From b3c610b205f88dddb02cdac39638c52eafaaf82c Mon Sep 17 00:00:00 2001 From: Tim Rozet Date: Tue, 12 Sep 2017 17:32:56 -0400 Subject: Adds ability to deploy from upstream openstack To deploy with upstream openstack branch, use new deploy setting 'os_version'. A default scenario file for nosdn with pike has been included in this patch. If 'os_version' is a version other than the default version for this OPNFV release, then upstream is used. In order to use upstream with the current OS version use '--upstream' argument to the deploy command, to force an upstream deployment. Also include '-e upstream-environment.yaml' to use default upstream deployment settings. Supports nosdn and odl-nofeature deployments. Change-Id: Ic07e308827b449637b4e86cdd086434e4de2fb69 Signed-off-by: Tim Rozet --- apex/deploy.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 14 deletions(-) (limited to 'apex/deploy.py') diff --git a/apex/deploy.py b/apex/deploy.py index 4b1ef855..5485d150 100644 --- a/apex/deploy.py +++ b/apex/deploy.py @@ -25,11 +25,15 @@ from apex import DeploySettings from apex import Inventory from apex import NetworkEnvironment from apex import NetworkSettings +from apex.builders import common_builder as c_builder +from apex.builders import overcloud_builder as oc_builder +from apex.builders import undercloud_builder as uc_builder from apex.common import utils from apex.common import constants from apex.common import parsers from apex.common.exceptions import ApexDeployException from apex.network import jumphost +from apex.network import network_data from apex.undercloud import undercloud as uc_lib from apex.overcloud import config as oc_cfg from apex.overcloud import deploy as oc_deploy @@ -120,7 +124,8 @@ def create_deploy_parser(): deploy_parser.add_argument('-e', '--environment-file', dest='env_file', default='opnfv-environment.yaml', - help='Provide alternate base env file') + help='Provide alternate base env file located ' + 'in deploy_dir') deploy_parser.add_argument('-v', '--virtual', action='store_true', default=False, dest='virtual', @@ -172,6 +177,10 @@ def create_deploy_parser(): deploy_parser.add_argument('--quickstart', action='store_true', default=False, help='Use tripleo-quickstart to deploy') + deploy_parser.add_argument('--upstream', action='store_true', + default=False, + help='Force deployment to use upstream ' + 'artifacts') return deploy_parser @@ -233,8 +242,10 @@ def main(): net_settings = NetworkSettings(args.network_settings_file) logging.info("Network settings are:\n {}".format(pprint.pformat( net_settings))) + os_version = deploy_settings['deploy_options']['os_version'] net_env_file = os.path.join(args.deploy_dir, constants.NET_ENV_FILE) - net_env = NetworkEnvironment(net_settings, net_env_file) + net_env = NetworkEnvironment(net_settings, net_env_file, + os_version=os_version) net_env_target = os.path.join(APEX_TEMP_DIR, constants.NET_ENV_FILE) utils.dump_yaml(dict(net_env), net_env_target) ha_enabled = deploy_settings['global_params']['ha_enabled'] @@ -268,7 +279,7 @@ def main(): inventory = Inventory(args.inventory_file, ha_enabled, args.virtual) validate_cross_settings(deploy_settings, net_settings, inventory) - + ds_opts = deploy_settings['deploy_options'] if args.quickstart: deploy_settings_file = os.path.join(APEX_TEMP_DIR, 'apex_deploy_settings.yaml') @@ -312,7 +323,6 @@ def main(): 'members'][0] bridge = "br-{}".format(network) jumphost.attach_interface_to_ovs(bridge, iface, network) - # Dump all settings out to temp bash files to be sourced instackenv_json = os.path.join(APEX_TEMP_DIR, 'instackenv.json') with open(instackenv_json, 'w') as fh: json.dump(inventory, fh) @@ -322,10 +332,52 @@ def main(): root_pw = constants.DEBUG_OVERCLOUD_PW else: root_pw = None + + upstream = (os_version != constants.DEFAULT_OS_VERSION or + args.upstream) + if os_version == 'master': + branch = 'master' + else: + branch = "stable/{}".format(os_version) + if upstream: + logging.info("Deploying with upstream artifacts for OpenStack " + "{}".format(os_version)) + args.image_dir = os.path.join(args.image_dir, os_version) + upstream_url = constants.UPSTREAM_RDO.replace( + constants.DEFAULT_OS_VERSION, os_version) + upstream_targets = ['overcloud-full.tar', 'undercloud.qcow2'] + utils.fetch_upstream_and_unpack(args.image_dir, upstream_url, + upstream_targets) + sdn_image = os.path.join(args.image_dir, 'overcloud-full.qcow2') + if ds_opts['sdn_controller'] == 'opendaylight': + logging.info("Preparing upstream image with OpenDaylight") + oc_builder.inject_opendaylight( + odl_version=ds_opts['odl_version'], + image=sdn_image, + tmp_dir=APEX_TEMP_DIR + ) + # copy undercloud so we don't taint upstream fetch + uc_image = os.path.join(args.image_dir, 'undercloud_mod.qcow2') + uc_fetch_img = os.path.join(args.image_dir, 'undercloud.qcow2') + shutil.copyfile(uc_fetch_img, uc_image) + # prep undercloud with required packages + uc_builder.add_upstream_packages(uc_image) + # add patches from upstream to undercloud and overcloud + logging.info('Adding patches to undercloud') + patches = deploy_settings['global_params']['patches'] + c_builder.add_upstream_patches(patches['undercloud'], uc_image, + APEX_TEMP_DIR, branch) + logging.info('Adding patches to overcloud') + c_builder.add_upstream_patches(patches['overcloud'], sdn_image, + APEX_TEMP_DIR, branch) + else: + sdn_image = os.path.join(args.image_dir, SDN_IMAGE) + uc_image = 'undercloud.qcow2' undercloud = uc_lib.Undercloud(args.image_dir, args.deploy_dir, root_pw=root_pw, - external_network=uc_external) + external_network=uc_external, + image_name=os.path.basename(uc_image)) undercloud.start() # Generate nic templates @@ -340,15 +392,34 @@ def main(): # Prepare overcloud-full.qcow2 logging.info("Preparing Overcloud for deployment...") - sdn_image = os.path.join(args.image_dir, SDN_IMAGE) - oc_deploy.prep_image(deploy_settings, sdn_image, APEX_TEMP_DIR, - root_pw=root_pw) + if os_version != 'ocata': + net_data_file = os.path.join(APEX_TEMP_DIR, 'network_data.yaml') + net_data = network_data.create_network_data(net_settings, + net_data_file) + else: + net_data = False + if upstream and args.env_file == 'opnfv-environment.yaml': + # Override the env_file if it is defaulted to opnfv + # opnfv env file will not work with upstream + args.env_file = 'upstream-environment.yaml' opnfv_env = os.path.join(args.deploy_dir, args.env_file) - oc_deploy.prep_env(deploy_settings, net_settings, inventory, - opnfv_env, net_env_target, APEX_TEMP_DIR) - oc_deploy.create_deploy_cmd(deploy_settings, net_settings, - inventory, APEX_TEMP_DIR, - args.virtual, args.env_file) + if not upstream: + oc_deploy.prep_env(deploy_settings, net_settings, inventory, + opnfv_env, net_env_target, APEX_TEMP_DIR) + oc_deploy.prep_image(deploy_settings, sdn_image, APEX_TEMP_DIR, + root_pw=root_pw) + else: + shutil.copyfile(sdn_image, os.path.join(APEX_TEMP_DIR, + 'overcloud-full.qcow2')) + shutil.copyfile( + opnfv_env, + os.path.join(APEX_TEMP_DIR, os.path.basename(opnfv_env)) + ) + + oc_deploy.create_deploy_cmd(deploy_settings, net_settings, inventory, + APEX_TEMP_DIR, args.virtual, + os.path.basename(opnfv_env), + net_data=net_data) deploy_playbook = os.path.join(args.lib_dir, ANSIBLE_PATH, 'deploy_overcloud.yml') virt_env = 'virtual-environment.yaml' @@ -365,8 +436,11 @@ def main(): deploy_vars['aarch64'] = platform.machine() == 'aarch64' deploy_vars['dns_server_args'] = '' deploy_vars['apex_temp_dir'] = APEX_TEMP_DIR + deploy_vars['apex_env_file'] = os.path.basename(opnfv_env) deploy_vars['stackrc'] = 'source /home/stack/stackrc' deploy_vars['overcloudrc'] = 'source /home/stack/overcloudrc' + deploy_vars['upstream'] = upstream + deploy_vars['os_version'] = os_version for dns_server in net_settings['dns_servers']: deploy_vars['dns_server_args'] += " --dns-nameserver {}".format( dns_server) @@ -393,7 +467,6 @@ def main(): deploy_vars['external_network_cmds'] = \ oc_deploy.external_network_cmds(net_settings) # TODO(trozet): just parse all ds_opts as deploy vars one time - ds_opts = deploy_settings['deploy_options'] deploy_vars['gluon'] = ds_opts['gluon'] deploy_vars['sdn'] = ds_opts['sdn_controller'] for dep_option in 'yardstick', 'dovetail', 'vsperf': @@ -459,5 +532,7 @@ def main(): logging.info("Undercloud IP: {}, please connect by doing " "'opnfv-util undercloud'".format(undercloud.ip)) # TODO(trozet): add logging here showing controller VIP and horizon url + + if __name__ == '__main__': main() -- cgit 1.2.3-korg