472195d77ea2ce91b638733218ba3fc5483e77d7
[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     def __init__(self, ns_filter=None):
32         self.ns_filter = ns_filter
33
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)
38         else:
39             ns_insts = NSInstModel.objects.all()
40         result = []
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))
44         return result
45
46     def get_single_ns_info(self, ns_inst, is_sol=False):
47         if is_sol:
48             nsInstance = {}
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)
63             if vnf_instance_list:
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)
67             if vl_list:
68                 nsInstance['virtualLinkInfo'] = vl_list
69                 # todo 'vnffgInfo': self.get_vnffg_infos(ns_inst.id, ns_inst.nsd_model),
70                 # todo  'sapInfo':{},
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'}
80             }
81             logger.debug(" test ")
82             return nsInstance
83         return {
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}
94
95     @staticmethod
96     def get_vnf_infos(ns_inst_id, is_sol):
97         vnfs = NfInstModel.objects.filter(ns_inst_id=ns_inst_id)
98         if is_sol:
99             return [{
100                 'id': vnf.nfinstid,
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
109             } for vnf in vnfs]
110         return [{
111             'vnfInstanceId': vnf.nfinstid,
112             'vnfInstanceName': vnf.nf_name,
113             'vnfProfileId': vnf.vnf_id} for vnf in vnfs]
114
115     def get_vl_infos(self, ns_inst_id, is_sol):
116         vls = VLInstModel.objects.filter(ownertype=OWNER_TYPE.NS, ownerid=ns_inst_id)
117         if is_sol:
118             return [
119                 {
120                     'id': vl.vlinstanceid,
121                     'nsVirtualLinkDescId': vl.vldid,
122                     'nsVirtualLinkProfileId': vl.vldid,
123                     'vlInstanceName': vl.vlinstancename,
124                     'resourceHandle': [{
125                         'vimConnectionId': vl.vimid,
126                         'resourceId': vl.relatednetworkid,
127                         'vimLevelResourceType': vl.vltype
128                     }],
129                     # todo 'linkPort': self.get_cp_infos(vl.vlinstanceid,is_sol),
130                     'networkId': vl.relatednetworkid,
131                     'subNetworkid': vl.relatedsubnetworkid
132                 } for vl in vls]
133
134         return [{
135             'vlInstanceId': vl.vlinstanceid,
136             'vlInstanceName': vl.vlinstancename,
137             'vldId': vl.vldid,
138             'relatedCpInstanceId': self.get_cp_infos(vl.vlinstanceid)} for vl in vls]
139
140     @staticmethod
141     def get_cp_infos(vl_inst_id):
142         cps = CPInstModel.objects.filter(relatedvl__icontains=vl_inst_id)
143         return [{
144             'cpInstanceId': cp.cpinstanceid,
145             'cpInstanceName': cp.cpname,
146             'cpdId': cp.cpdid} for cp in cps]
147
148     def get_vnffg_infos(self, ns_inst_id, nsd_model, is_sol):
149         vnffgs = VNFFGInstModel.objects.filter(nsinstid=ns_inst_id)
150         return [{
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]
157
158     @staticmethod
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]
163
164     @staticmethod
165     def convert_string_to_list(detail_id_string):
166         if not detail_id_string:
167             return None
168         return detail_id_string.split(',')
169
170     @staticmethod
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]