コード例 #1
0
 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)
コード例 #2
0
    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))
コード例 #3
0
 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)
コード例 #4
0
 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))