""" 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 클러스터 여부 (외부 접근 가능, True 선택 시 External Network 자동 설정)", default=True, ) 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", ) # ==================== Storage ==================== class StorageContainerSerializer(serializers.Serializer): """스토리지 컨테이너 생성 요청""" name = serializers.CharField( help_text="컨테이너 이름", max_length=255, ) # ==================== NKS Advanced ==================== class NksNodeGroupSerializer(serializers.Serializer): """NKS 노드 그룹 생성 요청""" nodegroup_name = serializers.CharField( help_text="노드 그룹 이름", max_length=255, ) instance_type = serializers.CharField( help_text="인스턴스 타입 (Flavor ID)", ) node_count = serializers.IntegerField( help_text="노드 수", default=1, min_value=1, max_value=100, ) availability_zone = serializers.CharField( help_text="가용 영역 (예: kr-pub-a)", required=False, ) 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", ) class NksNodeActionSerializer(serializers.Serializer): """워커 노드 액션 요청""" node_id = serializers.CharField( help_text="노드 ID", ) class NksClusterResizeSerializer(serializers.Serializer): """클러스터 리사이즈 요청""" node_count = serializers.IntegerField( help_text="조정할 노드 수", min_value=1, max_value=100, ) class NksClusterUpgradeSerializer(serializers.Serializer): """클러스터 업그레이드 요청""" kubernetes_version = serializers.CharField( help_text="업그레이드할 Kubernetes 버전 (예: v1.28.3)", ) class NksAutoscaleConfigSerializer(serializers.Serializer): """오토스케일러 설정 요청""" ca_enable = serializers.BooleanField( help_text="오토스케일러 활성화 여부", ) ca_max_node_count = serializers.IntegerField( help_text="최대 노드 수", required=False, min_value=1, max_value=100, ) ca_min_node_count = serializers.IntegerField( help_text="최소 노드 수", required=False, min_value=0, max_value=100, ) ca_scale_down_enable = serializers.BooleanField( help_text="스케일 다운 활성화 여부", required=False, ) ca_scale_down_delay_after_add = serializers.IntegerField( help_text="스케일 다운 지연 시간 (분)", required=False, ) ca_scale_down_unneeded_time = serializers.IntegerField( help_text="불필요 노드 대기 시간 (분)", required=False, ) class NksNodeGroupUpgradeSerializer(serializers.Serializer): """노드 그룹 업그레이드 요청""" kubernetes_version = serializers.CharField( help_text="업그레이드할 Kubernetes 버전", ) max_unavailable_worker = serializers.IntegerField( help_text="동시 업그레이드 가능한 노드 수", default=1, min_value=1, ) class NksNodeGroupUpdateSerializer(serializers.Serializer): """노드 그룹 설정 변경 요청""" instance_type = serializers.CharField( help_text="인스턴스 타입 (Flavor ID)", required=False, ) node_count = serializers.IntegerField( help_text="노드 수", required=False, min_value=0, max_value=100, ) class NksUserScriptSerializer(serializers.Serializer): """사용자 스크립트 설정 요청""" userscript = serializers.CharField( help_text="사용자 스크립트 내용", ) class NksApiEndpointIpAclSerializer(serializers.Serializer): """API 엔드포인트 IP 접근 제어 요청""" enable = serializers.BooleanField( help_text="IP 접근 제어 활성화 여부", ) allowed_cidrs = serializers.ListField( child=serializers.CharField(), help_text="허용할 CIDR 목록", required=False, ) # ==================== DNS Plus ==================== class DnsZoneSerializer(serializers.Serializer): """DNS Zone 생성 요청""" zone_name = serializers.CharField( help_text="Zone 이름 (도메인, 예: example.com.)", max_length=255, ) description = serializers.CharField( help_text="설명", required=False, allow_blank=True, ) class DnsZoneUpdateSerializer(serializers.Serializer): """DNS Zone 수정 요청""" description = serializers.CharField( help_text="설명", ) class DnsRecordSerializer(serializers.Serializer): """DNS 레코드""" recordContent = serializers.CharField( help_text="레코드 내용", ) recordDisabled = serializers.BooleanField( help_text="비활성화 여부", default=False, ) class DnsRecordSetSerializer(serializers.Serializer): """DNS 레코드 세트 생성 요청""" recordset_name = serializers.CharField( help_text="레코드 세트 이름", max_length=255, ) recordset_type = serializers.ChoiceField( choices=["A", "AAAA", "CAA", "CNAME", "MX", "NAPTR", "PTR", "TXT", "SRV", "NS"], help_text="레코드 타입", ) recordset_ttl = serializers.IntegerField( help_text="TTL (초)", min_value=1, max_value=2147483647, ) record_list = serializers.ListField( child=DnsRecordSerializer(), help_text="레코드 목록", ) class DnsRecordSetUpdateSerializer(serializers.Serializer): """DNS 레코드 세트 수정 요청""" recordset_type = serializers.ChoiceField( choices=["A", "AAAA", "CAA", "CNAME", "MX", "NAPTR", "PTR", "TXT", "SRV", "NS"], help_text="레코드 타입", ) recordset_ttl = serializers.IntegerField( help_text="TTL (초)", min_value=1, max_value=2147483647, ) record_list = serializers.ListField( child=DnsRecordSerializer(), help_text="레코드 목록", ) class DnsEndpointSerializer(serializers.Serializer): """Pool 엔드포인트""" endpointAddress = serializers.CharField( help_text="엔드포인트 주소 (IP 또는 도메인)", ) endpointWeight = serializers.FloatField( help_text="가중치 (0~1.00)", min_value=0, max_value=1.0, default=1.0, ) endpointDisabled = serializers.BooleanField( help_text="비활성화 여부", default=False, ) class DnsPoolSerializer(serializers.Serializer): """Pool 생성 요청""" pool_name = serializers.CharField( help_text="Pool 이름", max_length=255, ) endpoint_list = serializers.ListField( child=DnsEndpointSerializer(), help_text="엔드포인트 목록", ) pool_disabled = serializers.BooleanField( help_text="비활성화 여부", default=False, ) health_check_id = serializers.CharField( help_text="Health Check ID", required=False, ) class DnsPoolUpdateSerializer(serializers.Serializer): """Pool 수정 요청""" pool_name = serializers.CharField( help_text="Pool 이름", required=False, ) endpoint_list = serializers.ListField( child=DnsEndpointSerializer(), help_text="엔드포인트 목록", required=False, ) pool_disabled = serializers.BooleanField( help_text="비활성화 여부", required=False, ) health_check_id = serializers.CharField( help_text="Health Check ID", required=False, allow_null=True, ) class DnsConnectedPoolSerializer(serializers.Serializer): """GSLB 연결 Pool""" poolId = serializers.CharField( help_text="Pool ID", ) connectedPoolOrder = serializers.IntegerField( help_text="연결 순서 (우선순위)", min_value=1, ) connectedPoolRegionContent = serializers.CharField( help_text="지역 콘텐츠 (GEOLOCATION 규칙 사용 시)", required=False, ) class DnsGslbSerializer(serializers.Serializer): """GSLB 생성 요청""" gslb_name = serializers.CharField( help_text="GSLB 이름", max_length=255, ) gslb_ttl = serializers.IntegerField( help_text="TTL (초)", min_value=1, max_value=2147483647, ) gslb_routing_rule = serializers.ChoiceField( choices=["FAILOVER", "RANDOM", "GEOLOCATION"], help_text="라우팅 규칙", ) gslb_disabled = serializers.BooleanField( help_text="비활성화 여부", default=False, ) connected_pool_list = serializers.ListField( child=DnsConnectedPoolSerializer(), help_text="연결된 Pool 목록", required=False, ) class DnsGslbUpdateSerializer(serializers.Serializer): """GSLB 수정 요청""" gslb_name = serializers.CharField( help_text="GSLB 이름", required=False, ) gslb_ttl = serializers.IntegerField( help_text="TTL (초)", required=False, ) gslb_routing_rule = serializers.ChoiceField( choices=["FAILOVER", "RANDOM", "GEOLOCATION"], help_text="라우팅 규칙", required=False, ) gslb_disabled = serializers.BooleanField( help_text="비활성화 여부", required=False, ) connected_pool_list = serializers.ListField( child=DnsConnectedPoolSerializer(), help_text="연결된 Pool 목록", required=False, ) class DnsPoolConnectSerializer(serializers.Serializer): """GSLB에 Pool 연결 요청""" connected_pool_order = serializers.IntegerField( help_text="연결 순서 (우선순위)", min_value=1, ) connected_pool_region_content = serializers.CharField( help_text="지역 콘텐츠 (GEOLOCATION 규칙 사용 시)", required=False, ) class DnsHealthCheckSerializer(serializers.Serializer): """Health Check 생성 요청""" health_check_name = serializers.CharField( help_text="Health Check 이름", max_length=255, ) health_check_protocol = serializers.ChoiceField( choices=["HTTPS", "HTTP", "TCP"], help_text="프로토콜", ) health_check_port = serializers.IntegerField( help_text="포트", min_value=1, max_value=65535, ) health_check_interval = serializers.IntegerField( help_text="체크 간격 (초)", default=30, min_value=10, max_value=3600, ) health_check_timeout = serializers.IntegerField( help_text="타임아웃 (초)", default=5, min_value=1, max_value=10, ) health_check_retries = serializers.IntegerField( help_text="재시도 횟수", default=2, min_value=1, max_value=10, ) # HTTP/HTTPS 전용 health_check_path = serializers.CharField( help_text="경로 (HTTP/HTTPS 전용)", required=False, ) health_check_expected_codes = serializers.CharField( help_text="예상 응답 코드 (HTTP/HTTPS 전용)", required=False, ) health_check_expected_body = serializers.CharField( help_text="예상 응답 본문 (HTTP/HTTPS 전용)", required=False, ) class DnsHealthCheckUpdateSerializer(serializers.Serializer): """Health Check 수정 요청""" health_check_name = serializers.CharField( help_text="Health Check 이름", required=False, ) health_check_protocol = serializers.ChoiceField( choices=["HTTPS", "HTTP", "TCP"], help_text="프로토콜", required=False, ) health_check_port = serializers.IntegerField( help_text="포트", required=False, ) health_check_interval = serializers.IntegerField( help_text="체크 간격 (초)", required=False, ) health_check_timeout = serializers.IntegerField( help_text="타임아웃 (초)", required=False, ) health_check_retries = serializers.IntegerField( help_text="재시도 횟수", required=False, ) health_check_path = serializers.CharField( help_text="경로 (HTTP/HTTPS 전용)", required=False, ) health_check_expected_codes = serializers.CharField( help_text="예상 응답 코드 (HTTP/HTTPS 전용)", required=False, ) health_check_expected_body = serializers.CharField( help_text="예상 응답 본문 (HTTP/HTTPS 전용)", required=False, ) class DnsIdListSerializer(serializers.Serializer): """ID 목록 요청""" id_list = serializers.ListField( child=serializers.CharField(), help_text="ID 목록", min_length=1, )