Return realistic data from mocked library

Base CLI test mocks client library in order to test
command line components indepentently. If not configured
explicitly a mocked library returns mocks that accept
any incomng message without producing an error, even if
in real life scenarions if should be risen.

This patch configured mocked library to return realistic
data and fixes a problem in the code that was missed
because of the above-mentioned misconfiguration.

Closes-bug: #1467510
Change-Id: I065345d59c94e06f9d061c2e9b0b415e45fd62fb
This commit is contained in:
Roman Prykhodchenko
2015-06-23 11:09:09 +02:00
parent 912f2a72cd
commit bddabd470d
7 changed files with 163 additions and 110 deletions

View File

@@ -122,10 +122,10 @@ class EnvDelete(EnvMixIn, base.BaseDeleteCommand):
def take_action(self, parsed_args):
env = self.client.get_by_id(parsed_args.id)
if env.status == 'operational' and not parsed_args.force:
if env['status'] == 'operational' and not parsed_args.force:
self.app.stdout.write("Deleting an operational environment is a "
"dangerous operation. Please use --force to "
"bypass this message.")
"dangerous operation.\n"
"Please use --force to bypass this message.")
return
return super(EnvDelete, self).take_action(parsed_args)

View File

@@ -23,13 +23,14 @@ def get_fake_env(name=None, status=None, release_id=None,
environment. Represents the average amount of data.
"""
return {"status": status or "new",
"is_customized": False,
"release_id": release_id or 1,
"name": name or "fake_env",
"grouping": "roles",
"net_provider": "nova_network",
"fuel_version": fuel_version or "5.1",
"pending_release_id": pending_release,
"id": env_id or 1,
"mode": "multinode"}
return {'status': status or 'new',
'is_customized': False,
'release_id': release_id or 1,
'name': name or 'fake_env',
'grouping': 'roles',
'net_provider': 'nova_network',
'fuel_version': fuel_version or '5.1',
'pending_release_id': pending_release,
'id': env_id or 1,
'changes': [],
'mode': 'multinode'}

View File

@@ -14,118 +14,114 @@
# License for the specific language governing permissions and limitations
# under the License.
import random
from fuelclient import tests
def get_fake_node(cluster=None, hostname=None, node_id=None, cpu_model=None,
roles=None, mac=None, memory_b=None, os_platform=None,
status=None, node_name=None, group_id=None):
"""Creates a fake random node
"""Creates a fake node
Returns the serialized and parametrized representation of a dumped Fuel
environment. Represents the average amount of data.
"""
host_name = hostname or tests.utils.random_string(15, prefix='fake-node-')
host_name = hostname or 'fake-node-42'
return {"name": node_name or host_name,
"error_type": None,
"cluster": cluster or 1,
"id": node_id or random.randint(1, 10000),
"ip": "10.20.0.4",
"kernel_params": None,
"group_id": group_id or 1,
"mac": mac or "d6:11:3f:b0:f1:43",
"manufacturer": "VirtualBox",
"online": True,
"os_platform": os_platform or "centos",
"pending_addition": False,
"pending_deletion": False,
"pending_roles": [],
"platform_name": None,
"progress": 100,
"roles": roles or ["compute"],
"status": status or "ready",
"fqdn": "{hostname}.example.com".format(hostname=host_name),
return {'name': node_name or host_name,
'error_type': None,
'cluster': cluster or 1,
'id': node_id or 42,
'ip': '10.20.0.4',
'kernel_params': None,
'group_id': group_id or 1,
'mac': mac or 'd6:11:3f:b0:f1:43',
'manufacturer': 'VirtualBox',
'online': True,
'os_platform': os_platform or 'centos',
'pending_addition': False,
'pending_deletion': False,
'pending_roles': [],
'platform_name': None,
'progress': 100,
'roles': roles or ['compute'],
'status': status or 'ready',
'fqdn': '{hostname}.example.com'.format(hostname=host_name),
"meta": {"cpu": {"real": 0,
"spec": [{"frequency": 2553,
"model": cpu_model or "Random CPU"}],
"total": 1},
'meta': {'cpu': {'real': 0,
'spec': [{'frequency': 2553,
'model': cpu_model or 'Random CPU'}],
'total': 1},
"disks": [{"disk": "disk/by-path/pci:00:0d.0-scsi-2:0:0",
"extra": ["disk/by-id/scsi-SATA_VBOX_aef0bb5c",
"disk/by-id/ata-VBOX_HARDDISK_VB37"],
"model": "VBOX HARDDISK",
"name": "sdc",
"removable": "0",
"size": 68718428160},
'disks': [{'disk': 'disk/by-path/pci:00:0d.0-scsi-2:0:0',
'extra': ['disk/by-id/scsi-SATA_VBOX_aef0bb5c',
'disk/by-id/ata-VBOX_HARDDISK_VB37'],
'model': 'VBOX HARDDISK',
'name': 'sdc',
'removable': '0',
'size': 68718428160},
{"disk": "disk/by-path/pci:0:0d.0-scsi-1:0:0:0",
"extra": ["disk/by-id/scsi-SATA_VBOX_30fbc3bb",
"disk/by-id/ata-VBOX_HARDD30fbc3bb"],
"model": "VBOX HARDDISK",
"name": "sdb",
"removable": "0",
"size": 68718428160},
{'disk': 'disk/by-path/pci:0:0d.0-scsi-1:0:0:0',
'extra': ['disk/by-id/scsi-SATA_VBOX_30fbc3bb',
'disk/by-id/ata-VBOX_HARDD30fbc3bb'],
'model': 'VBOX HARDDISK',
'name': 'sdb',
'removable': '0',
'size': 68718428160},
{"disk": "disk/by-path/pci:00:d.0-scsi-0:0:0:0",
"extra": ["disk/by-id/scsi-SATA_VBOX-17e33653",
"disk/by-id/ata-VBOX_HARDD17e33653"],
"model": "VBOX HARDDISK",
"name": "sda",
"removable": "0",
"size": 68718428160}],
{'disk': 'disk/by-path/pci:00:d.0-scsi-0:0:0:0',
'extra': ['disk/by-id/scsi-SATA_VBOX-17e33653',
'disk/by-id/ata-VBOX_HARDD17e33653'],
'model': 'VBOX HARDDISK',
'name': 'sda',
'removable': '0',
'size': 68718428160}],
"interfaces": [{"name": "eth2",
"current_speed": 100,
"mac": "08:00:27:88:9C:46",
"max_speed": 100,
"state": "unknown"},
'interfaces': [{'name': 'eth2',
'current_speed': 100,
'mac': '08:00:27:88:9C:46',
'max_speed': 100,
'state': 'unknown'},
{"name": "eth1",
"current_speed": 100,
"mac": "08:00:27:24:BD:6D",
"max_speed": 100,
"state": "unknown"},
{'name': 'eth1',
'current_speed': 100,
'mac': '08:00:27:24:BD:6D',
'max_speed': 100,
'state': 'unknown'},
{"name": "eth0",
"current_speed": 100,
"mac": "08:00:27:C1:C5:72",
"max_speed": 100,
"state": "unknown"}],
"memory": {"total": memory_b or 1968627712},
{'name': 'eth0',
'current_speed': 100,
'mac': '08:00:27:C1:C5:72',
'max_speed': 100,
'state': 'unknown'}],
'memory': {'total': memory_b or 1968627712},
"system": {"family": "Virtual Machine",
"fqdn": host_name,
"manufacturer": "VirtualBox",
"serial": "0",
"version": "1.2"}},
"network_data": [{"brd": "192.168.0.255",
"dev": "eth0",
"gateway": None,
"ip": "192.168.0.2/24",
"name": "management",
"netmask": "255.255.255.0",
"vlan": 101},
'system': {'family': 'Virtual Machine',
'fqdn': host_name,
'manufacturer': 'VirtualBox',
'serial': '0',
'version': '1.2'}},
'network_data': [{'brd': '192.168.0.255',
'dev': 'eth0',
'gateway': None,
'ip': '192.168.0.2/24',
'name': 'management',
'netmask': '255.255.255.0',
'vlan': 101},
{"brd": "192.168.1.255",
"dev": "eth0",
"gateway": None,
"ip": "192.168.1.2/24",
"name": "storage",
"netmask": "255.255.255.0",
"vlan": 102},
{'brd': '192.168.1.255',
'dev': 'eth0',
'gateway': None,
'ip': '192.168.1.2/24',
'name': 'storage',
'netmask': '255.255.255.0',
'vlan': 102},
{"brd": "172.16.0.255",
"dev": "eth1",
"gateway": "172.16.0.1",
"ip": "172.16.0.3/24",
"name": "public",
"netmask": "255.255.255.0",
"vlan": None},
{'brd': '172.16.0.255',
'dev': 'eth1',
'gateway': '172.16.0.1',
'ip': '172.16.0.3/24',
'name': 'public',
'netmask': '255.255.255.0',
'vlan': None},
{"dev": "eth0",
"name": "admin"}]}
{'dev': 'eth0',
'name': 'admin'}]}

View File

@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
#
# Copyright 2015 Mirantis, 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.
def get_fake_task(task_id=None, status=None, name=None,
cluster=None, result=None, progress=None):
"""Create a fake task
Returns the serialized and parametrized representation of a dumped Fuel
Task. Represents the average amount of data.
"""
return {'status': status or 'running',
'name': name or 'deploy',
'task_id': task_id or 42,
'cluster': cluster or 34,
'result': result or '',
'progress': progress or 50}

View File

@@ -18,6 +18,7 @@ import cStringIO
import mock
from fuelclient.tests.utils import fake_env
from fuelclient.tests.v2.unit.cli import test_engine
from fuelclient.v1 import environment
@@ -25,6 +26,15 @@ from fuelclient.v1 import environment
class TestEnvCommand(test_engine.BaseCLITest):
"""Tests for fuel2 env * commands."""
def setUp(self):
super(TestEnvCommand, self).setUp()
self.m_client.get_all.return_value = [fake_env.get_fake_env()
for i in range(10)]
self.m_client.get_by_id.return_value = fake_env.get_fake_env()
self.m_client.create.return_value = fake_env.get_fake_env()
self.m_client.update.return_value = fake_env.get_fake_env()
def test_env_list(self):
args = 'env list'
self.exec_command(args)
@@ -70,10 +80,9 @@ class TestEnvCommand(test_engine.BaseCLITest):
def test_env_delete_wo_force(self):
args = 'env delete 42'
fake_env = mock.Mock()
fake_env.status = 'operational'
self.m_client.get_by_id.return_value = fake_env
env = fake_env.get_fake_env(status='operational')
self.m_client.get_by_id.return_value = env
with mock.patch('sys.stdout', new=cStringIO.StringIO()) as m_stdout:
self.exec_command(args)

View File

@@ -16,12 +16,20 @@
import mock
from fuelclient.tests.utils import fake_node
from fuelclient.tests.v2.unit.cli import test_engine
class TestNodeCommand(test_engine.BaseCLITest):
"""Tests for fuel2 node * commands."""
def setUp(self):
super(TestNodeCommand, self).setUp()
self.m_client.get_all.return_value = [fake_node.get_fake_node()
for i in range(10)]
self.m_client.get_by_id.return_value = fake_node.get_fake_node()
def test_node_list(self):
args = 'node list'
self.exec_command(args)

View File

@@ -16,11 +16,19 @@
import mock
from fuelclient.tests.utils import fake_task
from fuelclient.tests.v2.unit.cli import test_engine
class TestTaskCommand(test_engine.BaseCLITest):
def setUp(self):
super(TestTaskCommand, self).setUp()
self.m_client.get_all.return_value = [fake_task.get_fake_task()
for i in range(10)]
self.m_client.get_by_id.return_value = fake_task.get_fake_task()
def test_task_list(self):
args = 'task list'
self.exec_command(args)