Ejemplo n.º 1
0
def snapshot_delete(openstack_resource, **kwargs):
    """
     Delete volume backup.
    :param openstack_resource: instance of openstack volume resource
    :param kwargs: snapshot information provided by workflow
    """

    ctx.logger.info('Delete snapshot for {0}'.format(
        openstack_resource.resource_id))

    # Get snapshot information provided by workflow parameters
    snapshot_name = kwargs.get('snapshot_name')
    snapshot_incremental = kwargs.get('snapshot_incremental')
    # Generate snapshot name
    snapshot_name = \
        get_snapshot_name('volume', snapshot_name, snapshot_incremental)

    search_opts = \
        {
            'volume_id': openstack_resource.resource_id,
            'name': snapshot_name
        }

    # This is a backup stored at object storage must be deleted
    if not snapshot_incremental:
        _delete_volume_backup(openstack_resource, search_opts)
    # This is a snapshot that need to be deleted
    else:
        _delete_volume_snapshot(openstack_resource, search_opts)
Ejemplo n.º 2
0
def snapshot_create(openstack_resource, **kwargs):
    """
    Create volume backup.
    :param openstack_resource: instance of openstack volume resource
    :param kwargs: snapshot information provided by workflow
    """

    ctx.logger.info('Create snapshot for {0}'.format(
        openstack_resource.resource_id))

    # Get snapshot information provided by workflow parameters
    snapshot_name = kwargs.get('snapshot_name')
    snapshot_type = kwargs.get('snapshot_type')
    snapshot_incremental = kwargs.get('snapshot_incremental')

    # Generate snapshot name
    backup_name = \
        get_snapshot_name('volume', snapshot_name, snapshot_incremental)

    if not snapshot_incremental:
        # Create volume backup
        _create_volume_backup(openstack_resource, backup_name)
    else:
        # Create volume snapshot
        _create_volume_snapshot(openstack_resource, backup_name, snapshot_type)
    def test_restore_volume_backup(self, mock_connection):
        # Prepare the context for apply snapshot operation
        self._prepare_context_for_operation(
            test_name='VolumeTestCase',
            ctx_operation_name='cloudify.interfaces.snapshot.apply')

        # Set resource id as runtime properties for volume instance
        self._ctx.instance.runtime_properties['id'] = '1'

        snapshot_name = \
            get_snapshot_name('volume', 'test_volume_backup', False)

        restored_volume_backup_instance = \
            openstack.block_storage.v2.backup.Backup(**{
                'id': '1',
                'name': snapshot_name,
                'description': 'volume_backup_description',
                'availability_zone': 'test_availability_zone',
                'status': VOLUME_STATUS_CREATING
            })

        volume_backups = [
            openstack.block_storage.v2.backup.Backup(
                **{
                    'id': '1',
                    'name': snapshot_name,
                    'description': 'volume_backup_description',
                    'availability_zone': 'test_availability_zone',
                    'status': VOLUME_STATUS_AVAILABLE
                }),
            openstack.block_storage.v2.backup.Backup(
                **{
                    'id': '2',
                    'name': 'test_volume_backup_2',
                    'description': 'volume_backup_description',
                    'availability_zone': 'test_availability_zone',
                    'status': VOLUME_STATUS_AVAILABLE
                })
        ]
        # Mock list volume backup response
        mock_connection().block_storage.backups = \
            mock.MagicMock(return_value=volume_backups)

        # Mock restore volume backup response
        mock_connection().block_storage.restore_backup = \
            mock.MagicMock(return_value=restored_volume_backup_instance)

        snapshot_params = {
            'snapshot_name': 'test_volume_backup',
            'snapshot_incremental': False
        }

        # Call restore backup volume volume
        volume.snapshot_apply(**snapshot_params)
    def test_create_volume_backup(self, mock_connection):
        # Prepare the context for create snapshot operation
        self._prepare_context_for_operation(
            test_name='VolumeTestCase',
            ctx_operation_name='cloudify.interfaces.snapshot.create')

        # Set resource id as runtime properties for volume instance
        self._ctx.instance.runtime_properties['id'] = '1'

        snapshot_name = \
            get_snapshot_name('volume', 'test_volume_backup', False)

        volume_backup_instance = openstack.block_storage.v2.backup.Backup(
            **{
                'id': '1',
                'name': snapshot_name,
                'description': 'volume_backup_description',
                'availability_zone': 'test_availability_zone',
                'status': VOLUME_STATUS_CREATING
            })
        available_volume_backup = \
            openstack.block_storage.v2.backup.Backup(**{
                'id': '1',
                'name': snapshot_name,
                'description': 'volume_backup_description',
                'availability_zone': 'test_availability_zone',
                'status': VOLUME_STATUS_AVAILABLE
            })
        # Mock create volume backup response
        mock_connection().block_storage.create_backup = \
            mock.MagicMock(return_value=volume_backup_instance)

        # Mock get volume backup response
        mock_connection().block_storage.get_backup = \
            mock.MagicMock(return_value=available_volume_backup)

        snapshot_params = {
            'snapshot_name': 'test_volume_backup',
            'snapshot_incremental': False
        }

        # Call create backup volume volume
        volume.snapshot_create(**snapshot_params)

        for attr in [VOLUME_SNAPSHOT_TASK, VOLUME_BACKUP_ID]:
            self.assertNotIn(attr, self._ctx.instance.runtime_properties)
Ejemplo n.º 5
0
def snapshot_apply(openstack_resource, **kwargs):
    """
    This operation task will restore volume from created volume backups
    :param openstack_resource: instance of openstack volume resource
    :param kwargs: snapshot information provided by workflow
    """
    # Get snapshot information provided by workflow parameters
    snapshot_name = kwargs.get('snapshot_name')
    snapshot_incremental = kwargs.get('snapshot_incremental')

    # Generate snapshot name
    backup_name = \
        get_snapshot_name('volume', snapshot_name, snapshot_incremental)

    if not snapshot_incremental:
        _restore_volume_from_backup(openstack_resource, backup_name)
    else:
        raise NonRecoverableError('Apply snapshot is not supported')
    def test_create_volume_snapshot_with_retry(self, mock_connection):
        # Prepare the context for create snapshot operation
        self._prepare_context_for_operation(
            test_name='VolumeTestCase',
            ctx_operation_name='cloudify.interfaces.snapshot.create')

        # Set resource id as runtime properties for volume instance
        self._ctx.instance.runtime_properties['id'] = '1'

        snapshot_name = \
            get_snapshot_name('volume', 'test_volume_snapshot', True)

        volume_snapshot_instance = \
            openstack.block_storage.v2.snapshot.Snapshot(**{
                'id': '1',
                'name': snapshot_name,
                'description': 'volume_snapshot_description',
                'status': VOLUME_STATUS_CREATING
            })
        # Mock create volume snapshot response
        mock_connection().block_storage.create_snapshot = \
            mock.MagicMock(return_value=volume_snapshot_instance)

        # Mock get volume snapshot response
        mock_connection().block_storage.get_snapshot = \
            mock.MagicMock(return_value=volume_snapshot_instance)

        snapshot_params = {
            'snapshot_name': 'test_volume_snapshot',
            'snapshot_type': 'Daily',
            'snapshot_incremental': True
        }

        # Call create snapshot volume volume
        with self.assertRaises(OperationRetry):
            volume.snapshot_create(**snapshot_params)
    def test_delete_volume_snapshot(self, mock_connection):
        # Prepare the context for delete snapshot operation
        self._prepare_context_for_operation(
            test_name='VolumeTestCase',
            ctx_operation_name='cloudify.interfaces.snapshot.delete')

        # Set resource id as runtime properties for volume instance
        self._ctx.instance.runtime_properties['id'] = '1'

        snapshot_name = \
            get_snapshot_name('volume', 'test_volume_snapshot', True)

        volume_snapshot_to_delete = \
            openstack.block_storage.v2.snapshot.Snapshot(**{
                'id': '1',
                'name': snapshot_name,
                'description': 'volume_backup_description',
                'status': VOLUME_STATUS_CREATING
            })

        all_volume_snapshots = [
            openstack.block_storage.v2.snapshot.Snapshot(
                **{
                    'id': '1',
                    'name': snapshot_name,
                    'description': 'volume_backup_description',
                    'status': VOLUME_STATUS_CREATING
                }),
            openstack.block_storage.v2.snapshot.Snapshot(
                **{
                    'id': '1',
                    'name': 'test_volume_snapshot_2',
                    'description': 'volume_backup_description',
                    'status': VOLUME_STATUS_CREATING
                })
        ]

        remaining_volume_snapshots = [
            openstack.block_storage.v2.snapshot.Snapshot(
                **{
                    'id': '1',
                    'name': 'test_volume_snapshot_2',
                    'description': 'volume_backup_description',
                    'status': VOLUME_STATUS_CREATING
                })
        ]
        # Mock list volume snapshots response
        mock_connection().block_storage.snapshots = \
            mock.MagicMock(side_effect=[all_volume_snapshots,
                                        remaining_volume_snapshots])

        # Mock get volume snapshot response
        mock_connection().block_storage.get_snapshot = \
            mock.MagicMock(return_value=volume_snapshot_to_delete)

        # Mock delete volume snapshot response
        mock_connection().block_storage.delete_snapshot = \
            mock.MagicMock(return_value=None)

        snapshot_params = {
            'snapshot_name': 'test_volume_snapshot',
            'snapshot_incremental': True
        }

        # Call delete snapshot volume
        volume.snapshot_delete(**snapshot_params)