1 # Copyright 2017 Intel 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.
20 from lcm.ns.const import NS_INST_STATUS
21 from lcm.pub.database.models import JobModel, NSInstModel
22 from lcm.pub.exceptions import NSLCMException
23 from lcm.pub.utils.jobutil import JobUtil, JOB_MODEL_STATUS
24 from lcm.pub.utils.values import ignore_case_get
25 from lcm.ns_vnfs.biz.heal_vnfs import NFHealService
28 logger = logging.getLogger(__name__)
31 class NSHealService(threading.Thread):
32 def __init__(self, ns_instance_id, request_data, job_id):
33 super(NSHealService, self).__init__()
34 self.ns_instance_id = ns_instance_id
35 self.request_data = request_data
38 self.heal_vnf_data = ''
39 self.heal_ns_data = ''
44 except NSLCMException as e:
45 JobUtil.add_job_status(self.job_id, JOB_ERROR, e.message)
47 logger.error(traceback.format_exc())
48 JobUtil.add_job_status(self.job_id, JOB_ERROR, 'ns heal fail')
51 self.update_job(1, desc='ns heal start')
52 self.get_and_check_params()
53 self.update_ns_status(NS_INST_STATUS.HEALING)
55 self.update_ns_status(NS_INST_STATUS.ACTIVE)
56 self.update_job(100, desc='ns heal success')
58 def get_and_check_params(self):
59 ns_info = NSInstModel.objects.filter(id=self.ns_instance_id)
61 logger.error('NS [id=%s] does not exist' % self.ns_instance_id)
62 raise NSLCMException('NS [id=%s] does not exist' % self.ns_instance_id)
63 self.heal_ns_data = ignore_case_get(self.request_data, 'healNsData')
64 self.heal_vnf_data = ignore_case_get(self.request_data, 'healVnfData')
65 if self.heal_ns_data and self.heal_vnf_data:
66 logger.error('healNsData and healVnfData can not exist together')
67 raise NSLCMException('healNsData and healVnfData can not exist together')
68 if not self.heal_ns_data and not self.heal_vnf_data:
69 logger.error('healNsData and healVnfData parameters does not exist or value is incorrect.')
70 raise NSLCMException('healNsData and healVnfData parameters does not exist or value is incorrect.')
72 logger.info('The request of healNsData is being updated')
73 raise NSLCMException('The request of healNsData is being updated')
75 def do_vnfs_heal(self):
76 vnf_heal_params = self.prepare_vnf_heal_params(self.heal_vnf_data)
77 # count = len(self.heal_vnf_data)
78 # Only one VNF is supported to heal.
79 status = self.do_vnf_heal(vnf_heal_params, 15)
80 if status is JOB_MODEL_STATUS.FINISHED:
81 logger.info('nf[%s] heal handle end' % vnf_heal_params.get('vnfInstanceId'))
83 desc='nf[%s] heal handle end' % vnf_heal_params.get('vnfInstanceId'))
85 logger.error('nf heal failed')
86 raise NSLCMException('nf heal failed')
88 def do_vnf_heal(self, vnf_heal_params, progress):
89 vnf_instance_id = vnf_heal_params.get('vnfInstanceId')
90 nf_service = NFHealService(vnf_instance_id, vnf_heal_params)
92 self.update_job(progress, desc='nf[%s] heal handle start' % vnf_instance_id)
93 status = self.wait_job_finish(nf_service.job_id)
96 def prepare_vnf_heal_params(self, vnf_data):
97 vnf_instance_id = ignore_case_get(vnf_data, 'vnfInstanceId')
98 cause = ignore_case_get(vnf_data, "cause")
99 additional_params = ignore_case_get(vnf_data, "additionalParams")
101 "vnfInstanceId": vnf_instance_id,
103 "additionalParams": additional_params
108 def wait_job_finish(sub_job_id, timeout=3600):
110 start_time = end_time = datetime.datetime.now()
111 while (end_time - start_time).seconds < timeout:
112 job_result = JobModel.objects.get(jobid=sub_job_id)
113 time.sleep(query_interval)
114 end_time = datetime.datetime.now()
115 if job_result.progress == 100:
116 return JOB_MODEL_STATUS.FINISHED
117 elif job_result.progress > 100:
118 return JOB_MODEL_STATUS.ERROR
121 return JOB_MODEL_STATUS.TIMEOUT
123 def update_job(self, progress, desc=''):
124 JobUtil.add_job_status(self.job_id, progress, desc)
126 def update_ns_status(self, status):
127 NSInstModel.objects.filter(id=self.ns_instance_id).update(status=status)