1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
18 from drf_yasg import openapi
19 from drf_yasg.utils import no_body, swagger_auto_schema
20 from rest_framework import status
21 from rest_framework.decorators import api_view
22 from rest_framework.response import Response
23 from genericparser.packages.biz import sdc_vnf_package, sdc_ns_package
24 from genericparser.packages.biz.pnf_descriptor import PnfDescriptor
25 from genericparser.packages.biz.sdc_service_package import ServicePackage
26 from genericparser.packages.serializers.genericparser_serializers import InternalErrorRequestSerializer, \
27 ServicePackageDistributeRequestSerializer, ServicePackagesSerializer, ServicePackageSerializer
28 from genericparser.packages.serializers.genericparser_serializers import NfPackageDistributeRequestSerializer
29 from genericparser.packages.serializers.genericparser_serializers import NfPackageSerializer
30 from genericparser.packages.serializers.genericparser_serializers import NfPackagesSerializer
31 from genericparser.packages.serializers.genericparser_serializers import NsPackageDistributeRequestSerializer
32 from genericparser.packages.serializers.genericparser_serializers import NsPackageDistributeResponseSerializer
33 from genericparser.packages.serializers.genericparser_serializers import NsPackageSerializer
34 from genericparser.packages.serializers.genericparser_serializers import NsPackagesSerializer
35 from genericparser.packages.serializers.genericparser_serializers import ParseModelRequestSerializer
36 from genericparser.packages.serializers.genericparser_serializers import ParseModelResponseSerializer
37 from genericparser.packages.serializers.genericparser_serializers import PostJobResponseSerializer
38 from genericparser.packages.views.common import fmt_error_rsp
39 from genericparser.pub.exceptions import PackageNotFoundException, PackageHasExistsException
40 from genericparser.pub.utils.syscomm import fun_name
41 from genericparser.pub.utils.values import ignore_case_get
43 logger = logging.getLogger(__name__)
48 operation_description="On distribute NS package",
49 request_body=NsPackageDistributeRequestSerializer,
51 status.HTTP_202_ACCEPTED: NsPackageDistributeResponseSerializer,
52 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
55 operation_description="Query NS packages",
58 status.HTTP_200_OK: NsPackagesSerializer,
59 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
60 @api_view(http_method_names=['POST', 'GET'])
61 def nspackages_rc(request, *args, **kwargs):
62 logger.debug("Enter %s, method is %s", fun_name(), request.method)
63 ret, normal_status, response_serializer, validation_error = None, None, None, None
65 if request.method == 'GET':
66 # Gets ns package list
67 ret = sdc_ns_package.ns_get_csars()
68 normal_status = status.HTTP_200_OK
71 response_serializer = NsPackagesSerializer(data=ret[1])
72 validation_error = handleValidatonError(
73 response_serializer, False)
75 return validation_error
76 elif request.method == 'POST':
77 # Distributes the package accroding to the given csarId
78 request_serializer = NsPackageDistributeRequestSerializer(data=request.data)
79 validation_error = handleValidatonError(request_serializer, True)
81 return validation_error
83 csar_id = ignore_case_get(request.data, "csarId")
84 logger.debug("csar_id is %s", csar_id)
85 ret = sdc_ns_package.ns_on_distribute(csar_id)
86 normal_status = status.HTTP_202_ACCEPTED
88 logger.debug("Leave %s, Return value is %s", fun_name(), ret)
93 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
95 return Response(data=ret[1], status=normal_status)
100 operation_description="On distribute Nf package",
101 request_body=NfPackageDistributeRequestSerializer(),
103 status.HTTP_202_ACCEPTED: PostJobResponseSerializer,
104 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
105 @swagger_auto_schema(
107 operation_description="Query Nf packages",
108 request_body=no_body,
110 status.HTTP_200_OK: NfPackagesSerializer,
111 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
112 @api_view(http_method_names=['POST', 'GET'])
113 def nfpackages_rc(request, *args, **kwargs):
115 "Enter %s%s, method is %s",
119 ret, normal_status, response_serializer, validation_error = None, None, None, None
120 if request.method == 'GET':
121 ret = sdc_vnf_package.nf_get_csars()
122 normal_status = status.HTTP_200_OK
123 response_serializer = NfPackagesSerializer(data=ret[1])
124 elif request.method == 'POST':
125 request_serivalizer = NfPackageDistributeRequestSerializer(
127 validation_error = handleValidatonError(
128 request_serivalizer, True)
130 return validation_error
132 csar_id = ignore_case_get(request_serivalizer.data, "csarId")
133 vim_ids = ignore_case_get(request_serivalizer.data, "vimIds")
134 lab_vim_id = ignore_case_get(request_serivalizer.data, "labVimId")
135 job_id = str(uuid.uuid4())
136 sdc_vnf_package.NfDistributeThread(
137 csar_id, vim_ids, lab_vim_id, job_id).start()
138 ret = [0, {"jobId": job_id}]
139 normal_status = status.HTTP_202_ACCEPTED
141 response_serializer = PostJobResponseSerializer(data=ret[1])
142 logger.debug("Leave %s, Return value is %s", fun_name(), ret)
148 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
150 validation_error = handleValidatonError(
151 response_serializer, False)
153 return validation_error
155 return Response(data=response_serializer.data, status=normal_status)
158 @swagger_auto_schema(
160 operation_description="Delete one NS package",
161 request_body=no_body,
167 type=openapi.TYPE_STRING)],
169 status.HTTP_200_OK: NsPackageDistributeResponseSerializer,
170 status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
173 type=openapi.TYPE_STRING))})
174 @swagger_auto_schema(
176 operation_description="Query one NS package",
177 request_body=no_body,
183 type=openapi.TYPE_STRING)],
185 status.HTTP_200_OK: NsPackageSerializer,
186 status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
189 type=openapi.TYPE_STRING))})
190 @api_view(http_method_names=['DELETE', 'GET'])
191 def ns_rd_csar(request, *args, **kwargs):
192 csar_id = ignore_case_get(kwargs, "csarId")
193 logger.info("Enter %s, method is %s, csar_id is %s",
194 fun_name(), request.method, csar_id)
195 ret, normal_status, response_serializer, validation_error = None, None, None, None
196 if request.method == 'GET':
197 ret = sdc_ns_package.ns_get_csar(csar_id)
198 normal_status = status.HTTP_200_OK
200 response_serializer = NsPackageSerializer(data=ret[1])
201 validation_error = handleValidatonError(response_serializer, False)
203 return validation_error
204 elif request.method == 'DELETE':
205 ret = sdc_ns_package.ns_delete_csar(csar_id)
206 normal_status = status.HTTP_200_OK
207 logger.info("Leave %s, Return value is %s", fun_name(), ret)
212 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
213 return Response(data=ret[1], status=normal_status)
216 @swagger_auto_schema(
218 operation_description="On distribute Service package",
219 request_body=ServicePackageDistributeRequestSerializer,
221 status.HTTP_202_ACCEPTED: "",
222 status.HTTP_400_BAD_REQUEST: InternalErrorRequestSerializer,
223 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
224 @swagger_auto_schema(
226 operation_description="Query Service packages",
227 request_body=no_body,
229 status.HTTP_200_OK: ServicePackagesSerializer,
230 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
231 @api_view(http_method_names=['POST', 'GET'])
232 def servicepackages_rc(request, *args, **kwargs):
233 logger.debug("Enter %s, method is %s", fun_name(), request.method)
235 if request.method == 'GET':
236 # Gets service package list
238 csar_list = ServicePackage().get_csars()
239 response_serializer = ServicePackagesSerializer(data=csar_list)
240 validation_error = handleValidatonError(response_serializer, False)
242 return validation_error
243 return Response(data=csar_list, status=status.HTTP_200_OK)
244 except Exception as e:
245 error_status = status.HTTP_500_INTERNAL_SERVER_ERROR
246 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
247 elif request.method == 'POST':
248 # Distributes the package according to the given csarId
249 request_serializer = ServicePackageDistributeRequestSerializer(data=request.data)
250 validation_error = handleValidatonError(request_serializer, True)
252 return validation_error
254 csar_id = ignore_case_get(request.data, "csarId")
255 logger.debug("csar_id is %s", csar_id)
257 ServicePackage().on_distribute(csar_id)
258 return Response(status=status.HTTP_202_ACCEPTED)
259 except PackageHasExistsException as e:
260 error_status = status.HTTP_400_BAD_REQUEST
261 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
262 except Exception as e:
263 error_status = status.HTTP_500_INTERNAL_SERVER_ERROR
264 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
267 @swagger_auto_schema(
269 operation_description="Delete one Service package",
270 request_body=no_body,
276 type=openapi.TYPE_STRING)],
278 status.HTTP_204_NO_CONTENT: "",
279 status.HTTP_404_NOT_FOUND: InternalErrorRequestSerializer,
280 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
281 @swagger_auto_schema(
283 operation_description="Query one Service package",
284 request_body=no_body,
290 type=openapi.TYPE_STRING)],
292 status.HTTP_200_OK: ServicePackageSerializer,
293 status.HTTP_404_NOT_FOUND: InternalErrorRequestSerializer,
294 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
295 @api_view(http_method_names=['DELETE', 'GET'])
296 def service_rd_csar(request, *args, **kwargs):
297 csar_id = ignore_case_get(kwargs, "csarId")
298 logger.info("Enter %s, method is %s, csar_id is %s", fun_name(), request.method, csar_id)
300 if request.method == 'GET':
302 ret = ServicePackage().get_csar(csar_id)
303 response_serializer = ServicePackageSerializer(data=ret)
304 validation_error = handleValidatonError(response_serializer, False)
306 return validation_error
307 return Response(data=ret, status=status.HTTP_200_OK)
308 except PackageNotFoundException as e:
309 error_status = status.HTTP_404_NOT_FOUND
310 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
311 except Exception as e:
312 error_status = status.HTTP_500_INTERNAL_SERVER_ERROR
313 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
315 elif request.method == 'DELETE':
317 ServicePackage().delete_csar(csar_id)
318 return Response(status=status.HTTP_204_NO_CONTENT)
319 except PackageNotFoundException as e:
320 error_status = status.HTTP_404_NOT_FOUND
321 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
322 except Exception as e:
323 error_status = status.HTTP_500_INTERNAL_SERVER_ERROR
324 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
327 @swagger_auto_schema(
329 operation_description="Delete one Nf package",
330 request_body=no_body,
336 type=openapi.TYPE_STRING)],
338 status.HTTP_202_ACCEPTED: PostJobResponseSerializer,
339 status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
342 type=openapi.TYPE_STRING))})
343 @swagger_auto_schema(
345 operation_description="Query one Nf package",
346 request_body=no_body,
352 type=openapi.TYPE_STRING)],
354 status.HTTP_200_OK: NfPackageSerializer,
355 status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
358 type=openapi.TYPE_STRING))})
359 @api_view(http_method_names=['DELETE', 'GET'])
360 def nf_rd_csar(request, *args, **kwargs):
361 csar_id = ignore_case_get(kwargs, "csarId")
362 logger.info("Enter %s, method is %s, csar_id is %s",
363 fun_name(), request.method, csar_id)
364 ret, normal_status, response_serializer, validation_error = None, None, None, None
366 if request.method == 'GET':
367 ret = sdc_vnf_package.nf_get_csar(csar_id)
368 normal_status = status.HTTP_200_OK
369 response_serializer = NfPackageSerializer(data=ret[1])
371 elif request.method == 'DELETE':
372 job_id = str(uuid.uuid4())
373 sdc_vnf_package.NfPkgDeleteThread(csar_id, job_id).start()
374 ret = [0, {"jobId": job_id}]
375 normal_status = status.HTTP_202_ACCEPTED
376 response_serializer = PostJobResponseSerializer(data=ret[1])
378 logger.info("Leave %s, Return value is %s", fun_name(), ret)
383 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
385 validation_error = handleValidatonError(
386 response_serializer, False)
388 return validation_error
390 return Response(data=response_serializer.data, status=normal_status)
393 @swagger_auto_schema(
395 operation_description="Parse model(NS, Service, VNF, PNF)",
396 request_body=ParseModelRequestSerializer,
398 status.HTTP_202_ACCEPTED: ParseModelResponseSerializer,
399 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
400 @api_view(http_method_names=['POST'])
401 def model_parser(request, *args, **kwargs):
402 csar_id = ignore_case_get(request.data, "csarId")
403 package_type = ignore_case_get(request.data, "packageType")
404 inputs = ignore_case_get(request.data, "inputs")
406 "Enter %s, csar_id=%s, package_type=%s, inputs=%s",
412 if package_type.lower().__eq__("service"):
414 ret = ServicePackage().parse_serviced(csar_id, inputs)
415 response_serializer = ParseModelResponseSerializer(data=ret)
416 validation_error = handleValidatonError(
417 response_serializer, False)
419 return validation_error
420 return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED)
421 except PackageNotFoundException as e:
422 error_status = status.HTTP_404_NOT_FOUND
423 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
424 except Exception as e:
425 error_status = status.HTTP_500_INTERNAL_SERVER_ERROR
426 return Response(data=fmt_error_rsp(e.args[0], error_status), status=error_status)
427 elif package_type.lower().__eq__("ns"):
428 ret = sdc_ns_package.parse_nsd(csar_id, inputs)
429 elif package_type.lower().__eq__("vnf"):
430 ret = sdc_vnf_package.parse_vnfd(csar_id, inputs)
431 elif package_type.lower().__eq__("pnf"):
432 ret = PnfDescriptor().parse_pnfd(csar_id, inputs)
434 error_status = status.HTTP_400_BAD_REQUEST
435 error_message = "Invalid package type, it should be one of [VNF, PNF, NS, Service]"
436 return Response(data=fmt_error_rsp(error_message, error_status), status=error_status)
442 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
444 response_serializer = ParseModelResponseSerializer(data=ret[1])
445 validation_error = handleValidatonError(
446 response_serializer, False)
448 return validation_error
450 return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED)
453 @swagger_auto_schema(
455 operation_description="Parse NS model",
456 request_body=ParseModelRequestSerializer,
458 status.HTTP_202_ACCEPTED: ParseModelResponseSerializer,
459 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
460 @api_view(http_method_names=['POST'])
461 def ns_model_parser(request, *args, **kwargs):
462 csar_id = ignore_case_get(request.data, "csarId")
463 inputs = ignore_case_get(request.data, "inputs")
465 "Enter %s, csar_id=%s, inputs=%s",
469 ret = sdc_ns_package.parse_nsd(csar_id, inputs)
470 logger.info("Leave %s, Return value is %s", fun_name(), ret)
475 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
477 response_serializer = ParseModelResponseSerializer(data=ret[1])
478 validation_error = handleValidatonError(
479 response_serializer, False)
481 return validation_error
483 return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED)
486 @swagger_auto_schema(
488 operation_description="Parse NF model",
489 request_body=ParseModelRequestSerializer,
491 status.HTTP_202_ACCEPTED: ParseModelResponseSerializer,
492 status.HTTP_500_INTERNAL_SERVER_ERROR: InternalErrorRequestSerializer})
493 @api_view(http_method_names=['POST'])
494 def vnf_model_parser(request, *args, **kwargs):
495 csar_id = ignore_case_get(request.data, "csarId")
496 inputs = ignore_case_get(request.data, "inputs")
498 "Enter %s, csar_id=%s, inputs=%s",
502 ret = sdc_vnf_package.parse_vnfd(csar_id, inputs)
503 logger.info("Leave %s, Return value is %s", fun_name(), ret)
508 status=status.HTTP_500_INTERNAL_SERVER_ERROR)
510 response_serializer = ParseModelResponseSerializer(data=ret[1])
511 validation_error = handleValidatonError(
512 response_serializer, False)
514 return validation_error
516 return Response(data=response_serializer.data, status=status.HTTP_202_ACCEPTED)
519 def handleValidatonError(base_serializer, is_request):
522 if not base_serializer.is_valid():
523 errormessage = base_serializer.errors
524 logger.error(errormessage)
527 message = 'Invalid request'
529 message = 'Invalid response'
530 logger.error(message)
532 data={'error': errormessage},
533 status=status.HTTP_500_INTERNAL_SERVER_ERROR)