def _wait_for_futures(self, futures, raise_on_error=True): '''Collect results or failures from a list of running future tasks.''' results = [] retries = [] # Check on each result as its thread finishes for completed in concurrent.futures.as_completed(futures): try: result = completed.result() exceptions.raise_from_response(result) results.append(result) except (keystoneauth1.exceptions.RetriableConnectionFailure, exceptions.HttpException) as e: error_text = "Exception processing async task: {}".format( str(e)) if raise_on_error: self.log.exception(error_text) raise else: self.log.debug(error_text) # If we get an exception, put the result into a list so we # can try again retries.append(completed.result()) return results, retries
def create_container(self, name, public=False): """Create an object-store container. :param str name: Name of the container to create. :param bool public: Whether to set this container to be public. Defaults to ``False``. """ container = self.get_container(name) if container: return container exceptions.raise_from_response(self.object_store.put(name)) if public: self.set_container_access(name, 'public') return self.get_container(name, skip_cache=True)
def update_container(self, name, headers): """Update the metadata in a container. :param str name: Name of the container to create. :param dict headers: Key/Value headers to set on the container. """ """Update the metadata in a container. :param str name: Name of the container to update. :param dict headers: Key/Value headers to set on the container. """ exceptions.raise_from_response( self.object_store.post(name, headers=headers))
def get_container(self, name, skip_cache=False): """Get metadata about a container. :param str name: Name of the container to get metadata for. :param bool skip_cache: Ignore the cache of container metadata for this container.o Defaults to ``False``. """ if skip_cache or name not in self._container_cache: try: response = self.object_store.head(name) exceptions.raise_from_response(response) self._container_cache[name] = response.headers except exc.OpenStackCloudHTTPError as e: if e.response.status_code == 404: return None raise return self._container_cache[name]
def delete_container(self, name): """Delete an object-store container. :param str name: Name of the container to delete. """ try: exceptions.raise_from_response(self.object_store.delete(name)) self._container_cache.pop(name, None) return True except exc.OpenStackCloudHTTPError as e: if e.response.status_code == 404: return False if e.response.status_code == 409: raise exc.OpenStackCloudException( 'Attempt to delete container {container} failed. The' ' container is not empty. Please delete the objects' ' inside it before deleting the container'.format( container=name)) raise
def authorize(self): """Authorize this Connection .. note:: This method is optional. When an application makes a call to any OpenStack service, this method allows you to request a token manually before attempting to do anything else. :returns: A string token. :raises: :class:`~openstack.exceptions.HttpException` if the authorization fails due to reasons like the credentials provided are unable to be authorized or the `auth_type` argument is missing, etc. """ try: return self.session.get_token() except keystoneauth1.exceptions.ClientException as e: raise exceptions.raise_from_response(e.response)