Add vfc-lcm operate subnet from AAI
[vfc/nfvo/lcm.git] / lcm / pub / msapi / aai.py
1 # Copyright 2017 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 import uuid
18
19 from lcm.pub.config.config import AAI_BASE_URL, AAI_USER, AAI_PASSWD
20 from lcm.pub.exceptions import NSLCMException
21 from lcm.pub.utils import restcall
22
23
24 logger = logging.getLogger(__name__)
25
26
27 def call_aai(resource, method, content=''):
28     additional_headers = {
29         'X-FromAppId': 'VFC-NFVO-LCM',
30         'X-TransactionId': str(uuid.uuid1())
31     }
32
33     return restcall.call_req(AAI_BASE_URL,
34                              AAI_USER,
35                              AAI_PASSWD,
36                              restcall.rest_no_auth,
37                              resource,
38                              method,
39                              content,
40                              additional_headers)
41
42
43 def create_customer_aai(global_customer_id, data):
44     resource = "/business/customers/customer/%s" % global_customer_id
45     ret = call_aai(resource, "PUT", data)
46     if ret[0] != 0:
47         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
48         raise NSLCMException("Customer creation exception in AAI")
49     return json.JSONDecoder().decode(ret[1]), ret[2]
50
51
52 def query_customer_aai(global_customer_id):
53     resource = "/business/customers/customer/%s?depth=all" % global_customer_id
54     ret = call_aai(resource, "GET")
55     if ret[0] != 0:
56         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
57         raise NSLCMException("Get customer info exception in AAI")
58     return json.JSONDecoder().decode(ret[1]), ret[2]
59
60
61 def delete_customer_aai(global_customer_id, resource_version=""):
62     resource = "/business/customers/customer/%s" % global_customer_id
63     if resource_version:
64         resource = resource + "?resource-version=%s" % resource_version
65     ret = call_aai(resource, "DELETE")
66     if ret[0] != 0:
67         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
68         raise NSLCMException("Customer delete exception in AAI")
69     return json.JSONDecoder().decode(ret[1]), ret[2]
70
71
72 def put_customer_relationship(global_customer_id, data):
73     resource = "/business/customers/customer/{global-customer-id}/relationship-list/relationship" % global_customer_id
74     ret = call_aai(resource, "PUT", data)
75     if ret[0] != 0:
76         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
77         raise NSLCMException("Put or update customer relationship exception in AAI")
78     return json.JSONDecoder().decode(ret[1]), ret[2]
79
80
81 def delete_customer_relationship(global_customer_id):
82     resource = "/business/customers/customer/{global-customer-id}/relationship-list/relationship" % global_customer_id
83     ret = call_aai(resource, "DELETE")
84     if ret[0] != 0:
85         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
86         raise NSLCMException("Delete customer relationship exception in AAI")
87     return json.JSONDecoder().decode(ret[1]), ret[2]
88
89
90 def create_ns_aai(global_customer_id, service_type, service_instance_id, data):
91     resource = "/business/customers/customer/%s/service-subscriptions/service-subscription/" \
92                "%s/service-instances/service-instance/%s" % \
93                (global_customer_id, service_type, service_instance_id)
94     ret = call_aai(resource, "PUT", data)
95     if ret[0] != 0:
96         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
97         raise NSLCMException("Ns instance creation exception in AAI")
98     return json.JSONDecoder().decode(ret[1]), ret[2]
99
100
101 def query_ns_aai(global_customer_id, service_type, service_instance_id):
102     resource = "/business/customers/customer/%s/service-subscriptions/service-subscription/" \
103                "%s/service-instances/service-instance/%s?depth=all" % \
104                (global_customer_id, service_type, service_instance_id)
105     ret = call_aai(resource, "GET")
106     if ret[0] != 0:
107         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
108         raise NSLCMException("Ns instance query exception in AAI")
109     return json.JSONDecoder().decode(ret[1])
110
111
112 def delete_ns_aai(global_customer_id, service_type, service_instance_id, resource_version=""):
113     resource = "/business/customers/customer/%s/service-subscriptions/service-subscription/" \
114                "%s/service-instances/service-instance/%s" % \
115                (global_customer_id, service_type, service_instance_id)
116     if resource_version:
117         resource = resource + "?resource-version=%s" % resource_version
118     ret = call_aai(resource, "DELETE")
119     if ret[0] != 0:
120         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
121         raise NSLCMException("Ns instance delete exception in AAI")
122     return json.JSONDecoder().decode(ret[1]), ret[2]
123
124
125 def put_ns_relationship(global_customer_id, service_type, service_instance_id, data):
126     resource = "/business/customers/customer/%s/service-subscriptions/service-subscription/" \
127                "%s/service-instances/service-instance/%s/relationship-list/relationship" % \
128                (global_customer_id, service_type, service_instance_id)
129     ret = call_aai(resource, "PUT", data)
130     if ret[0] != 0:
131         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
132         raise NSLCMException("Put or update ns instance relationship exception in AAI")
133     return json.JSONDecoder().decode(ret[1]), ret[2]
134
135
136 def delete_ns_relationship(global_customer_id, service_type, service_instance_id):
137     resource = "/business/customers/customer/%s/service-subscriptions/service-subscription/" \
138                "%s/service-instances/service-instance/%s/relationship-list/relationship" % \
139                (global_customer_id, service_type, service_instance_id)
140     ret = call_aai(resource, "DELETE")
141     if ret[0] != 0:
142         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
143         raise NSLCMException("Delete ns instance relationship exception in AAI")
144     return json.JSONDecoder().decode(ret[1]), ret[2]
145
146
147 def create_vnf_aai(vnf_id, data):
148     resource = "/network/generic-vnfs/generic-vnf/%s" % vnf_id
149     ret = call_aai(resource, "PUT", data)
150     if ret[0] != 0:
151         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
152         raise NSLCMException("Vnf instance creation exception in AAI")
153     return json.JSONDecoder().decode(ret[1]), ret[2]
154
155
156 def query_vnf_aai(vnf_id):
157     resource = "/network/generic-vnfs/generic-vnf/%s?depth=all" % vnf_id
158     ret = call_aai(resource, "GET")
159     if ret[0] != 0:
160         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
161         raise NSLCMException("Vnf instance query exception in AAI")
162     return json.JSONDecoder().decode(ret[1])
163
164
165 def delete_vnf_aai(vnf_id, resource_version=""):
166     resource = "/network/generic-vnfs/generic-vnf/%s" % vnf_id
167     if resource_version:
168         resource = resource + "?resource-version=%s" % resource_version
169     ret = call_aai(resource, "DELETE")
170     if ret[0] != 0:
171         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
172         raise NSLCMException("Vnf instance delete exception in AAI")
173     return json.JSONDecoder().decode(ret[1]), ret[2]
174
175
176 def put_vnf_relationship(vnf_id, data):
177     resource = "/network/generic-vnfs/generic-vnf/%s/relationship-list/relationship" % vnf_id
178     ret = call_aai(resource, "PUT", data)
179     if ret[0] != 0:
180         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
181         raise NSLCMException("Put or update vnf instance relationship exception in AAI")
182     return json.JSONDecoder().decode(ret[1]), ret[2]
183
184
185 def delete_vnf_relationship(vnf_id):
186     resource = "/network/generic-vnfs/generic-vnf/%s/relationship-list/relationship" % vnf_id
187     ret = call_aai(resource, "DELETE")
188     if ret[0] != 0:
189         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
190         raise NSLCMException("Delete vnf instance relationship exception in AAI")
191     return json.JSONDecoder().decode(ret[1]), ret[2]
192
193
194 def create_vserver_aai(cloud_owner, cloud_region_id, tenant_id, vserver_id, data):
195     resource = "/cloud-infrastructure/cloud-regions/cloud-region/%s/" \
196                "%s/tenants/tenant/%s/vservers/vserver/%s" % \
197                (cloud_owner, cloud_region_id, tenant_id, vserver_id)
198     ret = call_aai(resource, "PUT", data)
199     if ret[0] != 0:
200         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
201         raise NSLCMException("Vserver creation exception in AAI")
202     return json.JSONDecoder().decode(ret[1]), ret[2]
203
204
205 def query_vserver_aai(cloud_owner, cloud_region_id, tenant_id, vserver_id):
206     resource = "/cloud-infrastructure/cloud-regions/cloud-region/%s/" \
207                "%s/tenants/tenant/%s/vservers/vserver/%s?depth=all" % \
208                (cloud_owner, cloud_region_id, tenant_id, vserver_id)
209     ret = call_aai(resource, "GET")
210     if ret[0] != 0:
211         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
212         raise NSLCMException("Vserver query exception in AAI")
213     return json.JSONDecoder().decode(ret[1])
214
215
216 def delete_vserver_aai(cloud_owner, cloud_region_id, tenant_id, vserver_id, resource_version=""):
217     resource = "/cloud-infrastructure/cloud-regions/cloud-region/%s/" \
218                "%s/tenants/tenant/%s/vservers/vserver/%s" % \
219                (cloud_owner, cloud_region_id, tenant_id, vserver_id)
220     if resource_version:
221         resource = resource + "?resource-version=%s" % resource_version
222     ret = call_aai(resource, "DELETE")
223     if ret[0] != 0:
224         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
225         raise NSLCMException("Vserver delete exception in AAI")
226     return json.JSONDecoder().decode(ret[1]), ret[2]
227
228
229 def put_vserver_relationship(cloud_owner, cloud_region_id, tenant_id, vserver_id, data):
230     resource = "/cloud-infrastructure/cloud-regions/cloud-region/%s/" \
231                "%s/tenants/tenant/%s/vservers/vserver/%s/relationship-list/relationship" % \
232                (cloud_owner, cloud_region_id, tenant_id, vserver_id)
233     ret = call_aai(resource, "PUT", data)
234     if ret[0] != 0:
235         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
236         raise NSLCMException("Put or update vserver relationship exception in AAI")
237     return json.JSONDecoder().decode(ret[1]), ret[2]
238
239
240 def delete_vserver_relationship(cloud_owner, cloud_region_id, tenant_id, vserver_id):
241     resource = "/cloud-infrastructure/cloud-regions/cloud-region/%s/" \
242                "%s/tenants/tenant/%s/vservers/vserver/%s/relationship-list/relationship" % \
243                (cloud_owner, cloud_region_id, tenant_id, vserver_id)
244     ret = call_aai(resource, "DELETE")
245     if ret[0] != 0:
246         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
247         raise NSLCMException("Delete vserver relationship exception in AAI")
248     return json.JSONDecoder().decode(ret[1]), ret[2]
249
250
251 def create_network_aai(network_id, data):
252     resource = "/network/l3-networks/l3-network/%s" % network_id
253     ret = call_aai(resource, "PUT", data)
254     if ret[0] != 0:
255         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
256         raise NSLCMException("Network creation exception in AAI")
257     return json.JSONDecoder().decode(ret[1]), ret[2]
258
259
260 def query_network_aai(network_id):
261     resource = "/network/l3-networks/l3-network/%s" % network_id
262     ret = call_aai(resource, "GET")
263     if ret[0] != 0:
264         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
265         raise NSLCMException("Network query exception in AAI")
266     return json.JSONDecoder().decode(ret[1])
267
268
269 def delete_network_aai(network_id, resource_version=""):
270     resource = "/network/l3-networks/l3-network/%s" % network_id
271     if resource_version:
272         resource = resource + "?resource-version=%s" % resource_version
273     ret = call_aai(resource, "DELETE")
274     if ret[0] != 0:
275         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
276         raise NSLCMException("Network delete exception in AAI")
277     return json.JSONDecoder().decode(ret[1]), ret[2]
278
279
280 def put_network_relationship(network_id, data):
281     resource = "/network/l3-networks/l3-network/%s/relationship-list/relationship" % network_id
282     ret = call_aai(resource, "PUT", data)
283     if ret[0] != 0:
284         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
285         raise NSLCMException("Put or update network relationship exception in AAI")
286     return json.JSONDecoder().decode(ret[1]), ret[2]
287
288
289 def delete_network_relationship(network_id):
290     resource = "/network/l3-networks/l3-network/%s/relationship-list/relationship" % network_id
291     ret = call_aai(resource, "DELETE")
292     if ret[0] != 0:
293         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
294         raise NSLCMException("Delete network relationship exception in AAI")
295     return json.JSONDecoder().decode(ret[1]), ret[2]
296
297
298 def create_subnet_aai(network_id, subnet_id, data):
299     resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
300     ret = call_aai(resource, "PUT", data)
301     if ret[0] != 0:
302         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
303         raise NSLCMException("Subnetwork creation exception in AAI")
304     return json.JSONDecoder().decode(ret[1]), ret[2]
305
306
307 def query_subnet_aai(network_id, subnet_id):
308     resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
309     ret = call_aai(resource, "GET")
310     if ret[0] != 0:
311         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
312         raise NSLCMException("Subnetwork query exception in AAI")
313     return json.JSONDecoder().decode(ret[1])
314
315
316 def delete_subnet_aai(network_id, subnet_id, resource_version=""):
317     resource = "/network/l3-networks/l3-network/%s/subnets/subnet/%s" % (network_id, subnet_id)
318     if resource_version:
319         resource = resource + "?resource-version=%s" % resource_version
320     ret = call_aai(resource, "DELETE")
321     if ret[0] != 0:
322         logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
323         raise NSLCMException("Subnetwork delete exception in AAI")
324     return json.JSONDecoder().decode(ret[1]), ret[2]