v0.0.13 | Skip Django JWT auth for NHN API (Kong handles it)
All checks were successful
Build And Test / build-and-push (push) Successful in 1m54s
All checks were successful
Build And Test / build-and-push (push) Successful in 1m54s
- Add NHNBaseView with authentication_classes = [] - All NHN View classes now inherit from NHNBaseView - Kong already validates JWT, no need for Django to re-validate Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
169
nhn/views.py
169
nhn/views.py
@ -70,6 +70,18 @@ from .packages.base import NHNCloudAPIError
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# ==================== Base View ====================
|
||||||
|
|
||||||
|
|
||||||
|
class NHNBaseView(APIView):
|
||||||
|
"""
|
||||||
|
NHN Cloud API 베이스 뷰
|
||||||
|
Kong이 이미 JWT 인증을 수행하므로 Django에서는 인증을 건너뜀
|
||||||
|
"""
|
||||||
|
authentication_classes = []
|
||||||
|
permission_classes = [AllowAny]
|
||||||
|
|
||||||
|
|
||||||
# ==================== Common Headers ====================
|
# ==================== Common Headers ====================
|
||||||
|
|
||||||
region_header = openapi.Parameter(
|
region_header = openapi.Parameter(
|
||||||
@ -114,12 +126,9 @@ def get_nhn_headers(request):
|
|||||||
# ==================== Token API ====================
|
# ==================== Token API ====================
|
||||||
|
|
||||||
|
|
||||||
class TokenCreateView(APIView):
|
class TokenCreateView(NHNBaseView):
|
||||||
"""토큰 생성 API"""
|
"""토큰 생성 API"""
|
||||||
|
|
||||||
authentication_classes = [] # 인증 완전히 건너뜀
|
|
||||||
permission_classes = [AllowAny]
|
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
operation_summary="NHN Cloud API 토큰 생성",
|
operation_summary="NHN Cloud API 토큰 생성",
|
||||||
operation_description="NHN Cloud API 인증 토큰을 생성합니다.",
|
operation_description="NHN Cloud API 인증 토큰을 생성합니다.",
|
||||||
@ -172,7 +181,7 @@ class TokenCreateView(APIView):
|
|||||||
# ==================== Compute API ====================
|
# ==================== Compute API ====================
|
||||||
|
|
||||||
|
|
||||||
class ComputeFlavorListView(APIView):
|
class ComputeFlavorListView(NHNBaseView):
|
||||||
"""Flavor 목록 조회 API"""
|
"""Flavor 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -189,7 +198,7 @@ class ComputeFlavorListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeKeypairListView(APIView):
|
class ComputeKeypairListView(NHNBaseView):
|
||||||
"""Keypair 목록 조회 API"""
|
"""Keypair 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -206,7 +215,7 @@ class ComputeKeypairListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeImageListView(APIView):
|
class ComputeImageListView(NHNBaseView):
|
||||||
"""이미지 목록 조회 API"""
|
"""이미지 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -223,7 +232,7 @@ class ComputeImageListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeInstanceListView(APIView):
|
class ComputeInstanceListView(NHNBaseView):
|
||||||
"""인스턴스 목록 조회 API"""
|
"""인스턴스 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -243,7 +252,7 @@ class ComputeInstanceListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeInstanceDetailView(APIView):
|
class ComputeInstanceDetailView(NHNBaseView):
|
||||||
"""인스턴스 상세/삭제 API"""
|
"""인스턴스 상세/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -285,7 +294,7 @@ class ComputeInstanceDetailView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeInstanceCreateView(APIView):
|
class ComputeInstanceCreateView(NHNBaseView):
|
||||||
"""인스턴스 생성 API (비동기)"""
|
"""인스턴스 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -324,7 +333,7 @@ class ComputeInstanceCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class ComputeInstanceActionView(APIView):
|
class ComputeInstanceActionView(NHNBaseView):
|
||||||
"""인스턴스 액션 API (시작/정지/재부팅) - 비동기"""
|
"""인스턴스 액션 API (시작/정지/재부팅) - 비동기"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -377,7 +386,7 @@ class ComputeInstanceActionView(APIView):
|
|||||||
# ==================== VPC API ====================
|
# ==================== VPC API ====================
|
||||||
|
|
||||||
|
|
||||||
class VpcListView(APIView):
|
class VpcListView(NHNBaseView):
|
||||||
"""VPC 목록 조회 API"""
|
"""VPC 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -399,7 +408,7 @@ class VpcListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class VpcCreateView(APIView):
|
class VpcCreateView(NHNBaseView):
|
||||||
"""VPC 생성 API (비동기)"""
|
"""VPC 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -432,7 +441,7 @@ class VpcCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class VpcDetailView(APIView):
|
class VpcDetailView(NHNBaseView):
|
||||||
"""VPC 상세/삭제 API"""
|
"""VPC 상세/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -480,7 +489,7 @@ class VpcDetailView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class SubnetListView(APIView):
|
class SubnetListView(NHNBaseView):
|
||||||
"""서브넷 목록 조회 API"""
|
"""서브넷 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -497,7 +506,7 @@ class SubnetListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class SubnetCreateView(APIView):
|
class SubnetCreateView(NHNBaseView):
|
||||||
"""서브넷 생성 API (비동기)"""
|
"""서브넷 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -531,7 +540,7 @@ class SubnetCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class SubnetDetailView(APIView):
|
class SubnetDetailView(NHNBaseView):
|
||||||
"""서브넷 상세/삭제 API"""
|
"""서브넷 상세/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -572,7 +581,7 @@ class SubnetDetailView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class FloatingIpListView(APIView):
|
class FloatingIpListView(NHNBaseView):
|
||||||
"""Floating IP 목록 조회 API"""
|
"""Floating IP 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -592,7 +601,7 @@ class FloatingIpListView(APIView):
|
|||||||
# ==================== Security Group API ====================
|
# ==================== Security Group API ====================
|
||||||
|
|
||||||
|
|
||||||
class SecurityGroupListView(APIView):
|
class SecurityGroupListView(NHNBaseView):
|
||||||
"""보안 그룹 목록 조회 API"""
|
"""보안 그룹 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -612,7 +621,7 @@ class SecurityGroupListView(APIView):
|
|||||||
# ==================== Async Task API ====================
|
# ==================== Async Task API ====================
|
||||||
|
|
||||||
|
|
||||||
class AsyncTaskListView(APIView):
|
class AsyncTaskListView(NHNBaseView):
|
||||||
"""비동기 작업 목록 조회 API"""
|
"""비동기 작업 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -640,7 +649,7 @@ class AsyncTaskListView(APIView):
|
|||||||
return Response({"tasks": data})
|
return Response({"tasks": data})
|
||||||
|
|
||||||
|
|
||||||
class AsyncTaskDetailView(APIView):
|
class AsyncTaskDetailView(NHNBaseView):
|
||||||
"""비동기 작업 상세 조회 API"""
|
"""비동기 작업 상세 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -674,7 +683,7 @@ class AsyncTaskDetailView(APIView):
|
|||||||
# ==================== NKS API ====================
|
# ==================== NKS API ====================
|
||||||
|
|
||||||
|
|
||||||
class NksSupportsView(APIView):
|
class NksSupportsView(NHNBaseView):
|
||||||
"""NKS 지원 버전 및 작업 종류 조회 API"""
|
"""NKS 지원 버전 및 작업 종류 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -691,7 +700,7 @@ class NksSupportsView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterListView(APIView):
|
class NksClusterListView(NHNBaseView):
|
||||||
"""NKS 클러스터 목록 조회 API"""
|
"""NKS 클러스터 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -708,7 +717,7 @@ class NksClusterListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterDetailView(APIView):
|
class NksClusterDetailView(NHNBaseView):
|
||||||
"""NKS 클러스터 상세/삭제 API"""
|
"""NKS 클러스터 상세/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -748,7 +757,7 @@ class NksClusterDetailView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterConfigView(APIView):
|
class NksClusterConfigView(NHNBaseView):
|
||||||
"""NKS 클러스터 kubeconfig 조회 API"""
|
"""NKS 클러스터 kubeconfig 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -766,7 +775,7 @@ class NksClusterConfigView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterCreateView(APIView):
|
class NksClusterCreateView(NHNBaseView):
|
||||||
"""NKS 클러스터 생성 API (비동기)"""
|
"""NKS 클러스터 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -834,7 +843,7 @@ class NksClusterCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterResizeView(APIView):
|
class NksClusterResizeView(NHNBaseView):
|
||||||
"""NKS 클러스터 리사이즈 API"""
|
"""NKS 클러스터 리사이즈 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -857,7 +866,7 @@ class NksClusterResizeView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterUpgradeView(APIView):
|
class NksClusterUpgradeView(NHNBaseView):
|
||||||
"""NKS 클러스터 업그레이드 API"""
|
"""NKS 클러스터 업그레이드 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -880,7 +889,7 @@ class NksClusterUpgradeView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterEventsView(APIView):
|
class NksClusterEventsView(NHNBaseView):
|
||||||
"""NKS 클러스터 작업 이력 API"""
|
"""NKS 클러스터 작업 이력 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -897,7 +906,7 @@ class NksClusterEventsView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterEventDetailView(APIView):
|
class NksClusterEventDetailView(NHNBaseView):
|
||||||
"""NKS 클러스터 작업 이력 상세 API"""
|
"""NKS 클러스터 작업 이력 상세 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -914,7 +923,7 @@ class NksClusterEventDetailView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterCertificatesView(APIView):
|
class NksClusterCertificatesView(NHNBaseView):
|
||||||
"""NKS 클러스터 인증서 갱신 API"""
|
"""NKS 클러스터 인증서 갱신 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -932,7 +941,7 @@ class NksClusterCertificatesView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksClusterIpAclView(APIView):
|
class NksClusterIpAclView(NHNBaseView):
|
||||||
"""NKS 클러스터 API 엔드포인트 IP 접근 제어 API"""
|
"""NKS 클러스터 API 엔드포인트 IP 접근 제어 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -975,7 +984,7 @@ class NksClusterIpAclView(APIView):
|
|||||||
# ==================== NKS Node Group API ====================
|
# ==================== NKS Node Group API ====================
|
||||||
|
|
||||||
|
|
||||||
class NksNodeGroupListView(APIView):
|
class NksNodeGroupListView(NHNBaseView):
|
||||||
"""NKS 노드 그룹 목록 조회 API"""
|
"""NKS 노드 그룹 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -992,7 +1001,7 @@ class NksNodeGroupListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeGroupCreateView(APIView):
|
class NksNodeGroupCreateView(NHNBaseView):
|
||||||
"""NKS 노드 그룹 생성 API"""
|
"""NKS 노드 그룹 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1023,7 +1032,7 @@ class NksNodeGroupCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeGroupDetailView(APIView):
|
class NksNodeGroupDetailView(NHNBaseView):
|
||||||
"""NKS 노드 그룹 상세/삭제/수정 API"""
|
"""NKS 노드 그룹 상세/삭제/수정 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1078,7 +1087,7 @@ class NksNodeGroupDetailView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeGroupUpgradeView(APIView):
|
class NksNodeGroupUpgradeView(NHNBaseView):
|
||||||
"""NKS 노드 그룹 업그레이드 API"""
|
"""NKS 노드 그룹 업그레이드 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1106,7 +1115,7 @@ class NksNodeGroupUpgradeView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeGroupUserScriptView(APIView):
|
class NksNodeGroupUserScriptView(NHNBaseView):
|
||||||
"""NKS 노드 그룹 사용자 스크립트 API"""
|
"""NKS 노드 그룹 사용자 스크립트 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1133,7 +1142,7 @@ class NksNodeGroupUserScriptView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeStartView(APIView):
|
class NksNodeStartView(NHNBaseView):
|
||||||
"""NKS 워커 노드 시작 API"""
|
"""NKS 워커 노드 시작 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1160,7 +1169,7 @@ class NksNodeStartView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksNodeStopView(APIView):
|
class NksNodeStopView(NHNBaseView):
|
||||||
"""NKS 워커 노드 중지 API"""
|
"""NKS 워커 노드 중지 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1187,7 +1196,7 @@ class NksNodeStopView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class NksAutoscaleConfigView(APIView):
|
class NksAutoscaleConfigView(NHNBaseView):
|
||||||
"""NKS 오토스케일러 설정 API"""
|
"""NKS 오토스케일러 설정 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1243,7 +1252,7 @@ storage_account_header = openapi.Parameter(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class StorageContainerListView(APIView):
|
class StorageContainerListView(NHNBaseView):
|
||||||
"""스토리지 컨테이너 목록 조회 API"""
|
"""스토리지 컨테이너 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1263,7 +1272,7 @@ class StorageContainerListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class StorageContainerCreateView(APIView):
|
class StorageContainerCreateView(NHNBaseView):
|
||||||
"""스토리지 컨테이너 생성 API (비동기)"""
|
"""스토리지 컨테이너 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1296,7 +1305,7 @@ class StorageContainerCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class StorageContainerDetailView(APIView):
|
class StorageContainerDetailView(NHNBaseView):
|
||||||
"""스토리지 컨테이너 상세/삭제 API"""
|
"""스토리지 컨테이너 상세/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1362,7 +1371,7 @@ def get_appkey(request):
|
|||||||
# ==================== DNS Zone API ====================
|
# ==================== DNS Zone API ====================
|
||||||
|
|
||||||
|
|
||||||
class DnsZoneListView(APIView):
|
class DnsZoneListView(NHNBaseView):
|
||||||
"""DNS Zone 목록 조회 API"""
|
"""DNS Zone 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1386,7 +1395,7 @@ class DnsZoneListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsZoneCreateView(APIView):
|
class DnsZoneCreateView(NHNBaseView):
|
||||||
"""DNS Zone 생성 API"""
|
"""DNS Zone 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1412,7 +1421,7 @@ class DnsZoneCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsZoneDetailView(APIView):
|
class DnsZoneDetailView(NHNBaseView):
|
||||||
"""DNS Zone 상세/수정/삭제 API"""
|
"""DNS Zone 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1465,7 +1474,7 @@ class DnsZoneDetailView(APIView):
|
|||||||
# ==================== DNS Record Set API ====================
|
# ==================== DNS Record Set API ====================
|
||||||
|
|
||||||
|
|
||||||
class DnsRecordSetListView(APIView):
|
class DnsRecordSetListView(NHNBaseView):
|
||||||
"""DNS 레코드 세트 목록 조회 API"""
|
"""DNS 레코드 세트 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1492,7 +1501,7 @@ class DnsRecordSetListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsRecordSetCreateView(APIView):
|
class DnsRecordSetCreateView(NHNBaseView):
|
||||||
"""DNS 레코드 세트 생성 API"""
|
"""DNS 레코드 세트 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1521,7 +1530,7 @@ class DnsRecordSetCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsRecordSetDetailView(APIView):
|
class DnsRecordSetDetailView(NHNBaseView):
|
||||||
"""DNS 레코드 세트 상세/수정/삭제 API"""
|
"""DNS 레코드 세트 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1580,7 +1589,7 @@ class DnsRecordSetDetailView(APIView):
|
|||||||
# ==================== DNS Pool API ====================
|
# ==================== DNS Pool API ====================
|
||||||
|
|
||||||
|
|
||||||
class DnsPoolListView(APIView):
|
class DnsPoolListView(NHNBaseView):
|
||||||
"""DNS Pool 목록 조회 API"""
|
"""DNS Pool 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1604,7 +1613,7 @@ class DnsPoolListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsPoolCreateView(APIView):
|
class DnsPoolCreateView(NHNBaseView):
|
||||||
"""DNS Pool 생성 API"""
|
"""DNS Pool 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1632,7 +1641,7 @@ class DnsPoolCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsPoolDetailView(APIView):
|
class DnsPoolDetailView(NHNBaseView):
|
||||||
"""DNS Pool 상세/수정/삭제 API"""
|
"""DNS Pool 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1691,7 +1700,7 @@ class DnsPoolDetailView(APIView):
|
|||||||
# ==================== DNS GSLB API ====================
|
# ==================== DNS GSLB API ====================
|
||||||
|
|
||||||
|
|
||||||
class DnsGslbListView(APIView):
|
class DnsGslbListView(NHNBaseView):
|
||||||
"""DNS GSLB 목록 조회 API"""
|
"""DNS GSLB 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1715,7 +1724,7 @@ class DnsGslbListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsGslbCreateView(APIView):
|
class DnsGslbCreateView(NHNBaseView):
|
||||||
"""DNS GSLB 생성 API"""
|
"""DNS GSLB 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1744,7 +1753,7 @@ class DnsGslbCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsGslbDetailView(APIView):
|
class DnsGslbDetailView(NHNBaseView):
|
||||||
"""DNS GSLB 상세/수정/삭제 API"""
|
"""DNS GSLB 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1801,7 +1810,7 @@ class DnsGslbDetailView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsGslbPoolConnectView(APIView):
|
class DnsGslbPoolConnectView(NHNBaseView):
|
||||||
"""GSLB에 Pool 연결/수정/해제 API"""
|
"""GSLB에 Pool 연결/수정/해제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1870,7 +1879,7 @@ class DnsGslbPoolConnectView(APIView):
|
|||||||
# ==================== DNS Health Check API ====================
|
# ==================== DNS Health Check API ====================
|
||||||
|
|
||||||
|
|
||||||
class DnsHealthCheckListView(APIView):
|
class DnsHealthCheckListView(NHNBaseView):
|
||||||
"""DNS Health Check 목록 조회 API"""
|
"""DNS Health Check 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1894,7 +1903,7 @@ class DnsHealthCheckListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsHealthCheckCreateView(APIView):
|
class DnsHealthCheckCreateView(NHNBaseView):
|
||||||
"""DNS Health Check 생성 API"""
|
"""DNS Health Check 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1927,7 +1936,7 @@ class DnsHealthCheckCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class DnsHealthCheckDetailView(APIView):
|
class DnsHealthCheckDetailView(NHNBaseView):
|
||||||
"""DNS Health Check 상세/수정/삭제 API"""
|
"""DNS Health Check 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -1991,7 +2000,7 @@ class DnsHealthCheckDetailView(APIView):
|
|||||||
# ==================== Load Balancer API ====================
|
# ==================== Load Balancer API ====================
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerListView(APIView):
|
class LoadBalancerListView(NHNBaseView):
|
||||||
"""로드밸런서 목록 조회 API"""
|
"""로드밸런서 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2017,7 +2026,7 @@ class LoadBalancerListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerCreateView(APIView):
|
class LoadBalancerCreateView(NHNBaseView):
|
||||||
"""로드밸런서 생성 API (비동기)"""
|
"""로드밸런서 생성 API (비동기)"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2049,7 +2058,7 @@ class LoadBalancerCreateView(APIView):
|
|||||||
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LoadBalancerDetailView(APIView):
|
class LoadBalancerDetailView(NHNBaseView):
|
||||||
"""로드밸런서 상세/수정/삭제 API"""
|
"""로드밸런서 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2123,7 +2132,7 @@ class LoadBalancerDetailView(APIView):
|
|||||||
# ==================== LB Listener API ====================
|
# ==================== LB Listener API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBListenerListView(APIView):
|
class LBListenerListView(NHNBaseView):
|
||||||
"""리스너 목록 조회 API"""
|
"""리스너 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2144,7 +2153,7 @@ class LBListenerListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBListenerCreateView(APIView):
|
class LBListenerCreateView(NHNBaseView):
|
||||||
"""리스너 생성 API"""
|
"""리스너 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2178,7 +2187,7 @@ class LBListenerCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBListenerDetailView(APIView):
|
class LBListenerDetailView(NHNBaseView):
|
||||||
"""리스너 상세/수정/삭제 API"""
|
"""리스너 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2239,7 +2248,7 @@ class LBListenerDetailView(APIView):
|
|||||||
# ==================== LB Pool API ====================
|
# ==================== LB Pool API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBPoolListView(APIView):
|
class LBPoolListView(NHNBaseView):
|
||||||
"""풀 목록 조회 API"""
|
"""풀 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2261,7 +2270,7 @@ class LBPoolListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBPoolCreateView(APIView):
|
class LBPoolCreateView(NHNBaseView):
|
||||||
"""풀 생성 API"""
|
"""풀 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2293,7 +2302,7 @@ class LBPoolCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBPoolDetailView(APIView):
|
class LBPoolDetailView(NHNBaseView):
|
||||||
"""풀 상세/수정/삭제 API"""
|
"""풀 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2353,7 +2362,7 @@ class LBPoolDetailView(APIView):
|
|||||||
# ==================== LB Member API ====================
|
# ==================== LB Member API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBMemberListView(APIView):
|
class LBMemberListView(NHNBaseView):
|
||||||
"""멤버 목록 조회 API"""
|
"""멤버 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2370,7 +2379,7 @@ class LBMemberListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBMemberCreateView(APIView):
|
class LBMemberCreateView(NHNBaseView):
|
||||||
"""멤버 추가 API"""
|
"""멤버 추가 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2400,7 +2409,7 @@ class LBMemberCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBMemberDetailView(APIView):
|
class LBMemberDetailView(NHNBaseView):
|
||||||
"""멤버 상세/수정/삭제 API"""
|
"""멤버 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2458,7 +2467,7 @@ class LBMemberDetailView(APIView):
|
|||||||
# ==================== LB Health Monitor API ====================
|
# ==================== LB Health Monitor API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBHealthMonitorListView(APIView):
|
class LBHealthMonitorListView(NHNBaseView):
|
||||||
"""헬스 모니터 목록 조회 API"""
|
"""헬스 모니터 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2478,7 +2487,7 @@ class LBHealthMonitorListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBHealthMonitorCreateView(APIView):
|
class LBHealthMonitorCreateView(NHNBaseView):
|
||||||
"""헬스 모니터 생성 API"""
|
"""헬스 모니터 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2513,7 +2522,7 @@ class LBHealthMonitorCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBHealthMonitorDetailView(APIView):
|
class LBHealthMonitorDetailView(NHNBaseView):
|
||||||
"""헬스 모니터 상세/수정/삭제 API"""
|
"""헬스 모니터 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2801,7 +2810,7 @@ class LBL7RuleDetailView(APIView):
|
|||||||
# ==================== LB IP ACL Group API ====================
|
# ==================== LB IP ACL Group API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBIpAclGroupListView(APIView):
|
class LBIpAclGroupListView(NHNBaseView):
|
||||||
"""IP ACL 그룹 목록 조회 API"""
|
"""IP ACL 그룹 목록 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2818,7 +2827,7 @@ class LBIpAclGroupListView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBIpAclGroupCreateView(APIView):
|
class LBIpAclGroupCreateView(NHNBaseView):
|
||||||
"""IP ACL 그룹 생성 API"""
|
"""IP ACL 그룹 생성 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2847,7 +2856,7 @@ class LBIpAclGroupCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBIpAclGroupDetailView(APIView):
|
class LBIpAclGroupDetailView(NHNBaseView):
|
||||||
"""IP ACL 그룹 상세/수정/삭제 API"""
|
"""IP ACL 그룹 상세/수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2905,7 +2914,7 @@ class LBIpAclGroupDetailView(APIView):
|
|||||||
# ==================== LB IP ACL Target API ====================
|
# ==================== LB IP ACL Target API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBIpAclTargetCreateView(APIView):
|
class LBIpAclTargetCreateView(NHNBaseView):
|
||||||
"""IP ACL 타깃 추가 API"""
|
"""IP ACL 타깃 추가 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2932,7 +2941,7 @@ class LBIpAclTargetCreateView(APIView):
|
|||||||
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class LBIpAclTargetDetailView(APIView):
|
class LBIpAclTargetDetailView(NHNBaseView):
|
||||||
"""IP ACL 타깃 수정/삭제 API"""
|
"""IP ACL 타깃 수정/삭제 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
@ -2978,7 +2987,7 @@ class LBIpAclTargetDetailView(APIView):
|
|||||||
# ==================== LB Quota API ====================
|
# ==================== LB Quota API ====================
|
||||||
|
|
||||||
|
|
||||||
class LBQuotaView(APIView):
|
class LBQuotaView(NHNBaseView):
|
||||||
"""로드밸런서 쿼타 조회 API"""
|
"""로드밸런서 쿼타 조회 API"""
|
||||||
|
|
||||||
@swagger_auto_schema(
|
@swagger_auto_schema(
|
||||||
|
|||||||
Reference in New Issue
Block a user