
test cases columns and datalist has been set in each test case in image and object which is not necessary. This patch abstract it out and remove all redundant code. Change-Id: Ie6aa3fa27ab2a468c67da31209107517259631c2 Related-Bug: 1532384
1137 lines
35 KiB
Python
1137 lines
35 KiB
Python
# Copyright 2013 Nebula Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
import copy
|
|
import mock
|
|
|
|
import warlock
|
|
|
|
from glanceclient.v2 import schemas
|
|
from openstackclient.common import exceptions
|
|
from openstackclient.image.v2 import image
|
|
from openstackclient.tests import fakes
|
|
from openstackclient.tests.identity.v3 import fakes as identity_fakes
|
|
from openstackclient.tests.image.v2 import fakes as image_fakes
|
|
|
|
|
|
class TestImage(image_fakes.TestImagev2):
|
|
|
|
def setUp(self):
|
|
super(TestImage, self).setUp()
|
|
|
|
# Get a shortcut to the ServerManager Mock
|
|
self.images_mock = self.app.client_manager.image.images
|
|
self.images_mock.reset_mock()
|
|
self.image_members_mock = self.app.client_manager.image.image_members
|
|
self.image_members_mock.reset_mock()
|
|
self.project_mock = self.app.client_manager.identity.projects
|
|
self.project_mock.reset_mock()
|
|
self.domain_mock = self.app.client_manager.identity.domains
|
|
self.domain_mock.reset_mock()
|
|
|
|
def setup_images_mock(self, count):
|
|
images = image_fakes.FakeImage.create_images(count=count)
|
|
|
|
self.images_mock.get = image_fakes.FakeImage.get_images(
|
|
images,
|
|
0)
|
|
return images
|
|
|
|
|
|
class TestImageCreate(TestImage):
|
|
|
|
def setUp(self):
|
|
super(TestImageCreate, self).setUp()
|
|
|
|
self.new_image = image_fakes.FakeImage.create_one_image()
|
|
self.images_mock.create.return_value = self.new_image
|
|
|
|
self.project_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.PROJECT),
|
|
loaded=True,
|
|
)
|
|
|
|
self.domain_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.DOMAIN),
|
|
loaded=True,
|
|
)
|
|
|
|
# This is the return value for utils.find_resource()
|
|
self.images_mock.get.return_value = copy.deepcopy(
|
|
image_fakes.FakeImage.get_image_info(self.new_image))
|
|
self.images_mock.update.return_value = self.new_image
|
|
|
|
# Get the command object to test
|
|
self.cmd = image.CreateImage(self.app, None)
|
|
|
|
def test_image_reserve_no_options(self):
|
|
mock_exception = {
|
|
'find.side_effect': exceptions.CommandError('x'),
|
|
}
|
|
self.images_mock.configure_mock(**mock_exception)
|
|
arglist = [
|
|
self.new_image.name
|
|
]
|
|
verifylist = [
|
|
('container_format', image.DEFAULT_CONTAINER_FORMAT),
|
|
('disk_format', image.DEFAULT_DISK_FORMAT),
|
|
('name', self.new_image.name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
|
|
# ImageManager.create(name=, **)
|
|
self.images_mock.create.assert_called_with(
|
|
name=self.new_image.name,
|
|
container_format=image.DEFAULT_CONTAINER_FORMAT,
|
|
disk_format=image.DEFAULT_DISK_FORMAT,
|
|
)
|
|
|
|
# Verify update() was not called, if it was show the args
|
|
self.assertEqual(self.images_mock.update.call_args_list, [])
|
|
|
|
self.images_mock.upload.assert_called_with(
|
|
mock.ANY, mock.ANY,
|
|
)
|
|
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_columns(self.new_image),
|
|
columns)
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_data(self.new_image),
|
|
data)
|
|
|
|
@mock.patch('glanceclient.common.utils.get_data_file', name='Open')
|
|
def test_image_reserve_options(self, mock_open):
|
|
mock_file = mock.MagicMock(name='File')
|
|
mock_open.return_value = mock_file
|
|
mock_open.read.return_value = None
|
|
mock_exception = {
|
|
'find.side_effect': exceptions.CommandError('x'),
|
|
}
|
|
self.images_mock.configure_mock(**mock_exception)
|
|
arglist = [
|
|
'--container-format', 'ovf',
|
|
'--disk-format', 'fs',
|
|
'--min-disk', '10',
|
|
'--min-ram', '4',
|
|
('--protected'
|
|
if self.new_image.protected else '--unprotected'),
|
|
('--private'
|
|
if self.new_image.visibility == 'private' else '--public'),
|
|
'--project', self.new_image.owner,
|
|
'--project-domain', identity_fakes.domain_id,
|
|
self.new_image.name,
|
|
]
|
|
verifylist = [
|
|
('container_format', 'ovf'),
|
|
('disk_format', 'fs'),
|
|
('min_disk', 10),
|
|
('min_ram', 4),
|
|
('protected', self.new_image.protected),
|
|
('unprotected', not self.new_image.protected),
|
|
('public', self.new_image.visibility == 'public'),
|
|
('private', self.new_image.visibility == 'private'),
|
|
('project', self.new_image.owner),
|
|
('project_domain', identity_fakes.domain_id),
|
|
('name', self.new_image.name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
|
|
# ImageManager.create(name=, **)
|
|
self.images_mock.create.assert_called_with(
|
|
name=self.new_image.name,
|
|
container_format='ovf',
|
|
disk_format='fs',
|
|
min_disk=10,
|
|
min_ram=4,
|
|
owner=identity_fakes.project_id,
|
|
protected=self.new_image.protected,
|
|
visibility=self.new_image.visibility,
|
|
)
|
|
|
|
# Verify update() was not called, if it was show the args
|
|
self.assertEqual(self.images_mock.update.call_args_list, [])
|
|
|
|
self.images_mock.upload.assert_called_with(
|
|
mock.ANY, mock.ANY,
|
|
)
|
|
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_columns(self.new_image),
|
|
columns)
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_data(self.new_image),
|
|
data)
|
|
|
|
def test_image_create_with_unexist_owner(self):
|
|
self.project_mock.get.side_effect = exceptions.NotFound(None)
|
|
self.project_mock.find.side_effect = exceptions.NotFound(None)
|
|
|
|
arglist = [
|
|
'--container-format', 'ovf',
|
|
'--disk-format', 'fs',
|
|
'--min-disk', '10',
|
|
'--min-ram', '4',
|
|
'--owner', 'unexist_owner',
|
|
'--protected',
|
|
'--private',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('container_format', 'ovf'),
|
|
('disk_format', 'fs'),
|
|
('min_disk', 10),
|
|
('min_ram', 4),
|
|
('owner', 'unexist_owner'),
|
|
('protected', True),
|
|
('unprotected', False),
|
|
('public', False),
|
|
('private', True),
|
|
('name', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action,
|
|
parsed_args,
|
|
)
|
|
|
|
def test_image_create_with_unexist_project(self):
|
|
self.project_mock.get.side_effect = exceptions.NotFound(None)
|
|
self.project_mock.find.side_effect = exceptions.NotFound(None)
|
|
|
|
arglist = [
|
|
'--container-format', 'ovf',
|
|
'--disk-format', 'fs',
|
|
'--min-disk', '10',
|
|
'--min-ram', '4',
|
|
'--protected',
|
|
'--private',
|
|
'--project', 'unexist_owner',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('container_format', 'ovf'),
|
|
('disk_format', 'fs'),
|
|
('min_disk', 10),
|
|
('min_ram', 4),
|
|
('protected', True),
|
|
('unprotected', False),
|
|
('public', False),
|
|
('private', True),
|
|
('project', 'unexist_owner'),
|
|
('name', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action,
|
|
parsed_args,
|
|
)
|
|
|
|
@mock.patch('glanceclient.common.utils.get_data_file', name='Open')
|
|
def test_image_create_file(self, mock_open):
|
|
mock_file = mock.MagicMock(name='File')
|
|
mock_open.return_value = mock_file
|
|
mock_open.read.return_value = (
|
|
image_fakes.FakeImage.get_image_data(self.new_image))
|
|
mock_exception = {
|
|
'find.side_effect': exceptions.CommandError('x'),
|
|
}
|
|
self.images_mock.configure_mock(**mock_exception)
|
|
|
|
arglist = [
|
|
'--file', 'filer',
|
|
('--unprotected'
|
|
if not self.new_image.protected else '--protected'),
|
|
('--public'
|
|
if self.new_image.visibility == 'public' else '--private'),
|
|
'--property', 'Alpha=1',
|
|
'--property', 'Beta=2',
|
|
'--tag', self.new_image.tags[0],
|
|
'--tag', self.new_image.tags[1],
|
|
self.new_image.name,
|
|
]
|
|
verifylist = [
|
|
('file', 'filer'),
|
|
('protected', self.new_image.protected),
|
|
('unprotected', not self.new_image.protected),
|
|
('public', self.new_image.visibility == 'public'),
|
|
('private', self.new_image.visibility == 'private'),
|
|
('properties', {'Alpha': '1', 'Beta': '2'}),
|
|
('tags', self.new_image.tags),
|
|
('name', self.new_image.name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
|
|
# ImageManager.create(name=, **)
|
|
self.images_mock.create.assert_called_with(
|
|
name=self.new_image.name,
|
|
container_format=image.DEFAULT_CONTAINER_FORMAT,
|
|
disk_format=image.DEFAULT_DISK_FORMAT,
|
|
protected=self.new_image.protected,
|
|
visibility=self.new_image.visibility,
|
|
Alpha='1',
|
|
Beta='2',
|
|
tags=self.new_image.tags,
|
|
)
|
|
|
|
# Verify update() was not called, if it was show the args
|
|
self.assertEqual(self.images_mock.update.call_args_list, [])
|
|
|
|
self.images_mock.upload.assert_called_with(
|
|
mock.ANY, mock.ANY,
|
|
)
|
|
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_columns(self.new_image),
|
|
columns)
|
|
self.assertEqual(
|
|
image_fakes.FakeImage.get_image_data(self.new_image),
|
|
data)
|
|
|
|
def test_image_create_dead_options(self):
|
|
|
|
arglist = [
|
|
'--store', 'somewhere',
|
|
self.new_image.name,
|
|
]
|
|
verifylist = [
|
|
('name', self.new_image.name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action, parsed_args)
|
|
|
|
|
|
class TestAddProjectToImage(TestImage):
|
|
|
|
columns = (
|
|
'image_id',
|
|
'member_id',
|
|
'status',
|
|
)
|
|
datalist = (
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
image_fakes.member_status,
|
|
)
|
|
|
|
def setUp(self):
|
|
super(TestAddProjectToImage, self).setUp()
|
|
|
|
# This is the return value for utils.find_resource()
|
|
self.images_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(image_fakes.IMAGE),
|
|
loaded=True,
|
|
)
|
|
self.image_members_mock.create.return_value = fakes.FakeModel(
|
|
copy.deepcopy(image_fakes.MEMBER),
|
|
)
|
|
self.project_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.PROJECT),
|
|
loaded=True,
|
|
)
|
|
self.domain_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.DOMAIN),
|
|
loaded=True,
|
|
)
|
|
# Get the command object to test
|
|
self.cmd = image.AddProjectToImage(self.app, None)
|
|
|
|
def test_add_project_to_image_no_option(self):
|
|
arglist = [
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
]
|
|
verifylist = [
|
|
('image', image_fakes.image_id),
|
|
('project', identity_fakes.project_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.image_members_mock.create.assert_called_with(
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id
|
|
)
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, data)
|
|
|
|
def test_add_project_to_image_with_option(self):
|
|
arglist = [
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
'--project-domain', identity_fakes.domain_id,
|
|
]
|
|
verifylist = [
|
|
('image', image_fakes.image_id),
|
|
('project', identity_fakes.project_id),
|
|
('project_domain', identity_fakes.domain_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.image_members_mock.create.assert_called_with(
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id
|
|
)
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, data)
|
|
|
|
|
|
class TestImageDelete(TestImage):
|
|
|
|
def setUp(self):
|
|
super(TestImageDelete, self).setUp()
|
|
|
|
self.images_mock.delete.return_value = None
|
|
|
|
# Get the command object to test
|
|
self.cmd = image.DeleteImage(self.app, None)
|
|
|
|
def test_image_delete_no_options(self):
|
|
images = self.setup_images_mock(count=1)
|
|
|
|
arglist = [
|
|
images[0].id,
|
|
]
|
|
verifylist = [
|
|
('images', [images[0].id]),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
self.images_mock.delete.assert_called_with(
|
|
images[0].id,
|
|
)
|
|
|
|
def test_image_delete_multi_images(self):
|
|
images = self.setup_images_mock(count=3)
|
|
|
|
arglist = [i.id for i in images]
|
|
verifylist = [
|
|
('images', arglist),
|
|
]
|
|
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
calls = [mock.call(i.id) for i in images]
|
|
|
|
self.images_mock.delete.assert_has_calls(calls)
|
|
|
|
|
|
class TestImageList(TestImage):
|
|
|
|
columns = (
|
|
'ID',
|
|
'Name',
|
|
'Status',
|
|
)
|
|
datalist = (
|
|
(
|
|
image_fakes.image_id,
|
|
image_fakes.image_name,
|
|
'',
|
|
),
|
|
)
|
|
|
|
def setUp(self):
|
|
super(TestImageList, self).setUp()
|
|
|
|
self.api_mock = mock.Mock()
|
|
self.api_mock.image_list.side_effect = [
|
|
[copy.deepcopy(image_fakes.IMAGE)], [],
|
|
]
|
|
self.app.client_manager.image.api = self.api_mock
|
|
|
|
# Get the command object to test
|
|
self.cmd = image.ListImage(self.app, None)
|
|
|
|
def test_image_list_no_options(self):
|
|
arglist = []
|
|
verifylist = [
|
|
('public', False),
|
|
('private', False),
|
|
('shared', False),
|
|
('long', False),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
marker=image_fakes.image_id,
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
def test_image_list_public_option(self):
|
|
arglist = [
|
|
'--public',
|
|
]
|
|
verifylist = [
|
|
('public', True),
|
|
('private', False),
|
|
('shared', False),
|
|
('long', False),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
public=True,
|
|
marker=image_fakes.image_id,
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
def test_image_list_private_option(self):
|
|
arglist = [
|
|
'--private',
|
|
]
|
|
verifylist = [
|
|
('public', False),
|
|
('private', True),
|
|
('shared', False),
|
|
('long', False),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
private=True,
|
|
marker=image_fakes.image_id,
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
def test_image_list_shared_option(self):
|
|
arglist = [
|
|
'--shared',
|
|
]
|
|
verifylist = [
|
|
('public', False),
|
|
('private', False),
|
|
('shared', True),
|
|
('long', False),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
shared=True,
|
|
marker=image_fakes.image_id,
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
def test_image_list_long_option(self):
|
|
arglist = [
|
|
'--long',
|
|
]
|
|
verifylist = [
|
|
('long', True),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
marker=image_fakes.image_id,
|
|
)
|
|
|
|
collist = (
|
|
'ID',
|
|
'Name',
|
|
'Disk Format',
|
|
'Container Format',
|
|
'Size',
|
|
'Status',
|
|
'Visibility',
|
|
'Protected',
|
|
'Project',
|
|
'Tags',
|
|
)
|
|
|
|
self.assertEqual(collist, columns)
|
|
datalist = ((
|
|
image_fakes.image_id,
|
|
image_fakes.image_name,
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'public',
|
|
False,
|
|
image_fakes.image_owner,
|
|
'',
|
|
), )
|
|
self.assertEqual(datalist, tuple(data))
|
|
|
|
@mock.patch('openstackclient.api.utils.simple_filter')
|
|
def test_image_list_property_option(self, sf_mock):
|
|
sf_mock.return_value = [
|
|
copy.deepcopy(image_fakes.IMAGE),
|
|
]
|
|
|
|
arglist = [
|
|
'--property', 'a=1',
|
|
]
|
|
verifylist = [
|
|
('property', {'a': '1'}),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
marker=image_fakes.image_id,
|
|
)
|
|
sf_mock.assert_called_with(
|
|
[image_fakes.IMAGE],
|
|
attr='a',
|
|
value='1',
|
|
property_field='properties',
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
@mock.patch('openstackclient.common.utils.sort_items')
|
|
def test_image_list_sort_option(self, si_mock):
|
|
si_mock.return_value = [
|
|
copy.deepcopy(image_fakes.IMAGE)
|
|
]
|
|
|
|
arglist = ['--sort', 'name:asc']
|
|
verifylist = [('sort', 'name:asc')]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.api_mock.image_list.assert_called_with(
|
|
marker=image_fakes.image_id,
|
|
)
|
|
si_mock.assert_called_with(
|
|
[image_fakes.IMAGE],
|
|
'name:asc'
|
|
)
|
|
|
|
self.assertEqual(self.columns, columns)
|
|
self.assertEqual(self.datalist, tuple(data))
|
|
|
|
|
|
class TestRemoveProjectImage(TestImage):
|
|
|
|
def setUp(self):
|
|
super(TestRemoveProjectImage, self).setUp()
|
|
|
|
# This is the return value for utils.find_resource()
|
|
self.images_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(image_fakes.IMAGE),
|
|
loaded=True,
|
|
)
|
|
self.project_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.PROJECT),
|
|
loaded=True,
|
|
)
|
|
self.domain_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.DOMAIN),
|
|
loaded=True,
|
|
)
|
|
self.image_members_mock.delete.return_value = None
|
|
# Get the command object to test
|
|
self.cmd = image.RemoveProjectImage(self.app, None)
|
|
|
|
def test_remove_project_image_no_options(self):
|
|
arglist = [
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
]
|
|
verifylist = [
|
|
('image', image_fakes.image_id),
|
|
('project', identity_fakes.project_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
self.image_members_mock.delete.assert_called_with(
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
)
|
|
|
|
def test_remove_project_image_with_options(self):
|
|
arglist = [
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
'--project-domain', identity_fakes.domain_id,
|
|
]
|
|
verifylist = [
|
|
('image', image_fakes.image_id),
|
|
('project', identity_fakes.project_id),
|
|
('project_domain', identity_fakes.domain_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
self.image_members_mock.delete.assert_called_with(
|
|
image_fakes.image_id,
|
|
identity_fakes.project_id,
|
|
)
|
|
|
|
|
|
class TestImageSet(TestImage):
|
|
|
|
def setUp(self):
|
|
super(TestImageSet, self).setUp()
|
|
# Set up the schema
|
|
self.model = warlock.model_factory(
|
|
image_fakes.IMAGE_schema,
|
|
schemas.SchemaBasedModel,
|
|
)
|
|
|
|
self.project_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.PROJECT),
|
|
loaded=True,
|
|
)
|
|
|
|
self.domain_mock.get.return_value = fakes.FakeResource(
|
|
None,
|
|
copy.deepcopy(identity_fakes.DOMAIN),
|
|
loaded=True,
|
|
)
|
|
|
|
self.images_mock.get.return_value = self.model(**image_fakes.IMAGE)
|
|
self.images_mock.update.return_value = self.model(**image_fakes.IMAGE)
|
|
# Get the command object to test
|
|
self.cmd = image.SetImage(self.app, None)
|
|
|
|
def test_image_set_options(self):
|
|
arglist = [
|
|
'--name', 'new-name',
|
|
'--min-disk', '2',
|
|
'--min-ram', '4',
|
|
'--container-format', 'ovf',
|
|
'--disk-format', 'vmdk',
|
|
'--project', identity_fakes.project_name,
|
|
'--project-domain', identity_fakes.domain_id,
|
|
image_fakes.image_id,
|
|
]
|
|
verifylist = [
|
|
('name', 'new-name'),
|
|
('min_disk', 2),
|
|
('min_ram', 4),
|
|
('container_format', 'ovf'),
|
|
('disk_format', 'vmdk'),
|
|
('project', identity_fakes.project_name),
|
|
('project_domain', identity_fakes.domain_id),
|
|
('image', image_fakes.image_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'name': 'new-name',
|
|
'owner': identity_fakes.project_id,
|
|
'min_disk': 2,
|
|
'min_ram': 4,
|
|
'container_format': 'ovf',
|
|
'disk_format': 'vmdk',
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id, **kwargs)
|
|
|
|
def test_image_set_with_unexist_owner(self):
|
|
self.project_mock.get.side_effect = exceptions.NotFound(None)
|
|
self.project_mock.find.side_effect = exceptions.NotFound(None)
|
|
|
|
arglist = [
|
|
'--owner', 'unexist_owner',
|
|
image_fakes.image_id,
|
|
]
|
|
verifylist = [
|
|
('owner', 'unexist_owner'),
|
|
('image', image_fakes.image_id),
|
|
]
|
|
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action, parsed_args)
|
|
|
|
def test_image_set_with_unexist_project(self):
|
|
self.project_mock.get.side_effect = exceptions.NotFound(None)
|
|
self.project_mock.find.side_effect = exceptions.NotFound(None)
|
|
|
|
arglist = [
|
|
'--project', 'unexist_owner',
|
|
image_fakes.image_id,
|
|
]
|
|
verifylist = [
|
|
('project', 'unexist_owner'),
|
|
('image', image_fakes.image_id),
|
|
]
|
|
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action, parsed_args)
|
|
|
|
def test_image_set_bools1(self):
|
|
arglist = [
|
|
'--protected',
|
|
'--private',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('protected', True),
|
|
('unprotected', False),
|
|
('public', False),
|
|
('private', True),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'protected': True,
|
|
'visibility': 'private',
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_bools2(self):
|
|
arglist = [
|
|
'--unprotected',
|
|
'--public',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('protected', False),
|
|
('unprotected', True),
|
|
('public', True),
|
|
('private', False),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'protected': False,
|
|
'visibility': 'public',
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_properties(self):
|
|
arglist = [
|
|
'--property', 'Alpha=1',
|
|
'--property', 'Beta=2',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('properties', {'Alpha': '1', 'Beta': '2'}),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'Alpha': '1',
|
|
'Beta': '2',
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_fake_properties(self):
|
|
arglist = [
|
|
'--architecture', 'z80',
|
|
'--instance-id', '12345',
|
|
'--kernel-id', '67890',
|
|
'--os-distro', 'cpm',
|
|
'--os-version', '2.2H',
|
|
'--ramdisk-id', 'xyzpdq',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('architecture', 'z80'),
|
|
('instance_id', '12345'),
|
|
('kernel_id', '67890'),
|
|
('os_distro', 'cpm'),
|
|
('os_version', '2.2H'),
|
|
('ramdisk_id', 'xyzpdq'),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'architecture': 'z80',
|
|
'instance_id': '12345',
|
|
'kernel_id': '67890',
|
|
'os_distro': 'cpm',
|
|
'os_version': '2.2H',
|
|
'ramdisk_id': 'xyzpdq',
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_tag(self):
|
|
arglist = [
|
|
'--tag', 'test-tag',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('tags', ['test-tag']),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'tags': ['test-tag'],
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_activate(self):
|
|
arglist = [
|
|
'--tag', 'test-tag',
|
|
'--activate',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('tags', ['test-tag']),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'tags': ['test-tag'],
|
|
}
|
|
|
|
self.images_mock.reactivate.assert_called_with(
|
|
image_fakes.image_id,
|
|
)
|
|
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_deactivate(self):
|
|
arglist = [
|
|
'--tag', 'test-tag',
|
|
'--deactivate',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('tags', ['test-tag']),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'tags': ['test-tag'],
|
|
}
|
|
|
|
self.images_mock.deactivate.assert_called_with(
|
|
image_fakes.image_id,
|
|
)
|
|
|
|
# ImageManager.update(image, **kwargs)
|
|
self.images_mock.update.assert_called_with(
|
|
image_fakes.image_id,
|
|
**kwargs
|
|
)
|
|
|
|
def test_image_set_tag_merge(self):
|
|
old_image = copy.copy(image_fakes.IMAGE)
|
|
old_image['tags'] = ['old1', 'new2']
|
|
self.images_mock.get.return_value = self.model(**old_image)
|
|
arglist = [
|
|
'--tag', 'test-tag',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('tags', ['test-tag']),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'tags': ['old1', 'new2', 'test-tag'],
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
a, k = self.images_mock.update.call_args
|
|
self.assertEqual(image_fakes.image_id, a[0])
|
|
self.assertTrue('tags' in k)
|
|
self.assertEqual(set(kwargs['tags']), set(k['tags']))
|
|
|
|
def test_image_set_tag_merge_dupe(self):
|
|
old_image = copy.copy(image_fakes.IMAGE)
|
|
old_image['tags'] = ['old1', 'new2']
|
|
self.images_mock.get.return_value = self.model(**old_image)
|
|
arglist = [
|
|
'--tag', 'old1',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('tags', ['old1']),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
self.cmd.take_action(parsed_args)
|
|
|
|
kwargs = {
|
|
'tags': ['new2', 'old1'],
|
|
}
|
|
# ImageManager.update(image, **kwargs)
|
|
a, k = self.images_mock.update.call_args
|
|
self.assertEqual(image_fakes.image_id, a[0])
|
|
self.assertTrue('tags' in k)
|
|
self.assertEqual(set(kwargs['tags']), set(k['tags']))
|
|
|
|
def test_image_set_dead_options(self):
|
|
|
|
arglist = [
|
|
'--visibility', '1-mile',
|
|
image_fakes.image_name,
|
|
]
|
|
verifylist = [
|
|
('visibility', '1-mile'),
|
|
('image', image_fakes.image_name),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
self.assertRaises(
|
|
exceptions.CommandError,
|
|
self.cmd.take_action, parsed_args)
|
|
|
|
|
|
class TestImageShow(TestImage):
|
|
|
|
def setUp(self):
|
|
super(TestImageShow, self).setUp()
|
|
|
|
# Set up the schema
|
|
self.model = warlock.model_factory(
|
|
image_fakes.IMAGE_schema,
|
|
schemas.SchemaBasedModel,
|
|
)
|
|
|
|
self.images_mock.get.return_value = self.model(**image_fakes.IMAGE)
|
|
|
|
# Get the command object to test
|
|
self.cmd = image.ShowImage(self.app, None)
|
|
|
|
def test_image_show(self):
|
|
arglist = [
|
|
image_fakes.image_id,
|
|
]
|
|
verifylist = [
|
|
('image', image_fakes.image_id),
|
|
]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
|
|
# DisplayCommandBase.take_action() returns two tuples
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
self.images_mock.get.assert_called_with(
|
|
image_fakes.image_id,
|
|
)
|
|
|
|
self.assertEqual(image_fakes.IMAGE_columns, columns)
|
|
self.assertEqual(image_fakes.IMAGE_SHOW_data, data)
|