def paginate(url, page_size, limit=None): next_url = url req_id_hdr = {} while True: if limit and page_size > limit: # NOTE(flaper87): Avoid requesting 2000 images when limit # is 1 next_url = next_url.replace("limit=%s" % page_size, "limit=%s" % limit) resp, body = self.http_client.get(next_url, headers=req_id_hdr) # NOTE(rsjethani): Store curent request id so that it can be # used in subsequent requests. Refer bug #1525259 req_id_hdr['x-openstack-request-id'] = \ utils._extract_request_id(resp) for image in body['images']: # NOTE(bcwaldon): remove 'self' for now until we have # an elegant way to pass it into the model constructor # without conflict. image.pop('self', None) # We do not validate the model when listing. # This prevents side-effects of injecting invalid # schema values via v1. yield self.unvalidated_model(**image), resp if limit: limit -= 1 if limit <= 0: raise StopIteration try: next_url = body['next'] except KeyError: return
def update(self, namespace, prop_name, **kwargs): """Update a property. :param namespace: Name of a namespace the property belongs. :param prop_name: Name of a property (old one). :param kwargs: Unpacked property object. """ prop = self.get(namespace, prop_name) for (key, value) in kwargs.items(): try: setattr(prop, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) url = '/v2/metadefs/namespaces/{0}/properties/{1}'.format( namespace, prop_name) # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=prop.wrapped) # Get request id from `put` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp) } return self._get(namespace, prop.name, req_id_hdr)
def update(self, namespace_name, **kwargs): """Update a namespace. :param namespace_name: Name of a namespace (old one). :param kwargs: Unpacked namespace object. """ namespace = self.get(namespace_name) for (key, value) in kwargs.items(): try: setattr(namespace, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) # Remove read-only parameters. read_only = ['schema', 'updated_at', 'created_at'] for elem in read_only: if elem in namespace: del namespace[elem] url = '/v2/metadefs/namespaces/{0}'.format(namespace_name) # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=namespace.wrapped) # Get request id from `put` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp) } return self._get(namespace.namespace, header=req_id_hdr)
def paginate(url, page_size, limit=None): next_url = url req_id_hdr = {} while True: if limit and page_size > limit: # NOTE(flaper87): Avoid requesting 2000 images when limit # is 1 next_url = next_url.replace("limit=%s" % page_size, "limit=%s" % limit) resp, body = self.http_client.get(next_url, headers=req_id_hdr) # NOTE(rsjethani): Store curent request id so that it can be # used in subsequent requests. Refer bug #1525259 req_id_hdr['x-openstack-request-id'] = \ utils._extract_request_id(resp) for image in body['images']: # NOTE(bcwaldon): remove 'self' for now until we have # an elegant way to pass it into the model constructor # without conflict. image.pop('self', None) # We do not validate the model when listing. # This prevents side-effects of injecting invalid # schema values via v1. yield self.unvalidated_model(**image), resp if limit: limit -= 1 if limit <= 0: return try: next_url = body['next'] except KeyError: return
def update(self, namespace_name, **kwargs): """Update a namespace. :param namespace_name: Name of a namespace (old one). :param kwargs: Unpacked namespace object. """ namespace = self.get(namespace_name) for (key, value) in kwargs.items(): try: setattr(namespace, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) # Remove read-only parameters. read_only = ['schema', 'updated_at', 'created_at'] for elem in read_only: if elem in namespace: del namespace[elem] url = '/v2/metadefs/namespaces/%(namespace)s' % { 'namespace': namespace_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=namespace.wrapped) # Get request id from `put` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp) } return self._get(namespace.namespace, header=req_id_hdr)
def update(self, namespace, tag_name, **kwargs): """Update a tag. :param namespace: Name of a namespace the Tag belongs. :param tag_name: Name of the Tag (old one). :param kwargs: Unpacked tag. """ tag = self.get(namespace, tag_name) for (key, value) in kwargs.items(): try: setattr(tag, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) # Remove read-only parameters. read_only = ['updated_at', 'created_at'] for elem in read_only: if elem in tag: del tag[elem] url = '/v2/metadefs/namespaces/%(namespace)s/tags/%(tag_name)s' % { 'namespace': namespace, 'tag_name': tag_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=tag.wrapped) # Get request id from `put` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp)} return self._get(namespace, tag.name, req_id_hdr)
def update(self, namespace, prop_name, **kwargs): """Update a property. :param namespace: Name of a namespace the property belongs. :param prop_name: Name of a property (old one). :param kwargs: Unpacked property object. """ prop = self.get(namespace, prop_name) for (key, value) in kwargs.items(): try: setattr(prop, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) url = ('/v2/metadefs/namespaces/%(namespace)s/' 'properties/%(prop_name)s') % { 'namespace': namespace, 'prop_name': prop_name} # Pass the original wrapped value to http client. resp, _ = self.http_client.put(url, data=prop.wrapped) # Get request id from `put` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp)} return self._get(namespace, prop.name, req_id_hdr)
def update(self, image_id, remove_props=None, **kwargs): """Update attributes of an image. :param image_id: ID of the image to modify. :param remove_props: List of property names to remove :param kwargs: Image attribute names and their new values. """ unvalidated_image = self.get(image_id) image = self.model(**unvalidated_image) for (key, value) in kwargs.items(): try: setattr(image, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) if remove_props: cur_props = image.keys() new_props = kwargs.keys() # NOTE(esheffield): Only remove props that currently exist on the # image and are NOT in the properties being updated / added props_to_remove = set(cur_props).intersection( set(remove_props).difference(new_props)) for key in props_to_remove: delattr(image, key) url = '/v2/images/%s' % image_id hdrs = {'Content-Type': 'application/openstack-images-v2.1-json-patch'} resp, _ = self.http_client.patch(url, headers=hdrs, data=image.patch) # Get request id from `patch` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp) } # NOTE(bcwaldon): calling image.patch doesn't clear the changes, so # we need to fetch the image again to get a clean history. This is # an obvious optimization for warlock return self._get(image_id, req_id_hdr)
def update(self, image_id, remove_props=None, **kwargs): """Update attributes of an image. :param image_id: ID of the image to modify. :param remove_props: List of property names to remove :param kwargs: Image attribute names and their new values. """ unvalidated_image = self.get(image_id) image = self.model(**unvalidated_image) for (key, value) in kwargs.items(): try: setattr(image, key, value) except warlock.InvalidOperation as e: raise TypeError(encodeutils.exception_to_unicode(e)) if remove_props: cur_props = image.keys() new_props = kwargs.keys() # NOTE(esheffield): Only remove props that currently exist on the # image and are NOT in the properties being updated / added props_to_remove = set(cur_props).intersection( set(remove_props).difference(new_props)) for key in props_to_remove: delattr(image, key) url = '/v2/images/%s' % image_id hdrs = {'Content-Type': 'application/openstack-images-v2.1-json-patch'} resp, _ = self.http_client.patch(url, headers=hdrs, data=image.patch) # Get request id from `patch` request so it can be passed to the # following `get` call req_id_hdr = { 'x-openstack-request-id': utils._extract_request_id(resp)} # NOTE(bcwaldon): calling image.patch doesn't clear the changes, so # we need to fetch the image again to get a clean history. This is # an obvious optimization for warlock return self._get(image_id, req_id_hdr)