v0.0.9 | Add Load Balancer API
All checks were successful
Build And Test / build-and-push (push) Successful in 53s
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:
@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user