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)
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)
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)