add comments
[vfc/nfvo/lcm.git] / lcm / ns / biz / ns_get.py
1 # Copyright 2016 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import logging
17
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
26
27 logger = logging.getLogger(__name__)
28
29
30 class GetNSInfoService(object):
31     """
32     Get NS instance Model
33     """
34
35     def __init__(self, ns_filter=None):
36         self.ns_filter = ns_filter
37
38     def get_ns_info(self, is_sol=False):
39         """
40         Get all the ns instance models
41         :param is_sol:
42         :return:
43         """
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)
47         else:
48             ns_insts = NSInstModel.objects.all()
49         result = []
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))
53         return result
54
55     def get_single_ns_info(self, ns_inst, is_sol=False):
56         """
57         Get a ns instance model
58         :param ns_inst:
59         :param is_sol:
60         :return:
61         """
62         if is_sol:
63             nsInstance = {}
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)
78             if vnf_instance_list:
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)
82             if vl_list:
83                 nsInstance['virtualLinkInfo'] = vl_list
84                 # todo 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model),
85                 # todo  'sapInfo':{},
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'}
95             }
96             logger.debug(" test ")
97             return nsInstance
98         return {
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}
109
110     @staticmethod
111     def get_vnf_infos(ns_inst_id, is_sol):
112         """
113         VNF info
114         :param ns_inst_id:
115         :param is_sol:
116         :return:
117         """
118         vnfs = NfInstModel.objects.filter(ns_inst_id=ns_inst_id)
119         if is_sol:
120             return [{
121                 'id': vnf.nfinstid,
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
130             } for vnf in vnfs]
131         return [{
132             'vnfInstanceId': vnf.nfinstid,
133             'vnfInstanceName': vnf.nf_name,
134             'vnfProfileId': vnf.vnf_id} for vnf in vnfs]
135
136     def get_vl_infos(self, ns_inst_id, is_sol):
137         """
138         VL info
139         :param ns_inst_id:
140         :param is_sol:
141         :return:
142         """
143         vls = VLInstModel.objects.filter(ownertype=OWNER_TYPE.NS, ownerid=ns_inst_id)
144         if is_sol:
145             return [
146                 {
147                     'id': vl.vlinstanceid,
148                     'nsVirtualLinkDescId': vl.vldid,
149                     'nsVirtualLinkProfileId': vl.vldid,
150                     'vlInstanceName': vl.vlinstancename,
151                     'resourceHandle': [{
152                         'vimConnectionId': vl.vimid,
153                         'resourceId': vl.relatednetworkid,
154                         'vimLevelResourceType': vl.vltype
155                     }],
156                     # todo 'linkPort': self.get_cp_infos(vl.vlinstanceid,is_sol),
157                     'networkId': vl.relatednetworkid,
158                     'subNetworkid': vl.relatedsubnetworkid
159                 } for vl in vls]
160
161         return [{
162             'vlInstanceId': vl.vlinstanceid,
163             'vlInstanceName': vl.vlinstancename,
164             'vldId': vl.vldid,
165             'relatedCpInstanceId': self.get_cp_infos(vl.vlinstanceid)} for vl in vls]
166
167     @staticmethod
168     def get_cp_infos(vl_inst_id):
169         """
170         CP info
171         :param vl_inst_id:
172         :return:
173         """
174         cps = CPInstModel.objects.filter(relatedvl__icontains=vl_inst_id)
175         return [{
176             'cpInstanceId': cp.cpinstanceid,
177             'cpInstanceName': cp.cpname,
178             'cpdId': cp.cpdid} for cp in cps]
179
180     def get_vnffg_infos(self, ns_inst_id, nsd_model, is_sol):
181         """
182         VNFFG info
183         :param ns_inst_id:
184         :param nsd_model:
185         :param is_sol:
186         :return:
187         """
188         vnffgs = VNFFGInstModel.objects.filter(nsinstid=ns_inst_id)
189         return [{
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]
196
197     @staticmethod
198     def get_pnf_ids(nsd_model):
199         """
200         PNF ids
201         :param nsd_model:
202         :return:
203         """
204         context = json.loads(nsd_model)
205         pnfs = context['pnfs']
206         return [pnf['pnf_id'] for pnf in pnfs]
207
208     @staticmethod
209     def convert_string_to_list(detail_id_string):
210         if not detail_id_string:
211             return None
212         return detail_id_string.split(',')
213
214     @staticmethod
215     def get_pnf_infos(ns_instance_id):
216         """
217         PNF infos
218         :param ns_instance_id:
219         :return:
220         """
221         pnfs = PNFInstModel.objects.filter(nsInstances__contains=ns_instance_id)
222         return [pnf.__dict__ for pnf in pnfs]