def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): if source_volume and volume_type: if volume_type['id'] != source_volume['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type['id'] != snapshot['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) def check_volume_az_zone(availability_zone): try: return self._valid_availability_zone(availability_zone) except exception.CinderException: LOG.exception(_("Unable to query if %s is in the " "availability zone set"), availability_zone) return False create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, 'optional_args': {'is_quota_committed': False} } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, check_volume_az_zone, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) flow_engine.run() volume = flow_engine.storage.fetch('volume') return volume
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): if source_volume and volume_type: if volume_type['id'] != source_volume['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type['id'] != snapshot['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) def check_volume_az_zone(availability_zone): try: return self._valid_availability_zone(availability_zone) except exception.CinderException: LOG.exception(_("Unable to query if %s is in the " "availability zone set"), availability_zone) return False create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, check_volume_az_zone, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) flow_engine.run() volume = flow_engine.storage.fetch('volume') return volume
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): def check_volume_az_zone(availability_zone): try: return self._valid_availability_zone(availability_zone) except exception.CinderException: LOG.exception(_("Unable to query if %s is in the " "availability zone set"), availability_zone) return False create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, check_volume_az_zone, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) flow_engine.run() volume = flow_engine.storage.fetch('volume') return volume
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): if source_volume and volume_type: if volume_type['id'] != source_volume['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type['id'] != snapshot['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) # Determine the valid availability zones that the volume could be # created in (a task in the flow will/can use this information to # ensure that the availability zone requested is valid). raw_zones = self.list_availability_zones(enable_cache=True) availability_zones = set([az['name'] for az in raw_zones]) if CONF.storage_availability_zone: availability_zones.add(CONF.storage_availability_zone) create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, 'optional_args': { 'is_quota_committed': False } } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, availability_zones, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) # Attaching this listener will capture all of the notifications that # taskflow sends out and redirect them to a more useful log for # cinders debugging (or error reporting) usage. with flow_utils.DynamicLogListener(flow_engine, logger=LOG): flow_engine.run() return flow_engine.storage.fetch('volume')
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): if source_volume and volume_type: if volume_type['id'] != source_volume['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type['id'] != snapshot['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) # Determine the valid availability zones that the volume could be # created in (a task in the flow will/can use this information to # ensure that the availability zone requested is valid). raw_zones = self.list_availability_zones(enable_cache=True) availability_zones = set([az['name'] for az in raw_zones]) if CONF.storage_availability_zone: availability_zones.add(CONF.storage_availability_zone) create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, 'optional_args': {'is_quota_committed': False} } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, availability_zones, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) # Attaching this listener will capture all of the notifications that # taskflow sends out and redirect them to a more useful log for # cinders debugging (or error reporting) usage. with flow_utils.DynamicLogListener(flow_engine, logger=LOG): flow_engine.run() return flow_engine.storage.fetch('volume')
def create(self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None): if source_volume and volume_type: if volume_type['id'] != source_volume['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type['id'] != snapshot['volume_type_id']: msg = _("Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument.") raise exception.InvalidInput(reason=msg) def check_volume_az_zone(availability_zone): try: return self._valid_availability_zone(availability_zone) except exception.CinderException: LOG.exception(_("Unable to query if %s is in the " "availability zone set"), availability_zone) return False create_what = { 'context': context, 'raw_size': size, 'name': name, 'description': description, 'snapshot': snapshot, 'image_id': image_id, 'raw_volume_type': volume_type, 'metadata': metadata, 'raw_availability_zone': availability_zone, 'source_volume': source_volume, 'scheduler_hints': scheduler_hints, 'key_manager': self.key_manager, 'backup_source_volume': backup_source_volume, 'optional_args': {'is_quota_committed': False} } try: flow_engine = create_volume.get_flow(self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, check_volume_az_zone, create_what) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException( _("Failed to create api volume flow")) # Attaching this listener will capture all of the notifications that # taskflow sends out and redirect them to a more useful log for # cinders debugging (or error reporting) usage. with flow_common.DynamicLogListener(flow_engine, logger=LOG): flow_engine.run() return flow_engine.storage.fetch('volume')
def create( self, context, size, name, description, snapshot=None, image_id=None, volume_type=None, metadata=None, availability_zone=None, source_volume=None, scheduler_hints=None, backup_source_volume=None, source_replica=None, consistencygroup=None, ): if consistencygroup: if not volume_type: msg = _("volume_type must be provided when creating " "a volume in a consistency group.") raise exception.InvalidInput(reason=msg) cg_voltypeids = consistencygroup.get("volume_type_id") if volume_type.get("id") not in cg_voltypeids: msg = _("Invalid volume_type provided (requested type " "must be supported by this consistency group).") raise exception.InvalidInput(reason=msg) if source_volume and volume_type: if volume_type["id"] != source_volume["volume_type_id"]: msg = _( "Invalid volume_type provided (requested type " "must match source volume, or be omitted). " "You should omit the argument." ) raise exception.InvalidInput(reason=msg) # When cloning replica (for testing), volume type must be omitted if source_replica and volume_type: msg = _("No volume_type should be provided when creating test " "replica, type must be omitted.") raise exception.InvalidInput(reason=msg) if snapshot and volume_type: if volume_type["id"] != snapshot["volume_type_id"]: msg = _( "Invalid volume_type provided (requested type " "must match source snapshot, or be omitted). " "You should omit the argument." ) raise exception.InvalidInput(reason=msg) # Determine the valid availability zones that the volume could be # created in (a task in the flow will/can use this information to # ensure that the availability zone requested is valid). raw_zones = self.list_availability_zones(enable_cache=True) availability_zones = set([az["name"] for az in raw_zones]) if CONF.storage_availability_zone: availability_zones.add(CONF.storage_availability_zone) create_what = { "context": context, "raw_size": size, "name": name, "description": description, "snapshot": snapshot, "image_id": image_id, "raw_volume_type": volume_type, "metadata": metadata, "raw_availability_zone": availability_zone, "source_volume": source_volume, "scheduler_hints": scheduler_hints, "key_manager": self.key_manager, "backup_source_volume": backup_source_volume, "source_replica": source_replica, "optional_args": {"is_quota_committed": False}, "consistencygroup": consistencygroup, } try: flow_engine = create_volume.get_flow( self.scheduler_rpcapi, self.volume_rpcapi, self.db, self.image_service, availability_zones, create_what ) except Exception: LOG.exception(_("Failed to create api volume flow")) raise exception.CinderException(_("Failed to create api volume flow")) # Attaching this listener will capture all of the notifications that # taskflow sends out and redirect them to a more useful log for # cinders debugging (or error reporting) usage. with flow_utils.DynamicLogListener(flow_engine, logger=LOG): flow_engine.run() return flow_engine.storage.fetch("volume")