Merge "Support for snapshot force delete"
This commit is contained in:
		@@ -356,6 +356,8 @@ class FakeHTTPClient(base_client.HTTPClient):
 | 
			
		||||
            assert 'status' in body['os-reset_status']
 | 
			
		||||
        elif action == 'os-update_snapshot_status':
 | 
			
		||||
            assert 'status' in body['os-update_snapshot_status']
 | 
			
		||||
        elif action == 'os-force_delete':
 | 
			
		||||
            assert body[action] is None
 | 
			
		||||
        elif action == 'os-unmanage':
 | 
			
		||||
            assert body[action] is None
 | 
			
		||||
        else:
 | 
			
		||||
 
 | 
			
		||||
@@ -946,17 +946,44 @@ class ShellTest(utils.TestCase):
 | 
			
		||||
        self.assert_called('POST', '/volumes/1234/action', body=expected)
 | 
			
		||||
 | 
			
		||||
    def test_snapshot_delete(self):
 | 
			
		||||
        """Tests delete snapshot without force parameter"""
 | 
			
		||||
        self.run_command('snapshot-delete 1234')
 | 
			
		||||
        self.assert_called('DELETE', '/snapshots/1234')
 | 
			
		||||
 | 
			
		||||
    def test_snapshot_delete_multiple(self):
 | 
			
		||||
        """Tests delete multiple snapshots without force parameter"""
 | 
			
		||||
        self.run_command('snapshot-delete 5678 1234')
 | 
			
		||||
        self.assert_called_anytime('DELETE', '/snapshots/5678')
 | 
			
		||||
        self.assert_called('DELETE', '/snapshots/1234')
 | 
			
		||||
 | 
			
		||||
    def test_force_snapshot_delete(self):
 | 
			
		||||
        """Tests delete snapshot with default force parameter value(True)"""
 | 
			
		||||
        self.run_command('snapshot-delete 1234 --force')
 | 
			
		||||
        expected_body = {'os-force_delete': None}
 | 
			
		||||
        self.assert_called('POST',
 | 
			
		||||
                           '/snapshots/1234/action',
 | 
			
		||||
                           expected_body)
 | 
			
		||||
 | 
			
		||||
    def test_force_snapshot_delete_multiple(self):
 | 
			
		||||
        """
 | 
			
		||||
        Tests delete multiple snapshots with force parameter
 | 
			
		||||
 | 
			
		||||
        Snapshot delete with force parameter allows deleting snapshot of a
 | 
			
		||||
        volume when its status is other than "available" or "error".
 | 
			
		||||
        """
 | 
			
		||||
        self.run_command('snapshot-delete 5678 1234 --force')
 | 
			
		||||
        expected_body = {'os-force_delete': None}
 | 
			
		||||
        self.assert_called_anytime('POST',
 | 
			
		||||
                                   '/snapshots/5678/action',
 | 
			
		||||
                                   expected_body)
 | 
			
		||||
        self.assert_called_anytime('POST',
 | 
			
		||||
                                   '/snapshots/1234/action',
 | 
			
		||||
                                   expected_body)
 | 
			
		||||
 | 
			
		||||
    def test_quota_delete(self):
 | 
			
		||||
        self.run_command('quota-delete 1234')
 | 
			
		||||
        self.assert_called('DELETE', '/os-quota-sets/1234')
 | 
			
		||||
 | 
			
		||||
    def test_snapshot_delete_multiple(self):
 | 
			
		||||
        self.run_command('snapshot-delete 5678')
 | 
			
		||||
        self.assert_called('DELETE', '/snapshots/5678')
 | 
			
		||||
 | 
			
		||||
    def test_volume_manage(self):
 | 
			
		||||
        self.run_command('manage host1 some_fake_name '
 | 
			
		||||
                         '--name foo --description bar '
 | 
			
		||||
 
 | 
			
		||||
@@ -784,13 +784,19 @@ def do_snapshot_create(cs, args):
 | 
			
		||||
@utils.arg('snapshot',
 | 
			
		||||
           metavar='<snapshot>', nargs='+',
 | 
			
		||||
           help='Name or ID of the snapshot(s) to delete.')
 | 
			
		||||
@utils.arg('--force',
 | 
			
		||||
           action="store_true",
 | 
			
		||||
           help='Allows deleting snapshot of a volume '
 | 
			
		||||
           'when its status is other than "available" or "error". '
 | 
			
		||||
           'Default=False.')
 | 
			
		||||
@utils.service_type('volumev3')
 | 
			
		||||
def do_snapshot_delete(cs, args):
 | 
			
		||||
    """Removes one or more snapshots."""
 | 
			
		||||
    failure_count = 0
 | 
			
		||||
 | 
			
		||||
    for snapshot in args.snapshot:
 | 
			
		||||
        try:
 | 
			
		||||
            _find_volume_snapshot(cs, snapshot).delete()
 | 
			
		||||
            _find_volume_snapshot(cs, snapshot).delete(args.force)
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            failure_count += 1
 | 
			
		||||
            print("Delete for snapshot %s failed: %s" % (snapshot, e))
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,9 @@ class Snapshot(base.Resource):
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return "<Snapshot: %s>" % self.id
 | 
			
		||||
 | 
			
		||||
    def delete(self):
 | 
			
		||||
    def delete(self, force=False):
 | 
			
		||||
        """Delete this snapshot."""
 | 
			
		||||
        return self.manager.delete(self)
 | 
			
		||||
        return self.manager.delete(self, force)
 | 
			
		||||
 | 
			
		||||
    def update(self, **kwargs):
 | 
			
		||||
        """Update the name or description for this snapshot."""
 | 
			
		||||
@@ -118,12 +118,16 @@ class SnapshotManager(base.ManagerWithFind):
 | 
			
		||||
                                   limit=limit, sort=sort)
 | 
			
		||||
        return self._list(url, resource_type, limit=limit)
 | 
			
		||||
 | 
			
		||||
    def delete(self, snapshot):
 | 
			
		||||
    def delete(self, snapshot, force=False):
 | 
			
		||||
        """Delete a snapshot.
 | 
			
		||||
 | 
			
		||||
        :param snapshot: The :class:`Snapshot` to delete.
 | 
			
		||||
        :param force: Allow delete in state other than error or available.
 | 
			
		||||
        """
 | 
			
		||||
        return self._delete("/snapshots/%s" % base.getid(snapshot))
 | 
			
		||||
        if force:
 | 
			
		||||
            return self._action('os-force_delete', snapshot)
 | 
			
		||||
        else:
 | 
			
		||||
            return self._delete("/snapshots/%s" % base.getid(snapshot))
 | 
			
		||||
 | 
			
		||||
    def update(self, snapshot, **kwargs):
 | 
			
		||||
        """Update the name or description for a snapshot.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user