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):
31 def __init__(self, ns_filter=None):
32 self.ns_filter = ns_filter
34 def get_ns_info(self, is_sol=False):
35 if self.ns_filter and "ns_inst_id" in self.ns_filter:
36 ns_inst_id = self.ns_filter["ns_inst_id"]
37 ns_insts = NSInstModel.objects.filter(id=ns_inst_id)
39 ns_insts = NSInstModel.objects.all()
41 for ns_inst in ns_insts:
42 if ns_inst.status != 'null':
43 result.append(self.get_single_ns_info(ns_inst, is_sol))
46 def get_single_ns_info(self, ns_inst, is_sol=False):
49 nsInstance['id'] = ns_inst.id
50 nsInstance['nsInstanceName'] = ns_inst.name
51 nsInstance['nsInstanceDescription'] = ns_inst.description
52 nsInstance['nsdId'] = ns_inst.nsd_id
53 nsInstance['nsdInfoId'] = ns_inst.nspackage_id
54 nsInstance['nsState'] = ns_inst.status
55 if ns_inst.nsd_invariant_id:
56 nsInstance['nsdInvariantId'] = ns_inst.nsd_invariant_id
57 if ns_inst.flavour_id:
58 nsInstance['flavourId'] = ns_inst.flavour_id
59 # todo 'nsScaleStatus':{}
60 # todo 'additionalAffinityOrAntiAffinityRule':{}
61 logger.debug(" test ")
62 vnf_instance_list = self.get_vnf_infos(ns_inst.id, is_sol)
64 nsInstance['vnfInstance'] = vnf_instance_list
65 # todo 'pnfInfo': self.get_pnf_infos(ns_inst.id,is_sol),
66 vl_list = self.get_vl_infos(ns_inst.id, is_sol)
68 nsInstance['virtualLinkInfo'] = vl_list
69 # todo 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model),
71 # todo nestedNsInstanceId
72 logger.debug(" test ")
73 nsInstance['_links'] = {
74 'self': {'href': NS_INSTANCE_BASE_URI % ns_inst.id},
75 'instantiate': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/instantiate'},
76 'terminate': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/terminate'},
77 'update': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/update'},
78 'scale': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/scale'},
79 'heal': {'href': NS_INSTANCE_BASE_URI % ns_inst.id + '/heal'}
81 logger.debug(" test ")
84 'nsInstanceId': ns_inst.id,
85 'nsName': ns_inst.name,
86 'description': ns_inst.description,
87 'nsdId': ns_inst.nsd_id,
88 'nsdInvariantId': ns_inst.nsd_invariant_id,
89 'vnfInfo': self.get_vnf_infos(ns_inst.id, is_sol),
90 'pnfInfo': self.get_pnf_infos(ns_inst.id),
91 'vlInfo': self.get_vl_infos(ns_inst.id, is_sol),
92 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model, is_sol),
93 'nsState': ns_inst.status}
96 def get_vnf_infos(ns_inst_id, is_sol):
97 vnfs = NfInstModel.objects.filter(ns_inst_id=ns_inst_id)
101 'vnfInstanceName': vnf.nf_name,
102 'vnfdId': vnf.template_id,
103 'vnfProvider': vnf.vendor,
104 'vnfSoftwareVersion': vnf.version,
105 'vnfProductName': vnf.nf_name, # todo
106 'vnfdVersion': vnf.version, # todo
107 'vnfPkgId': vnf.package_id,
108 'instantiationState': vnf.status
111 'vnfInstanceId': vnf.nfinstid,
112 'vnfInstanceName': vnf.nf_name,
113 'vnfProfileId': vnf.vnf_id} for vnf in vnfs]
115 def get_vl_infos(self, ns_inst_id, is_sol):
116 vls = VLInstModel.objects.filter(ownertype=OWNER_TYPE.NS, ownerid=ns_inst_id)
120 'id': vl.vlinstanceid,
121 'nsVirtualLinkDescId': vl.vldid,
122 'nsVirtualLinkProfileId': vl.vldid,
123 'vlInstanceName': vl.vlinstancename,
125 'vimConnectionId': vl.vimid,
126 'resourceId': vl.relatednetworkid,
127 'vimLevelResourceType': vl.vltype
129 # todo 'linkPort': self.get_cp_infos(vl.vlinstanceid,is_sol),
130 'networkId': vl.relatednetworkid,
131 'subNetworkid': vl.relatedsubnetworkid
135 'vlInstanceId': vl.vlinstanceid,
136 'vlInstanceName': vl.vlinstancename,
138 'relatedCpInstanceId': self.get_cp_infos(vl.vlinstanceid)} for vl in vls]
141 def get_cp_infos(vl_inst_id):
142 cps = CPInstModel.objects.filter(relatedvl__icontains=vl_inst_id)
144 'cpInstanceId': cp.cpinstanceid,
145 'cpInstanceName': cp.cpname,
146 'cpdId': cp.cpdid} for cp in cps]
148 def get_vnffg_infos(self, ns_inst_id, nsd_model, is_sol):
149 vnffgs = VNFFGInstModel.objects.filter(nsinstid=ns_inst_id)
151 'vnffgInstanceId': vnffg.vnffginstid,
152 'vnfId': self.convert_string_to_list(vnffg.vnflist),
153 'pnfId': self.get_pnf_ids(nsd_model),
154 'virtualLinkId': self.convert_string_to_list(vnffg.vllist),
155 'cpId': self.convert_string_to_list(vnffg.cplist),
156 'nfp': self.convert_string_to_list(vnffg.fplist)} for vnffg in vnffgs]
159 def get_pnf_ids(nsd_model):
160 context = json.loads(nsd_model)
161 pnfs = context['pnfs']
162 return [pnf['pnf_id'] for pnf in pnfs]
165 def convert_string_to_list(detail_id_string):
166 if not detail_id_string:
168 return detail_id_string.split(',')
171 def get_pnf_infos(ns_instance_id):
172 pnfs = PNFInstModel.objects.filter(nsInstances__contains=ns_instance_id)
173 return [pnf.__dict__ for pnf in pnfs]