fcb485535ea95fccd683ef1bfc83cb1fdf0f3044
[vfc/nfvo/lcm.git] / lcm / pub / msapi / extsys.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.pub.exceptions import NSLCMException
19 from lcm.pub.msapi.aai import call_aai
20 from lcm.pub.utils.values import ignore_case_get
21
22 logger = logging.getLogger(__name__)
23
24
25 def get_vims():
26     ret = call_aai("/cloud-infrastructure/cloud-regions?depth=all", "GET")
27     if ret[0] != 0:
28         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
29         raise NSLCMException("Failed to query vims from extsys.")
30     # convert vim_info_aai to internal vim_info
31     vims_aai = json.JSONDecoder().decode(ret[1])
32     vims_aai = ignore_case_get(vims_aai, "cloud-region")
33     vims_info = []
34     for vim in vims_aai:
35         vim = convert_vim_info(vim)
36         vims_info.append(vim)
37     logger.debug("vims_info=%s", vims_info)
38     return vims_info
39
40
41 def get_vim_by_id_vim_info(cloudowner, cloudregionid):
42     cloud_owner = cloudowner
43     cloud_regionid = cloudregionid
44     ret = call_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s?depth=all"
45                    % (cloud_owner, cloud_regionid), "GET")
46     if ret[0] != 0:
47         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
48         raise NSLCMException("Failed to query vim(%s__%s) from extsys." % (cloudowner, cloudregionid))
49     # convert vim_info_aai to internal vim_info
50     vim_info_aai = json.JSONDecoder().decode(ret[1])
51     vim_info = convert_vim_info(vim_info_aai)
52     logger.debug("cloud_owner=%s, cloud_regionid=%s, vim_info=%s", cloudowner, cloudregionid, vim_info)
53     return vim_info
54
55
56 def get_vim_by_id(vim_id):
57     # cloud_owner, cloud_region = split_vim_to_owner_region(vim_id)
58     vim_id = json.JSONDecoder().decode(vim_id) if isinstance(vim_id, (str, unicode)) else vim_id
59     cloud_owner = vim_id['cloud_owner']
60     cloud_regionid = vim_id['cloud_regionid']
61     ret = call_aai("/cloud-infrastructure/cloud-regions/cloud-region/%s/%s?depth=all"
62                    % (cloud_owner, cloud_regionid), "GET")
63     if ret[0] != 0:
64         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
65         raise NSLCMException("Failed to query vim(%s) from extsys." % vim_id)
66     # convert vim_info_aai to internal vim_info
67     vim_info_aai = json.JSONDecoder().decode(ret[1])
68     vim_info = convert_vim_info(vim_info_aai)
69     logger.debug("vim_id=%s, vim_info=%s", vim_id, vim_info)
70     return vim_info
71
72
73 def split_vim_to_owner_region(vim_id):
74     split_vim = vim_id.split('_')
75     cloud_owner = split_vim[0]
76     cloud_region = "".join(split_vim[1:])
77     return cloud_owner, cloud_region
78
79
80 def convert_vim_info(vim_info_aai):
81     vim_id = vim_info_aai["cloud-owner"] + "_" + vim_info_aai["cloud-region-id"]
82     vim_type_aai = vim_info_aai["cloud-type"]
83     vim_type = vim_type_aai if vim_type_aai else "openstack"
84     esr_system_info = ignore_case_get(ignore_case_get(vim_info_aai, "esr-system-info-list"), "esr-system-info")
85     # tenants = ignore_case_get(vim_info_aai, "tenants")
86     default_tenant = ignore_case_get(esr_system_info[0], "default-tenant")
87     tenants = ignore_case_get(ignore_case_get(vim_info_aai, "tenants"), "tenant")
88     tenant_id = ""
89     for tenant_info in tenants:
90         if tenant_info["tenant-name"] == default_tenant:
91             tenant_id = tenant_info["tenant-id"]
92             break
93     vim_info = {
94         "vimId": vim_id,
95         "name": vim_id,
96         "url": ignore_case_get(esr_system_info[0], "service-url"),
97         "userName": ignore_case_get(esr_system_info[0], "user-name"),
98         "password": ignore_case_get(esr_system_info[0], "password"),
99         # "tenant": ignore_case_get(tenants[0], "tenant-id"),
100         "tenantId": tenant_id,
101         "tenant": default_tenant,
102         "vendor": ignore_case_get(esr_system_info[0], "vendor"),
103         "version": ignore_case_get(esr_system_info[0], "version"),
104         "description": "vim",
105         "domain": ignore_case_get(esr_system_info[0], "cloud-domain"),
106         "type": vim_type,
107         "createTime": "",
108         "sslCacert": ignore_case_get(esr_system_info[0], "ssl-cacert"),
109         "sslInsecure": str(ignore_case_get(esr_system_info[0], "ssl-insecure")),
110         "status": ignore_case_get(esr_system_info[0], "system-status")
111     }
112     return vim_info
113
114
115 def get_sdn_controller_by_id(sdn_ontroller_id):
116     ret = call_aai("/external-system/esr-thirdparty-sdnc-list/esr-thirdparty-sdnc/%s?depth=all"
117                    % sdn_ontroller_id, "GET")
118     if ret[0] != 0:
119         logger.error("Failed to query sdn ontroller(%s) from extsys. detail is %s.", sdn_ontroller_id, ret[1])
120         raise NSLCMException("Failed to query sdn ontroller(%s) from extsys." % sdn_ontroller_id)
121     # convert vim_info_aai to internal vim_info
122     sdnc_info_aai = json.JSONDecoder().decode(ret[1])
123     sdnc_info = convert_sdnc_info(sdnc_info_aai)
124     logger.debug("sdn_ontroller_id=%s, sdnc_info=%s", sdn_ontroller_id, sdnc_info)
125     return sdnc_info
126
127
128 def convert_sdnc_info(sdnc_info_aai):
129     esr_system_info = ignore_case_get(ignore_case_get(sdnc_info_aai, "esr-system-info-list"), "esr-system-info")
130     sdnc_info = {
131         "sdnControllerId": sdnc_info_aai["thirdparty-sdnc-id"],
132         "name": sdnc_info_aai["thirdparty-sdnc-id"],
133         "url": ignore_case_get(esr_system_info[0], "service-url"),
134         "userName": ignore_case_get(esr_system_info[0], "user-name"),
135         "password": ignore_case_get(esr_system_info[0], "password"),
136         "vendor": ignore_case_get(esr_system_info[0], "vendor"),
137         "version": ignore_case_get(esr_system_info[0], "version"),
138         "description": "",
139         "protocol": ignore_case_get(esr_system_info[0], "protocal"),
140         "productName": ignore_case_get(sdnc_info_aai, "product-name"),
141         "type": ignore_case_get(esr_system_info[0], "type"),
142         "createTime": ""
143     }
144     return sdnc_info
145
146
147 def get_vnfm_by_id(vnfm_inst_id):
148     uri = "/external-system/esr-vnfm-list/esr-vnfm/%s?depth=all" % vnfm_inst_id
149     ret = call_aai(uri, "GET")
150     if ret[0] > 0:
151         logger.error('Send get VNFM information request to extsys failed.')
152         raise NSLCMException('Send get VNFM information request to extsys failed.')
153     # convert vnfm_info_aai to internal vnfm_info
154     vnfm_info_aai = json.JSONDecoder().decode(ret[1])
155     vnfm_info = convert_vnfm_info(vnfm_info_aai)
156     logger.debug("vnfm_inst_id=%s, vnfm_info=%s", vnfm_inst_id, vnfm_info)
157     return vnfm_info
158
159
160 def convert_vnfm_info(vnfm_info_aai):
161     esr_system_info = ignore_case_get(ignore_case_get(vnfm_info_aai, "esr-system-info-list"), "esr-system-info")
162     vnfm_info = {
163         "vnfmId": vnfm_info_aai["vnfm-id"],
164         "name": vnfm_info_aai["vnfm-id"],
165         "type": ignore_case_get(esr_system_info[0], "type"),
166         "vimId": vnfm_info_aai["vim-id"],
167         "vendor": ignore_case_get(esr_system_info[0], "vendor"),
168         "version": ignore_case_get(esr_system_info[0], "version"),
169         "description": "vnfm",
170         "certificateUrl": vnfm_info_aai["certificate-url"],
171         "url": ignore_case_get(esr_system_info[0], "service-url"),
172         "userName": ignore_case_get(esr_system_info[0], "user-name"),
173         "password": ignore_case_get(esr_system_info[0], "password"),
174         "createTime": ""
175     }
176     return vnfm_info
177
178
179 def select_vnfm(vnfm_type, vim_id):
180     uri = "/external-system/esr-vnfm-list"
181     ret = call_aai(uri, "GET")
182     if ret[0] > 0:
183         logger.error("Failed to call %s: %s", uri, ret[1])
184         raise NSLCMException('Failed to get vnfms from extsys.')
185     vnfms = json.JSONDecoder().decode(ret[1])
186     vnfms = ignore_case_get(vnfms, "esr-vnfm")
187     for vnfm in vnfms:
188         vnfm_info = get_vnfm_by_id(vnfm.get("vnfm-id"))
189         vnfmtype = ignore_case_get(vnfm_info, "type")
190         vimid = ignore_case_get(vnfm_info, "vimId")
191         if vnfmtype == vnfm_type and vimid == vim_id:
192             return vnfm_info
193     raise NSLCMException('No vnfm found with %s in vim(%s)' % (vnfm_type, vim_id))
194
195
196 def get_ems_by_id(ems_inst_id):
197     uri = "/external-system/esr-ems-list/esr-ems/%s?depth=all" % ems_inst_id
198     ret = call_aai(uri, "GET")
199     if ret[0] > 0:
200         logger.error('Send get EMS information request to extsys failed.')
201         raise NSLCMException('Send get EMS information request to extsys failed.')
202     # convert vnfm_info_aai to internal vnfm_info
203     ems_info_aai = json.JSONDecoder().decode(ret[1])
204     ems_info = convert_ems_info(ems_info_aai)
205     logger.debug("ems_inst_id=%s, ems_info=%s", ems_inst_id, ems_info)
206     return ems_info
207
208
209 def convert_ems_info(ems_info_aai):
210     esr_system_info = ignore_case_get(ignore_case_get(ems_info_aai, "esr-system-info-list"), "esr-system-info")
211     ems_info_aai = {
212         "emsId": ems_info_aai["ems-id"],
213         "type": ignore_case_get(esr_system_info[0], "type"),
214         "vendor": ignore_case_get(esr_system_info[0], "vendor"),
215         "version": ignore_case_get(esr_system_info[0], "version"),
216         "url": ignore_case_get(esr_system_info[0], "service-url"),
217         "userName": ignore_case_get(esr_system_info[0], "user-name"),
218         "password": ignore_case_get(esr_system_info[0], "password"),
219         "createTime": ""
220     }
221     return ems_info_aai