v0.0.25 | KVM 서버 관리 API 추가
All checks were successful
Build And Test / build-and-push (push) Successful in 2m7s
All checks were successful
Build And Test / build-and-push (push) Successful in 2m7s
- KVMServer 모델 추가 (멀티 서버 지원) - 서버별 SSH 키 암호화 저장 - msa-django-libvirt 연동용 SSH 정보 조회 API Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
from rest_framework import serializers
|
||||
from .models import CustomUser
|
||||
from .models import CustomUser, KVMServer
|
||||
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
@ -86,3 +86,60 @@ class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
|
||||
data["email"] = user.email
|
||||
data["grade"] = user.grade
|
||||
return data
|
||||
|
||||
|
||||
class KVMServerSerializer(serializers.ModelSerializer):
|
||||
"""KVM 서버 시리얼라이저"""
|
||||
tags_list = serializers.ListField(
|
||||
child=serializers.CharField(),
|
||||
required=False,
|
||||
write_only=True
|
||||
)
|
||||
private_key = serializers.CharField(write_only=True, required=False)
|
||||
|
||||
class Meta:
|
||||
model = KVMServer
|
||||
fields = [
|
||||
'id', 'name', 'host', 'port', 'username',
|
||||
'encrypted_private_key_name', 'libvirt_uri',
|
||||
'description', 'tags', 'tags_list', 'is_active',
|
||||
'last_used_at', 'created_at', 'updated_at', 'private_key'
|
||||
]
|
||||
read_only_fields = ['id', 'last_used_at', 'created_at', 'updated_at']
|
||||
extra_kwargs = {
|
||||
'tags': {'required': False},
|
||||
}
|
||||
|
||||
def to_representation(self, instance):
|
||||
data = super().to_representation(instance)
|
||||
data['has_ssh_key'] = bool(instance.encrypted_private_key)
|
||||
data['tags_list'] = instance.get_tags_list()
|
||||
return data
|
||||
|
||||
def create(self, validated_data):
|
||||
tags_list = validated_data.pop('tags_list', None)
|
||||
private_key = validated_data.pop('private_key', None)
|
||||
|
||||
instance = super().create(validated_data)
|
||||
|
||||
if tags_list is not None:
|
||||
instance.set_tags_list(tags_list)
|
||||
if private_key:
|
||||
instance.save_ssh_key(private_key, validated_data.get('encrypted_private_key_name'))
|
||||
instance.save()
|
||||
|
||||
return instance
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
tags_list = validated_data.pop('tags_list', None)
|
||||
private_key = validated_data.pop('private_key', None)
|
||||
|
||||
instance = super().update(instance, validated_data)
|
||||
|
||||
if tags_list is not None:
|
||||
instance.set_tags_list(tags_list)
|
||||
instance.save()
|
||||
if private_key:
|
||||
instance.save_ssh_key(private_key, validated_data.get('encrypted_private_key_name'))
|
||||
|
||||
return instance
|
||||
|
||||
Reference in New Issue
Block a user