@@ -30,7 +30,6 @@ def __init__(self, cloud_resource_name=None, api_token=None, profile=None, debug
3030 sys .exit (1 )
3131
3232 self ._output = output
33- self ._retries = 30
3433
3534 self .cloud_resource_name = cloud_resource_name
3635 self .verbose = verbose
@@ -50,6 +49,14 @@ def __init__(self, cloud_resource_name=None, api_token=None, profile=None, debug
5049 def get_client_resource (self ):
5150 return getattr (self ._client , self .cloud_resource_name )
5251
52+ def _handle_tags (self , tags ):
53+ try :
54+ tags = tags_to_dict (tags )
55+ return tags
56+ except ValueError as e :
57+ click .echo (e , err = True )
58+ sys .exit (1 )
59+
5360 def _format_output (self , response ):
5461 if self ._output == "json" :
5562 return to_pretty_json (response )
@@ -73,7 +80,7 @@ def cmd_list(self, filter_tag=None, filter_json=None, action=None, delete=False,
7380 sys .exit (1 )
7481 try :
7582 with Spinner (text = "Querying" ):
76- response = self .get_client_resource ().get_all (filter_tag )
83+ response = self .get_client_resource ().get_all (filter_tag = filter_tag )
7784 if filter_json :
7885 try :
7986 response = jmespath .search (filter_json , response )
@@ -104,13 +111,13 @@ def cmd_list(self, filter_tag=None, filter_json=None, action=None, delete=False,
104111 getattr (self .get_client_resource (), action )(uuid )
105112
106113 if wait :
107- response = self .get_client_resource ().get_all (filter_tag )
114+ response = self .get_client_resource ().get_all (filter_tag = filter_tag )
108115 for r in response :
109116 uuid = r ['href' ].split ('/' )[- 1 ]
110117 self .wait_for_status (uuid = uuid )
111118
112119 with Spinner (text = "Querying" ):
113- response = self .get_client_resource ().get_all (filter_tag )
120+ response = self .get_client_resource ().get_all (filter_tag = filter_tag )
114121 click .echo (self ._format_output (response ))
115122 except Exception as e :
116123 click .echo (e , err = True )
@@ -133,7 +140,7 @@ def cmd_get_by_name(self, name):
133140 def cmd_show (self , uuid ):
134141 try :
135142 with Spinner (text = f"Querying by { self .resource_uuid_name } { uuid } " ):
136- response = self .get_client_resource ().get_by_uuid (uuid )
143+ response = self .get_client_resource ().get_by_uuid (uuid = uuid )
137144 click .echo (self ._format_output (response ))
138145 except CloudscaleApiException as e :
139146 results = self .cmd_get_by_name (name = uuid )
@@ -152,11 +159,7 @@ def cmd_show(self, uuid):
152159 def cmd_create (self , silent = False , ** kwargs ):
153160 try :
154161 if 'tags' in kwargs :
155- try :
156- kwargs ['tags' ] = tags_to_dict (kwargs ['tags' ])
157- except ValueError as e :
158- click .echo (e , err = True )
159- sys .exit (1 )
162+ kwargs ['tags' ] = self ._handle_tags (kwargs ['tags' ])
160163
161164 name = kwargs .get (self .resource_name_key , '' )
162165 with Spinner (text = f"Creating { name } " ):
@@ -172,7 +175,7 @@ def cmd_create(self, silent=False, **kwargs):
172175 def cmd_update (self , uuid , tags = None , clear_tags = None , clear_all_tags = False , wait = False , ** kwargs ):
173176 try :
174177 with Spinner (text = f"Querying by { self .resource_uuid_name } { uuid } " ):
175- self .get_client_resource ().get_by_uuid (uuid )
178+ self .get_client_resource ().get_by_uuid (uuid = uuid )
176179
177180 except CloudscaleApiException as e :
178181 results = self .cmd_get_by_name (name = uuid )
@@ -222,7 +225,7 @@ def cmd_update(self, uuid, tags=None, clear_tags=None, clear_all_tags=False, wai
222225 response = self .wait_for_status (uuid = uuid )
223226 else :
224227 with Spinner (text = f"Querying { uuid } " ):
225- response = self .get_client_resource ().get_by_uuid (uuid )
228+ response = self .get_client_resource ().get_by_uuid (uuid = uuid )
226229
227230 click .echo (self ._format_output (response ))
228231 except Exception as e :
@@ -234,7 +237,7 @@ def cmd_delete(self, uuid, force=False, skip_query=False):
234237 if not skip_query :
235238 try :
236239 with Spinner (text = f"Querying by { self .resource_uuid_name } { uuid } " ):
237- response = self .get_client_resource ().get_by_uuid (uuid )
240+ response = self .get_client_resource ().get_by_uuid (uuid = uuid )
238241 except CloudscaleApiException as e :
239242 results = self .cmd_get_by_name (name = uuid )
240243 if not results :
@@ -268,7 +271,7 @@ def cmd_act(self, action, uuid, wait=False):
268271 with Spinner (text = f"Processing" ):
269272 try :
270273 with Spinner (text = f"Querying by { self .resource_uuid_name } { uuid } " ):
271- self .get_client_resource ().get_by_uuid (uuid )
274+ self .get_client_resource ().get_by_uuid (uuid = uuid )
272275
273276 except CloudscaleApiException as e :
274277 results = self .cmd_get_by_name (name = uuid )
@@ -295,20 +298,25 @@ def cmd_act(self, action, uuid, wait=False):
295298 response = self .wait_for_status (uuid = uuid )
296299 else :
297300 with Spinner (text = f"Querying { uuid } " ):
298- response = self .get_client_resource ().get_by_uuid (uuid )
301+ response = self .get_client_resource ().get_by_uuid (uuid = uuid )
299302 click .echo (self ._format_output (response ))
300303 except Exception as e :
301304 click .echo (e , err = True )
302305 sys .exit (1 )
303306
304- def wait_for_status (self , uuid ):
307+ def wait_for_status (self , uuid , status = "changing" , max_sleep = 4 , retries = 30 , path = "" ):
305308 with Spinner (text = f"Waiting for status { uuid } : ..." ) as sp :
306- for retry in range (1 , self . _retries ):
307- response = self .get_client_resource ().get_by_uuid (uuid )
308- if response ['status' ] != 'changing' :
309+ for retry in range (0 , retries ):
310+ response = self .get_client_resource ().get_by_uuid (uuid = uuid , path = path )
311+ if response ['status' ] != status :
309312 break
310- sp .text = f"Waiting for status { uuid } : { response ['status' ]} "
311- time .sleep (1 )
313+ sp .text = f"Waiting for { uuid } to finish, current status: { response ['status' ]} { retry * '.' } "
314+
315+ # Exponential wait...
316+ sleep = 2 ** retry
317+ if sleep > max_sleep :
318+ sleep = max_sleep
319+ time .sleep (sleep )
312320 else :
313321 sp .text = f"Waiting for status { uuid } timed out."
314322 time .sleep (1 )
0 commit comments