Skip to content

Commit 7dc1276

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Adding image delete --store and image import info commands"
2 parents afdec1d + b347347 commit 7dc1276

File tree

9 files changed

+184
-7
lines changed

9 files changed

+184
-7
lines changed

doc/source/cli/data/glance.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ image-tag-update,image set --tag <tag>,Update an image with the given tag.
1818
image-tasks,,Get tasks associated with image.
1919
image-update,image set,Update an existing image.
2020
image-upload,,Upload data for a specific image.
21-
import-info,,Print import methods available from Glance.
21+
import-info,image import info,Show available import methods from Glance.
2222
location-add,,Add a location (and related metadata) to an image.
2323
location-delete,,Remove locations (and related metadata) from an image.
2424
location-update,,Update metadata of an image's location.
@@ -57,7 +57,7 @@ member-delete,image remove project,Delete image member.
5757
member-get,,Show details of an image member
5858
member-list,image member list,Describe sharing permissions by image.
5959
member-update,image set --accept --reject --status,Update the status of a member for a given image.
60-
stores-delete,,Delete image from specific store.
60+
stores-delete,image delete --store,Delete image from specific store.
6161
stores-info,,Print available backends from Glance.
6262
task-create,WONTFIX,Create a new task.
6363
task-list,image task list,List tasks you can access.

openstackclient/image/v2/image.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,13 @@ def get_parser(self, prog_name):
653653
nargs="+",
654654
help=_("Image(s) to delete (name or ID)"),
655655
)
656+
parser.add_argument(
657+
'--store',
658+
metavar='<STORE>',
659+
# default=None,
660+
dest='store',
661+
help=_('Store to delete image(s) from.'),
662+
)
656663
return parser
657664

658665
def take_action(self, parsed_args):
@@ -664,7 +671,18 @@ def take_action(self, parsed_args):
664671
image,
665672
ignore_missing=False,
666673
)
667-
image_client.delete_image(image_obj.id)
674+
except sdk_exceptions.ResourceNotFound as e:
675+
msg = _("Unable to process request: %(e)s") % {'e': e}
676+
raise exceptions.CommandError(msg)
677+
try:
678+
image_client.delete_image(
679+
image_obj.id,
680+
store=parsed_args.store,
681+
ignore_missing=False,
682+
)
683+
except sdk_exceptions.ResourceNotFound:
684+
msg = _("Multi Backend support not enabled.")
685+
raise exceptions.CommandError(msg)
668686
except Exception as e:
669687
del_result += 1
670688
msg = _(

openstackclient/image/v2/info.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
13+
14+
from osc_lib.cli import format_columns
15+
from osc_lib.command import command
16+
17+
from openstackclient.i18n import _
18+
19+
20+
class ImportInfo(command.ShowOne):
21+
_description = _("Show available import methods")
22+
23+
def take_action(self, parsed_args):
24+
image_client = self.app.client_manager.image
25+
26+
import_info = image_client.get_import_info()
27+
import_methods = import_info.import_methods or {}
28+
return (
29+
('import-methods',),
30+
(format_columns.ListColumn(import_methods.get('value', [])),),
31+
)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Copyright 2023 Red Hat.
2+
# All Rights Reserved.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
5+
# not use this file except in compliance with the License. You may obtain
6+
# a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
# License for the specific language governing permissions and limitations
14+
# under the License.
15+
16+
from openstackclient.tests.functional.image import base
17+
18+
19+
class InfoTests(base.BaseImageTests):
20+
"""Functional tests for Info commands"""
21+
22+
def setUp(self):
23+
super(InfoTests, self).setUp()
24+
25+
def tearDown(self):
26+
super().tearDown()
27+
28+
def test_image_import_info(self):
29+
output = self.openstack('image import info', parse_output=True)
30+
self.assertIsNotNone(output['import-methods'])

openstackclient/tests/unit/image/v2/fakes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def __init__(self, **kwargs):
4141
self.deactivate_image = mock.Mock()
4242
self.stage_image = mock.Mock()
4343
self.import_image = mock.Mock()
44+
self.get_import_info = mock.Mock()
4445

4546
self.members = mock.Mock()
4647
self.add_member = mock.Mock()

openstackclient/tests/unit/image/v2/test_image.py

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,29 @@ def test_image_delete_no_options(self):
520520

521521
result = self.cmd.take_action(parsed_args)
522522

523-
self.client.delete_image.assert_called_with(images[0].id)
523+
self.client.delete_image.assert_called_with(
524+
images[0].id, store=parsed_args.store, ignore_missing=False
525+
)
526+
self.assertIsNone(result)
527+
528+
def test_image_delete_from_store(self):
529+
images = self.setup_images_mock(count=1)
530+
531+
arglist = [
532+
images[0].id,
533+
'--store',
534+
'store1',
535+
]
536+
verifylist = [('images', [images[0].id]), ('store', 'store1')]
537+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
538+
539+
self.client.find_image.side_effect = images
540+
541+
result = self.cmd.take_action(parsed_args)
542+
543+
self.client.delete_image.assert_called_with(
544+
images[0].id, store=parsed_args.store, ignore_missing=False
545+
)
524546
self.assertIsNone(result)
525547

526548
def test_image_delete_multi_images(self):
@@ -536,10 +558,33 @@ def test_image_delete_multi_images(self):
536558

537559
result = self.cmd.take_action(parsed_args)
538560

539-
calls = [mock.call(i.id) for i in images]
561+
calls = [
562+
mock.call(i.id, store=parsed_args.store, ignore_missing=False)
563+
for i in images
564+
]
540565
self.client.delete_image.assert_has_calls(calls)
541566
self.assertIsNone(result)
542567

568+
def test_image_delete_from_store_without_multi_backend(self):
569+
images = self.setup_images_mock(count=1)
570+
571+
arglist = [images[0].id, '--store', 'store1']
572+
verifylist = [('images', [images[0].id]), ('store', 'store1')]
573+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
574+
575+
self.client.find_image.side_effect = images
576+
577+
self.client.delete_image.side_effect = sdk_exceptions.ResourceNotFound
578+
exc = self.assertRaises(
579+
exceptions.CommandError,
580+
self.cmd.take_action,
581+
parsed_args,
582+
)
583+
self.assertIn(
584+
"Multi Backend support not enabled",
585+
str(exc),
586+
)
587+
543588
def test_image_delete_multi_images_exception(self):
544589
images = image_fakes.create_images(count=2)
545590
arglist = [
@@ -562,7 +607,10 @@ def test_image_delete_multi_images_exception(self):
562607
self.assertRaises(
563608
exceptions.CommandError, self.cmd.take_action, parsed_args
564609
)
565-
calls = [mock.call(i.id) for i in images]
610+
calls = [
611+
mock.call(i.id, store=parsed_args.store, ignore_missing=False)
612+
for i in images
613+
]
566614
self.client.delete_image.assert_has_calls(calls)
567615

568616

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Copyright 2023 Red Hat.
2+
# All Rights Reserved.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
5+
# not use this file except in compliance with the License. You may obtain
6+
# a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
# License for the specific language governing permissions and limitations
14+
# under the License.
15+
16+
from openstackclient.image.v2 import info
17+
from openstackclient.tests.unit.image.v2 import fakes as info_fakes
18+
19+
20+
class TestInfo(info_fakes.TestImagev2):
21+
def setUp(self):
22+
super().setUp()
23+
24+
# Get shortcuts to mocked image client
25+
self.client = self.app.client_manager.image
26+
27+
28+
class TestImportInfo(TestInfo):
29+
import_info = info_fakes.create_one_import_info()
30+
31+
def setUp(self):
32+
super().setUp()
33+
34+
self.client.get_import_info.return_value = self.import_info
35+
36+
self.cmd = info.ImportInfo(self.app, None)
37+
38+
def test_import_info(self):
39+
arglist = []
40+
parsed_args = self.check_parser(self.cmd, arglist, [])
41+
self.cmd.take_action(parsed_args)
42+
43+
self.client.get_import_info.assert_called()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
features:
3+
- |
4+
Add ``image import info`` command, allowing users to know available import
5+
methods, and `--store` option to ``image delete``, allowing users to delete
6+
image from particular store.

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ openstack.image.v2 =
387387
image_stage = openstackclient.image.v2.image:StageImage
388388
image_task_show = openstackclient.image.v2.task:ShowTask
389389
image_task_list = openstackclient.image.v2.task:ListTask
390-
image_import = openstackclient.image.v2.image:ImportImage
390+
image_import_info = openstackclient.image.v2.info:ImportInfo
391391

392392
image_metadef_namespace_create = openstackclient.image.v2.metadef_namespaces:CreateMetadefNameSpace
393393
image_metadef_namespace_delete = openstackclient.image.v2.metadef_namespaces:DeleteMetadefNameSpace

0 commit comments

Comments
 (0)