v0.0.17 | 보안그룹 관리 API 추가 (CRUD + 규칙 CRUD)
All checks were successful
Build And Test / build-and-push (push) Successful in 53s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-18 13:57:08 +09:00
parent 9bf41ebf21
commit 2eade2ee9b
5 changed files with 332 additions and 1 deletions

View File

@ -19,6 +19,9 @@ from .serializers import (
ComputeInstanceSerializer,
VpcSerializer,
SubnetSerializer,
SecurityGroupSerializer,
SecurityGroupUpdateSerializer,
SecurityGroupRuleSerializer,
NksClusterSerializer,
NksNodeGroupSerializer,
NksNodeActionSerializer,
@ -671,6 +674,145 @@ class SecurityGroupListView(NHNBaseView):
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
class SecurityGroupCreateView(NHNBaseView):
"""보안 그룹 생성 API"""
@swagger_auto_schema(
operation_summary="보안 그룹 생성",
manual_parameters=[region_header, token_header],
request_body=SecurityGroupSerializer,
responses={201: "생성된 보안 그룹 정보"},
)
def post(self, request):
headers = get_nhn_headers(request)
serializer = SecurityGroupSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
try:
api = ApiVpc(headers["region"], headers["token"])
result = api.create_security_group(
name=serializer.validated_data["name"],
description=serializer.validated_data.get("description", ""),
)
logger.info(f"[SG] 보안 그룹 생성 성공: {serializer.validated_data['name']}")
return Response(result, status=status.HTTP_201_CREATED)
except NHNCloudAPIError as e:
logger.error(f"[SG] 보안 그룹 생성 실패 - error={e.message}")
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
class SecurityGroupDetailView(NHNBaseView):
"""보안 그룹 상세 조회/수정/삭제 API"""
@swagger_auto_schema(
operation_summary="보안 그룹 상세 조회",
manual_parameters=[region_header, token_header],
responses={200: "보안 그룹 상세 정보"},
)
def get(self, request, security_group_id):
headers = get_nhn_headers(request)
try:
api = ApiVpc(headers["region"], headers["token"])
return Response(api.get_security_group_info(security_group_id))
except NHNCloudAPIError as e:
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
@swagger_auto_schema(
operation_summary="보안 그룹 수정",
manual_parameters=[region_header, token_header],
request_body=SecurityGroupUpdateSerializer,
responses={200: "수정된 보안 그룹 정보"},
)
def put(self, request, security_group_id):
headers = get_nhn_headers(request)
serializer = SecurityGroupUpdateSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
try:
api = ApiVpc(headers["region"], headers["token"])
result = api.update_security_group(
security_group_id,
name=serializer.validated_data.get("name"),
description=serializer.validated_data.get("description"),
)
logger.info(f"[SG] 보안 그룹 수정 성공: {security_group_id}")
return Response(result)
except NHNCloudAPIError as e:
logger.error(f"[SG] 보안 그룹 수정 실패 - error={e.message}")
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
@swagger_auto_schema(
operation_summary="보안 그룹 삭제",
manual_parameters=[region_header, token_header],
responses={204: "삭제 성공"},
)
def delete(self, request, security_group_id):
headers = get_nhn_headers(request)
try:
api = ApiVpc(headers["region"], headers["token"])
api.delete_security_group(security_group_id)
logger.info(f"[SG] 보안 그룹 삭제 성공: {security_group_id}")
return Response(status=status.HTTP_204_NO_CONTENT)
except NHNCloudAPIError as e:
logger.error(f"[SG] 보안 그룹 삭제 실패 - error={e.message}")
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
class SecurityGroupRuleCreateView(NHNBaseView):
"""보안 그룹 규칙 생성 API"""
@swagger_auto_schema(
operation_summary="보안 그룹 규칙 생성",
manual_parameters=[region_header, token_header],
request_body=SecurityGroupRuleSerializer,
responses={201: "생성된 규칙 정보"},
)
def post(self, request):
headers = get_nhn_headers(request)
serializer = SecurityGroupRuleSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
try:
data = serializer.validated_data
api = ApiVpc(headers["region"], headers["token"])
result = api.create_security_group_rule(
security_group_id=data["security_group_id"],
direction=data["direction"],
ethertype=data.get("ethertype", "IPv4"),
protocol=data.get("protocol") or None,
port_range_min=data.get("port_range_min"),
port_range_max=data.get("port_range_max"),
remote_ip_prefix=data.get("remote_ip_prefix") or None,
remote_group_id=data.get("remote_group_id") or None,
description=data.get("description", ""),
)
logger.info(f"[SG Rule] 규칙 생성 성공: sg={data['security_group_id']}")
return Response(result, status=status.HTTP_201_CREATED)
except NHNCloudAPIError as e:
logger.error(f"[SG Rule] 규칙 생성 실패 - error={e.message}")
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
class SecurityGroupRuleDeleteView(NHNBaseView):
"""보안 그룹 규칙 삭제 API"""
@swagger_auto_schema(
operation_summary="보안 그룹 규칙 삭제",
manual_parameters=[region_header, token_header],
responses={204: "삭제 성공"},
)
def delete(self, request, rule_id):
headers = get_nhn_headers(request)
try:
api = ApiVpc(headers["region"], headers["token"])
api.delete_security_group_rule(rule_id)
logger.info(f"[SG Rule] 규칙 삭제 성공: {rule_id}")
return Response(status=status.HTTP_204_NO_CONTENT)
except NHNCloudAPIError as e:
logger.error(f"[SG Rule] 규칙 삭제 실패 - error={e.message}")
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
# ==================== Async Task API ====================