v0.0.19 | Internet Gateway / Routing Table 관리 API 추가
All checks were successful
Build And Test / build-and-push (push) Successful in 13s
All checks were successful
Build And Test / build-and-push (push) Successful in 13s
- ApiVpc에 IGW CRUD 추가 (/v2.0/internetgateways, external_network_id 사용) - IGW/RoutingTable/Subnet-attach View 및 URL 신규 (모두 동기) - API_SPEC.md 3.7.1~3.7.8 네트워크 섹션 추가 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
273
nhn/views.py
273
nhn/views.py
@ -19,6 +19,10 @@ from .serializers import (
|
||||
ComputeInstanceSerializer,
|
||||
VpcSerializer,
|
||||
SubnetSerializer,
|
||||
SubnetAttachRoutingTableSerializer,
|
||||
RoutingTableSerializer,
|
||||
RoutingTableAttachGatewaySerializer,
|
||||
InternetGatewaySerializer,
|
||||
SecurityGroupSerializer,
|
||||
SecurityGroupUpdateSerializer,
|
||||
SecurityGroupRuleSerializer,
|
||||
@ -654,6 +658,275 @@ class FloatingIpDetachView(NHNBaseView):
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
# ==================== Internet Gateway API ====================
|
||||
|
||||
|
||||
class InternetGatewayListView(NHNBaseView):
|
||||
"""인터넷 게이트웨이 목록 조회 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="인터넷 게이트웨이 목록 조회",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "IGW 목록"},
|
||||
)
|
||||
def get(self, request):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
return Response(api.get_internet_gateway_list())
|
||||
except NHNCloudAPIError as e:
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class InternetGatewayCreateView(NHNBaseView):
|
||||
"""인터넷 게이트웨이 생성 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="인터넷 게이트웨이 생성",
|
||||
manual_parameters=[region_header, token_header],
|
||||
request_body=InternetGatewaySerializer,
|
||||
responses={201: "생성된 IGW 정보"},
|
||||
)
|
||||
def post(self, request):
|
||||
headers = get_nhn_headers(request)
|
||||
serializer = InternetGatewaySerializer(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"])
|
||||
external_network_id = serializer.validated_data.get("external_network_id", "")
|
||||
if not external_network_id:
|
||||
networks = api.get_external_network_id().get("networks", [])
|
||||
if not networks:
|
||||
return Response(
|
||||
{"error": "외부 네트워크를 찾을 수 없습니다."},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
external_network_id = networks[0].get("id")
|
||||
|
||||
result = api.create_internet_gateway(
|
||||
name=serializer.validated_data["name"],
|
||||
external_network_id=external_network_id,
|
||||
)
|
||||
logger.info(f"[IGW] 생성 성공 - name={serializer.validated_data['name']}")
|
||||
return Response(result, status=status.HTTP_201_CREATED)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[IGW] 생성 실패 - error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class InternetGatewayDetailView(NHNBaseView):
|
||||
"""인터넷 게이트웨이 상세/삭제 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="인터넷 게이트웨이 상세 조회",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "IGW 상세 정보"},
|
||||
)
|
||||
def get(self, request, internetgateway_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
return Response(api.get_internet_gateway_info(internetgateway_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],
|
||||
responses={204: "삭제 완료"},
|
||||
)
|
||||
def delete(self, request, internetgateway_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
api.delete_internet_gateway(internetgateway_id)
|
||||
logger.info(f"[IGW] 삭제 성공 - id={internetgateway_id}")
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[IGW] 삭제 실패 - id={internetgateway_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
# ==================== Routing Table API ====================
|
||||
|
||||
|
||||
class RoutingTableListView(NHNBaseView):
|
||||
"""라우팅 테이블 목록 조회 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블 목록 조회",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "라우팅 테이블 목록"},
|
||||
)
|
||||
def get(self, request):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
return Response(api.get_routing_table_list())
|
||||
except NHNCloudAPIError as e:
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class RoutingTableCreateView(NHNBaseView):
|
||||
"""라우팅 테이블 생성 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블 생성",
|
||||
manual_parameters=[region_header, token_header],
|
||||
request_body=RoutingTableSerializer,
|
||||
responses={201: "생성된 라우팅 테이블 정보"},
|
||||
)
|
||||
def post(self, request):
|
||||
headers = get_nhn_headers(request)
|
||||
serializer = RoutingTableSerializer(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_routing_table(
|
||||
name=serializer.validated_data["name"],
|
||||
vpc_id=serializer.validated_data["vpc_id"],
|
||||
distributed=serializer.validated_data.get("distributed", True),
|
||||
)
|
||||
logger.info(f"[RT] 생성 성공 - name={serializer.validated_data['name']}")
|
||||
return Response(result, status=status.HTTP_201_CREATED)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[RT] 생성 실패 - error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class RoutingTableDetailView(NHNBaseView):
|
||||
"""라우팅 테이블 상세/삭제 API"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블 상세 조회",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "라우팅 테이블 상세"},
|
||||
)
|
||||
def get(self, request, routingtable_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
return Response(api.get_routing_table_info(routingtable_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],
|
||||
responses={204: "삭제 완료"},
|
||||
)
|
||||
def delete(self, request, routingtable_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
api.delete_routing_table(routingtable_id)
|
||||
logger.info(f"[RT] 삭제 성공 - id={routingtable_id}")
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[RT] 삭제 실패 - id={routingtable_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class RoutingTableSetDefaultView(NHNBaseView):
|
||||
"""라우팅 테이블을 기본으로 설정"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블 기본 설정",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "설정 결과"},
|
||||
)
|
||||
def put(self, request, routingtable_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
result = api.set_default_routing_table(routingtable_id)
|
||||
logger.info(f"[RT] 기본 설정 성공 - id={routingtable_id}")
|
||||
return Response(result)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[RT] 기본 설정 실패 - id={routingtable_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class RoutingTableAttachGatewayView(NHNBaseView):
|
||||
"""라우팅 테이블에 인터넷 게이트웨이 연결"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블에 인터넷 게이트웨이 연결",
|
||||
manual_parameters=[region_header, token_header],
|
||||
request_body=RoutingTableAttachGatewaySerializer,
|
||||
responses={200: "연결 결과"},
|
||||
)
|
||||
def put(self, request, routingtable_id):
|
||||
headers = get_nhn_headers(request)
|
||||
serializer = RoutingTableAttachGatewaySerializer(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.attach_gateway_to_routing_table(
|
||||
routingtable_id=routingtable_id,
|
||||
gateway_id=serializer.validated_data["gateway_id"],
|
||||
)
|
||||
logger.info(f"[RT] 게이트웨이 연결 성공 - rt={routingtable_id}")
|
||||
return Response(result)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[RT] 게이트웨이 연결 실패 - rt={routingtable_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class RoutingTableDetachGatewayView(NHNBaseView):
|
||||
"""라우팅 테이블에서 인터넷 게이트웨이 분리"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="라우팅 테이블에서 인터넷 게이트웨이 분리",
|
||||
manual_parameters=[region_header, token_header],
|
||||
responses={200: "분리 결과"},
|
||||
)
|
||||
def put(self, request, routingtable_id):
|
||||
headers = get_nhn_headers(request)
|
||||
try:
|
||||
api = ApiVpc(headers["region"], headers["token"])
|
||||
result = api.detach_gateway_from_routing_table(routingtable_id)
|
||||
logger.info(f"[RT] 게이트웨이 분리 성공 - rt={routingtable_id}")
|
||||
return Response(result)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[RT] 게이트웨이 분리 실패 - rt={routingtable_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class SubnetAttachRoutingTableView(NHNBaseView):
|
||||
"""서브넷에 라우팅 테이블 연결"""
|
||||
|
||||
@swagger_auto_schema(
|
||||
operation_summary="서브넷에 라우팅 테이블 연결",
|
||||
manual_parameters=[region_header, token_header],
|
||||
request_body=SubnetAttachRoutingTableSerializer,
|
||||
responses={200: "연결 결과"},
|
||||
)
|
||||
def put(self, request, subnet_id):
|
||||
headers = get_nhn_headers(request)
|
||||
serializer = SubnetAttachRoutingTableSerializer(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.attach_routing_table_to_subnet(
|
||||
subnet_id=subnet_id,
|
||||
routingtable_id=serializer.validated_data["routingtable_id"],
|
||||
)
|
||||
logger.info(f"[Subnet] 라우팅 테이블 연결 성공 - subnet={subnet_id}")
|
||||
return Response(result)
|
||||
except NHNCloudAPIError as e:
|
||||
logger.error(f"[Subnet] 라우팅 테이블 연결 실패 - subnet={subnet_id}, error={e.message}")
|
||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
# ==================== Security Group API ====================
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user