1 # Copyright 2019 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.
19 from rest_framework import status
20 from rest_framework.response import Response
22 from lcm.pub.exceptions import NFLCMException
23 from lcm.pub.exceptions import NFLCMExceptionPreconditionFailed
24 from lcm.pub.exceptions import NFLCMExceptionBadRequest
25 from lcm.pub.exceptions import NFLCMExceptionNotFound
26 from lcm.pub.exceptions import NFLCMExceptionConflict
27 from lcm.pub.exceptions import NFLCMExceptionSeeOther
28 from lcm.pub.database.models import NfInstModel
29 from lcm.pub.utils.jobutil import JobUtil
30 from lcm.nf.const import OPERATION_TYPE
31 from lcm.nf.serializers.vnf_instance import VnfInstanceSerializer
33 logger = logging.getLogger(__name__)
38 def make_error_resp(status, detail):
48 def view_safe_call_with_log(logger):
49 def view_safe_call(func):
50 def wrapper(*args, **kwargs):
52 return func(*args, **kwargs)
53 except NFLCMExceptionSeeOther as e:
54 logger.error(e.message)
55 resp = Response(status=status.HTTP_303_SEE_OTHER)
57 # resp["Location"] = "subscriptions/%s" % e.id
59 except NFLCMExceptionNotFound as e:
60 logger.error(e.message)
61 return make_error_resp(
63 status=status.HTTP_404_NOT_FOUND
65 except NFLCMExceptionBadRequest as e:
66 logger.error(e.message)
67 return make_error_resp(
69 status=status.HTTP_400_BAD_REQUEST
71 except NFLCMExceptionConflict as e:
72 logger.error(e.message)
73 return make_error_resp(
75 status=status.HTTP_409_CONFLICT
77 except NFLCMExceptionPreconditionFailed as e:
78 logger.error(e.message)
79 return make_error_resp(
81 status=status.HTTP_412_PRECONDITION_FAILED
83 except NFLCMException as e:
84 logger.error(e.message)
85 return make_error_resp(
87 status=status.HTTP_500_INTERNAL_SERVER_ERROR
89 except Exception as e:
90 logger.error(e.message)
91 logger.error(traceback.format_exc())
92 return make_error_resp(
93 detail='Unexpected exception',
94 status=status.HTTP_500_INTERNAL_SERVER_ERROR
100 def deal_vnf_action(logger, opt_type, opt_status, instid, req, req_serializer, act_task):
101 logger.debug("%s--post::> %s, %s", opt_type, instid, req.data)
103 act_vnf_req_serializer = req_serializer(data=req.data)
104 if not act_vnf_req_serializer.is_valid():
105 raise NFLCMException(act_vnf_req_serializer.errors)
107 vnf_insts = NfInstModel.objects.filter(nfinstid=instid)
108 if not vnf_insts.exists():
109 raise NFLCMExceptionNotFound("VNF(%s) does not exist." % instid)
111 if opt_type == OPERATION_TYPE.INSTANTIATE:
112 if vnf_insts[0].status == 'INSTANTIATED':
113 raise NFLCMExceptionConflict("VNF(%s) is already INSTANTIATED." % instid)
114 elif opt_type != OPERATION_TYPE.MODIFY_INFO:
115 if vnf_insts[0].status != 'INSTANTIATED':
116 raise NFLCMExceptionConflict("VNF(%s) is not INSTANTIATED." % instid)
118 job_id = JobUtil.create_job('NF', opt_type, instid)
119 JobUtil.add_job_status(job_id, 0, "VNF_%s_READY" % opt_type)
121 vnf_insts.update(status=opt_status)
122 act_task(req.data, instid, job_id).start()
124 return Response(data={"jobId": job_id}, status=status.HTTP_202_ACCEPTED)
127 def deal_indivdual_query(res_serializer, query_fun, *args):
130 res = query_fun(*args)
131 resp_serializer = res_serializer(data=res)
132 if not resp_serializer.is_valid():
133 raise NFLCMException(resp_serializer.errors)
135 resp = Response(data=resp_serializer.data, status=status.HTTP_200_OK)
136 if res_serializer == VnfInstanceSerializer:
137 CACHE_ETAG = "%s" % uuid.uuid1()
138 logger.debug("set CACHE_ETAG = %s", CACHE_ETAG)
139 resp["ETag"] = CACHE_ETAG