""" NHN Cloud API Serializers API 요청/응답 직렬화 """ from rest_framework import serializers # ==================== Token ==================== class TokenRequestSerializer(serializers.Serializer): """토큰 생성 요청""" tenant_id = serializers.CharField( help_text="NHN Cloud 테넌트 ID", max_length=64, ) username = serializers.CharField( help_text="NHN Cloud 사용자 ID (이메일 또는 API 사용자 ID)", max_length=255, ) password = serializers.CharField( help_text="NHN Cloud API 비밀번호", write_only=True, ) class TokenResponseSerializer(serializers.Serializer): """토큰 생성 응답""" token = serializers.CharField(help_text="API 토큰") tenant_id = serializers.CharField(help_text="테넌트 ID") expires_at = serializers.CharField(help_text="만료 시간", allow_null=True) # ==================== Common ==================== class ErrorResponseSerializer(serializers.Serializer): """에러 응답""" error = serializers.CharField(help_text="에러 메시지") code = serializers.IntegerField(help_text="에러 코드", required=False) # ==================== Compute ==================== class ComputeInstanceSerializer(serializers.Serializer): """인스턴스 생성 요청""" name = serializers.CharField( help_text="인스턴스 이름", max_length=255, ) image_id = serializers.CharField( help_text="이미지 ID", ) flavor_id = serializers.CharField( help_text="Flavor ID", ) subnet_id = serializers.CharField( help_text="서브넷 ID", ) keypair_name = serializers.CharField( help_text="Keypair 이름", ) volume_size = serializers.IntegerField( help_text="볼륨 크기 (GB)", default=50, min_value=20, max_value=2048, ) volume_type = serializers.CharField( help_text="볼륨 타입 (General SSD, General HDD)", default="General SSD", required=False, ) security_groups = serializers.ListField( child=serializers.CharField(), help_text="보안 그룹 목록", required=False, ) availability_zone = serializers.CharField( help_text="가용 영역", required=False, ) # ==================== VPC ==================== class VpcSerializer(serializers.Serializer): """VPC 생성 요청""" name = serializers.CharField( help_text="VPC 이름", max_length=255, ) cidr = serializers.CharField( help_text="CIDR 블록 (예: 10.0.0.0/16)", ) class SubnetSerializer(serializers.Serializer): """서브넷 생성 요청""" vpc_id = serializers.CharField( help_text="VPC ID", ) name = serializers.CharField( help_text="서브넷 이름", max_length=255, ) cidr = serializers.CharField( help_text="CIDR 블록 (예: 10.0.1.0/24)", ) # ==================== NKS ==================== class NksClusterSerializer(serializers.Serializer): """NKS 클러스터 생성 요청""" cluster_name = serializers.CharField( help_text="클러스터 이름", max_length=255, ) vpc_id = serializers.CharField( help_text="VPC ID", ) subnet_id = serializers.CharField( help_text="서브넷 ID", ) instance_type = serializers.CharField( help_text="인스턴스 타입 (Flavor ID)", ) keypair_name = serializers.CharField( help_text="Keypair 이름", ) kubernetes_version = serializers.CharField( help_text="Kubernetes 버전 (예: v1.28.3)", ) availability_zone = serializers.CharField( help_text="가용 영역 (예: kr-pub-a)", ) is_public = serializers.BooleanField( help_text="Public 클러스터 여부 (외부 접근 가능)", default=True, ) external_network_id = serializers.CharField( help_text="외부 네트워크 ID (Public 클러스터 필수)", required=False, ) external_subnet_id = serializers.CharField( help_text="외부 서브넷 ID (Public 클러스터 필수)", required=False, ) node_count = serializers.IntegerField( help_text="노드 수", default=1, min_value=1, max_value=100, ) boot_volume_size = serializers.IntegerField( help_text="부팅 볼륨 크기 (GB)", default=50, min_value=50, max_value=1000, ) boot_volume_type = serializers.CharField( help_text="볼륨 타입", default="General SSD", ) def validate(self, data): """Public 클러스터인 경우 external 관련 필드 필수""" if data.get("is_public", True): if not data.get("external_network_id"): raise serializers.ValidationError( {"external_network_id": "Public 클러스터에는 외부 네트워크 ID가 필요합니다."} ) if not data.get("external_subnet_id"): raise serializers.ValidationError( {"external_subnet_id": "Public 클러스터에는 외부 서브넷 ID가 필요합니다."} ) return data # ==================== Storage ==================== class StorageContainerSerializer(serializers.Serializer): """스토리지 컨테이너 생성 요청""" name = serializers.CharField( help_text="컨테이너 이름", max_length=255, )