diff --git a/glanceclient/tests/unit/v2/test_images.py b/glanceclient/tests/unit/v2/test_images.py index 84726ce0..6fda7ae3 100644 --- a/glanceclient/tests/unit/v2/test_images.py +++ b/glanceclient/tests/unit/v2/test_images.py @@ -207,6 +207,12 @@ data_fixtures = { 'CCC', ), }, + '/v2/images/87b634c1-f893-33c9-28a9-e5673c99239a/actions/reactivate': { + 'POST': ({}, None) + }, + '/v2/images/87b634c1-f893-33c9-28a9-e5673c99239a/actions/deactivate': { + 'POST': ({}, None) + }, '/v2/images?limit=%d&visibility=public' % images.DEFAULT_PAGE_SIZE: { 'GET': ( {}, @@ -789,6 +795,24 @@ class TestController(testtools.TestCase): None)] self.assertEqual(expect, self.api.calls) + def test_deactivate_image(self): + id_image = '87b634c1-f893-33c9-28a9-e5673c99239a' + self.controller.deactivate(id_image) + expect = [('POST', + '/v2/images/%s/actions/deactivate' % id_image, + {}, + None)] + self.assertEqual(expect, self.api.calls) + + def reactivate_image(self): + id_image = '87b634c1-f893-33c9-28a9-e5673c99239a' + self.controller.reactivate(id_image) + expect = [('POST', + '/v2/images/%s/actions/reactivate' % id_image, + {}, + None)] + self.assertEqual(expect, self.api.calls) + def test_data_upload(self): image_data = 'CCC' image_id = '606b0e88-7c5a-4d54-b5bb-046105d4de6f' diff --git a/glanceclient/tests/unit/v2/test_shell_v2.py b/glanceclient/tests/unit/v2/test_shell_v2.py index 1a5f5013..4ccef275 100644 --- a/glanceclient/tests/unit/v2/test_shell_v2.py +++ b/glanceclient/tests/unit/v2/test_shell_v2.py @@ -601,6 +601,24 @@ class ShellV2Test(testtools.TestCase): test_shell.do_image_delete(self.gc, args) self.assertEqual(2, mocked_delete.call_count) + def test_do_image_deactivate(self): + args = argparse.Namespace(id='image1') + with mock.patch.object(self.gc.images, + 'deactivate') as mocked_deactivate: + mocked_deactivate.return_value = 0 + + test_shell.do_image_deactivate(self.gc, args) + self.assertEqual(1, mocked_deactivate.call_count) + + def test_do_image_reactivate(self): + args = argparse.Namespace(id='image1') + with mock.patch.object(self.gc.images, + 'reactivate') as mocked_reactivate: + mocked_reactivate.return_value = 0 + + test_shell.do_image_reactivate(self.gc, args) + self.assertEqual(1, mocked_reactivate.call_count) + @mock.patch.object(utils, 'exit') @mock.patch.object(utils, 'print_err') def test_do_image_delete_with_invalid_ids(self, mocked_print_err, diff --git a/glanceclient/v2/images.py b/glanceclient/v2/images.py index 1f733a44..4fdcea2d 100644 --- a/glanceclient/v2/images.py +++ b/glanceclient/v2/images.py @@ -234,6 +234,16 @@ class Controller(object): body.pop('self', None) return self.model(**body) + def deactivate(self, image_id): + """Deactivate an image.""" + url = '/v2/images/%s/actions/deactivate' % image_id + return self.http_client.post(url) + + def reactivate(self, image_id): + """Reactivate an image.""" + url = '/v2/images/%s/actions/reactivate' % image_id + return self.http_client.post(url) + def update(self, image_id, remove_props=None, **kwargs): """Update attributes of an image. diff --git a/glanceclient/v2/shell.py b/glanceclient/v2/shell.py index 963eb900..e6f27660 100644 --- a/glanceclient/v2/shell.py +++ b/glanceclient/v2/shell.py @@ -335,6 +335,20 @@ def do_image_delete(gc, args): utils.exit() +@utils.arg('id', metavar='', + help=_('ID of image to deactivate.')) +def do_image_deactivate(gc, args): + """Deactivate specified image.""" + gc.images.deactivate(args.id) + + +@utils.arg('id', metavar='', + help=_('ID of image to reactivate.')) +def do_image_reactivate(gc, args): + """Reactivate specified image.""" + gc.images.reactivate(args.id) + + @utils.arg('image_id', metavar='', help=_('Image to be updated with the given tag.')) @utils.arg('tag_value', metavar='',