# 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.
+
import logging
import traceback
import json
from lcm.ns.vnfs.wait_job import wait_job_finish
from lcm.pub.config.config import REPORT_TO_AAI
-from lcm.pub.database.models import NfInstModel
-from lcm.ns.vnfs.const import VNF_STATUS, NFVO_VNF_INST_TIMEOUT_SECOND
-from lcm.pub.msapi.aai import query_vnf_aai, delete_vnf_aai
+from lcm.pub.database.models import NfInstModel, VmInstModel
+from lcm.ns.vnfs.const import VNF_STATUS, NFVO_VNF_INST_TIMEOUT_SECOND, INST_TYPE
+from lcm.pub.msapi.aai import query_vnf_aai, delete_vnf_aai, query_vserver_aai, delete_vserver_aai
+from lcm.pub.msapi.extsys import split_vim_to_owner_region, get_vim_by_id
from lcm.pub.utils.values import ignore_case_get
from lcm.pub.utils.jobutil import JOB_MODEL_STATUS, JobUtil
from lcm.pub.exceptions import NSLCMException
self.send_nf_terminate_to_vnfmDriver()
self.wait_vnfm_job_finish()
self.send_terminate_vnf_to_resMgr()
- self.delete_data_from_db()
if REPORT_TO_AAI:
+ self.delete_vserver_in_aai()
self.delete_vnf_in_aai()
+ self.delete_data_from_db()
except NSLCMException as e:
- self.exception(e.message)
- except Exception:
+ self.set_job_err(e.message)
+ except Exception as ex:
logger.error(traceback.format_exc())
- self.exception('unexpected exception')
+ self.set_job_err(ex.message)
def set_vnf_status(self, vnf_inst_info):
vnf_status = vnf_inst_info.status
vnf_inst_info.status = VNF_STATUS.TERMINATING
vnf_inst_info.save()
- def check_vnf_is_exist(self):
+ def get_vnf_inst(self):
vnf_inst = NfInstModel.objects.filter(nfinstid=self.vnf_inst_id)
if not vnf_inst.exists():
- logger.warning('[VNF terminate] Vnf terminate [%s] is not exist.' % self.vnf_inst_id)
+ logger.warning('[VNF terminate] Vnf terminate [%s] does not exist.' % self.vnf_inst_id)
return None
return vnf_inst[0]
JobUtil.add_job_status(self.job_id, progress, status_decs, error_code)
def initdata(self):
- vnf_inst_info = self.check_vnf_is_exist()
+ vnf_inst_info = self.get_vnf_inst()
if not vnf_inst_info:
self.add_progress(100, "TERM_VNF_NOT_EXIST_SUCCESS", "finished")
self.add_progress(2, "GET_VNF_INST_SUCCESS")
raise NSLCMException('[VNF terminate] Vnf instance is not exist.')
self.set_vnf_status(vnf_inst[0])
- def exception(self, error_msg):
+ def set_job_err(self, error_msg):
logger.error('VNF Terminate failed, detail message: %s' % error_msg)
NfInstModel.objects.filter(nfinstid=self.vnf_inst_id).update(status=VNF_STATUS.FAILED)
JobUtil.add_job_status(self.job_id, 255, 'VNF Terminate failed, detail message: %s' % error_msg, 0)
def send_nf_terminate_to_vnfmDriver(self):
req_param = json.JSONEncoder().encode({
- 'terminationType': self.terminationType,
+ 'terminationType': self.terminationType,
'gracefulTerminationTimeout': self.gracefulTerminationTimeout})
rsp = send_nf_terminate_request(self.vnfm_inst_id, self.vnf_uuid, req_param)
self.vnfm_job_id = ignore_case_get(rsp, 'jobId')
if not self.vnfm_job_id:
logger.warn("No Job, need not wait")
return
- ret = wait_job_finish(vnfm_id=self.vnfm_inst_id, vnfo_job_id=self.job_id,
- vnfm_job_id=self.vnfm_job_id, progress_range=[10, 90],
- timeout=NFVO_VNF_INST_TIMEOUT_SECOND)
+ ret = wait_job_finish(vnfm_id=self.vnfm_inst_id,
+ vnfo_job_id=self.job_id,
+ vnfm_job_id=self.vnfm_job_id,
+ progress_range=[10, 90],
+ timeout=NFVO_VNF_INST_TIMEOUT_SECOND)
if ret != JOB_MODEL_STATUS.FINISHED:
logger.error('VNF terminate failed on VNFM side.')
def delete_vnf_in_aai(self):
logger.debug("TerminateVnfs::delete_vnf_in_aai::delete vnf instance[%s] in aai." % self.vnf_inst_id)
+ try:
+ # query vnf instance in aai, get resource_version
+ customer_info = query_vnf_aai(self.vnf_inst_id)
+ resource_version = customer_info["resource-version"]
- # query vnf instance in aai, get resource_version
- customer_info = query_vnf_aai(self.vnf_inst_id)
- resource_version = customer_info["resource-version"]
-
- # delete vnf instance from aai
- resp_data, resp_status = delete_vnf_aai(self.vnf_inst_id, resource_version)
- if resp_data:
- logger.debug("Fail to delete vnf instance[%s] from aai, resp_status: [%s]." % (self.vnf_inst_id, resp_status))
- else:
+ # delete vnf instance from aai
+ resp_data, resp_status = delete_vnf_aai(self.vnf_inst_id, resource_version)
logger.debug(
- "Success to delete vnf instance[%s] from aai, resp_status: [%s]." % (self.vnf_inst_id, resp_status))
+ "Success to delete vnf[%s] from aai, resp_status: [%s]." % (self.vnf_inst_id, resp_status))
+ except NSLCMException as e:
+ logger.debug("Fail to delete vnf from aai[%s], detail message: %s" % (self.vnf_inst_id, e.message))
+ except:
+ logger.error(traceback.format_exc())
+
+ def delete_vserver_in_aai(self):
+ logger.debug("delete_vserver_in_aai start!")
+ try:
+ vm_inst_infos = VmInstModel.objects.filter(insttype=INST_TYPE.VNF, instid=self.vnf_inst_id)
+ for vm_inst_info in vm_inst_infos:
+ vserver_id = vm_inst_info.resouceid
+ vim_id = vm_inst_info.vimid
+ cloud_owner, cloud_region_id = split_vim_to_owner_region(vim_id)
+ # query vim_info from aai, get tenant
+ vim_info = get_vim_by_id(vim_id)
+ tenant_id = vim_info["tenantId"]
+
+ # query vserver instance in aai, get resource_version
+ vserver_info = query_vserver_aai(cloud_owner, cloud_region_id, tenant_id, vserver_id)
+ resource_version = vserver_info["resource-version"]
+
+ # delete vserver instance from aai
+ resp_data, resp_status = delete_vserver_aai(cloud_owner, cloud_region_id,
+ tenant_id, vserver_id, resource_version)
+ logger.debug(
+ "Success to delete vserver instance[%s] from aai, resp_status: [%s]." %
+ (vserver_id, resp_status))
+ logger.debug("delete_vserver_in_aai end!")
+ except NSLCMException as e:
+ logger.debug("Fail to delete vserver from aai, detail message: %s" % e.message)
+ except:
+ logger.error(traceback.format_exc())