def translate_etcd_result(etcd_result, model_type): """Translate etcd unicode result to etcd models.""" try: data = json.loads(etcd_result.value) ret = None if model_type == 'container': ret = models.Container(data) elif model_type == 'zun_service': ret = models.ZunService(data) elif model_type == 'image': ret = models.Image(data) elif model_type == 'resource_class': ret = models.ResourceClass(data) elif model_type == 'compute_node': ret = models.ComputeNode(data) elif model_type == 'capsule': ret = models.Capsule(data) elif model_type == 'pcidevice': ret = models.PciDevice(data) elif model_type == 'volume_mapping': ret = models.VolumeMapping(data) elif model_type == 'container_action': ret = models.ContainerAction(data) elif model_type == 'container_action_event': ret = models.ContainerActionEvent(data) else: raise exception.InvalidParameterValue( _('The model_type value: %s is invalid.'), model_type) return ret except (ValueError, TypeError) as e: LOG.error("Error occurred while translating etcd result: %s", six.text_type(e)) raise
def update_container(self, context, container_uuid, values): # NOTE(yuywz): Update would fail if any other client # write '/containers/$CONTAINER_UUID' in the meanwhile if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Container.") raise exception.InvalidParameterValue(err=msg) if 'name' in values: self._validate_unique_container_name(context, values['name']) try: target_uuid = self.get_container_by_uuid(context, container_uuid).uuid target = self.client.read('/containers/' + target_uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dump_as_bytes(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.ContainerNotFound(container=container_uuid) except Exception as e: LOG.error('Error occurred while updating container: %s', six.text_type(e)) raise return translate_etcd_result(target, 'container')
def update_volume_mapping(self, context, volume_mapping_uuid, values): # NOTE(dtantsur): this can lead to very strange errors if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing VolumeMapping.") raise exception.InvalidParameterValue(err=msg) return self._do_update_volume_mapping(volume_mapping_uuid, values)
def update_container(self, context, container_id, values): # NOTE(dtantsur): this can lead to very strange errors if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Container.") raise exception.InvalidParameterValue(err=msg) if 'name' in values: self._validate_unique_container_name(context, values['name']) return self._do_update_container(container_id, values)
def _process_list_result(self, res_list, limit=None, sort_key=None): if len(res_list) == 0: return [] sorted_res_list = res_list if sort_key: if not hasattr(res_list[0], sort_key): raise exception.InvalidParameterValue( err='Container has no attribute: %s' % sort_key) sorted_res_list = sorted(res_list, key=lambda k: k.get(sort_key)) if limit: sorted_res_list = sorted_res_list[0:limit] return sorted_res_list
def _paginate_query(model, limit=None, marker=None, sort_key=None, sort_dir=None, query=None, default_sort_key='id'): if not query: query = model_query(model) sort_keys = [default_sort_key] if sort_key and sort_key not in sort_keys: sort_keys.insert(0, sort_key) try: query = db_utils.paginate_query(query, model, limit, sort_keys, marker=marker, sort_dir=sort_dir) except db_exc.InvalidSortKey: raise exception.InvalidParameterValue( _('The sort_key value "%(key)s" is an invalid field for sorting') % {'key': sort_key}) return query.all()
def update_resource_class(self, context, uuid, values): if 'uuid' in values: msg = _("Cannot override UUID for an existing resource class.") raise exception.InvalidParameterValue(err=msg) try: target = self.client.read('/resource_classes/' + uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dump_as_bytes(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.ResourceClassNotFound(resource_class=uuid) except Exception as e: LOG.error('Error occurred while updating resource class: %s', six.text_type(e)) raise return translate_etcd_result(target, 'resource_class')
def update_compute_node(self, context, node_uuid, values): if 'uuid' in values: msg = _('Cannot overwrite UUID for an existing node.') raise exception.InvalidParameterValue(err=msg) try: target = self.client.read('/compute_nodes/' + node_uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dumps(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.ComputeNodeNotFound(compute_node=node_uuid) except Exception as e: LOG.error('Error occurred while updating compute node: %s', six.text_type(e)) raise return translate_etcd_result(target, 'compute_node')
def update_image(self, image_uuid, values): if 'uuid' in values: msg = _('Cannot overwrite UUID for an existing image.') raise exception.InvalidParameterValue(err=msg) try: target = self.client.read('/images/' + image_uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dump_as_bytes(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.ImageNotFound(image=image_uuid) except Exception as e: LOG.error('Error occurred while updating image: %s', six.text_type(e)) raise return translate_etcd_result(target, 'image')
def translate_etcd_result(etcd_result, model_type): """Translate etcd unicode result to etcd models.""" try: data = json.loads(etcd_result.value) ret = None if model_type == 'container': ret = models.Container(data) elif model_type == 'zun_service': ret = models.ZunService(data) elif model_type == 'image': ret = models.Image(data) else: raise exception.InvalidParameterValue( _('The model_type value: %s is invalid.'), model_type) return ret except (ValueError, TypeError) as e: LOG.error(_LE("Error occurred while translating etcd result: %s"), six.text_type(e)) raise
def update_capsule(self, context, capsule_id, values): if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Capsule.") raise exception.InvalidParameterValue(err=msg) try: target_uuid = self.get_capsule_by_uuid(context, capsule_id).uuid target = self.client.read('/capsules/' + target_uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dump_as_bytes(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.CapsuleNotFound(capsule=capsule_id) except Exception as e: LOG.error('Error occurred while updating capsule: %s', six.text_type(e)) raise return translate_etcd_result(target, 'capsule')
def update_volume_mapping(self, context, volume_mapping_uuid, values): if 'uuid' in values: msg = _('Cannot overwrite UUID for an existing VolumeMapping.') raise exception.InvalidParameterValue(err=msg) try: target_uuid = self.get_volume_mapping_by_uuid( context, volume_mapping_uuid).uuid target = self.client.read('/volume_mapping/' + target_uuid) target_value = json.loads(target.value) target_value.update(values) target.value = json.dump_as_bytes(target_value) self.client.update(target) except etcd.EtcdKeyNotFound: raise exception.VolumeMappingNotFound( volume_mapping=volume_mapping_uuid) except Exception as e: LOG.error('Error occurred while updating volume mappping: %s', six.text_type(e)) raise return translate_etcd_result(target, 'volume_mapping')
def update_capsule(self, context, capsule_id, values): if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Capsule.") raise exception.InvalidParameterValue(err=msg) return self._do_update_capsule_id(capsule_id, values)
def update_compute_node(self, context, node_uuid, values): if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing ComputeNode.") raise exception.InvalidParameterValue(err=msg) return self._do_update_compute_node(node_uuid, values)
def update_resource_provider(self, context, provider_id, values): if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing ResourceProvider.") raise exception.InvalidParameterValue(err=msg) return self._do_update_resource_provider(provider_id, values)
def update_image(self, image_id, values): # NOTE(dtantsur): this can lead to very strange errors if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Image.") raise exception.InvalidParameterValue(err=msg) return self._do_update_image(image_id, values)