Fix tox pep8 errors and add parenthesis to print.
This commit is contained in:
parent
a3786bca16
commit
8dde4a4945
@ -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 = []
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -12,57 +12,64 @@
|
||||
# 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 +100,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 +139,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 +173,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 +189,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 +216,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 +236,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 +258,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 +282,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 +295,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 +328,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 +336,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)
|
||||
|
@ -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,
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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'])
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user