Beispiel #1
0
 def save_vnffg_inst_data(self):
     VNFFGInstModel(
         vnffgdid="vnffg_id1",
         vnffginstid="vnffg_inst_1",
         nsinstid="ns_inst_1",
         endpointnumber=2,
         vllist="vlinst1",
         cplist="cp1",
         vnflist="vnf1,vnf2"
     ).save()
Beispiel #2
0
 def setUp(self):
     self.client = Client()
     self.vl_inst_id = str(uuid.uuid4())
     self.vl_name = str(uuid.uuid4())
     self.ns_inst_id = str(uuid.uuid4())
     VLInstModel(vlinstanceid=self.vl_inst_id, vldid="", vlinstancename=self.vl_name, ownertype=1,
                 ownerid=self.ns_inst_id, relatednetworkid="network1", relatedsubnetworkid="subnet1,subnet2",
                 vimid='{"cloud_owner": "VCPE", "cloud_regionid": "RegionOne"}',
                 tenant="").save()
     VNFFGInstModel(vnffgdid="", vnffginstid="", nsinstid=self.ns_inst_id,
                    vllist="test1," + self.vl_inst_id + ",test2,test3", endpointnumber=0, cplist="", vnflist="",
                    fplist="", status="").save()
Beispiel #3
0
 def setUp(self):
     self.client = Client()
     self.ns_inst_id = str(uuid.uuid4())
     self.sfc_inst_id = str(uuid.uuid4())
     self.status = "active"
     self.sdn_controler_id = str(uuid.uuid4())
     sfc_id = str(uuid.uuid4())
     flow_classifiers = "flow1,flow2"
     port_pair_groups = json.JSONEncoder().encode(
         [{"groupid": "group1", "portpair": [str(uuid.uuid4()), str(uuid.uuid4())]},
          {"groupid": "group2", "portpair": [str(uuid.uuid4()), str(uuid.uuid4())]}])
     FPInstModel(fpid="", fpinstid=self.sfc_inst_id, nsinstid=self.ns_inst_id, vnffginstid="", policyinfo="",
                 status=self.status, sdncontrollerid=self.sdn_controler_id, sfcid=sfc_id,
                 flowclassifiers=flow_classifiers,
                 portpairgroups=port_pair_groups).save()
     VNFFGInstModel(vnffgdid="", vnffginstid="", nsinstid=self.ns_inst_id,
                    fplist="test1," + self.sfc_inst_id + ",test2,test3", endpointnumber=0, cplist="", vnflist="",
                    vllist="", status="").save()
 def setUp(self):
     self.client = Client()
     self.data = {
         "nsInstanceId": "ns_inst_1",
         "context": json.dumps(nsd_model),
         "fpindex": "fpd_1",
         "sdnControllerId": "sdnControllerId_1"
     }
     VNFFGInstModel.objects.all().delete()
     FPInstModel.objects.all().delete()
     VNFFGInstModel(vnffgdid="vnffg_id1",
                    vnffginstid="vnffg_inst_1",
                    nsinstid="ns_inst_1",
                    endpointnumber=2,
                    vllist="vlinst1",
                    cplist="cp1",
                    vnflist="vnf1,vnf2",
                    fplist="fp1").save()
Beispiel #5
0
 def setUp(self):
     self.client = Client()
     self.ns_inst_id = str(uuid.uuid4())
     self.vnffg_id = str(uuid.uuid4())
     self.vl_id_1 = 1
     self.vl_id_2 = 2
     self.vim_id = '{"cloud_owner": "cloud_owner", "cloud_regionid": "cloud_regionid"}'
     self.tenant = "tenantname"
     properties = {"vl_profile": {"networkName": "vl_inst_name", "network_type": "vlan",
                                  "segmentationId": "segmentation_id", "physicalNetwork": "physical_network",
                                  "mtu": 1500, "vlanTransparent": True, "dhcp_enabled": False,
                                  "cidr": "190.168.100.0/24", "ip_version": const.IPV4, "dhcpEnabled": True,
                                  "gatewayIp": "190.168.100.1", "dns_nameservers": "dns_nameservers",
                                  "host_routes": "host_routes", "start_ip": "190.168.100.2",
                                  "end_ip": "190.168.100.100"},
                   "location_info": {"host": True, "vimid": self.vim_id, "region": True, "tenant": self.tenant}}
     properties2 = {"vl_profile": {"networkName": "vl_inst_name", "network_type": "vlan",
                                   "segmentationId": "segmentation_id", "physicalNetwork": "physical_network",
                                   "mtu": 1500, "vlanTransparent": True, "dhcp_enabled": False,
                                   "cidr": "190.168.100.0/24", "ip_version": const.IPV4, "dhcpEnabled": True,
                                   "gatewayIp": "190.168.100.1", "dns_nameservers": "dns_nameservers",
                                   "host_routes": "host_routes", "start_ip": "190.168.100.2",
                                   "end_ip": "190.168.100.100"},
                    "location_info": {"host": True, "vimid": "", "region": True, "tenant": self.tenant}}
     self.context = {
         "vls": [{"vl_id": self.vl_id_1, "description": "", "properties": properties, "route_external": False},
                 {"vl_id": self.vl_id_2, "description": "", "properties": properties2, "route_external": False}],
         "vnffgs": [{"vnffg_id": self.vnffg_id, "description": "",
                     "properties": {"vendor": "zte", "version": "1.1.2", "number_of_endpoints": 7,
                                    "dependent_virtual_link": [self.vl_id_2, self.vl_id_1],
                                    "connection_point": ["CP01", "CP02"],
                                    "constituent_vnfs": ["VNF1", "VNF2", "VNF3"],
                                    "constituent_pnfs": ["pnf1", "pnf2"]},
                     "members": ["forwarding_path1", "forwarding_path2"]}]}
     NSInstModel(id=self.ns_inst_id, name="ns_name").save()
     VNFFGInstModel(vnffgdid=self.vnffg_id, vnffginstid="", nsinstid=self.ns_inst_id, endpointnumber=0, vllist="",
                    cplist="", vnflist="", fplist="", status="").save()
Beispiel #6
0
    def do_biz(self):
        job_id = JobUtil.create_job("NS", "NS_INST", self.ns_inst_id)
        occ_id = NsLcmOpOcc.create(self.ns_inst_id, "INSTANTIATE",
                                   "PROCESSING", False, self.req_data)
        NSInstModel.objects.filter(id=self.ns_inst_id).update(
            status=NS_INST_STATUS.INSTANTIATING)

        try:
            logger.debug('ns-instant(%s) workflow starting...' %
                         self.ns_inst_id)
            logger.debug('req_data=%s' % self.req_data)
            ns_inst = NSInstModel.objects.get(id=self.ns_inst_id)
            vim_id = {}

            input_parameters = []
            if 'additionalParamForNs' in self.req_data:
                for key, val in list(
                        self.req_data['additionalParamForNs'].items()):
                    input_parameters.append({"key": key, "value": val})

                if 'location' in self.req_data['additionalParamForNs']:
                    cloud_owner = self.req_data['additionalParamForNs'][
                        'location'].split('_')[0]
                    cloud_regionid = self.req_data["additionalParamForNs"][
                        "location"].split('_')[1]
                    vim_id = {
                        "cloud_owner": cloud_owner,
                        "cloud_regionid": cloud_regionid
                    }
                params_json = json.JSONEncoder().encode(
                    self.req_data["additionalParamForNs"])
            else:
                params_json = json.JSONEncoder().encode({})

            location_constraints = [] if not self.req_data.get('locationConstraints')\
                else self.req_data['locationConstraints']
            vnf_vim = self.get_vnf_vim_info(location_constraints)

            JobUtil.add_job_status(
                job_id, 5, 'Start query nsd(%s)' % ns_inst.nspackage_id)
            dst_plan = sdc_run_catalog.parse_nsd(ns_inst.nspackage_id,
                                                 input_parameters)
            logger.debug('tosca plan dest: %s' % dst_plan)
            logger.debug('Start query nsd(%s)' % ns_inst.nspackage_id)
            sdc_run_catalog.modify_nsd_state(ns_inst.nspackage_id)
            NSInstModel.objects.filter(id=self.ns_inst_id).update(
                nsd_model=dst_plan)

            params_vnf = []
            plan_dict = json.JSONDecoder().decode(dst_plan)
            for vnf in ignore_case_get(plan_dict, "vnfs"):
                vnfd_id = vnf['properties']['id']
                vnfm_type = vnf['properties'].get("vnfm_info", "undefined")
                logger.debug("vnfd_id: %s, vnfm_type : %s", vnfd_id, vnfm_type)
                if isinstance(vnfm_type, list):
                    vnfm_type = vnfm_type[0]
                vimid = self.get_vnf_vim_id(vim_id, vnf_vim, vnfd_id)
                s_vimid = "%s_%s" % (vimid["cloud_owner"],
                                     vimid["cloud_regionid"])
                vnfm_info = extsys.select_vnfm(vnfm_type=vnfm_type,
                                               vim_id=s_vimid)

                params_vnf.append({
                    "vnfProfileId": vnf["vnf_id"],
                    "additionalParam": {
                        "properties":
                        json.JSONEncoder().encode(vnf['properties']),
                        "vimId": vimid,
                        "vnfmInstanceId": vnfm_info["vnfmId"],
                        "vnfmType": vnfm_type,
                        "inputs": params_json
                    }
                })

            self.set_vl_vim_id(vim_id, vnf_vim, plan_dict)
            dst_plan = json.JSONEncoder().encode(plan_dict)
            logger.debug('tosca plan dest add vimid:%s' % dst_plan)
            NSInstModel.objects.filter(id=self.ns_inst_id).update(
                nsd_model=dst_plan)

            pnf_params_json = json.JSONEncoder().encode(
                self.init_pnf_para(plan_dict))

            vnf_params_json = json.JSONEncoder().encode(params_vnf)
            plan_input = {
                'jobId': job_id,
                'nsInstanceId': self.ns_inst_id,
                'object_context': dst_plan,
                'object_additionalParamForNs': params_json,
                'object_additionalParamForVnf': vnf_params_json,
                'object_additionalParamForPnf': pnf_params_json
            }
            plan_input.update(**self.get_model_count(dst_plan))

            if 'additionalParamForNs' in self.req_data:
                plan_input["sdnControllerId"] = ignore_case_get(
                    self.req_data['additionalParamForNs'], "sdncontroller")

            ServiceBaseInfoModel(service_id=self.ns_inst_id,
                                 service_name=ns_inst.name,
                                 service_type='NFVO',
                                 description=ns_inst.description,
                                 active_status='--',
                                 status=ns_inst.status,
                                 creator='--',
                                 create_time=int(time.time() * 1000)).save()

            if config.WORKFLOW_OPTION == "wso2":
                service_tpl = get_servicetemplate(ns_inst.nsd_id)
                DefPkgMappingModel(
                    service_id=self.ns_inst_id,
                    service_def_id=service_tpl['csarId'],
                    template_name=service_tpl['templateName'],
                    template_id=service_tpl['serviceTemplateId']).save()

                for key, val in list(
                        self.req_data['additionalParamForNs'].items()):
                    InputParamMappingModel(service_id=self.ns_inst_id,
                                           input_key=key,
                                           input_value=val).save()

                for vnffg in ignore_case_get(plan_dict, "vnffgs"):
                    VNFFGInstModel(vnffgdid=vnffg["vnffg_id"],
                                   vnffginstid=str(uuid.uuid4()),
                                   nsinstid=self.ns_inst_id,
                                   endpointnumber=0).save()
            else:
                # TODO
                pass
            logger.debug("workflow option: %s" % config.WORKFLOW_OPTION)
            if config.WORKFLOW_OPTION == "wso2":
                return self.start_wso2_workflow(job_id,
                                                ns_inst,
                                                plan_input,
                                                occ_id=occ_id)
            elif config.WORKFLOW_OPTION == "activiti":
                return self.start_activiti_workflow(job_id,
                                                    plan_input,
                                                    occ_id=occ_id)
            elif config.WORKFLOW_OPTION == "grapflow":
                return self.start_buildin_grapflow(job_id,
                                                   plan_input,
                                                   occ_id=occ_id)
            else:
                return self.start_buildin_workflow(job_id,
                                                   plan_input,
                                                   occ_id=occ_id)

        except Exception as e:
            logger.error(traceback.format_exc())
            logger.error("ns-instant(%s) workflow error:%s" %
                         (self.ns_inst_id, e.args[0]))
            NsLcmOpOcc.update(occ_id, operationState="FAILED", error=e.args[0])
            JobUtil.add_job_status(job_id, 255, 'NS instantiation failed')
            build_in.post_deal(self.ns_inst_id, "false")
            return dict(data={'error': e.args[0]},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Beispiel #7
0
    def do_biz(self):
        try:
            job_id = JobUtil.create_job("NS", "NS_INST", self.ns_inst_id)
            logger.debug('ns-instant(%s) workflow starting...' %
                         self.ns_inst_id)
            logger.debug('req_data=%s' % self.req_data)
            ns_inst = NSInstModel.objects.get(id=self.ns_inst_id)

            input_parameters = []
            for key, val in self.req_data['additionalParamForNs'].items():
                input_parameters.append({"key": key, "value": val})

            vim_id = ''
            if 'location' in self.req_data['additionalParamForNs']:
                vim_id = self.req_data['additionalParamForNs']['location']
            location_constraints = []
            if 'locationConstraints' in self.req_data:
                location_constraints = self.req_data['locationConstraints']

            JobUtil.add_job_status(
                job_id, 5, 'Start query nsd(%s)' % ns_inst.nspackage_id)
            src_plan = query_rawdata_from_catalog(ns_inst.nspackage_id,
                                                  input_parameters)
            dst_plan = toscautil.convert_nsd_model(src_plan["rawData"])
            logger.debug('tosca plan dest:%s' % dst_plan)
            NSInstModel.objects.filter(id=self.ns_inst_id).update(
                nsd_model=dst_plan)

            params_json = json.JSONEncoder().encode(
                self.req_data["additionalParamForNs"])
            # start
            params_vnf = []
            plan_dict = json.JSONDecoder().decode(dst_plan)
            for vnf in ignore_case_get(plan_dict, "vnfs"):
                vnfd_id = vnf['properties']['id']
                vnfd = NfPackageModel.objects.get(vnfdid=vnfd_id)
                vnfd_model = json.JSONDecoder().decode(vnfd.vnfdmodel)
                vnfm_type = vnfd_model["metadata"].get("vnfmType",
                                                       "ztevmanagerdriver")
                vimid = self.get_vnf_vim_id(vim_id, location_constraints,
                                            vnfd_id)
                vnfm_info = select_vnfm(vnfm_type=vnfm_type, vim_id=vimid)
                params_vnf.append({
                    "vnfProfileId": vnf["vnf_id"],
                    "additionalParam": {
                        "vimId": vimid,
                        "vnfmInstanceId": vnfm_info["vnfmId"],
                        "vnfmType": vnfm_type,
                        "inputs": params_json
                    }
                })
            # end

            self.set_vl_vim_id(vim_id, location_constraints, plan_dict)
            dst_plan = json.JSONEncoder().encode(plan_dict)
            logger.debug('tosca plan dest add vimid:%s' % dst_plan)
            NSInstModel.objects.filter(id=self.ns_inst_id).update(
                nsd_model=dst_plan)

            vnf_params_json = json.JSONEncoder().encode(params_vnf)
            plan_input = {
                'jobId': job_id,
                'nsInstanceId': self.req_data["nsInstanceId"],
                'object_context': dst_plan,
                'object_additionalParamForNs': params_json,
                'object_additionalParamForVnf': vnf_params_json
            }
            plan_input.update(**self.get_model_count(dst_plan))
            plan_input["sdnControllerId"] = ignore_case_get(
                self.req_data['additionalParamForNs'], "sdncontroller")

            ServiceBaseInfoModel(service_id=self.ns_inst_id,
                                 service_name=ns_inst.name,
                                 service_type='NFVO',
                                 description=ns_inst.description,
                                 active_status='--',
                                 status=ns_inst.status,
                                 creator='--',
                                 create_time=int(time.time() * 1000)).save()

            service_tpl = get_servicetemplate(ns_inst.nsd_id)
            DefPkgMappingModel(
                service_id=self.ns_inst_id,
                service_def_id=service_tpl['csarId'],
                template_name=service_tpl['templateName'],
                template_id=service_tpl['serviceTemplateId']).save()

            for key, val in self.req_data['additionalParamForNs'].items():
                InputParamMappingModel(service_id=self.ns_inst_id,
                                       input_key=key,
                                       input_value=val).save()

            for vnffg in ignore_case_get(plan_dict, "vnffgs"):
                VNFFGInstModel(vnffgdid=vnffg["vnffg_id"],
                               vnffginstid=str(uuid.uuid4()),
                               nsinstid=self.ns_inst_id,
                               endpointnumber=0).save()

            servicetemplate_id = get_servicetemplate_id(ns_inst.nsd_id)
            process_id = get_process_id('init', servicetemplate_id)
            data = {
                "processId": process_id,
                "params": {
                    "planInput": plan_input
                }
            }
            logger.debug('ns-instant(%s) workflow data:%s' %
                         (self.ns_inst_id, data))

            ret = workflow_run(data)
            logger.info("ns-instant(%s) workflow result:%s" %
                        (self.ns_inst_id, ret))
            JobUtil.add_job_status(
                job_id, 10, 'NS inst(%s) workflow started: %s' %
                (self.ns_inst_id, ret.get('status')))
            if ret.get('status') == 1:
                return dict(data={'jobId': job_id}, status=status.HTTP_200_OK)
            return dict(data={'error': ret['message']},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        except Exception as e:
            logger.error(traceback.format_exc())
            logger.error("ns-instant(%s) workflow error:%s" %
                         (self.ns_inst_id, e.message))
            JobUtil.add_job_status(job_id, 255,
                                   'NS instantiation failed: %s' % e.message)
            return dict(data={'error': e.message},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)