1 # Copyright 2016 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 lcm.ns.const import NS_INSTANCE_BASE_URI
19 from lcm.ns.enum import OWNER_TYPE
20 from lcm.pub.database.models import NSInstModel
21 from lcm.pub.database.models import NfInstModel
22 from lcm.pub.database.models import VLInstModel
23 from lcm.pub.database.models import CPInstModel
24 from lcm.pub.database.models import VNFFGInstModel
25 from lcm.pub.database.models import PNFInstModel
27 logger = logging.getLogger(__name__)
30 class GetNSInfoService(object):
35 def __init__(self, ns_filter=None):
36 self.ns_filter = ns_filter
38 def get_ns_info(self, is_sol=False):
40 Get all the ns instance models
44 if self.ns_filter and "ns_inst_id" in self.ns_filter:
45 ns_inst_id = self.ns_filter["ns_inst_id"]
46 ns_insts = NSInstModel.objects.filter(id=ns_inst_id)
48 ns_insts = NSInstModel.objects.all()
50 for ns_inst in ns_insts:
51 if ns_inst.status != 'null':
52 result.append(self.get_single_ns_info(ns_inst, is_sol))
55 def get_single_ns_info(self, ns_inst, is_sol=False):
57 Get a ns instance model
64 nsInstance['id'] = ns_inst.id
65 nsInstance['nsInstanceName'] = ns_inst.name
66 nsInstance['nsInstanceDescription'] = ns_inst.description
67 nsInstance['nsdId'] = ns_inst.nsd_id
68 nsInstance['nsdInfoId'] = ns_inst.nspackage_id
69 nsInstance['nsState'] = ns_inst.status
70 if ns_inst.nsd_invariant_id:
71 nsInstance['nsdInvariantId'] = ns_inst.nsd_invariant_id
72 if ns_inst.flavour_id:
73 nsInstance['flavourId'] = ns_inst.flavour_id
74 # todo 'nsScaleStatus':{}
75 # todo 'additionalAffinityOrAntiAffinityRule':{}
76 logger.debug(" test ")
77 vnf_instance_list = self.get_vnf_infos(ns_inst.id, is_sol)
79 nsInstance['vnfInstance'] = vnf_instance_list
80 # todo 'pnfInfo': self.get_pnf_infos(ns_inst.id,is_sol),
81 vl_list = self.get_vl_infos(ns_inst.id, is_sol)
83 nsInstance['virtualLinkInfo'] = vl_list
84 # todo 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model),
86 # todo nestedNsInstanceId
87 logger.debug(" test ")
88 nsInstance['_links'] = {
89 'self': {'href': NS_INSTANCE_BASE_URI % ns_inst.id},
90 'instantiate': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/instantiate'},
91 'terminate': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/terminate'},
92 'update': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/update'},
93 'scale': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/scale'},
94 'heal': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/heal'}
96 logger.debug(" test ")
99 'nsInstanceId': ns_inst.id,
100 'nsName': ns_inst.name,
101 'description': ns_inst.description,
102 'nsdId': ns_inst.nsd_id,
103 'nsdInvariantId': ns_inst.nsd_invariant_id,
104 'vnfInfo': self.get_vnf_infos(ns_inst.id, is_sol),
105 'pnfInfo': self.get_pnf_infos(ns_inst.id),
106 'vlInfo': self.get_vl_infos(ns_inst.id, is_sol),
107 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model, is_sol),
108 'nsState': ns_inst.status}
111 def get_vnf_infos(ns_inst_id, is_sol):
118 vnfs = NfInstModel.objects.filter(ns_inst_id=ns_inst_id)
122 'vnfInstanceName': vnf.nf_name,
123 'vnfdId': vnf.template_id,
124 'vnfProvider': vnf.vendor,
125 'vnfSoftwareVersion': vnf.version,
126 'vnfProductName': vnf.nf_name, # todo
127 'vnfdVersion': vnf.version, # todo
128 'vnfPkgId': vnf.package_id,
129 'instantiationState': vnf.status
132 'vnfInstanceId': vnf.nfinstid,
133 'vnfInstanceName': vnf.nf_name,
134 'vnfProfileId': vnf.vnf_id} for vnf in vnfs]
136 def get_vl_infos(self, ns_inst_id, is_sol):
143 vls = VLInstModel.objects.filter(ownertype=OWNER_TYPE.NS, ownerid=ns_inst_id)
147 'id': vl.vlinstanceid,
148 'nsVirtualLinkDescId': vl.vldid,
149 'nsVirtualLinkProfileId': vl.vldid,
150 'vlInstanceName': vl.vlinstancename,
152 'vimConnectionId': vl.vimid,
153 'resourceId': vl.relatednetworkid,
154 'vimLevelResourceType': vl.vltype
156 # todo 'linkPort': self.get_cp_infos(vl.vlinstanceid,is_sol),
157 'networkId': vl.relatednetworkid,
158 'subNetworkid': vl.relatedsubnetworkid
162 'vlInstanceId': vl.vlinstanceid,
163 'vlInstanceName': vl.vlinstancename,
165 'relatedCpInstanceId': self.get_cp_infos(vl.vlinstanceid)} for vl in vls]
168 def get_cp_infos(vl_inst_id):
174 cps = CPInstModel.objects.filter(relatedvl__icontains=vl_inst_id)
176 'cpInstanceId': cp.cpinstanceid,
177 'cpInstanceName': cp.cpname,
178 'cpdId': cp.cpdid} for cp in cps]
180 def get_vnffg_infos(self, ns_inst_id, nsd_model, is_sol):
188 vnffgs = VNFFGInstModel.objects.filter(nsinstid=ns_inst_id)
190 'vnffgInstanceId': vnffg.vnffginstid,
191 'vnfId': self.convert_string_to_list(vnffg.vnflist),
192 'pnfId': self.get_pnf_ids(nsd_model),
193 'virtualLinkId': self.convert_string_to_list(vnffg.vllist),
194 'cpId': self.convert_string_to_list(vnffg.cplist),
195 'nfp': self.convert_string_to_list(vnffg.fplist)} for vnffg in vnffgs]
198 def get_pnf_ids(nsd_model):
204 context = json.loads(nsd_model)
205 pnfs = context['pnfs']
206 return [pnf['pnf_id'] for pnf in pnfs]
209 def convert_string_to_list(detail_id_string):
210 if not detail_id_string:
212 return detail_id_string.split(',')
215 def get_pnf_infos(ns_instance_id):
218 :param ns_instance_id:
221 pnfs = PNFInstModel.objects.filter(nsInstances__contains=ns_instance_id)
222 return [pnf.__dict__ for pnf in pnfs]