1 # Copyright 2018 Telefonica
5 # Licensed under the Apache License, Version 2.0 (the "License"); you may
6 # not use this file except in compliance with the License. You may obtain
7 # a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 # License for the specific language governing permissions and limitations
21 from osmclient
.common
import utils
22 from osmclient
.common
.exceptions
import ClientException
23 from osmclient
.common
.exceptions
import NotFound
30 def __init__(self
, http
=None, client
=None):
33 self
._apiName
= '/nslcm'
34 self
._apiVersion
= '/v1'
35 self
._apiResource
= '/ns_instances_content'
36 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
37 self
._apiVersion
, self
._apiResource
)
39 def list(self
, filter=None):
40 """Returns a list of NS
44 filter_string
= '?{}'.format(filter)
45 resp
= self
._http
.get_cmd('{}{}'.format(self
._apiBase
,filter_string
))
51 """Returns an NS based on name or id
53 if utils
.validate_uuid4(name
):
54 for ns
in self
.list():
58 for ns
in self
.list():
59 if name
== ns
['name']:
61 raise NotFound("ns {} not found".format(name
))
63 def get_individual(self
, name
):
65 if not utils
.validate_uuid4(name
):
66 for ns
in self
.list():
67 if name
== ns
['name']:
70 resp
= self
._http
.get_cmd('{}/{}'.format(self
._apiBase
, ns_id
))
71 #resp = self._http.get_cmd('{}/{}/nsd_content'.format(self._apiBase, ns_id))
72 #print yaml.safe_dump(resp)
75 raise NotFound("ns {} not found".format(name
))
77 def delete(self
, name
, force
=False):
81 querystring
= '?FORCE=True'
82 http_code
, resp
= self
._http
.delete_cmd('{}/{}{}'.format(self
._apiBase
,
83 ns
['_id'], querystring
))
85 resp
= json
.loads(resp
)
86 #print 'RESP: {}'.format(resp)
88 print 'Deletion in progress'
89 elif http_code
== 204:
92 raise ClientException("failed to delete ns {}: {}".format(name
, resp
))
94 def create(self
, nsd_name
, nsr_name
, account
, config
=None,
95 ssh_keys
=None, description
='default description',
96 admin_status
='ENABLED'):
98 nsd
= self
._client
.nsd
.get(nsd_name
)
102 def get_vim_account_id(vim_account
):
103 if vim_account_id
.get(vim_account
):
104 return vim_account_id
[vim_account
]
106 vim
= self
._client
.vim
.get(vim_account
)
108 raise NotFound("cannot find vim account '{}'".format(vim_account
))
109 vim_account_id
[vim_account
] = vim
['_id']
113 ns
['nsdId'] = nsd
['_id']
114 ns
['nsName'] = nsr_name
115 ns
['nsDescription'] = description
116 ns
['vimAccountId'] = get_vim_account_id(account
)
118 #ns['userdata']['key1']='value1'
119 #ns['userdata']['key2']='value2'
121 if ssh_keys
is not None:
122 # ssh_keys is comma separate list
123 # ssh_keys_format = []
124 # for key in ssh_keys.split(','):
125 # ssh_keys_format.append({'key-pair-ref': key})
127 # ns['ssh-authorized-key'] = ssh_keys_format
128 ns
['ssh-authorized-key'] = []
129 for pubkeyfile
in ssh_keys
.split(','):
130 with
open(pubkeyfile
, 'r') as f
:
131 ns
['ssh-authorized-key'].append(f
.read())
133 ns_config
= yaml
.load(config
)
134 if "vim-network-name" in ns_config
:
135 ns_config
["vld"] = ns_config
.pop("vim-network-name")
136 if "vld" in ns_config
:
137 for vld
in ns_config
["vld"]:
138 if vld
.get("vim-network-name"):
139 if isinstance(vld
["vim-network-name"], dict):
140 vim_network_name_dict
= {}
141 for vim_account
, vim_net
in vld
["vim-network-name"].items():
142 vim_network_name_dict
[get_vim_account_id(vim_account
)] = vim_net
143 vld
["vim-network-name"] = vim_network_name_dict
144 ns
["vld"] = ns_config
["vld"]
145 if "vnf" in ns_config
:
146 for vnf
in ns_config
["vnf"]:
147 if vnf
.get("vim_account"):
148 vnf
["vimAccountId"] = get_vim_account_id(vnf
.pop("vim_account"))
150 ns
["vnf"] = ns_config
["vnf"]
152 #print yaml.safe_dump(ns)
154 self
._apiResource
= '/ns_instances_content'
155 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
156 self
._apiVersion
, self
._apiResource
)
157 http_code
, resp
= self
._http
.post_cmd(endpoint
=self
._apiBase
,
160 resp
= json
.loads(resp
)
161 #print 'RESP: {}'.format(resp)
162 if not resp
or 'id' not in resp
:
163 raise ClientException('unexpected response from server: '.format(
167 except ClientException
as exc
:
168 message
="failed to create ns: {} nsd: {}\nerror:\n{}".format(
172 raise ClientException(message
)
174 def list_op(self
, name
, filter=None):
175 """Returns the list of operations of a NS
179 self
._apiResource
= '/ns_lcm_op_occs'
180 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
181 self
._apiVersion
, self
._apiResource
)
184 filter_string
= '&{}'.format(filter)
185 http_code
, resp
= self
._http
.get2_cmd('{}?nsInstanceId={}'.format(self
._apiBase
, ns
['_id'],
187 resp
= json
.loads(resp
)
188 #print 'RESP: {}'.format(resp)
192 raise ClientException('{}'.format(resp
['detail']))
194 except ClientException
as exc
:
195 message
="failed to get operation list of NS {}:\nerror:\n{}".format(
198 raise ClientException(message
)
200 def get_op(self
, operationId
):
201 """Returns the status of an operation
204 self
._apiResource
= '/ns_lcm_op_occs'
205 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
206 self
._apiVersion
, self
._apiResource
)
207 http_code
, resp
= self
._http
.get2_cmd('{}/{}'.format(self
._apiBase
, operationId
))
208 resp
= json
.loads(resp
)
209 #print 'RESP: {}'.format(resp)
213 raise ClientException("{}".format(resp
['detail']))
214 except ClientException
as exc
:
215 message
="failed to get status of operation {}:\nerror:\n{}".format(
218 raise ClientException(message
)
220 def exec_op(self
, name
, op_name
, op_data
=None):
221 """Executes an operation on a NS
225 self
._apiResource
= '/ns_instances'
226 self
._apiBase
= '{}{}{}'.format(self
._apiName
,
227 self
._apiVersion
, self
._apiResource
)
228 endpoint
= '{}/{}/{}'.format(self
._apiBase
, ns
['_id'], op_name
)
229 #print 'OP_NAME: {}'.format(op_name)
230 #print 'OP_DATA: {}'.format(json.dumps(op_data))
231 http_code
, resp
= self
._http
.post_cmd(endpoint
=endpoint
, postfields_dict
=op_data
)
233 resp
= json
.loads(resp
)
234 #print 'RESP: {}'.format(resp)
235 if not resp
or 'id' not in resp
:
236 raise ClientException('unexpected response from server: '.format(
240 except ClientException
as exc
:
241 message
="failed to exec operation {}:\nerror:\n{}".format(
244 raise ClientException(message
)
246 def create_alarm(self
, alarm
):
248 data
["create_alarm_request"] = {}
249 data
["create_alarm_request"]["alarm_create_request"] = alarm
251 http_code
, resp
= self
._http
.post_cmd(endpoint
='/test/message/alarm_request',
252 postfields_dict
=data
)
253 if http_code
in (200, 201, 202, 204):
254 #resp = json.loads(resp)
255 #print 'RESP: {}'.format(resp)
256 print 'Alarm created'
258 raise ClientException('unexpected response from server: code: {}, resp: {}'.format(
260 except ClientException
as exc
:
261 message
="failed to create alarm: alarm {}\nerror:\n{}".format(
264 raise ClientException(message
)
266 def delete_alarm(self
, name
):
268 data
["delete_alarm_request"] = {}
269 data
["delete_alarm_request"]["alarm_delete_request"] = {}
270 data
["delete_alarm_request"]["alarm_delete_request"]["alarm_uuid"] = name
272 http_code
, resp
= self
._http
.post_cmd(endpoint
='/test/message/alarm_request',
273 postfields_dict
=data
)
274 if http_code
in (200, 201, 202, 204):
275 #resp = json.loads(resp)
276 #print 'RESP: {}'.format(resp)
277 print 'Alarm deleted'
279 raise ClientException('unexpected response from server: code: {}, resp: {}'.format(
281 except ClientException
as exc
:
282 message
="failed to delete alarm: alarm {}\nerror:\n{}".format(
285 raise ClientException(message
)
287 def export_metric(self
, metric
):
289 data
["read_metric_data_request"] = metric
291 http_code
, resp
= self
._http
.post_cmd(endpoint
='/test/message/metric_request',
292 postfields_dict
=data
)
293 if http_code
in (200, 201, 202, 204):
294 #resp = json.loads(resp)
295 #print 'RESP: {}'.format(resp)
296 return 'Metric exported'
298 raise ClientException('unexpected response from server: code: {}, resp: {}'.format(
300 except ClientException
as exc
:
301 message
="failed to export metric: metric {}\nerror:\n{}".format(
304 raise ClientException(message
)