Skip to content

Commit 181bb19

Browse files
committed
image: Migrate 'create image' volume calls to SDK
Change-Id: Ie57a5c17a6df5a333abd6b11e28b65833740e102 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 30aa27b commit 181bb19

2 files changed

Lines changed: 57 additions & 57 deletions

File tree

openstackclient/image/v2/image.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717

1818
import argparse
1919
from base64 import b64encode
20+
import copy
2021
import logging
2122
import os
2223
import sys
2324
import typing as ty
2425

25-
from cinderclient import api_versions
2626
from openstack import exceptions as sdk_exceptions
2727
from openstack.image import image_signer
28+
from openstack import utils as sdk_utils
2829
from osc_lib.api import utils as api_utils
2930
from osc_lib.cli import format_columns
3031
from osc_lib.cli import parseractions
@@ -576,7 +577,7 @@ def _take_action_image(self, parsed_args):
576577
return _format_image(image)
577578

578579
def _take_action_volume(self, parsed_args):
579-
volume_client = self.app.client_manager.volume
580+
volume_client = self.app.client_manager.sdk_connection.volume
580581

581582
unsupported_opts = {
582583
# 'name', # 'name' is a positional argument and will always exist
@@ -607,15 +608,14 @@ def _take_action_volume(self, parsed_args):
607608
# version
608609
LOG.warning(msg % opt_name)
609610

610-
source_volume = utils.find_resource(
611-
volume_client.volumes,
612-
parsed_args.volume,
611+
source_volume = volume_client.find_volume(
612+
parsed_args.volume, ignore_missing=False
613613
)
614614
kwargs: dict[str, ty.Any] = {
615615
'visibility': None,
616616
'protected': None,
617617
}
618-
if volume_client.api_version < api_versions.APIVersion('3.1'):
618+
if not sdk_utils.supports_microversion(volume_client, '3.1'):
619619
if parsed_args.visibility or parsed_args.is_protected is not None:
620620
msg = _(
621621
'--os-volume-api-version 3.1 or greater is required '
@@ -627,15 +627,15 @@ def _take_action_volume(self, parsed_args):
627627
kwargs['visibility'] = parsed_args.visibility or 'private'
628628
kwargs['protected'] = parsed_args.is_protected or False
629629

630-
response, body = volume_client.volumes.upload_to_image(
630+
response = volume_client.upload_volume_to_image(
631631
source_volume.id,
632-
parsed_args.force,
633632
parsed_args.name,
634-
parsed_args.container_format,
635-
parsed_args.disk_format,
633+
force=parsed_args.force,
634+
disk_format=parsed_args.disk_format,
635+
container_format=parsed_args.container_format,
636636
**kwargs,
637637
)
638-
info = body['os-volume_upload_image']
638+
info = copy.deepcopy(response)
639639
try:
640640
info['volume_type'] = info['volume_type']['name']
641641
except TypeError:

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

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
import tempfile
1818
from unittest import mock
1919

20-
from cinderclient import api_versions
20+
from openstack.block_storage.v2 import volume as _volume
2121
from openstack import exceptions as sdk_exceptions
22+
from openstack.test import fakes as sdk_fakes
2223
from osc_lib.cli import format_columns
2324
from osc_lib import exceptions
2425

@@ -37,12 +38,6 @@ def setUp(self):
3738
self.project_mock.reset_mock()
3839
self.domain_mock = self.identity_client.domains
3940
self.domain_mock.reset_mock()
40-
self.volumes_mock = self.volume_client.volumes
41-
fake_body = {
42-
'os-volume_upload_image': {'volume_type': {'name': 'fake_type'}}
43-
}
44-
self.volumes_mock.upload_to_image.return_value = (200, fake_body)
45-
self.volumes_mock.reset_mock()
4641

4742

4843
class TestImageCreate(TestImage):
@@ -312,7 +307,6 @@ def test_image_create_import(self, raw_input):
312307

313308
columns, data = self.cmd.take_action(parsed_args)
314309

315-
# ImageManager.create(name=, **)
316310
self.image_client.create_image.assert_called_with(
317311
name=self.new_image.name,
318312
allow_duplicates=True,
@@ -322,20 +316,19 @@ def test_image_create_import(self, raw_input):
322316
)
323317
self.image_client.get_image.assert_called_once_with(self.new_image)
324318

325-
@mock.patch('osc_lib.utils.find_resource')
326319
@mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
327-
def test_image_create_from_volume(self, mock_get_data_f, mock_get_vol):
328-
fake_vol_id = 'fake-volume-id'
320+
def test_image_create_from_volume(self, mock_get_data_f):
329321
mock_get_data_f.return_value = None
330322

331-
class FakeVolume:
332-
id = fake_vol_id
333-
334-
mock_get_vol.return_value = FakeVolume()
323+
volume = sdk_fakes.generate_fake_resource(_volume.Volume)
324+
self.volume_sdk_client.find_volume.return_value = volume
325+
self.volume_sdk_client.upload_volume_to_image.return_value = {
326+
'volume_type': {'name': 'fake_type'}
327+
}
335328

336329
arglist = [
337330
'--volume',
338-
fake_vol_id,
331+
volume.id,
339332
self.new_image.name,
340333
]
341334
verifylist = [
@@ -345,66 +338,73 @@ class FakeVolume:
345338

346339
columns, data = self.cmd.take_action(parsed_args)
347340

348-
self.volumes_mock.upload_to_image.assert_called_with(
349-
fake_vol_id,
350-
False,
341+
self.volume_sdk_client.upload_volume_to_image.assert_called_once_with(
342+
volume.id,
351343
self.new_image.name,
352-
'bare',
353-
'raw',
344+
force=False,
345+
disk_format='raw',
346+
container_format='bare',
354347
visibility=None,
355348
protected=None,
356349
)
357350

358-
@mock.patch('osc_lib.utils.find_resource')
359351
@mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
360-
def test_image_create_from_volume_fail(
361-
self, mock_get_data_f, mock_get_vol
362-
):
363-
fake_vol_id = 'fake-volume-id'
352+
def test_image_create_from_volume_pre_v31(self, mock_get_data_f):
364353
mock_get_data_f.return_value = None
365354

366-
class FakeVolume:
367-
id = fake_vol_id
368-
369-
mock_get_vol.return_value = FakeVolume()
355+
volume = sdk_fakes.generate_fake_resource(_volume.Volume)
356+
self.volume_sdk_client.find_volume.return_value = volume
357+
self.volume_sdk_client.upload_volume_to_image.return_value = {
358+
'volume_type': {'name': 'fake_type'}
359+
}
370360

371-
arglist = ['--volume', fake_vol_id, self.new_image.name, '--public']
361+
arglist = [
362+
'--volume',
363+
volume.id,
364+
self.new_image.name,
365+
'--public',
366+
]
372367
verifylist = [
373368
('name', self.new_image.name),
374369
]
375370
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
376371

377-
self.assertRaises(
372+
exc = self.assertRaises(
378373
exceptions.CommandError, self.cmd.take_action, parsed_args
379374
)
375+
self.assertIn('--os-volume-api-version 3.1 or greater ', str(exc))
380376

381-
@mock.patch('osc_lib.utils.find_resource')
382377
@mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
383-
def test_image_create_from_volume_v31(self, mock_get_data_f, mock_get_vol):
384-
self.volume_client.api_version = api_versions.APIVersion('3.1')
378+
def test_image_create_from_volume_v31(self, mock_get_data_f):
379+
self.set_volume_api_version('3.1')
385380

386-
fake_vol_id = 'fake-volume-id'
387381
mock_get_data_f.return_value = None
388382

389-
class FakeVolume:
390-
id = fake_vol_id
391-
392-
mock_get_vol.return_value = FakeVolume()
383+
volume = sdk_fakes.generate_fake_resource(_volume.Volume)
384+
self.volume_sdk_client.find_volume.return_value = volume
385+
self.volume_sdk_client.upload_volume_to_image.return_value = {
386+
'volume_type': {'name': 'fake_type'}
387+
}
393388

394-
arglist = ['--volume', fake_vol_id, self.new_image.name, '--public']
389+
arglist = [
390+
'--volume',
391+
volume.id,
392+
self.new_image.name,
393+
'--public',
394+
]
395395
verifylist = [
396396
('name', self.new_image.name),
397397
]
398398
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
399399

400400
columns, data = self.cmd.take_action(parsed_args)
401401

402-
self.volumes_mock.upload_to_image.assert_called_with(
403-
fake_vol_id,
404-
False,
402+
self.volume_sdk_client.upload_volume_to_image.assert_called_once_with(
403+
volume.id,
405404
self.new_image.name,
406-
'bare',
407-
'raw',
405+
force=False,
406+
disk_format='raw',
407+
container_format='bare',
408408
visibility='public',
409409
protected=False,
410410
)

0 commit comments

Comments
 (0)