def _create_flashcopy(self, source_volume_id, target_volume_id, options): logger.info( "creating FlashCopy relationship from '{0}' to '{1}'".format( source_volume_id, target_volume_id)) options.append(FLASHCOPY_PERMIT_SPACE_EFFICIENT_TARGET_OPTION) try: api_flashcopy = self.client.create_flashcopy( source_volume_id=source_volume_id, target_volume_id=target_volume_id, options=options) except (exceptions.ClientError, exceptions.ClientException) as ex: if ERROR_CODE_ALREADY_FLASHCOPY in str(ex.message).upper(): raise array_errors.SnapshotAlreadyExists( target_volume_id, self.service_address) if ERROR_CODE_VOLUME_NOT_FOUND_OR_ALREADY_PART_OF_CS_RELATIONSHIP in str( ex.message).upper(): raise array_errors.ObjectNotFoundError('{} or {}'.format( source_volume_id, target_volume_id)) raise ex flashcopy_state = self.get_flashcopy_state(api_flashcopy.id) if not flashcopy_state == FLASHCOPY_STATE_VALID: self._delete_flashcopy(api_flashcopy.id) raise ValueError( "Flashcopy state is not correct. expected: '{}' , got: '{}'.". format(FLASHCOPY_STATE_VALID, flashcopy_state)) return self._get_api_volume_by_id(target_volume_id)
def create_snapshot(self, name, volume_name, pool_id=None): logger.info("creating snapshot {0} from volume {1}".format( name, volume_name)) try: cli_snapshot = self.client.cmd.snapshot_create( name=name, vol=volume_name).as_single_element logger.info( "finished creating cli snapshot {0} from volume {1}".format( name, volume_name)) return self._generate_snapshot_response(cli_snapshot) except xcli_errors.IllegalNameForObjectError as ex: logger.exception(ex) raise controller_errors.IllegalObjectName(ex.status) except xcli_errors.VolumeExistsError as ex: logger.exception(ex) raise controller_errors.SnapshotAlreadyExists(name, self.endpoint) except xcli_errors.VolumeBadNameError as ex: logger.exception(ex) raise controller_errors.ObjectNotFoundError(volume_name) except xcli_errors.OperationForbiddenForUserCategoryError as ex: logger.exception(ex) raise controller_errors.PermissionDeniedError( "create snapshot {0} from volume {1}".format( name, volume_name))
def _create_flashcopy(self, source_volume_id, target_volume_id, options=None): logger.info( "creating FlashCopy relationship from '{0}' to '{1}'".format( source_volume_id, target_volume_id)) source_volume_id = get_volume_id_from_scsi_identifier(source_volume_id) target_volume_id = get_volume_id_from_scsi_identifier(target_volume_id) if not options: options = [] options.append(FLASHCOPY_PERMIT_SPACE_EFFICIENT_TARGET) try: api_flashcopy = self.client.create_flashcopy( source_volume_id=source_volume_id, target_volume_id=target_volume_id, options=options) except (exceptions.ClientError, exceptions.ClientException) as ex: if ERROR_CODE_ALREADY_FLASHCOPY in str(ex.message).upper(): raise array_errors.SnapshotAlreadyExists( target_volume_id, self.service_address) elif ERROR_CODE_VOLUME_NOT_FOUND_OR_ALREADY_PART_OF_CS_RELATIONSHIP in str( ex.message).upper(): raise array_errors.VolumeNotFoundError('{} or {}'.format( source_volume_id, target_volume_id)) else: raise ex if not self.validate_flashcopy(api_flashcopy.id): self._delete_flashcopy(api_flashcopy.id) logger.info("Flashcopy is not in a valid state") raise ValueError return self._get_api_volume_by_id(target_volume_id)
def create_snapshot(self, volume_id, snapshot_name, pool=None): logger.info("creating snapshot {0} from volume {1}".format( snapshot_name, volume_id)) source_cli_volume = self._get_cli_object_by_wwn(volume_id) if pool and pool != source_cli_volume.pool_name: raise array_errors.SnapshotSourcePoolMismatch( snapshot_pool=pool, source_pool=source_cli_volume.pool_name) try: cli_snapshot = self.client.cmd.snapshot_create( name=snapshot_name, vol=source_cli_volume.name).as_single_element logger.info( "finished creating cli snapshot {0} from volume {1}".format( snapshot_name, volume_id)) return self._generate_snapshot_response(cli_snapshot) except xcli_errors.IllegalNameForObjectError as ex: logger.exception(ex) raise array_errors.IllegalObjectName(ex.status) except xcli_errors.VolumeExistsError as ex: logger.exception(ex) raise array_errors.SnapshotAlreadyExists(snapshot_name, self.endpoint) except xcli_errors.VolumeBadNameError as ex: logger.exception(ex) raise array_errors.ObjectNotFoundError(volume_id) except xcli_errors.OperationForbiddenForUserCategoryError as ex: logger.exception(ex) raise array_errors.PermissionDeniedError( "create snapshot {0} from volume {1}".format( snapshot_name, volume_id))