Skip to content

Commit 31b5a22

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add image re/deactivate commands"
2 parents 5840dd5 + b3943d7 commit 31b5a22

3 files changed

Lines changed: 101 additions & 2 deletions

File tree

doc/source/command-objects/image.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ Set image properties
243243
[--os-distro <os-distro>]
244244
[--os-version <os-version>]
245245
[--ramdisk-id <ramdisk-id>]
246+
[--activate|--deactivate]
246247
<image>
247248
248249
.. option:: --name <name>
@@ -387,6 +388,18 @@ Set image properties
387388
388389
.. versionadded:: 2
389390
391+
.. option:: --activate
392+
393+
Activate the image.
394+
395+
.. versionadded:: 2
396+
397+
.. option:: --deactivate
398+
399+
Deactivate the image.
400+
401+
.. versionadded:: 2
402+
390403
.. describe:: <image>
391404
392405
Image to modify (name or ID)

openstackclient/image/v2/image.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,17 @@ def get_parser(self, prog_name):
693693
metavar="<ramdisk-id>",
694694
help="ID of ramdisk image used to boot this disk image",
695695
)
696+
deactivate_group = parser.add_mutually_exclusive_group()
697+
deactivate_group.add_argument(
698+
"--deactivate",
699+
action="store_true",
700+
help="Deactivate the image",
701+
)
702+
deactivate_group.add_argument(
703+
"--activate",
704+
action="store_true",
705+
help="Activate the image",
706+
)
696707
for deadopt in self.deadopts:
697708
parser.add_argument(
698709
"--%s" % deadopt,
@@ -745,18 +756,35 @@ def take_action(self, parsed_args):
745756
if parsed_args.private:
746757
kwargs['visibility'] = 'private'
747758

748-
if not kwargs:
759+
# Checks if anything that requires getting the image
760+
if not (kwargs or parsed_args.deactivate or parsed_args.activate):
749761
self.log.warning("No arguments specified")
750762
return {}, {}
751763

752764
image = utils.find_resource(
753765
image_client.images, parsed_args.image)
754766

767+
if parsed_args.deactivate:
768+
image_client.images.deactivate(image.id)
769+
activation_status = "deactivated"
770+
if parsed_args.activate:
771+
image_client.images.reactivate(image.id)
772+
activation_status = "activated"
773+
774+
# Check if need to do the actual update
775+
if not kwargs:
776+
return {}, {}
777+
755778
if parsed_args.tags:
756779
# Tags should be extended, but duplicates removed
757780
kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags)))
758781

759-
image = image_client.images.update(image.id, **kwargs)
782+
try:
783+
image = image_client.images.update(image.id, **kwargs)
784+
except Exception as e:
785+
if activation_status is not None:
786+
print("Image %s was %s." % (image.id, activation_status))
787+
raise e
760788

761789

762790
class ShowImage(show.ShowOne):

openstackclient/tests/image/v2/test_image.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,64 @@ def test_image_set_tag(self):
858858
**kwargs
859859
)
860860

861+
def test_image_set_activate(self):
862+
arglist = [
863+
'--tag', 'test-tag',
864+
'--activate',
865+
image_fakes.image_name,
866+
]
867+
verifylist = [
868+
('tags', ['test-tag']),
869+
('image', image_fakes.image_name),
870+
]
871+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
872+
873+
# DisplayCommandBase.take_action() returns two tuples
874+
self.cmd.take_action(parsed_args)
875+
876+
kwargs = {
877+
'tags': ['test-tag'],
878+
}
879+
880+
self.images_mock.reactivate.assert_called_with(
881+
image_fakes.image_id,
882+
)
883+
884+
# ImageManager.update(image, **kwargs)
885+
self.images_mock.update.assert_called_with(
886+
image_fakes.image_id,
887+
**kwargs
888+
)
889+
890+
def test_image_set_deactivate(self):
891+
arglist = [
892+
'--tag', 'test-tag',
893+
'--deactivate',
894+
image_fakes.image_name,
895+
]
896+
verifylist = [
897+
('tags', ['test-tag']),
898+
('image', image_fakes.image_name),
899+
]
900+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
901+
902+
# DisplayCommandBase.take_action() returns two tuples
903+
self.cmd.take_action(parsed_args)
904+
905+
kwargs = {
906+
'tags': ['test-tag'],
907+
}
908+
909+
self.images_mock.deactivate.assert_called_with(
910+
image_fakes.image_id,
911+
)
912+
913+
# ImageManager.update(image, **kwargs)
914+
self.images_mock.update.assert_called_with(
915+
image_fakes.image_id,
916+
**kwargs
917+
)
918+
861919
def test_image_set_tag_merge(self):
862920
old_image = copy.copy(image_fakes.IMAGE)
863921
old_image['tags'] = ['old1', 'new2']

0 commit comments

Comments
 (0)