def _get_from_manager(resource): # catch client side errors try: res = resource.manager.get(resource.id) except Exception as e: if getattr(e, "code", 400) == 404: raise exceptions.GetResourceNotFound(resource=resource) raise exceptions.GetResourceFailure(resource=resource, err=e) # catch abnormal status, such as "no valid host" for servers status = get_status(res) if status in ("DELETED", "DELETE_COMPLETE"): raise exceptions.GetResourceNotFound(resource=res) if status in error_statuses: raise exceptions.GetResourceErrorStatus(resource=res, status=status, fault="") return res
def _get_from_manager(resource): # catch client side errors try: res = resource.manager.get(resource.id) except Exception as e: if getattr(e, 'code', 400) == 404: raise exceptions.GetResourceNotFound(resource=resource) raise exceptions.GetResourceFailure(resource=resource, err=e) # catch abnormal status, such as "no valid host" for servers status = res.status.upper() if status == "DELETED": raise exceptions.GetResourceNotFound(resource=res) if status in error_statuses: if isinstance(res.manager, servers.ServerManager): msg = res.fault['message'] else: msg = '' raise exceptions.GetResourceErrorStatus(resource=res, status=status, fault=msg) return res
def wait_for_status(resource, ready_statuses, failure_statuses=None, status_attr="status", update_resource=None, timeout=60, check_interval=1, check_deletion=False): resource_repr = getattr(resource, "name", repr(resource)) if not isinstance(ready_statuses, (set, list, tuple)): raise ValueError("Ready statuses should be supplied as set, list or " "tuple") if failure_statuses and not isinstance(failure_statuses, (set, list, tuple)): raise ValueError("Failure statuses should be supplied as set, list or " "tuple") # make all statuses upper case ready_statuses = set([s.upper() for s in ready_statuses or []]) failure_statuses = set([s.upper() for s in failure_statuses or []]) if len(ready_statuses & failure_statuses) > 0: raise ValueError( "Can't wait for resource's %s status. Ready and Failure" "statuses conflict." % resource_repr) if not ready_statuses: raise ValueError("Can't wait for resource's %s status. No ready " "statuses provided" % resource_repr) if not update_resource: raise ValueError( "Can't wait for resource's %s status. No update method." % resource_repr) start = time.time() latest_status = get_status(resource, status_attr) latest_status_update = start while True: try: resource = update_resource(resource) except exceptions.GetResourceNotFound: if check_deletion: return else: raise status = get_status(resource, status_attr) if status != latest_status: current_time = time.time() delta = current_time - latest_status_update LOG.debug( "Waiting for resource %(resource)s. Status changed: " "%(latest)s => %(current)s in %(delta)s" % { "resource": resource_repr, "latest": latest_status, "current": status, "delta": delta }) latest_status = status latest_status_update = current_time if status in ready_statuses: return resource if status in failure_statuses: raise exceptions.GetResourceErrorStatus( resource=resource, status=status, fault="Status in failure list %s" % str(failure_statuses)) time.sleep(check_interval) if time.time() - start > timeout: raise exceptions.TimeoutException( desired_status="('%s')" % "', '".join(ready_statuses), resource_name=resource_repr, resource_type=resource.__class__.__name__, resource_id=getattr(resource, "id", "<no id>"), resource_status=get_status(resource))