v0.0.9 | Add Load Balancer API
All checks were successful
Build And Test / build-and-push (push) Successful in 53s

- 로드밸런서 CRUD API 추가
- 리스너, 풀, 멤버, 헬스 모니터 API 추가
- L7 정책/룰, IP ACL 그룹/타깃 API 추가
- 쿼타 조회 API 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-16 11:14:03 +09:00
parent 57526a0f13
commit 7136e76d63
9 changed files with 2658 additions and 1 deletions

View File

@ -644,3 +644,574 @@ class DnsIdListSerializer(serializers.Serializer):
help_text="ID 목록",
min_length=1,
)
# ==================== Load Balancer ====================
class LoadBalancerSerializer(serializers.Serializer):
"""로드밸런서 생성 요청"""
vip_subnet_id = serializers.CharField(
help_text="VIP가 할당될 서브넷 ID (필수)",
)
name = serializers.CharField(
help_text="로드밸런서 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
vip_address = serializers.CharField(
help_text="VIP 주소 (지정하지 않으면 자동 할당)",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
loadbalancer_type = serializers.ChoiceField(
choices=["shared", "dedicated"],
help_text="로드밸런서 타입 (shared: 공유형, dedicated: 전용형)",
default="shared",
)
class LoadBalancerUpdateSerializer(serializers.Serializer):
"""로드밸런서 수정 요청"""
name = serializers.CharField(
help_text="로드밸런서 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
class LBListenerSerializer(serializers.Serializer):
"""리스너 생성 요청"""
loadbalancer_id = serializers.CharField(
help_text="로드밸런서 ID",
)
protocol = serializers.ChoiceField(
choices=["TCP", "HTTP", "HTTPS", "TERMINATED_HTTPS"],
help_text="프로토콜",
)
protocol_port = serializers.IntegerField(
help_text="포트 번호 (1-65535)",
min_value=1,
max_value=65535,
)
name = serializers.CharField(
help_text="리스너 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
default_pool_id = serializers.CharField(
help_text="기본 풀 ID",
required=False,
)
connection_limit = serializers.IntegerField(
help_text="연결 제한 (-1: 무제한)",
default=-1,
)
keepalive_timeout = serializers.IntegerField(
help_text="Keepalive 타임아웃 (초)",
default=300,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
default_tls_container_ref = serializers.CharField(
help_text="TLS 인증서 컨테이너 참조 (TERMINATED_HTTPS 사용 시)",
required=False,
)
class LBListenerUpdateSerializer(serializers.Serializer):
"""리스너 수정 요청"""
name = serializers.CharField(
help_text="리스너 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
default_pool_id = serializers.CharField(
help_text="기본 풀 ID",
required=False,
allow_null=True,
)
connection_limit = serializers.IntegerField(
help_text="연결 제한 (-1: 무제한)",
required=False,
)
keepalive_timeout = serializers.IntegerField(
help_text="Keepalive 타임아웃 (초)",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
class SessionPersistenceSerializer(serializers.Serializer):
"""세션 지속성 설정"""
type = serializers.ChoiceField(
choices=["SOURCE_IP", "HTTP_COOKIE", "APP_COOKIE"],
help_text="세션 지속성 타입",
)
cookie_name = serializers.CharField(
help_text="쿠키 이름 (APP_COOKIE 타입 사용 시)",
required=False,
)
class LBPoolSerializer(serializers.Serializer):
"""풀 생성 요청"""
lb_algorithm = serializers.ChoiceField(
choices=["ROUND_ROBIN", "LEAST_CONNECTIONS", "SOURCE_IP"],
help_text="로드밸런싱 알고리즘",
)
protocol = serializers.ChoiceField(
choices=["TCP", "HTTP", "HTTPS", "PROXY"],
help_text="프로토콜",
)
loadbalancer_id = serializers.CharField(
help_text="로드밸런서 ID (listener_id와 둘 중 하나 필수)",
required=False,
)
listener_id = serializers.CharField(
help_text="리스너 ID (loadbalancer_id와 둘 중 하나 필수)",
required=False,
)
name = serializers.CharField(
help_text="풀 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
session_persistence = SessionPersistenceSerializer(
help_text="세션 지속성 설정",
required=False,
)
class LBPoolUpdateSerializer(serializers.Serializer):
"""풀 수정 요청"""
name = serializers.CharField(
help_text="풀 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
lb_algorithm = serializers.ChoiceField(
choices=["ROUND_ROBIN", "LEAST_CONNECTIONS", "SOURCE_IP"],
help_text="로드밸런싱 알고리즘",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
session_persistence = SessionPersistenceSerializer(
help_text="세션 지속성 설정",
required=False,
allow_null=True,
)
class LBMemberSerializer(serializers.Serializer):
"""멤버 추가 요청"""
address = serializers.CharField(
help_text="멤버 IP 주소",
)
protocol_port = serializers.IntegerField(
help_text="멤버 포트 번호",
min_value=1,
max_value=65535,
)
subnet_id = serializers.CharField(
help_text="멤버가 속한 서브넷 ID",
required=False,
)
weight = serializers.IntegerField(
help_text="가중치 (1-256)",
default=1,
min_value=1,
max_value=256,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
class LBMemberUpdateSerializer(serializers.Serializer):
"""멤버 수정 요청"""
weight = serializers.IntegerField(
help_text="가중치 (1-256)",
required=False,
min_value=1,
max_value=256,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
class LBHealthMonitorSerializer(serializers.Serializer):
"""헬스 모니터 생성 요청"""
pool_id = serializers.CharField(
help_text="풀 ID",
)
type = serializers.ChoiceField(
choices=["TCP", "HTTP", "HTTPS"],
help_text="헬스 체크 타입",
)
delay = serializers.IntegerField(
help_text="헬스 체크 간격 (초)",
min_value=1,
)
timeout = serializers.IntegerField(
help_text="응답 대기 시간 (초)",
min_value=1,
)
max_retries = serializers.IntegerField(
help_text="최대 재시도 횟수 (정상 판정)",
min_value=1,
max_value=10,
)
max_retries_down = serializers.IntegerField(
help_text="최대 재시도 횟수 (비정상 판정)",
default=3,
min_value=1,
max_value=10,
)
http_method = serializers.ChoiceField(
choices=["GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "OPTIONS", "CONNECT", "PATCH"],
help_text="HTTP 메서드 (HTTP/HTTPS 타입 시)",
default="GET",
)
url_path = serializers.CharField(
help_text="URL 경로 (HTTP/HTTPS 타입 시)",
default="/",
)
expected_codes = serializers.CharField(
help_text="예상 응답 코드 (예: 200, 200,201, 200-204)",
default="200",
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
host_header = serializers.CharField(
help_text="Host 헤더 값",
required=False,
)
class LBHealthMonitorUpdateSerializer(serializers.Serializer):
"""헬스 모니터 수정 요청"""
delay = serializers.IntegerField(
help_text="헬스 체크 간격 (초)",
required=False,
min_value=1,
)
timeout = serializers.IntegerField(
help_text="응답 대기 시간 (초)",
required=False,
min_value=1,
)
max_retries = serializers.IntegerField(
help_text="최대 재시도 횟수 (정상 판정)",
required=False,
min_value=1,
max_value=10,
)
max_retries_down = serializers.IntegerField(
help_text="최대 재시도 횟수 (비정상 판정)",
required=False,
min_value=1,
max_value=10,
)
http_method = serializers.ChoiceField(
choices=["GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "OPTIONS", "CONNECT", "PATCH"],
help_text="HTTP 메서드",
required=False,
)
url_path = serializers.CharField(
help_text="URL 경로",
required=False,
)
expected_codes = serializers.CharField(
help_text="예상 응답 코드",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
host_header = serializers.CharField(
help_text="Host 헤더 값",
required=False,
)
class LBL7PolicySerializer(serializers.Serializer):
"""L7 정책 생성 요청"""
listener_id = serializers.CharField(
help_text="리스너 ID",
)
action = serializers.ChoiceField(
choices=["REDIRECT_TO_POOL", "REDIRECT_TO_URL", "REJECT"],
help_text="액션",
)
position = serializers.IntegerField(
help_text="정책 우선순위 (낮을수록 먼저 적용)",
default=1,
min_value=1,
)
name = serializers.CharField(
help_text="정책 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
redirect_pool_id = serializers.CharField(
help_text="리다이렉트 대상 풀 ID (REDIRECT_TO_POOL 액션 시)",
required=False,
)
redirect_url = serializers.CharField(
help_text="리다이렉트 URL (REDIRECT_TO_URL 액션 시)",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
class LBL7PolicyUpdateSerializer(serializers.Serializer):
"""L7 정책 수정 요청"""
name = serializers.CharField(
help_text="정책 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
action = serializers.ChoiceField(
choices=["REDIRECT_TO_POOL", "REDIRECT_TO_URL", "REJECT"],
help_text="액션",
required=False,
)
position = serializers.IntegerField(
help_text="정책 우선순위",
required=False,
min_value=1,
)
redirect_pool_id = serializers.CharField(
help_text="리다이렉트 대상 풀 ID",
required=False,
allow_null=True,
)
redirect_url = serializers.CharField(
help_text="리다이렉트 URL",
required=False,
allow_null=True,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
class LBL7RuleSerializer(serializers.Serializer):
"""L7 룰 생성 요청"""
type = serializers.ChoiceField(
choices=["COOKIE", "FILE_TYPE", "HEADER", "HOST_NAME", "PATH"],
help_text="룰 타입",
)
compare_type = serializers.ChoiceField(
choices=["CONTAINS", "ENDS_WITH", "STARTS_WITH", "EQUAL_TO", "REGEX"],
help_text="비교 방식",
)
value = serializers.CharField(
help_text="비교할 값",
)
key = serializers.CharField(
help_text="키 값 (COOKIE, HEADER 타입 사용 시)",
required=False,
)
invert = serializers.BooleanField(
help_text="조건 반전 여부",
default=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
default=True,
)
class LBL7RuleUpdateSerializer(serializers.Serializer):
"""L7 룰 수정 요청"""
type = serializers.ChoiceField(
choices=["COOKIE", "FILE_TYPE", "HEADER", "HOST_NAME", "PATH"],
help_text="룰 타입",
required=False,
)
compare_type = serializers.ChoiceField(
choices=["CONTAINS", "ENDS_WITH", "STARTS_WITH", "EQUAL_TO", "REGEX"],
help_text="비교 방식",
required=False,
)
value = serializers.CharField(
help_text="비교할 값",
required=False,
)
key = serializers.CharField(
help_text="키 값",
required=False,
allow_null=True,
)
invert = serializers.BooleanField(
help_text="조건 반전 여부",
required=False,
)
admin_state_up = serializers.BooleanField(
help_text="관리자 상태",
required=False,
)
class LBIpAclTargetSerializer(serializers.Serializer):
"""IP ACL 타깃"""
ip_address = serializers.CharField(
help_text="IP 주소 또는 CIDR (예: 10.0.0.1, 10.0.0.0/24)",
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
class LBIpAclGroupSerializer(serializers.Serializer):
"""IP ACL 그룹 생성 요청"""
action = serializers.ChoiceField(
choices=["ALLOW", "DENY"],
help_text="액션 (ALLOW 또는 DENY)",
)
name = serializers.CharField(
help_text="그룹 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
ipacl_targets = serializers.ListField(
child=LBIpAclTargetSerializer(),
help_text="IP ACL 타깃 목록",
required=False,
)
loadbalancers = serializers.ListField(
child=serializers.CharField(),
help_text="적용할 로드밸런서 ID 목록",
required=False,
)
class LBIpAclGroupUpdateSerializer(serializers.Serializer):
"""IP ACL 그룹 수정 요청"""
name = serializers.CharField(
help_text="그룹 이름",
required=False,
max_length=255,
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)
loadbalancers = serializers.ListField(
child=serializers.CharField(),
help_text="적용할 로드밸런서 ID 목록",
required=False,
)
class LBIpAclTargetCreateSerializer(serializers.Serializer):
"""IP ACL 타깃 추가 요청"""
ipacl_group_id = serializers.CharField(
help_text="IP ACL 그룹 ID",
)
ip_address = serializers.CharField(
help_text="IP 주소 또는 CIDR (예: 10.0.0.1, 10.0.0.0/24)",
)
description = serializers.CharField(
help_text="설명",
required=False,
allow_blank=True,
)