Merge pull request #41 from frac/frac/fix_pep8

Fix tox pep8 errors and add parenthesis to print.
This commit is contained in:
Ben Nemec 2018-03-14 14:43:12 -05:00 committed by GitHub
commit dac9b5d0b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 232 additions and 179 deletions

View File

@ -25,7 +25,6 @@ import errno
import json
import os
import re
import sys
import yaml
@ -38,7 +37,7 @@ _STATIC_MESSAGE_START = (
' # Static parameters - these are values that must be\n'
' # included in the environment but should not be changed.\n'
' # ******************************************************\n'
)
)
_STATIC_MESSAGE_END = (' # *********************\n'
' # End static parameters\n'
' # *********************\n'
@ -50,7 +49,7 @@ _FILE_HEADER = (
'# Users are recommended to make changes to a copy of the file instead\n'
'# of the original, if any customizations are needed.\n'
'# *******************************************************************\n'
)
)
# Certain parameter names can't be changed, but shouldn't be shown because
# they are never intended for direct user input.
_PRIVATE_OVERRIDES = []

View File

@ -14,10 +14,7 @@
import json
import os
import sys
from keystoneclient.v2_0 import client as keystone_client
from keystoneclient.v3 import client as keystone_v3_client
import os_client_config
@ -61,6 +58,7 @@ def _create_auth_parameters():
'os_project_domain': project_domain,
}
def _cloud_json():
"""Return the current cloud's data in JSON

View File

@ -16,13 +16,10 @@
import argparse
import json
import os
import sys
import yaml
import os_client_config
import auth
def _parse_args():
parser = argparse.ArgumentParser(
@ -93,7 +90,7 @@ def _get_names(args):
role = e.get('parameter_defaults', {}).get('role')
if role and baremetal_base.endswith('-' + role):
baremetal_base = baremetal_base[:-len(role) - 1]
undercloud_name = e.get('parameter_defaults', {}).get('undercloud_name')
undercloud_name = e.get('parameter_defaults', {}).get('undercloud_name') # noqa: E501
return bmc_base, baremetal_base, provision_net, undercloud_name
@ -146,9 +143,12 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net,
node = dict(node_template)
node['pm_addr'] = bmc_port['fixed_ips'][0]['ip_address']
bmc_bm_pairs.append((node['pm_addr'], baremetal.name))
node['mac'] = [baremetal.addresses[provision_net][0]['OS-EXT-IPS-MAC:mac_addr']]
node['mac'] = [
baremetal.addresses[provision_net][0]['OS-EXT-IPS-MAC:mac_addr']
]
if not cache.get(baremetal.flavor['id']):
cache[baremetal.flavor['id']] = nova.flavors.get(baremetal.flavor['id'])
cache[baremetal.flavor['id']] = nova.flavors.get(
baremetal.flavor['id'])
flavor = cache.get(baremetal.flavor['id'])
node['cpu'] = flavor.vcpus
node['memory'] = flavor.ram
@ -163,7 +163,8 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net,
# the instance so we can't do this.
if baremetal.image:
if not cache.get(baremetal.image['id']):
cache[baremetal.image['id']] = glance.images.get(baremetal.image['id'])
cache[baremetal.image['id']] = glance.images.get(
baremetal.image['id'])
image = cache.get(baremetal.image['id'])
if image.get('hw_firmware_type') == 'uefi':
node['capabilities'] += ",boot_mode:uefi"
@ -172,7 +173,8 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net,
# need to look up the volume disk size.
cloud = os.environ.get('OS_CLOUD')
cinder = os_client_config.make_client('volume', cloud=cloud)
vol_id = baremetal.to_dict()['os-extended-volumes:volumes_attached'][0]['id']
vol_id = baremetal.to_dict()[
'os-extended-volumes:volumes_attached'][0]['id']
volume = cinder.volumes.get(vol_id)
node['disk'] = volume.size
@ -195,17 +197,18 @@ def _build_nodes(nova, glance, bmc_ports, bm_ports, provision_net,
undercloud_instance = nova.servers.list(
search_opts={'name': undercloud_name})[0]
except IndexError:
print ('Undercloud %s specified in the environment file is not '
'available in nova. No undercloud details will be '
'included in the output.' % undercloud_name)
print('Undercloud %s specified in the environment file is not '
'available in nova. No undercloud details will be '
'included in the output.' % undercloud_name)
else:
undercloud_node_template['id'] = undercloud_instance.id
undercloud_node_template['ips'] = nova.servers.ips(undercloud_instance)
undercloud_node_template['ips'] = nova.servers.ips(
undercloud_instance)
extra_nodes.append(undercloud_node_template)
network_details[undercloud_name] = {}
network_details[undercloud_name]['id'] = undercloud_instance.id
network_details[undercloud_name]['ips'] = undercloud_instance.addresses
network_details[undercloud_name] = dict(
id=undercloud_instance.id,
ips=undercloud_instance.addresses)
return nodes, bmc_bm_pairs, extra_nodes, network_details

View File

@ -12,57 +12,63 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import print_function
import argparse
import os
import random
import sys
import time
import yaml
from heatclient import client as heat_client
from heatclient.common import template_utils
import os_client_config
import auth
def _parse_args():
parser = argparse.ArgumentParser(description='Deploy an OVB environment')
parser.add_argument('--env', '-e',
help='Path to Heat environment file describing the OVB '
'environment to be deployed. Default: %(default)s',
action='append',
default=[])
parser.add_argument('--id',
help='Identifier to add to all resource names. The '
'resulting names will look like undercloud-ID or '
'baremetal-ID. By default no changes will be made to '
'the resource names. If an id is specified, a new '
'environment file will be written to env-ID.yaml. ')
parser.add_argument('--name',
help='Name for the Heat stack to be created. Defaults '
'to "baremetal" in a standard deployment. If '
'--quintupleo is specified then the default is '
'"quintupleo".')
parser.add_argument('--quintupleo',
help='Deploy a full environment suitable for TripleO '
'development.',
action='store_true',
default=False)
parser.add_argument('--role',
help='Additional environment file describing a '
'secondary role to be deployed alongside the '
'primary one described in the main environment.',
action='append',
default=[])
parser.add_argument('--poll',
help='Poll until the Heat stack(s) are complete. '
'Automatically enabled when multiple roles are '
'deployed.',
action='store_true',
default=False)
parser.add_argument(
'--env', '-e',
help='Path to Heat environment file describing the OVB '
'environment to be deployed. Default: %(default)s',
action='append',
default=[])
parser.add_argument(
'--id',
help='Identifier to add to all resource names. The '
'resulting names will look like undercloud-ID or '
'baremetal-ID. By default no changes will be made to '
'the resource names. If an id is specified, a new '
'environment file will be written to env-ID.yaml. ')
parser.add_argument(
'--name',
help='Name for the Heat stack to be created. Defaults '
'to "baremetal" in a standard deployment. If '
'--quintupleo is specified then the default is '
'"quintupleo".')
parser.add_argument(
'--quintupleo',
help='Deploy a full environment suitable for TripleO '
'development.',
action='store_true',
default=False)
parser.add_argument(
'--role',
help='Additional environment file describing a '
'secondary role to be deployed alongside the '
'primary one described in the main environment.',
action='append',
default=[])
parser.add_argument(
'--poll',
help='Poll until the Heat stack(s) are complete. '
'Automatically enabled when multiple roles are '
'deployed.',
action='store_true',
default=False)
return parser.parse_args()
def _process_args(args):
if args.id:
if not args.quintupleo:
@ -93,6 +99,7 @@ def _process_args(args):
stack_template = 'templates/quintupleo.yaml'
return stack_name, stack_template
def _add_identifier(env_data, name, identifier, default=None):
# We require both sections for id environments
if not env_data.get('parameters'):
@ -131,16 +138,23 @@ def _build_env_data(env_paths):
env_paths)
return env_data
def _generate_id_env(args):
env_data = _build_env_data(args.env)
_add_identifier(env_data, 'provision_net', args.id, default='provision')
_add_identifier(env_data, 'public_net', args.id, default='public')
_add_identifier(env_data, 'baremetal_prefix', args.id, default='baremetal')
_add_identifier(env_data,
'baremetal_prefix',
args.id,
default='baremetal')
role = env_data['parameter_defaults'].get('role')
if role:
_add_identifier(env_data, 'baremetal_prefix', role)
_add_identifier(env_data, 'bmc_prefix', args.id, default='bmc')
_add_identifier(env_data, 'undercloud_name', args.id, default='undercloud')
_add_identifier(env_data,
'undercloud_name',
args.id,
default='undercloud')
_add_identifier(env_data, 'overcloud_internal_net', args.id,
default='internal')
_add_identifier(env_data, 'overcloud_storage_net', args.id,
@ -158,6 +172,7 @@ def _generate_id_env(args):
yaml.safe_dump(env_data, f, default_flow_style=False)
return args.env + [env_path]
def _validate_env(args, env_paths):
"""Check for invalid environment configurations
@ -173,13 +188,15 @@ def _validate_env(args, env_paths):
prefix = env_data['parameter_defaults']['baremetal_prefix']
if role and prefix.endswith('-' + role):
raise RuntimeError('baremetal_prefix ends with role name. This '
'will break build-nodes-json. Please choose a '
'different baremetal_prefix or role name.')
'will break build-nodes-json. Please choose '
'a different baremetal_prefix or role name.')
def _get_heat_client():
return os_client_config.make_client('orchestration',
cloud=auth.OS_CLOUD)
def _deploy(stack_name, stack_template, env_paths, poll):
hclient = _get_heat_client()
@ -198,16 +215,17 @@ def _deploy(stack_name, stack_template, env_paths, poll):
files=all_files,
parameters=parameters)
print 'Deployment of stack "%s" started.' % stack_name
print('Deployment of stack "%s" started.' % stack_name)
if poll:
_poll_stack(stack_name, hclient)
def _poll_stack(stack_name, hclient):
def _poll_stack(stack_name, hclient):
"""Poll status for stack_name until it completes or fails"""
print 'Waiting for stack to complete',
print('Waiting for stack to complete', end="")
done = False
while not done:
print '.',
print('.', end="")
# By the time we get here we know Heat was up at one point because
# we were able to start the stack create. Therefore, we can
# reasonably guess that any errors from this call are going to be
@ -217,19 +235,20 @@ def _poll_stack(stack_name, hclient):
except Exception as e:
# Print the error so the user can determine whether they need
# to cancel the deployment, but keep trying otherwise.
print 'WARNING: Exception occurred while polling stack: %s' % e
print('WARNING: Exception occurred while polling stack: %s' % e)
time.sleep(10)
continue
sys.stdout.flush()
if stack.status == 'COMPLETE':
print 'Stack %s created successfully' % stack_name
print('Stack %s created successfully' % stack_name)
done = True
elif stack.status == 'FAILED':
print stack.to_dict().get('stack_status_reason')
print(stack.to_dict().get('stack_status_reason'))
raise RuntimeError('Failed to create stack %s' % stack_name)
else:
time.sleep(10)
# Abstract out the role file interactions for easier unit testing
def _load_role_data(base_envs, role_file, args):
base_data = _build_env_data(base_envs)
@ -238,10 +257,12 @@ def _load_role_data(base_envs, role_file, args):
orig_data = _build_env_data(args.env)
return base_data, role_data, orig_data
def _write_role_file(role_env, role_file):
with open(role_file, 'w') as f:
yaml.safe_dump(role_env, f, default_flow_style=False)
def _process_role(role_file, base_envs, stack_name, args):
"""Merge a partial role env with the base env
@ -260,7 +281,7 @@ def _process_role(role_file, base_envs, stack_name, args):
'os_password', 'os_tenant', 'os_user',
'private_net', 'provision_net', 'public_net',
'overcloud_internal_net', 'overcloud_storage_mgmt_net',
'overcloud_storage_net','overcloud_tenant_net',
'overcloud_storage_net', 'overcloud_tenant_net',
]
# Parameters that are inherited but can be overridden by the role
allowed_parameter_keys = ['baremetal_image', 'bmc_flavor']
@ -273,7 +294,7 @@ def _process_role(role_file, base_envs, stack_name, args):
if k in inherited_keys and
(k not in role_env.get(section, {}) or
k not in allowed_parameter_keys)
})
})
# Most of the resource_registry should not be included in role envs.
# Only allow specific entries that may be needed.
role_env.setdefault('resource_registry', {})
@ -306,6 +327,7 @@ def _process_role(role_file, base_envs, stack_name, args):
_write_role_file(role_env, role_file)
return role_file, role
def _deploy_roles(stack_name, args, env_paths):
for r in args.role:
role_env, role_name = _process_role(r, env_paths, stack_name, args)
@ -313,6 +335,7 @@ def _deploy_roles(stack_name, args, env_paths):
'templates/virtual-baremetal.yaml',
[role_env], poll=True)
if __name__ == '__main__':
args = _parse_args()
stack_name, stack_template = _process_args(args)

View File

@ -20,7 +20,7 @@
# Sample ipmitool commands:
# ipmitool -I lanplus -U admin -P password -H 127.0.0.1 power on
# ipmitool -I lanplus -U admin -P password -H 127.0.0.1 power status
# ipmitool -I lanplus -U admin -P password -H 127.0.0.1 chassis bootdev pxe|disk
# ipmitool -I lanplus -U admin -P password -H 127.0.0.1 chassis bootdev pxe|disk # noqa: E501
# ipmitool -I lanplus -U admin -P password -H 127.0.0.1 mc reset cold
import argparse
@ -44,10 +44,12 @@ NO_OCC_DEPRECATION = ('WARNING: Creating novaclient without os-client-config '
class OpenStackBmc(bmc.Bmc):
def __init__(self, authdata, port, address, instance, user, password, tenant,
auth_url, project, user_domain, project_domain, cache_status,
os_cloud):
super(OpenStackBmc, self).__init__(authdata, port=port, address=address)
def __init__(self, authdata, port, address, instance, user, password,
tenant, auth_url, project, user_domain, project_domain,
cache_status, os_cloud):
super(OpenStackBmc, self).__init__(authdata,
port=port,
address=address)
if os_client_config:
if user:
# NOTE(bnemec): This is deprecated. clouds.yaml is a much
@ -66,7 +68,7 @@ class OpenStackBmc(bmc.Bmc):
else:
# NOTE(bnemec): This path was deprecated 2017-7-17
self.log(NO_OCC_DEPRECATION)
if not '/v3' in auth_url:
if '/v3' not in auth_url:
# novaclient 7+ is backwards-incompatible :-(
if int(nc.__version__[0]) <= 6:
self.novaclient = novaclient.Client(2, user, password,
@ -76,11 +78,13 @@ class OpenStackBmc(bmc.Bmc):
auth_url=auth_url,
project_name=tenant)
else:
self.novaclient = novaclient.Client(2, user, password,
auth_url=auth_url,
project_name=project,
user_domain_name=user_domain,
project_domain_name=project_domain)
self.novaclient = novaclient.Client(
2, user, password,
auth_url=auth_url,
project_name=project,
user_domain_name=user_domain,
project_domain_name=project_domain
)
self.instance = None
self.cache_status = cache_status
self.cached_status = None
@ -120,7 +124,10 @@ class OpenStackBmc(bmc.Bmc):
def get_boot_device(self):
"""Return the currently configured boot device"""
server = self.novaclient.servers.get(self.instance)
retval = 'network' if server.metadata.get('libvirt:pxe-first') else 'hd'
if server.metadata.get('libvirt:pxe-first'):
retval = 'network'
else:
retval = 'hd'
self.log('Reporting boot device', retval)
return retval
@ -132,9 +139,13 @@ class OpenStackBmc(bmc.Bmc):
"""
server = self.novaclient.servers.get(self.instance)
if bootdevice == 'network':
self.novaclient.servers.set_meta_item(server, 'libvirt:pxe-first', '1')
self.novaclient.servers.set_meta_item(
server, 'libvirt:pxe-first', '1'
)
else:
self.novaclient.servers.set_meta_item(server, 'libvirt:pxe-first', '')
self.novaclient.servers.set_meta_item(
server, 'libvirt:pxe-first', ''
)
self.log('Set boot device to', bootdevice)
def cold_reset(self):
@ -146,7 +157,7 @@ class OpenStackBmc(bmc.Bmc):
if (self.cached_status is None or
self.cached_status != self.target_status or
not self.cache_status):
self.cached_status = self.novaclient.servers.get(self.instance).status
self.cached_status = self.novaclient.servers.get(self.instance).status # noqa: E501
return self.cached_status == 'ACTIVE'
def get_power_state(self):
@ -221,7 +232,8 @@ def main():
parser.add_argument('--instance',
dest='instance',
required=True,
help='The uuid or name of the OpenStack instance to manage')
help='The uuid or name of the OpenStack instance '
'to manage')
parser.add_argument('--os-user',
dest='user',
required=False,

View File

@ -140,6 +140,7 @@ class TestCreateAuthParameters(testtools.TestCase):
}
self.assertEqual(expected, result)
class TestCloudJSON(testtools.TestCase):
@mock.patch('openstack_virtual_baremetal.auth.OS_CLOUD', 'foo')
@mock.patch('os_client_config.OpenStackConfig')

View File

@ -98,12 +98,13 @@ class TestBuildNodesJson(testtools.TestCase):
args = mock.Mock()
args.env = 'foo.yaml'
args.add_undercloud = False
mock_env = {'parameters':
{'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo',
'provision_net': 'provision-foo'
},
}
mock_env = {
'parameters': {
'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo',
'provision_net': 'provision-foo'
},
}
mock_load.return_value = mock_env
bmc_base, baremetal_base, provision_net, undercloud_name = (
build_nodes_json._get_names(args))
@ -119,12 +120,13 @@ class TestBuildNodesJson(testtools.TestCase):
args = mock.Mock()
args.env = 'foo.yaml'
args.add_undercloud = False
mock_env = {'parameter_defaults':
{'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo',
'provision_net': 'provision-foo'
},
}
mock_env = {
'parameter_defaults': {
'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo',
'provision_net': 'provision-foo'
},
}
mock_load.return_value = mock_env
bmc_base, baremetal_base, provision_net, undercloud_name = (
build_nodes_json._get_names(args))
@ -140,13 +142,14 @@ class TestBuildNodesJson(testtools.TestCase):
args = mock.Mock()
args.env = 'foo.yaml'
args.add_undercloud = False
mock_env = {'parameter_defaults':
{'bmc_prefix': 'bmc',
'baremetal_prefix': 'baremetal',
'provision_net': 'provision',
'role': 'foo',
},
}
mock_env = {
'parameter_defaults': {
'bmc_prefix': 'bmc',
'baremetal_prefix': 'baremetal',
'provision_net': 'provision',
'role': 'foo',
},
}
mock_load.return_value = mock_env
bmc_base, baremetal_base, provision_net, undercloud_name = (
build_nodes_json._get_names(args))
@ -162,13 +165,14 @@ class TestBuildNodesJson(testtools.TestCase):
args = mock.Mock()
args.env = 'foo.yaml'
args.add_undercloud = False
mock_env = {'parameter_defaults':
{'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo-bar',
'provision_net': 'provision-foo',
'role': 'bar',
},
}
mock_env = {
'parameter_defaults': {
'bmc_prefix': 'bmc-foo',
'baremetal_prefix': 'baremetal-foo-bar',
'provision_net': 'provision-foo',
'role': 'bar',
},
}
mock_load.return_value = mock_env
bmc_base, baremetal_base, provision_net, undercloud_name = (
build_nodes_json._get_names(args))
@ -195,17 +199,17 @@ class TestBuildNodesJson(testtools.TestCase):
mock.call('image', cloud=None)]
self.assertEqual(calls, mock_make_client.mock_calls)
def test_get_ports(self):
neutron = mock.Mock()
fake_ports = {'ports':
[{'name': 'random'},
{'name': 'bmc_1'},
{'name': 'bmc_0'},
{'name': 'baremetal_1'},
{'name': 'baremetal_0'},
]
}
fake_ports = {
'ports': [
{'name': 'random'},
{'name': 'bmc_1'},
{'name': 'bmc_0'},
{'name': 'baremetal_1'},
{'name': 'baremetal_0'},
]
}
neutron.list_ports.return_value = fake_ports
bmc_ports, bm_ports = build_nodes_json._get_ports(neutron, 'bmc',
'baremetal')
@ -222,14 +226,15 @@ class TestBuildNodesJson(testtools.TestCase):
def test_get_ports_multiple(self):
neutron = mock.Mock()
fake_ports = {'ports':
[{'name': 'random'},
{'name': 'bmc-foo_0'},
{'name': 'bmc-bar_0'},
{'name': 'baremetal-foo_0'},
{'name': 'baremetal-bar_0'},
]
}
fake_ports = {
'ports': [
{'name': 'random'},
{'name': 'bmc-foo_0'},
{'name': 'bmc-bar_0'},
{'name': 'baremetal-foo_0'},
{'name': 'baremetal-bar_0'},
]
}
neutron.list_ports.return_value = fake_ports
bmc_ports, bm_ports = build_nodes_json._get_ports(neutron, 'bmc-foo',
'baremetal-foo')
@ -246,14 +251,14 @@ class TestBuildNodesJson(testtools.TestCase):
servers[0].name = 'bm_0'
servers[0].flavor = {'id': '1'}
servers[0].addresses = {'provision': [{'OS-EXT-IPS-MAC:mac_addr':
'aa:aa:aa:aa:aa:aa',
'aa:aa:aa:aa:aa:aa',
'addr': '2.1.1.1'}]}
servers[0].image = {'id': 'f00'}
servers[0].id = '123abc'
servers[1].name = 'bm_1'
servers[1].flavor = {'id': '1'}
servers[1].addresses = {'provision': [{'OS-EXT-IPS-MAC:mac_addr':
'aa:aa:aa:aa:aa:ab',
'aa:aa:aa:aa:aa:ab',
'addr': '2.1.1.2'}]}
servers[1].image = {'id': 'f00'}
servers[1].id = '456def'
@ -274,7 +279,7 @@ class TestBuildNodesJson(testtools.TestCase):
self._create_build_nodes_mocks(nova, servers)
servers[1].image = None
mock_to_dict = {'os-extended-volumes:volumes_attached':
[{'id': 'v0lume'}]}
[{'id': 'v0lume'}]}
servers[1].to_dict.return_value = mock_to_dict
mock_cinder = mock.Mock()
mock_make_client.return_value = mock_cinder
@ -284,7 +289,7 @@ class TestBuildNodesJson(testtools.TestCase):
servers[2].name = 'undercloud'
servers[2].flavor = {'id': '1'}
servers[2].addresses = {'provision': [{'OS-EXT-IPS-MAC:mac_addr':
'aa:aa:aa:aa:aa:ac'}]}
'aa:aa:aa:aa:aa:ac'}]}
servers[2].image = {'id': 'f00'}
nova.servers.list.return_value = [servers[2]]
ips_return_val = 'ips call value'
@ -305,10 +310,10 @@ class TestBuildNodesJson(testtools.TestCase):
bmc_bm_pairs)
self.assertEqual(1, len(extra_nodes))
self.assertEqual('undercloud', extra_nodes[0]['name'])
self.assertEqual('2.1.1.1',
network_details['bm_0']['ips']['provision'][0]['addr'])
self.assertEqual('2.1.1.2',
network_details['bm_1']['ips']['provision'][0]['addr'])
self.assertEqual(
'2.1.1.1', network_details['bm_0']['ips']['provision'][0]['addr'])
self.assertEqual(
'2.1.1.2', network_details['bm_1']['ips']['provision'][0]['addr'])
@mock.patch('os_client_config.make_client')
def test_build_nodes_with_driver(self, mock_make_client):
@ -321,7 +326,7 @@ class TestBuildNodesJson(testtools.TestCase):
self._create_build_nodes_mocks(nova, servers)
servers[1].image = None
mock_to_dict = {'os-extended-volumes:volumes_attached':
[{'id': 'v0lume'}]}
[{'id': 'v0lume'}]}
servers[1].to_dict.return_value = mock_to_dict
mock_cinder = mock.Mock()
mock_make_client.return_value = mock_cinder
@ -331,7 +336,7 @@ class TestBuildNodesJson(testtools.TestCase):
servers[2].name = 'undercloud'
servers[2].flavor = {'id': '1'}
servers[2].addresses = {'provision': [{'OS-EXT-IPS-MAC:mac_addr':
'aa:aa:aa:aa:aa:ac'}]}
'aa:aa:aa:aa:aa:ac'}]}
servers[2].image = {'id': 'f00'}
nova.servers.list.return_value = [servers[2]]
ips_return_val = 'ips call value'
@ -354,10 +359,10 @@ class TestBuildNodesJson(testtools.TestCase):
bmc_bm_pairs)
self.assertEqual(1, len(extra_nodes))
self.assertEqual('undercloud', extra_nodes[0]['name'])
self.assertEqual('2.1.1.1',
network_details['bm_0']['ips']['provision'][0]['addr'])
self.assertEqual('2.1.1.2',
network_details['bm_1']['ips']['provision'][0]['addr'])
self.assertEqual(
'2.1.1.1', network_details['bm_0']['ips']['provision'][0]['addr'])
self.assertEqual(
'2.1.1.2', network_details['bm_1']['ips']['provision'][0]['addr'])
def test_build_nodes_role_uefi(self):
bmc_ports = [{'fixed_ips': [{'ip_address': '1.1.1.1'}]},
@ -449,9 +454,9 @@ class TestBuildNodesJson(testtools.TestCase):
mock_open.mock_calls)
f = mock_open.return_value.__enter__.return_value
f.write.assert_any_call(json.dumps({'nodes': [test_nodes[0]]},
indent=2))
indent=2))
f.write.assert_any_call(json.dumps({'nodes': [test_nodes[1]]},
indent=2))
indent=2))
@mock.patch('openstack_virtual_baremetal.build_nodes_json.open',
create=True)
@ -519,4 +524,3 @@ class TestBuildNodesJson(testtools.TestCase):
network_details, args)
mock_write_role_nodes.assert_called_once_with(nodes, args)
mock_write_pairs.assert_called_once_with(pairs)

View File

@ -14,17 +14,15 @@
# under the License.
import copy
import io
import unittest
import yaml
import fixtures
import mock
import testtools
from openstack_virtual_baremetal import auth
from openstack_virtual_baremetal import deploy
class TestProcessArgs(unittest.TestCase):
def _basic_mock_args(self):
"""Return a mock with basic args set"""
@ -90,6 +88,7 @@ class TestProcessArgs(unittest.TestCase):
mock_args.env = ['env-foo.yaml']
self.assertRaises(ValueError, deploy._process_args, mock_args)
test_env = u"""parameters:
provision_net: provision
public_net: public
@ -111,7 +110,7 @@ test_env_output = {
'overcloud_storage_net': 'storage-foo',
'overcloud_storage_mgmt_net': 'storage_mgmt-foo',
'overcloud_tenant_net': 'tenant-foo'
}
}
class TestIdEnv(unittest.TestCase):
@ -189,6 +188,7 @@ class TestIdEnv(unittest.TestCase):
self.assertEqual(v, dumped_dict['parameters'][k])
self.assertEqual(v, dumped_dict['parameter_defaults'][k])
# _process_role test data
role_base_data = {
'parameter_defaults': {
@ -197,7 +197,7 @@ role_base_data = {
'overcloud_storage_net': 'storage-foo',
'role': 'control',
'overcloud_tenant_net': 'tenant-foo'
},
},
'parameters': {
'os_user': 'admin',
'key_name': 'default',
@ -218,17 +218,18 @@ role_base_data = {
'undercloud_flavor': 'undercloud-16',
'node_count': 3,
'bmc_flavor': 'bmc'
},
},
'resource_registry': {
'OS::OVB::BaremetalNetworks': 'templates/baremetal-networks-all.yaml',
'OS::OVB::BaremetalPorts': 'templates/baremetal-ports-public-bond.yaml',
'OS::OVB::BaremetalPorts':
'templates/baremetal-ports-public-bond.yaml',
'OS::OVB::BMCPort': 'templates/bmc-port-port-security.yaml'
}
}
}
role_specific_data = {
'parameter_defaults': {
'role': 'compute',
},
},
'parameters': {
'key_name': 'default',
'baremetal_flavor': 'baremetal',
@ -236,17 +237,17 @@ role_specific_data = {
'bmc_prefix': 'bmc',
'node_count': 2,
'bmc_flavor': 'bmc'
},
},
'resource_registry': {
'OS::OVB::BaremetalNetworks': 'templates/baremetal-networks-all.yaml',
'OS::OVB::BaremetalPorts': 'templates/baremetal-ports-all.yaml'
}
}
}
role_original_data = {
'parameter_defaults': {
'role': 'control',
'baremetal_prefix': 'baremetal',
},
},
'parameters': {
'os_user': 'admin',
'key_name': 'default',
@ -266,15 +267,17 @@ role_original_data = {
'undercloud_flavor': 'undercloud-16',
'node_count': 3,
'bmc_flavor': 'bmc'
},
},
'resource_registry': {
'OS::OVB::BaremetalNetworks': 'templates/baremetal-networks-all.yaml',
'OS::OVB::BaremetalPorts': 'templates/baremetal-ports-public-bond.yaml',
'OS::OVB::BaremetalPorts':
'templates/baremetal-ports-public-bond.yaml',
'OS::OVB::BMCPort': 'templates/bmc-port-port-security.yaml'
}
}
}
# end _process_role test data
class TestDeploy(testtools.TestCase):
def _test_deploy(self, mock_ghc, mock_tu, mock_poll, mock_cj, poll=False):
mock_client = mock.Mock()
@ -283,13 +286,13 @@ class TestDeploy(testtools.TestCase):
template = {'foo': 'bar'}
mock_tu.get_template_contents.return_value = (
template_files, template
)
)
env_files = {'templates/resource_registry.yaml': {'bar': 'baz'},
'env.yaml': {'parameters': {}}}
env = {'parameters': {}}
mock_tu.process_multiple_environments_and_files.return_value = (
env_files, env
)
)
all_files = {}
all_files.update(template_files)
all_files.update(env_files)
@ -340,9 +343,11 @@ class TestDeploy(testtools.TestCase):
stacks[1].status = 'COMPLETE'
hclient.stacks.get.side_effect = stacks
deploy._poll_stack('foo', hclient)
self.assertEqual([mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)],
hclient.stacks.get.mock_calls)
self.assertEqual(
[
mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)
], hclient.stacks.get.mock_calls)
@mock.patch('time.sleep')
def test_poll_fail(self, mock_sleep):
@ -352,9 +357,11 @@ class TestDeploy(testtools.TestCase):
stacks[1].status = 'FAILED'
hclient.stacks.get.side_effect = stacks
self.assertRaises(RuntimeError, deploy._poll_stack, 'foo', hclient)
self.assertEqual([mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)],
hclient.stacks.get.mock_calls)
self.assertEqual(
[
mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)
], hclient.stacks.get.mock_calls)
@mock.patch('time.sleep')
def test_poll_retry(self, mock_sleep):
@ -364,10 +371,12 @@ class TestDeploy(testtools.TestCase):
stacks[2].status = 'COMPLETE'
hclient.stacks.get.side_effect = stacks
deploy._poll_stack('foo', hclient)
self.assertEqual([mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)],
hclient.stacks.get.mock_calls)
self.assertEqual(
[
mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False),
mock.call('foo', resolve_outputs=False)
], hclient.stacks.get.mock_calls)
@mock.patch('openstack_virtual_baremetal.deploy._write_role_file')
@mock.patch('openstack_virtual_baremetal.deploy._load_role_data')
@ -395,8 +404,9 @@ class TestDeploy(testtools.TestCase):
self.assertNotIn('OS::OVB::BaremetalNetworks',
output['resource_registry'])
# This should be the value set in the role env, not the base one
self.assertEqual('templates/baremetal-ports-all.yaml',
output['resource_registry']['OS::OVB::BaremetalPorts'])
self.assertEqual(
'templates/baremetal-ports-all.yaml',
output['resource_registry']['OS::OVB::BaremetalPorts'])
# This should be inherited from the base env
self.assertEqual('templates/bmc-port-port-security.yaml',
output['resource_registry']['OS::OVB::BMCPort'])

View File

@ -22,6 +22,7 @@ import testtools
from openstack_virtual_baremetal import openstackbmc
@mock.patch('openstack_virtual_baremetal.openstackbmc.OpenStackBmc.'
'log')
@mock.patch('pyghmi.ipmi.bmc.Bmc.__init__')
@ -120,6 +121,7 @@ class TestOpenStackBmcInitDeprecated(unittest.TestCase):
('foo-instance', 'abc-123'))],
mock_log.mock_calls)
@mock.patch('openstack_virtual_baremetal.openstackbmc.OpenStackBmc.'
'log')
@mock.patch('pyghmi.ipmi.bmc.Bmc.__init__')
@ -150,7 +152,8 @@ class TestOpenStackBmcInit(testtools.TestCase):
os_cloud=None
)
mock_make_client.assert_called_once_with('compute',
mock_make_client.assert_called_once_with(
'compute',
os_auth_url='http://keystone:5000',
os_password='password',
os_project_domain='',
@ -229,6 +232,7 @@ class TestOpenStackBmcInit(testtools.TestCase):
]
self.assertEqual(log_calls, mock_log.mock_calls)
@mock.patch('openstack_virtual_baremetal.openstackbmc.OpenStackBmc.'
'__init__', return_value=None)
@mock.patch('openstack_virtual_baremetal.openstackbmc.OpenStackBmc.'
@ -281,17 +285,16 @@ class TestOpenStackBmc(unittest.TestCase):
mock_server = mock.Mock()
self.mock_client.servers.get.side_effect = exceptions.NotFound('foo')
self.mock_client.servers.list.return_value = [mock_server, mock_server]
instance = self.bmc._find_instance('abc-123')
self.bmc._find_instance('abc-123')
mock_exit.assert_called_once_with(1)
@mock.patch('sys.exit')
def test_find_instance_not_found(self, mock_exit, mock_nova, mock_log,
mock_init):
self._create_bmc(mock_nova)
mock_server = mock.Mock()
self.mock_client.servers.get.side_effect = exceptions.NotFound('foo')
self.mock_client.servers.list.return_value = []
instance = self.bmc._find_instance('abc-123')
self.bmc._find_instance('abc-123')
mock_exit.assert_called_once_with(1)
def test_get_boot_device(self, mock_nova, mock_log, mock_init):