All checks were successful
Build And Test / build-and-push (push) Successful in 36s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
647 lines
17 KiB
Python
647 lines
17 KiB
Python
"""
|
|
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,
|
|
)
|