class JobHistorySerializer(serializers.Serializer):
status = serializers.CharField(help_text="Status of job", required=True)
progress = serializers.CharField(help_text="Progress of job", required=True)
- statusDescription = serializers.CharField(help_text="Description of job", required=False)
- errorCode = serializers.CharField(help_text="Error code of job", required=False)
+ statusDescription = serializers.CharField(help_text="Description of job", required=False, allow_null=True)
+ errorCode = serializers.CharField(help_text="Error code of job", required=False, allow_null=True)
responseId = serializers.CharField(help_text="Response index of job", required=True)
class JobDescriptorSerializer(serializers.Serializer):
status = serializers.CharField(help_text="Status of job", required=True)
progress = serializers.CharField(help_text="Progress of job", required=True)
- statusDescription = serializers.CharField(help_text="Description of job", required=False)
- errorCode = serializers.CharField(help_text="Error code of job", required=False)
+ statusDescription = serializers.CharField(help_text="Description of job", required=False, allow_null=True)
+ errorCode = serializers.CharField(help_text="Error code of job", required=False, allow_null=True)
responseId = serializers.CharField(help_text="Response index of job", required=True)
responseHistoryList = JobHistorySerializer(help_text="History of job", many=True)
--- /dev/null
+# Copyright 2018 ZTE Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from rest_framework import serializers
+
+
+class ContextSerializer(serializers.Serializer):
+ globalCustomerId = serializers.CharField(help_text="Global customer ID", required=False, allow_null=True)
+ serviceType = serializers.CharField(help_text="Service type", required=False, allow_null=True)
+
+
+class CreateNsReqSerializer(serializers.Serializer):
+ csarId = serializers.CharField(help_text="Package ID of NS", required=False, allow_null=True)
+ nsName = serializers.CharField(help_text="Name of NS", required=False, allow_null=True)
+ description = serializers.CharField(help_text="Description of NS", required=False, allow_null=True)
+ context = ContextSerializer(help_text="Context of NS", required=False)
+
+
+class CreateNsRespSerializer(serializers.Serializer):
+ nsInstanceId = serializers.CharField(help_text="ID of NS instance", required=True)
+
+
+class VnfInstSerializer(serializers.Serializer):
+ vnfInstanceId = serializers.CharField(help_text="ID of VNF instance", required=True)
+ vnfInstanceName = serializers.CharField(help_text="Name of VNF instance", required=False, allow_null=True)
+ vnfdId = serializers.CharField(help_text="ID of VNFD", required=False, allow_null=True)
+
+
+class CpInstInfoSerializer(serializers.Serializer):
+ cpInstanceId = serializers.CharField(help_text="ID of CP instance", required=True)
+ cpInstanceName = serializers.CharField(help_text="Name of CP instance", required=False, allow_null=True)
+ cpdId = serializers.CharField(help_text="ID of CPD", required=False, allow_null=True)
+
+
+class VlInstSerializer(serializers.Serializer):
+ vlInstanceId = serializers.CharField(help_text="ID of VL instance", required=True)
+ vlInstanceName = serializers.CharField(help_text="Name of VL instance", required=False, allow_null=True)
+ vldId = serializers.CharField(help_text="ID of VLD", required=False, allow_null=True)
+ relatedCpInstanceId = CpInstInfoSerializer(help_text="Related CP instances", many=True)
+
+
+class VnffgInstSerializer(serializers.Serializer):
+ vnffgInstanceId = serializers.CharField(help_text="ID of VNFFG instance", required=True)
+ vnfdId = serializers.CharField(help_text="ID of VNFD", required=False, allow_null=True)
+ pnfId = serializers.CharField(help_text="ID of PNF", required=False, allow_null=True)
+ virtualLinkId = serializers.CharField(help_text="ID of virtual link", required=False, allow_null=True)
+ cpdId = serializers.CharField(help_text="ID of CPD", required=False, allow_null=True)
+ nfp = serializers.CharField(help_text="nfp", required=False, allow_null=True)
+
+
+class QueryNsRespSerializer(serializers.Serializer):
+ nsInstanceId = serializers.CharField(help_text="ID of NS instance", required=True)
+ nsName = serializers.CharField(help_text="Name of NS instance", required=False, allow_null=True)
+ description = serializers.CharField(help_text="Description of NS instance", required=False, allow_null=True)
+ nsdId = serializers.CharField(help_text="ID of NSD", required=True)
+ vnfInfo = VnfInstSerializer(help_text="VNF instances", many=True, required=False, allow_null=True)
+ vlInfo = VlInstSerializer(help_text="VL instances", many=True, required=False, allow_null=True)
+ vnffgInfo = VnffgInstSerializer(help_text="VNFFG instances", many=True, required=False, allow_null=True)
+ nsState = serializers.CharField(help_text="State of NS instance", required=False, allow_null=True)
+
+
+class VimSerializer(serializers.Serializer):
+ vimid = serializers.CharField(help_text="ID of VIM", required=False, allow_null=True)
+
+
+class LocationConstraintSerializer(serializers.Serializer):
+ vnfProfileId = serializers.CharField(help_text="ID of VNF profile", required=False, allow_null=True)
+ locationConstraints = VimSerializer(help_text="Location constraints", required=False, allow_null=True)
+
+
+class InstantNsReqSerializer(serializers.Serializer):
+ locationConstraints = LocationConstraintSerializer(required=False, allow_null=True)
+ additionalParamForNs = serializers.CharField(help_text="Additional param for NS", required=False, allow_null=True)
+
+
+class NsOperateJobSerializer(serializers.Serializer):
+ jobId = serializers.CharField(help_text="ID of NS operate job", required=True)
+
+
+class TerminateNsReqSerializer(serializers.Serializer):
+ terminationType = serializers.CharField(help_text="Type of NS termination", required=False, allow_null=True)
+ gracefulTerminationTimeout = serializers.CharField(help_text="Timeout of NS graceful termination", required=False, allow_null=True)
mock_do_biz.side_effect = NSLCMException("nsd not exists.")
new_nsd_id = '1'
data = {
- 'nsdid': new_nsd_id,
- 'nsname': 'ns',
+ 'csarId': new_nsd_id,
+ 'nsName': 'ns',
'description': 'description'
}
response = self.client.post("/api/nslcm/v1/ns", data=data)
\r
def test_query_all_nsinstance(self):\r
response = self.client.get("/api/nslcm/v1/ns")\r
- self.failUnlessEqual(status.HTTP_200_OK, response.status_code)\r
+ self.failUnlessEqual(status.HTTP_200_OK, response.status_code, response.data)\r
self.assertIsNotNone(response.data)\r
self.assertEqual(2, len(response.data))\r
\r
@mock.patch.object(TerminateNsService, 'run')
def test_terminate_vnf_url(self, mock_run):
- mock_run.re.return_value = None
+ mock_run.re.return_value = "1"
req_data = {
"terminationType": "forceful",
"gracefulTerminationTimeout": "600"}
response = self.client.post("/api/nslcm/v1/ns/%s/terminate" % self.ns_inst_id, data=req_data)
- self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code)
+ self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code, response.data)
response = self.client.delete("/api/nslcm/v1/ns/%s" % self.ns_inst_id)
self.failUnlessEqual(status.HTTP_204_NO_CONTENT, response.status_code)
@mock.patch.object(TerminateNsService, 'run')
def test_terminate_non_existing_ns_inst_id(self, mock_run):
- mock_run.re.return_value = None
+ mock_run.re.return_value = "1"
ns_inst_id = '100'
"terminationType": "forceful",
"gracefulTerminationTimeout": "600"}
response = self.client.post("/api/nslcm/v1/ns/%s/terminate" % ns_inst_id, data=req_data)
- self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code)
+ self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code, response.data)
self.assertRaises(NSInstModel.DoesNotExist, NSInstModel.objects.get, id=ns_inst_id)
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
+from drf_yasg.utils import swagger_auto_schema
from lcm.ns.ns_create import CreateNSService
from lcm.ns.ns_delete import DeleteNsService
from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE
from lcm.pub.utils.restcall import req_by_msb
from lcm.pub.utils.values import ignore_case_get
+from lcm.ns.serializers import CreateNsReqSerializer, CreateNsRespSerializer
+from lcm.ns.serializers import QueryNsRespSerializer
+from lcm.ns.serializers import NsOperateJobSerializer
+from lcm.ns.serializers import InstantNsReqSerializer
+from lcm.ns.serializers import TerminateNsReqSerializer
+from lcm.pub.exceptions import NSLCMException
logger = logging.getLogger(__name__)
class CreateNSView(APIView):
+ @swagger_auto_schema(
+ request_body=None,
+ responses={
+ status.HTTP_200_OK: QueryNsRespSerializer(help_text="NS instances", many=True),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
+ }
+ )
def get(self, request):
- logger.debug("CreateNSView::get")
- filter = None
- csarId = ignore_case_get(request.META, 'csarId')
- if csarId:
- filter = {"csarId": csarId}
-
- ret = GetNSInfoService(filter).get_ns_info()
- logger.debug("CreateNSView::get::ret=%s", ret)
- return Response(data=ret, status=status.HTTP_200_OK)
+ try:
+ logger.debug("CreateNSView::get")
+ filter = None
+ csarId = ignore_case_get(request.META, 'csarId')
+ if csarId:
+ filter = {"csarId": csarId}
+
+ ret = GetNSInfoService(filter).get_ns_info()
+ logger.debug("CreateNSView::get::ret=%s", ret)
+ resp_serializer = QueryNsRespSerializer(data=ret, many=True)
+ if not resp_serializer.is_valid():
+ raise NSLCMException(resp_serializer.errors)
+ return Response(data=resp_serializer.data, status=status.HTTP_200_OK)
+ except Exception as e:
+ logger.error(traceback.format_exc())
+ logger.error("Exception in GetNS: %s", e.message)
+ return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
+ @swagger_auto_schema(
+ request_body=CreateNsReqSerializer(),
+ responses={
+ status.HTTP_201_CREATED: CreateNsRespSerializer(),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
+ }
+ )
def post(self, request):
logger.debug("Enter CreateNS: %s", request.data)
- if ignore_case_get(request.data, 'test') == "test":
- return Response(data={'nsInstanceId': "test"}, status=status.HTTP_201_CREATED)
- # nsd_id = ignore_case_get(request.data, 'nsdId')
- csar_id = ignore_case_get(request.data, 'csarId')
- ns_name = ignore_case_get(request.data, 'nsName')
- description = ignore_case_get(request.data, 'description')
- context = ignore_case_get(request.data, 'context')
try:
+ req_serializer = CreateNsReqSerializer(data=request.data)
+ if not req_serializer.is_valid():
+ raise NSLCMException(req_serializer.errors)
+
+ if ignore_case_get(request.data, 'test') == "test":
+ return Response(data={'nsInstanceId': "test"}, status=status.HTTP_201_CREATED)
+ csar_id = ignore_case_get(request.data, 'csarId')
+ ns_name = ignore_case_get(request.data, 'nsName')
+ description = ignore_case_get(request.data, 'description')
+ context = ignore_case_get(request.data, 'context')
ns_inst_id = CreateNSService(csar_id, ns_name, description, context).do_biz()
+
+ logger.debug("CreateNSView::post::ret={'nsInstanceId':%s}", ns_inst_id)
+ resp_serializer = CreateNsRespSerializer(data={'nsInstanceId': ns_inst_id})
+ if not resp_serializer.is_valid():
+ raise NSLCMException(resp_serializer.errors)
+ return Response(data=resp_serializer.data, status=status.HTTP_201_CREATED)
except Exception as e:
logger.error(traceback.format_exc())
logger.error("Exception in CreateNS: %s", e.message)
return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
- logger.debug("CreateNSView::post::ret={'nsInstanceId':%s}", ns_inst_id)
- return Response(data={'nsInstanceId': ns_inst_id}, status=status.HTTP_201_CREATED)
class NSInstView(APIView):
+ @swagger_auto_schema(
+ request_body=InstantNsReqSerializer(),
+ responses={
+ status.HTTP_200_OK: NsOperateJobSerializer(),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
+ }
+ )
def post(self, request, ns_instance_id):
+ logger.debug("Enter NSInstView::post::ns_instance_id=%s", ns_instance_id)
+ req_serializer = InstantNsReqSerializer(data=request.data)
+ if not req_serializer.is_valid():
+ return Response({'error': req_serializer.errors},
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR)
ack = InstantNSService(ns_instance_id, request.data).do_biz()
+ resp_serializer = NsOperateJobSerializer(data=ack['data'])
+ if not resp_serializer.is_valid():
+ return Response({'error': resp_serializer.errors},
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR)
logger.debug("Leave NSInstView::post::ack=%s", ack)
- return Response(data=ack['data'], status=ack['status'])
+ return Response(data=resp_serializer.data, status=ack['status'])
class TerminateNSView(APIView):
+ @swagger_auto_schema(
+ request_body=TerminateNsReqSerializer(),
+ responses={
+ status.HTTP_202_ACCEPTED: NsOperateJobSerializer(),
+ status.HTTP_500_INTERNAL_SERVER_ERROR: "Inner error"
+ }
+ )
def post(self, request, ns_instance_id):
- logger.debug("Enter TerminateNSView::post %s", request.data)
- termination_type = ignore_case_get(request.data, 'terminationType')
- graceful_termination_timeout = ignore_case_get(request.data, 'gracefulTerminationTimeout')
- job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, ns_instance_id)
try:
+ logger.debug("Enter TerminateNSView::post %s", request.data)
+ req_serializer = TerminateNsReqSerializer(data=request.data)
+ if not req_serializer.is_valid():
+ raise NSLCMException(req_serializer.errors)
+
+ termination_type = ignore_case_get(request.data, 'terminationType')
+ graceful_termination_timeout = ignore_case_get(request.data, 'gracefulTerminationTimeout')
+ job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, ns_instance_id)
TerminateNsService(ns_instance_id, termination_type, graceful_termination_timeout, job_id).start()
+
+ resp_serializer = NsOperateJobSerializer(data={'jobId': job_id})
+ if not resp_serializer.is_valid():
+ raise NSLCMException(resp_serializer.errors)
+ logger.debug("Leave TerminateNSView::post ret=%s", resp_serializer.data)
+ return Response(data=resp_serializer.data, status=status.HTTP_202_ACCEPTED)
except Exception as e:
logger.error("Exception in CreateNS: %s", e.message)
return Response(data={'error': e.message}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
- ret = {'jobId': job_id}
- logger.debug("Leave TerminateNSView::post ret=%s", ret)
- return Response(data=ret, status=status.HTTP_202_ACCEPTED)
class NSHealView(APIView):
# for swagger
drf-yasg>=1.2.2
-Pillow>=4.3.0
-pygments>=2.2.0
-django-cors-headers>=2.1.0
-django-filter>=1.1.0,<2.0
-djangorestframework-camel-case>=0.2.0
-dj-database-url>=0.4.2
-user_agents>=1.1.0
# for the validation feature
flex>=6.11.1
swagger-spec-validator>=2.1.0
-