The nimble api require 'port_type' when creating a server with port type specified, but currently the client pass a 'port-type' parameter. Change-Id: I4be883d41e5b8174f1870f2ed41f1d325a01537d Closes-Bug: #1652551
297 lines
12 KiB
Python
297 lines
12 KiB
Python
# Copyright 2016 Huawei, Inc. All rights reserved.
|
|
#
|
|
# 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 uuid
|
|
|
|
from osc_lib.tests import utils as osc_test_utils
|
|
from osc_lib import utils
|
|
|
|
from nimbleclient.osc.v1 import server
|
|
from nimbleclient.tests.unit import base as test_base
|
|
from nimbleclient.tests.unit import fakes
|
|
from nimbleclient.v1 import server as server_mgr
|
|
|
|
|
|
class TestServer(test_base.TestBaremetalComputeV1):
|
|
fake_server = fakes.FakeServer.create_one_server()
|
|
|
|
columns = (
|
|
'availability_zone',
|
|
'created_at',
|
|
'description',
|
|
'extra',
|
|
'image_uuid',
|
|
'instance_type_uuid',
|
|
'links',
|
|
'name',
|
|
'network_info',
|
|
'updated_at',
|
|
'uuid')
|
|
|
|
data = (
|
|
fake_server.availability_zone,
|
|
fake_server.created_at,
|
|
fake_server.description,
|
|
fake_server.image_uuid,
|
|
fake_server.instance_type_uuid,
|
|
fake_server.links,
|
|
fake_server.name,
|
|
fake_server.network_info,
|
|
fake_server.updated_at,
|
|
fake_server.uuid)
|
|
|
|
|
|
@mock.patch.object(utils, 'find_resource')
|
|
@mock.patch.object(server_mgr.ServerManager, '_create')
|
|
class TestServerCreate(TestServer):
|
|
def setUp(self):
|
|
super(TestServerCreate, self).setUp()
|
|
self.cmd = server.CreateServer(self.app, None)
|
|
self.app.client_manager.image = mock.Mock()
|
|
|
|
def _test_create_fake_server(self, mock_create, mock_find,
|
|
name, flavor_id, image_id, networks,
|
|
description=None,
|
|
availability_zone=None, extra=None):
|
|
arglist = [
|
|
name,
|
|
'--flavor', flavor_id,
|
|
'--image', image_id]
|
|
verifylist = [
|
|
('name', name),
|
|
('flavor', flavor_id),
|
|
('image', image_id)]
|
|
called_networks = copy.deepcopy(networks)
|
|
for nic in called_networks:
|
|
if 'port-type' in nic:
|
|
nic['port_type'] = nic['port-type']
|
|
del nic['port-type']
|
|
called_data = {'name': name,
|
|
'image_uuid': image_id,
|
|
'instance_type_uuid': flavor_id,
|
|
'networks': called_networks}
|
|
for network in networks:
|
|
network_id = network.get('uuid')
|
|
port_type = network.get('port-type')
|
|
if port_type:
|
|
arglist.extend(
|
|
['--nic',
|
|
'uuid=' + network_id + ',port-type=' + port_type])
|
|
verifylist.append(
|
|
('nic', [{'uuid': network_id, 'port-type': port_type}]))
|
|
else:
|
|
arglist.extend(['--nic', 'uuid=' + network_id])
|
|
verifylist.append(('nic', [{'uuid': network_id}]))
|
|
if description:
|
|
arglist.extend(['--description', description])
|
|
verifylist.append(('description', description))
|
|
called_data['description'] = description
|
|
if availability_zone:
|
|
arglist.extend(['--availability-zone', availability_zone])
|
|
verifylist.append(('availability_zone', availability_zone))
|
|
called_data['availability_zone'] = availability_zone
|
|
if extra:
|
|
arglist.extend(['--extra', extra])
|
|
verifylist.append(('extra', extra))
|
|
called_data['extra'] = extra
|
|
|
|
flavor_obj = mock.Mock()
|
|
flavor_obj.uuid = flavor_id
|
|
image_obj = mock.Mock()
|
|
image_obj.id = image_id
|
|
mock_find.side_effect = [flavor_obj, image_obj]
|
|
fk_server = fakes.FakeServer.create_one_server(called_data)
|
|
mock_create.return_value = fk_server
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
columns, data = self.cmd.take_action(parsed_args)
|
|
|
|
mock_create.assert_called_once_with(
|
|
'/instances',
|
|
data=called_data)
|
|
self.assertEqual(self.columns, columns)
|
|
expected_data = (
|
|
fk_server.availability_zone,
|
|
fk_server.created_at,
|
|
fk_server.description,
|
|
fk_server.extra,
|
|
fk_server.image_uuid,
|
|
fk_server.instance_type_uuid,
|
|
fk_server.links,
|
|
fk_server.name,
|
|
fk_server.network_info,
|
|
fk_server.updated_at,
|
|
fk_server.uuid)
|
|
self.assertEqual(expected_data, data)
|
|
|
|
def test_server_create(self, mock_create, mock_find):
|
|
name = 'server1'
|
|
flavor_id = 'flavor-id-' + uuid.uuid4().hex
|
|
image_id = 'image-id-' + uuid.uuid4().hex
|
|
networks = [{'uuid': 'net-id-' + uuid.uuid4().hex}]
|
|
self._test_create_fake_server(mock_create, mock_find,
|
|
name, flavor_id, image_id, networks)
|
|
|
|
def test_server_create_with_description(self, mock_create, mock_find):
|
|
name = 'server1'
|
|
flavor_id = 'flavor-id-' + uuid.uuid4().hex
|
|
image_id = 'image-id-' + uuid.uuid4().hex
|
|
networks = [{'uuid': 'net-id-' + uuid.uuid4().hex}]
|
|
description = 'fake_description'
|
|
self._test_create_fake_server(mock_create, mock_find,
|
|
name, flavor_id, image_id,
|
|
networks, description)
|
|
|
|
def test_server_create_with_az(self, mock_create, mock_find):
|
|
name = 'server1'
|
|
flavor_id = 'flavor-id-' + uuid.uuid4().hex
|
|
image_id = 'image-id-' + uuid.uuid4().hex
|
|
networks = [{'uuid': 'net-id-' + uuid.uuid4().hex}]
|
|
fake_az = 'fake_availability_zone'
|
|
self._test_create_fake_server(mock_create, mock_find,
|
|
name, flavor_id, image_id,
|
|
networks, availability_zone=fake_az)
|
|
|
|
def test_server_create_with_port_type(self, mock_create, mock_find):
|
|
name = 'server1'
|
|
flavor_id = 'flavor-id-' + uuid.uuid4().hex
|
|
image_id = 'image-id-' + uuid.uuid4().hex
|
|
networks = [{'uuid': 'net-id-' + uuid.uuid4().hex,
|
|
'port-type': 'normal'}]
|
|
self._test_create_fake_server(mock_create, mock_find,
|
|
name, flavor_id, image_id,
|
|
networks)
|
|
|
|
def test_server_create_with_extra(self, mock_create, mock_find):
|
|
name = 'server1'
|
|
flavor_id = 'flavor-id-' + uuid.uuid4().hex
|
|
image_id = 'image-id-' + uuid.uuid4().hex
|
|
networks = [{'uuid': 'net-id-' + uuid.uuid4().hex}]
|
|
extra_info = 'key1=test'
|
|
self._test_create_fake_server(mock_create, mock_find,
|
|
name, flavor_id, image_id,
|
|
networks, extra=extra_info)
|
|
|
|
|
|
@mock.patch.object(utils, 'find_resource')
|
|
@mock.patch.object(server_mgr.ServerManager, '_update')
|
|
class TestServerUpdate(test_base.TestBaremetalComputeV1):
|
|
def setUp(self):
|
|
super(TestServerUpdate, self).setUp()
|
|
self.cmd = server.UpdateServer(self.app, None)
|
|
self.fake_server = fakes.FakeServer.create_one_server()
|
|
|
|
def test_server_update_description(self, mock_update, mock_find):
|
|
mock_find.return_value = self.fake_server
|
|
arglist = [
|
|
'--description', 'test_description',
|
|
self.fake_server.uuid]
|
|
verifylist = [
|
|
('server', self.fake_server.uuid),
|
|
('description', 'test_description')]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
self.cmd.take_action(parsed_args)
|
|
mock_update.assert_called_with(
|
|
'/instances/%s' % self.fake_server.uuid,
|
|
data=[{'path': '/description',
|
|
'value': 'test_description',
|
|
'op': 'replace'}])
|
|
|
|
def test_server_update_add_extra(self, mock_update, mock_find):
|
|
mock_find.return_value = self.fake_server
|
|
arglist = [
|
|
'--add-extra', 'extra_key:extra_value',
|
|
self.fake_server.uuid]
|
|
verifylist = [
|
|
('server', self.fake_server.uuid),
|
|
('add_extra', [('extra_key', 'extra_value')])]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
self.cmd.take_action(parsed_args)
|
|
mock_update.assert_called_with(
|
|
'/instances/%s' % self.fake_server.uuid,
|
|
data=[{'path': '/extra/extra_key',
|
|
'value': 'extra_value',
|
|
'op': 'add'}])
|
|
|
|
def test_server_update_add_replace_remove_multi_extra(
|
|
self, mock_update, mock_find):
|
|
mock_find.return_value = self.fake_server
|
|
arglist = [
|
|
'--add-extra', 'add_key1:add_value1',
|
|
'--add-extra', 'add_key2:add_value2',
|
|
'--replace-extra', 'replace_key1:replace_value1',
|
|
'--replace-extra', 'replace_key2:replace_value2',
|
|
'--remove-extra', 'remove_key1',
|
|
'--remove-extra', 'remove_key2',
|
|
self.fake_server.uuid]
|
|
verifylist = [
|
|
('server', self.fake_server.uuid),
|
|
('add_extra', [('add_key1', 'add_value1'),
|
|
('add_key2', 'add_value2')]),
|
|
('replace_extra', [('replace_key1', 'replace_value1'),
|
|
('replace_key2', 'replace_value2')]),
|
|
('remove_extra', ['remove_key1', 'remove_key2'])]
|
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
self.cmd.take_action(parsed_args)
|
|
mock_update.assert_called_with(
|
|
'/instances/%s' % self.fake_server.uuid,
|
|
data=[{'path': '/extra/add_key1',
|
|
'value': 'add_value1',
|
|
'op': 'add'},
|
|
{'path': '/extra/add_key2',
|
|
'value': 'add_value2',
|
|
'op': 'add'},
|
|
{'path': '/extra/replace_key1',
|
|
'value': 'replace_value1',
|
|
'op': 'replace'},
|
|
{'path': '/extra/replace_key2',
|
|
'value': 'replace_value2',
|
|
'op': 'replace'},
|
|
{'path': '/extra/remove_key1',
|
|
'op': 'remove'},
|
|
{'path': '/extra/remove_key2',
|
|
'op': 'remove'}])
|
|
|
|
|
|
@mock.patch.object(utils, 'find_resource')
|
|
@mock.patch.object(server_mgr.ServerManager, '_update_all')
|
|
class TestSetServerPowerState(test_base.TestBaremetalComputeV1):
|
|
def setUp(self):
|
|
super(TestSetServerPowerState, self).setUp()
|
|
self.cmd = server.SetServerPowerState(self.app, None)
|
|
self.fake_server = fakes.FakeServer.create_one_server()
|
|
|
|
def test_server_set_power_state(self, mock_update_all, mock_find):
|
|
mock_find.return_value = self.fake_server
|
|
args = ['--power-state', 'off', self.fake_server.uuid]
|
|
verify_args = [('power_state', 'off'),
|
|
('server', self.fake_server.uuid)]
|
|
parsed_args = self.check_parser(self.cmd, args, verify_args)
|
|
self.cmd.take_action(parsed_args)
|
|
mock_update_all.assert_called_with(
|
|
'/instances/%s/states/power' % self.fake_server.uuid,
|
|
data={'target': 'off'})
|
|
|
|
def test_server_set_invalid_power_state(self,
|
|
mock_update_all, mock_find):
|
|
mock_find.return_value = self.fake_server
|
|
args = ['--power-state', 'non_state', self.fake_server.uuid]
|
|
verify_args = [('power_state', 'off'),
|
|
('server', self.fake_server.uuid)]
|
|
self.assertRaises(osc_test_utils.ParserException,
|
|
self.check_parser,
|
|
self.cmd, args, verify_args)
|