Add NHN Cloud API integration with async task support
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
- NHN Cloud API packages: token, vpc, compute, nks, storage - REST API endpoints with Swagger documentation - Async task processing for long-running operations - CORS configuration for frontend integration - Enhanced logging for debugging API calls Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
201
nhn/serializers.py
Normal file
201
nhn/serializers.py
Normal file
@ -0,0 +1,201 @@
|
||||
"""
|
||||
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.EmailField(
|
||||
help_text="NHN Cloud 사용자 이메일",
|
||||
)
|
||||
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,
|
||||
)
|
||||
Reference in New Issue
Block a user