v0.0.17 | 보안그룹 관리 API 추가 (CRUD + 규칙 CRUD)
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
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
142
nhn/views.py
142
nhn/views.py
@ -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 ====================
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user