Adds ability to deploy from upstream openstack
[apex.git] / apex / deploy.py
index 4b1ef85..5485d15 100644 (file)
@@ -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()