6 from prettytable
import PrettyTable
10 def __init__(self
,host
,upload_port
=8443):
12 raise Exception('missing host specifier')
15 self
._password
='admin'
17 self
._upload
_port
=upload_port
18 self
._url
= 'https://{}/'.format(self
._host
)
19 self
._upload
_url
= 'https://{}:{}/'.format(self
._host
.split(':')[0],self
._upload
_port
)
21 def get_curl_cmd(self
,url
):
22 curl_cmd
= pycurl
.Curl()
23 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
24 curl_cmd
.setopt(pycurl
.URL
, self
._url
+ url
)
25 curl_cmd
.setopt(pycurl
.SSL_VERIFYPEER
,0)
26 curl_cmd
.setopt(pycurl
.SSL_VERIFYHOST
,0)
27 curl_cmd
.setopt(pycurl
.USERPWD
, '{}:{}'.format(self
._user
,self
._password
))
28 curl_cmd
.setopt(pycurl
.HTTPHEADER
, ['Accept: application/vnd.yand.data+json','Content-Type": "application/vnd.yang.data+json'])
31 def get_curl_upload_cmd(self
,filename
):
32 curl_cmd
= pycurl
.Curl()
33 curl_cmd
.setopt(pycurl
.HTTPPOST
,[(('package',(pycurl
.FORM_FILE
,filename
)))])
34 curl_cmd
.setopt(pycurl
.URL
, self
._upload
_url
+ 'composer/upload?api_server=https://localhost&upload_server=https://' + self
._host
.split(':')[0])
35 curl_cmd
.setopt(pycurl
.SSL_VERIFYPEER
,0)
36 curl_cmd
.setopt(pycurl
.SSL_VERIFYHOST
,0)
37 curl_cmd
.setopt(pycurl
.USERPWD
, '{}:{}'.format(self
._user
,self
._password
))
40 def get_ns_opdata(self
,id):
42 curl_cmd
=self
.get_curl_cmd('api/operational/ns-instance-opdata/nsr/{}?deep'.format(id))
43 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
44 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
48 return json
.loads(data
.getvalue().decode())
51 def get_ns_catalog(self
):
53 curl_cmd
=self
.get_curl_cmd('api/running/nsd-catalog/nsd')
54 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
55 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
59 resp
= json
.loads(data
.getvalue().decode())
61 return {'nsd:nsd': []}
63 def get_config_agents(self
):
65 curl_cmd
=self
.get_curl_cmd('api/config/config-agent')
66 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
67 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
71 resp
= json
.loads(data
.getvalue().decode())
72 if 'rw-config-agent:config-agent' in resp
:
73 return resp
['rw-config-agent:config-agent']['account']
76 def delete_config_agent(self
,name
):
78 curl_cmd
=self
.get_curl_cmd('api/config/config-agent/account/'+name
)
79 curl_cmd
.setopt(pycurl
.CUSTOMREQUEST
, "DELETE")
80 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
83 resp
= json
.loads(data
.getvalue().decode())
86 def add_config_agent(self
,name
,account_type
,server
,user
,secret
):
88 curl_cmd
=self
.get_curl_cmd('api/config/config-agent')
89 curl_cmd
.setopt(pycurl
.POST
,1)
90 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
93 postdata
['account'] = list()
96 account
['name'] = name
97 account
['account-type'] = account_type
99 account
['juju']['user'] = user
100 account
['juju']['secret'] = secret
101 account
['juju']['ip-address'] = server
102 postdata
['account'].append(account
)
104 jsondata
=json
.dumps(postdata
)
105 curl_cmd
.setopt(pycurl
.POSTFIELDS
,jsondata
)
108 resp
= json
.loads(data
.getvalue().decode())
111 def get_ns_instance_list(self
):
113 curl_cmd
=self
.get_curl_cmd('api/running/ns-instance-config')
114 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
115 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
118 resp
= json
.loads(data
.getvalue().decode())
119 return resp
['nsr:ns-instance-config']
121 def get_vnf_catalog(self
):
123 curl_cmd
=self
.get_curl_cmd('api/running/vnfd-catalog/vnfd')
124 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
125 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
129 resp
= json
.loads(data
.getvalue().decode())
131 return {'vnfd:vnfd': []}
133 def get_vcs_info(self
):
135 curl_cmd
=self
.get_curl_cmd('api/operational/vcs/info')
136 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
137 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
141 resp
= json
.loads(data
.getvalue().decode())
142 return resp
['rw-base:info']['components']['component_info']
145 def get_vnfr_catalog(self
):
147 curl_cmd
=self
.get_curl_cmd('v1/api/operational/vnfr-catalog/vnfr')
148 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
149 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
153 resp
= json
.loads(data
.getvalue().decode())
157 def get_vnf(self
,vnf_name
):
158 vnfs
=self
.get_vnfr_catalog()
159 for vnf
in vnfs
['vnfr:vnfr']:
160 if vnf_name
== vnf
['name']:
164 def get_vnf_monitoring(self
,vnf_name
):
165 vnf
=self
.get_vnf(vnf_name
)
167 if 'monitoring-param' in vnf
:
168 return vnf
['monitoring-param']
171 def get_ns_monitoring(self
,ns_name
):
172 ns
=self
.get_ns(ns_name
)
174 raise Exception('cannot find ns {}'.format(ns_name
))
176 vnfs
=self
.get_vnfr_catalog()
180 for vnf
in vnfs
['vnfr:vnfr']:
181 if ns
['id'] == vnf
['nsr-id-ref']:
182 if 'monitoring-param' in vnf
:
183 mon_list
[vnf
['name']] = vnf
['monitoring-param']
187 def list_key_pair(self
):
189 curl_cmd
=self
.get_curl_cmd('v1/api/config/key-pair?deep')
190 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
191 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
194 resp
= json
.loads(data
.getvalue().decode())
195 if 'nsr:key-pair' in resp
:
196 return resp
['nsr:key-pair']
199 def list_ns_catalog(self
):
200 resp
= self
.get_ns_catalog()
201 table
=PrettyTable(['nsd name','id'])
202 for ns
in resp
['nsd:nsd']:
203 table
.add_row([ns
['name'],ns
['id']])
207 def list_ns_instance(self
):
208 resp
= self
.get_ns_instance_list()
209 table
=PrettyTable(['ns instance name','id','catalog name','operational status','config status'])
211 for ns
in resp
['nsr']:
212 nsopdata
=self
.get_ns_opdata(ns
['id'])
213 nsr
=nsopdata
['nsr:nsr']
214 table
.add_row([nsr
['name-ref'],nsr
['ns-instance-config-ref'],nsr
['nsd-name-ref'],nsr
['operational-status'],nsr
['config-status']])
218 def get_nsd(self
,name
):
219 resp
= self
.get_ns_catalog()
220 for ns
in resp
['nsd:nsd']:
221 if name
== ns
['name']:
225 def get_vnfd(self
,name
):
226 resp
= self
.get_vnf_catalog()
227 for vnf
in resp
['vnfd:vnfd']:
228 if name
== vnf
['name']:
232 def get_ns(self
,name
):
233 resp
=self
.get_ns_instance_list()
234 for ns
in resp
['nsr']:
235 if name
== ns
['name']:
239 def instantiate_ns(self
,nsd_name
,nsr_name
,account
,vim_network_prefix
=None,ssh_keys
=None,description
='default description',admin_status
='ENABLED'):
241 curl_cmd
=self
.get_curl_cmd('api/config/ns-instance-config/nsr')
242 curl_cmd
.setopt(pycurl
.POST
,1)
243 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
246 postdata
['nsr'] = list()
248 nsr
['id']=str(uuid
.uuid1())
250 nsd
=self
.get_nsd(nsd_name
)
252 raise Exception('cannot find nsd {}'.format(nsd_name
))
254 datacenter
=self
.get_datacenter(account
)
255 if datacenter
is None:
256 raise Exception('cannot find datacenter account {}'.format(account
))
260 nsr
['short-name']=nsr_name
261 nsr
['description']=description
262 nsr
['admin-status']=admin_status
263 nsr
['om-datacenter']=datacenter
['uuid']
265 if ssh_keys
is not None:
266 # ssh_keys is comma separate list
268 for key
in ssh_keys
.split(','):
269 ssh_keys_format
.append({'key-pair-ref':key
})
271 nsr
['ssh-authorized-key']=ssh_keys_format
273 if vim_network_prefix
is not None:
274 for index
,vld
in enumerate(nsr
['nsd']['vld']):
275 network_name
= vld
['name']
276 nsr
['nsd']['vld'][index
]['vim-network-name'] = '{}-{}'.format(vim_network_prefix
,network_name
)
278 postdata
['nsr'].append(nsr
)
279 jsondata
=json
.dumps(postdata
)
280 curl_cmd
.setopt(pycurl
.POSTFIELDS
,jsondata
)
283 resp
= json
.loads(data
.getvalue().decode())
286 def delete_nsd(self
,nsd_name
):
287 nsd
=self
.get_nsd(nsd_name
)
289 raise Exception('cannot find nsd {}'.format(nsd_name
))
291 curl_cmd
=self
.get_curl_cmd('api/running/nsd-catalog/nsd/'+nsd
['id'])
292 curl_cmd
.setopt(pycurl
.CUSTOMREQUEST
, "DELETE")
293 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
296 resp
= json
.loads(data
.getvalue().decode())
299 def delete_vnfd(self
,vnfd_name
):
300 vnfd
=self
.get_vnfd(vnfd_name
)
302 raise Exception('cannot find vnfd {}'.format(vnfd_name
))
304 curl_cmd
=self
.get_curl_cmd('api/running/vnfd-catalog/vnfd/'+vnfd
['id'])
305 curl_cmd
.setopt(pycurl
.CUSTOMREQUEST
, "DELETE")
306 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
309 resp
= json
.loads(data
.getvalue().decode())
312 def terminate_ns(self
,ns_name
):
313 ns
=self
.get_ns(ns_name
)
315 raise Exception('cannot find ns {}'.format(ns_name
))
318 curl_cmd
=self
.get_curl_cmd('api/config/ns-instance-config/nsr/'+ns
['id'])
319 curl_cmd
.setopt(pycurl
.CUSTOMREQUEST
, "DELETE")
320 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
323 resp
= json
.loads(data
.getvalue().decode())
326 def upload_package(self
,filename
):
328 curl_cmd
=self
.get_curl_upload_cmd(filename
)
329 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
332 resp
= json
.loads(data
.getvalue().decode())
335 def add_vim_account(self
,name
,user_name
,secret
,auth_url
,tenant
,mgmt_network
,float_ip_pool
,account_type
='openstack'):
337 curl_cmd
=self
.get_curl_cmd('api/config/cloud')
338 curl_cmd
.setopt(pycurl
.POST
,1)
339 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
341 vim_account
['account']={}
343 vim_account
['account']['name'] = name
344 vim_account
['account']['account-type'] = account_type
345 vim_account
['account'][account_type
] = {}
346 vim_account
['account'][account_type
]['key'] = user_name
347 vim_account
['account'][account_type
]['secret'] = secret
348 vim_account
['account'][account_type
]['auth_url'] = auth_url
349 vim_account
['account'][account_type
]['tenant'] = tenant
350 vim_account
['account'][account_type
]['mgmt-network'] = mgmt_network
351 vim_account
['account'][account_type
]['floating-ip-pool'] = float_ip_pool
353 jsondata
=json
.dumps(vim_account
)
354 curl_cmd
.setopt(pycurl
.POSTFIELDS
,jsondata
)
357 resp
= json
.loads(data
.getvalue().decode())
360 def list_vim_accounts(self
):
362 curl_cmd
=self
.get_curl_cmd('v1/api/operational/datacenters')
363 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
364 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
367 resp
= json
.loads(data
.getvalue().decode())
368 datacenters
=resp
['rw-launchpad:datacenters']
369 if 'ro-accounts' in datacenters
:
370 return datacenters
['ro-accounts']
373 def get_datacenter(self
,name
):
375 curl_cmd
=self
.get_curl_cmd('v1/api/operational/datacenters')
376 curl_cmd
.setopt(pycurl
.HTTPGET
,1)
377 curl_cmd
.setopt(pycurl
.WRITEFUNCTION
, data
.write
)
380 resp
= json
.loads(data
.getvalue().decode())
381 datacenters
=resp
['rw-launchpad:datacenters']
382 if 'ro-accounts' in datacenters
:
383 for roaccount
in datacenters
['ro-accounts']:
384 if not 'datacenters' in roaccount
:
386 for datacenter
in roaccount
['datacenters']:
387 if datacenter
['name'] == name
:
391 def show_ns(self
,ns_name
):
392 resp
= self
.get_ns_instance_list()
393 table
=PrettyTable(['attribute','value'])
396 for ns
in resp
['nsr']:
397 if ns_name
== ns
['name']:
399 for k
,v
in ns
.items():
400 table
.add_row([k
,json
.dumps(v
,indent
=2)])
402 nsopdata
=self
.get_ns_opdata(ns
['id'])
403 nsr_optdata
=nsopdata
['nsr:nsr']
404 for k
,v
in nsr_optdata
.items():
405 table
.add_row([k
,json
.dumps(v
,indent
=2)])
409 def show_ns_scaling(self
,ns_name
):
410 resp
= self
.get_ns_instance_list()
412 table
=PrettyTable(['instance-id','operational status','create-time','vnfr ids'])
415 for ns
in resp
['nsr']:
416 if ns_name
== ns
['name']:
417 nsopdata
=self
.get_ns_opdata(ns
['id'])
418 scaling_records
=nsopdata
['nsr:nsr']['scaling-group-record']
419 for record
in scaling_records
:
420 if 'instance' in record
:
421 instances
=record
['instance']
422 for inst
in instances
:
423 table
.add_row([inst
['instance-id'],inst
['op-status'],time
.strftime('%Y-%m-%d %H:%M:%S',time
.localtime(inst
['create-time'])),inst
['vnfrs']])
428 return self
.get_vnfr_catalog()
430 def list_vnf_catalog(self
):
431 resp
= self
.get_vnf_catalog()
432 table
=PrettyTable(['vnfd name','id'])
433 for ns
in resp
['vnfd:vnfd']:
434 table
.add_row([ns
['name'],ns
['id']])