6a6c1c136fbdef8f09c50f31fe406471682c3b38
[osm/osmclient.git] / osmclient / sol005 / sdncontroller.py
1 # Copyright 2018 Telefonica
2 #
3 # All Rights Reserved.
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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
15 # under the License.
16
17 """
18 OSM SDN controller API handling
19 """
20
21 from osmclient.common import utils
22 from osmclient.common import wait as WaitForStatus
23 from osmclient.common.exceptions import ClientException
24 from osmclient.common.exceptions import NotFound
25 import json
26
27
28 class SdnController(object):
29 def __init__(self, http=None, client=None):
30 self._http = http
31 self._client = client
32 self._apiName = '/admin'
33 self._apiVersion = '/v1'
34 self._apiResource = '/sdns'
35 self._apiBase = '{}{}{}'.format(self._apiName,
36 self._apiVersion, self._apiResource)
37
38 # SDNC '--wait' option
39 def _wait(self, id, deleteFlag=False):
40 # Endpoint to get operation status
41 apiUrlStatus = '{}{}{}'.format(self._apiName, self._apiVersion, '/sdns')
42 # Wait for status for SDN instance creation/update/deletion
43 WaitForStatus.wait_for_status(
44 'SDNC',
45 str(id),
46 WaitForStatus.TIMEOUT_SDNC_OPERATION,
47 apiUrlStatus,
48 self._http.get2_cmd,
49 deleteFlag=deleteFlag)
50
51 def _get_id_for_wait(self, name):
52 # Returns id of name, or the id itself if given as argument
53 for sdnc in self.list():
54 if name == sdnc['name']:
55 return sdnc['_id']
56 for wim in self.list():
57 if name == sdnc['_id']:
58 return sdnc['_id']
59 return ''
60
61 def create(self, name, sdn_controller, wait=False):
62 http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
63 postfields_dict=sdn_controller)
64 #print 'HTTP CODE: {}'.format(http_code)
65 #print 'RESP: {}'.format(resp)
66 if http_code in (200, 201, 202, 204):
67 if resp:
68 resp = json.loads(resp)
69 if not resp or 'id' not in resp:
70 raise ClientException('unexpected response from server - {}'.format(
71 resp))
72 if wait:
73 # Wait for status for SDNC instance creation
74 self._wait(resp.get('id'))
75 print(resp['id'])
76 else:
77 msg = ""
78 if resp:
79 try:
80 msg = json.loads(resp)
81 except ValueError:
82 msg = resp
83 raise ClientException("failed to create SDN controller {} - {}".format(name, msg))
84
85 def update(self, name, sdn_controller, wait=False):
86 sdnc = self.get(name)
87 sdnc_id_for_wait = self._get_id_for_wait(name)
88 http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase,sdnc['_id']),
89 postfields_dict=sdn_controller)
90 #print 'HTTP CODE: {}'.format(http_code)
91 #print 'RESP: {}'.format(resp)
92 if http_code in (200, 201, 202, 204):
93 if resp:
94 resp = json.loads(resp)
95 if not resp or 'id' not in resp:
96 raise ClientException('unexpected response from server - {}'.format(
97 resp))
98 if wait:
99 # Wait for status for SDNC instance update
100 self._wait(sdnc_id_for_wait)
101 print(resp['id'])
102 else:
103 msg = ""
104 if resp:
105 try:
106 msg = json.loads(resp)
107 except ValueError:
108 msg = resp
109 raise ClientException("failed to update SDN controller {} - {}".format(name, msg))
110
111 def delete(self, name, force=False, wait=False):
112 sdn_controller = self.get(name)
113 sdnc_id_for_wait = self._get_id_for_wait(name)
114 querystring = ''
115 if force:
116 querystring = '?FORCE=True'
117 http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
118 sdn_controller['_id'], querystring))
119 #print 'HTTP CODE: {}'.format(http_code)
120 #print 'RESP: {}'.format(resp)
121 if http_code == 202:
122 if wait:
123 # Wait for status for SDNC instance deletion
124 self._wait(sdnc_id_for_wait, deleteFlag=True)
125 else:
126 print('Deletion in progress')
127 elif http_code == 204:
128 print('Deleted')
129 elif resp and 'result' in resp:
130 print('Deleted')
131 else:
132 msg = ""
133 if resp:
134 try:
135 msg = json.loads(resp)
136 except ValueError:
137 msg = resp
138 raise ClientException("failed to delete SDN controller {} - {}".format(name, msg))
139
140 def list(self, filter=None):
141 """Returns a list of SDN controllers
142 """
143 filter_string = ''
144 if filter:
145 filter_string = '?{}'.format(filter)
146 resp = self._http.get_cmd('{}{}'.format(self._apiBase,filter_string))
147 #print 'RESP: {}'.format(resp)
148 if resp:
149 return resp
150 return list()
151
152 def get(self, name):
153 """Returns an SDN controller based on name or id
154 """
155 if utils.validate_uuid4(name):
156 for sdnc in self.list():
157 if name == sdnc['_id']:
158 return sdnc
159 else:
160 for sdnc in self.list():
161 if name == sdnc['name']:
162 return sdnc
163 raise NotFound("SDN controller {} not found".format(name))
164
165