def run(ceph_cluster, **kw): log.info("Running test") ceph_nodes = kw.get('ceph_nodes') log.info("Running ceph ansible test") config = kw.get('config') test_data = kw.get('test_data') prev_install_version = test_data['install_version'] skip_version_compare = config.get('skip_version_compare') containerized = config.get('ansi_config').get('containerized_deployment') build = config.get('build', config.get('rhbuild')) log.info("Build for upgrade: {build}".format(build=build)) ubuntu_repo = config.get('ubuntu_repo') hotfix_repo = config.get('hotfix_repo') base_url = config.get('base_url') installer_url = config.get('installer_url') config['ansi_config']['public_network'] = get_public_network(ceph_nodes[0]) ceph_cluster.ansible_config = config['ansi_config'] ceph_cluster.custom_config = test_data.get('custom-config') ceph_cluster.custom_config_file = test_data.get('custom-config-file') ceph_cluster.use_cdn = config.get('use_cdn') ceph_installer = ceph_cluster.get_ceph_object('installer') ansible_dir = '/usr/share/ceph-ansible' if config.get('skip_setup') is True: log.info("Skipping setup of ceph cluster") return 0 # set pre-upgrade install version test_data['install_version'] = build log.info("Previous install version: {}".format(prev_install_version)) # retrieve pre-upgrade versions and initialize container counts pre_upgrade_versions = get_ceph_versions(ceph_cluster.get_nodes(), containerized) pre_upgrade_container_counts = {} # setup packages based on build ceph_cluster.setup_packages(base_url, hotfix_repo, installer_url, ubuntu_repo, build) # backup existing hosts file and ansible config ceph_installer.exec_command( cmd='cp {}/hosts /tmp/hosts'.format(ansible_dir)) ceph_installer.exec_command( cmd='cp {}/group_vars/all.yml /tmp/all.yml'.format(ansible_dir)) # update ceph-ansible ceph_installer.install_ceph_ansible(build, upgrade=True) # restore hosts file ceph_installer.exec_command( sudo=True, cmd='cp /tmp/hosts {}/hosts'.format(ansible_dir)) # If upgrading from version 2 update hosts file with mgrs if prev_install_version.startswith('2') and build.startswith('3'): collocate_mons_with_mgrs(ceph_cluster, ansible_dir) # configure fetch directory path if config.get('ansi_config').get('fetch_directory') is None: config['ansi_config']['fetch_directory'] = '~/fetch/' # set the docker image tag if necessary if containerized and config.get('ansi_config').get( 'docker-insecure-registry'): config['ansi_config'][ 'ceph_docker_image_tag'] = get_latest_container_image_tag(build) log.info("gvar: {}".format(config.get('ansi_config'))) gvar = yaml.dump(config.get('ansi_config'), default_flow_style=False) # create all.yml log.info("global vars {}".format(gvar)) gvars_file = ceph_installer.write_file( sudo=True, file_name='{}/group_vars/all.yml'.format(ansible_dir), file_mode='w') gvars_file.write(gvar) gvars_file.flush() # retrieve container count if containerized if containerized: pre_upgrade_container_counts = get_container_counts(ceph_cluster) # configure insecure registry if necessary if config.get('docker-insecure-registry'): ceph_cluster.setup_insecure_registry() # copy rolling update from infrastructure playbook jewel_minor_update = build.startswith('2') if build.startswith('4'): cmd = 'cd {};' \ 'ANSIBLE_STDOUT_CALLBACK=debug;' \ 'ansible-playbook -e ireallymeanit=yes -vvvv -i'\ 'hosts infrastructure-playbooks/rolling_update.yml'.format(ansible_dir) else: ceph_installer.exec_command( sudo=True, cmd='cd {} ; cp infrastructure-playbooks/rolling_update.yml .'. format(ansible_dir)) cmd = 'cd {};' \ 'ANSIBLE_STDOUT_CALLBACK=debug;' \ 'ansible-playbook -e ireallymeanit=yes -vvvv -i hosts rolling_update.yml'.format(ansible_dir) if jewel_minor_update: cmd += " -e jewel_minor_update=true" log.info("Upgrade is jewel_minor_update, cmd: {cmd}".format(cmd=cmd)) out, rc = ceph_installer.exec_command(cmd=cmd, long_running=True) if rc != 0: log.error("Failed during upgrade (rc = {})".format(rc)) return rc # set build to new version log.info("Setting install_version to {build}".format(build=build)) test_data['install_version'] = build ceph_cluster.rhcs_version = build # check if all mon's and osd's are in correct state num_osds = ceph_cluster.ceph_demon_stat['osd'] num_mons = ceph_cluster.ceph_demon_stat['mon'] test_data['ceph-ansible'] = { 'num-osds': num_osds, 'num-mons': num_mons, 'rhbuild': build } # compare pre and post upgrade versions if skip_version_compare: log.warning("Skipping version comparison.") else: if not jewel_minor_update: post_upgrade_versions = get_ceph_versions(ceph_nodes, containerized) version_compare_fail = compare_ceph_versions( pre_upgrade_versions, post_upgrade_versions) if version_compare_fail: return version_compare_fail # compare pre and post upgrade container counts if containerized: post_upgrade_container_counts = get_container_counts(ceph_cluster) container_count_fail = compare_container_counts( pre_upgrade_container_counts, post_upgrade_container_counts, prev_install_version) if container_count_fail: return container_count_fail return ceph_cluster.check_health(build, timeout=config.get('timeout', 300))
def run(ceph_cluster, **kw): log.info("Running test") ceph_nodes = kw.get("ceph_nodes") log.info("Running ceph ansible test") config = kw.get("config") test_data = kw.get("test_data") prev_install_version = test_data["install_version"] skip_version_compare = config.get("skip_version_compare") containerized = config.get("ansi_config").get("containerized_deployment") build = config.get("build", config.get("rhbuild")) log.info("Build for upgrade: {build}".format(build=build)) cluster_name = config.get("ansi_config").get("cluster") ubuntu_repo = config.get("ubuntu_repo") hotfix_repo = config.get("hotfix_repo") cloud_type = config.get("cloud-type", "openstack") base_url = config.get("base_url") installer_url = config.get("installer_url") config["ansi_config"]["public_network"] = get_public_network(ceph_nodes[0]) ceph_cluster.ansible_config = config["ansi_config"] ceph_cluster.custom_config = test_data.get("custom-config") ceph_cluster.custom_config_file = test_data.get("custom-config-file") ceph_cluster.use_cdn = config.get("use_cdn") config["ansi_config"].update( set_container_info(ceph_cluster, config, ceph_cluster.use_cdn, containerized)) # Translate RGW node to ip address for Multisite rgw_pull_host = config["ansi_config"].get("rgw_pullhost") if rgw_pull_host: ceph_cluster.ansible_config["rgw_pullhost"] = translate_to_ip( kw["ceph_cluster_dict"], ceph_cluster.name, rgw_pull_host) ceph_installer = ceph_cluster.get_ceph_object("installer") ansible_dir = "/usr/share/ceph-ansible" if config.get("skip_setup") is True: log.info("Skipping setup of ceph cluster") return 0 # set pre-upgrade install version test_data["install_version"] = build log.info("Previous install version: {}".format(prev_install_version)) # retrieve pre-upgrade versions and initialize container counts pre_upgrade_versions = get_ceph_versions(ceph_cluster.get_nodes(), containerized) pre_upgrade_container_counts = {} # setup packages based on build ceph_cluster.setup_packages(base_url, hotfix_repo, installer_url, ubuntu_repo, build, cloud_type) # backup existing hosts file and ansible config ceph_installer.exec_command( cmd="cp {}/hosts /tmp/hosts".format(ansible_dir)) ceph_installer.exec_command( cmd="cp {}/group_vars/all.yml /tmp/all.yml".format(ansible_dir)) # update ceph-ansible ceph_installer.install_ceph_ansible(build, upgrade=True) # restore hosts file ceph_installer.exec_command( sudo=True, cmd="cp /tmp/hosts {}/hosts".format(ansible_dir)) # If upgrading from version 2 update hosts file with mgrs if prev_install_version.startswith("2") and build.startswith("3"): collocate_mons_with_mgrs(ceph_cluster, ansible_dir) # configure fetch directory path if config.get("ansi_config").get("fetch_directory") is None: config["ansi_config"]["fetch_directory"] = "~/fetch/" # set the docker image tag if necessary if containerized and config.get("ansi_config").get( "docker-insecure-registry"): config["ansi_config"][ "ceph_docker_image_tag"] = get_latest_container_image_tag(build) log.info("gvar: {}".format(config.get("ansi_config"))) gvar = yaml.dump(config.get("ansi_config"), default_flow_style=False) # create all.yml log.info("global vars {}".format(gvar)) gvars_file = ceph_installer.remote_file( sudo=True, file_name="{}/group_vars/all.yml".format(ansible_dir), file_mode="w") gvars_file.write(gvar) gvars_file.flush() # retrieve container count if containerized if containerized: pre_upgrade_container_counts = get_container_counts(ceph_cluster) # configure insecure registry if necessary if config.get("docker-insecure-registry"): ceph_cluster.setup_insecure_registry() # copy rolling update from infrastructure playbook jewel_minor_update = build.startswith("2") if build.startswith("4") or build.startswith("5"): cmd = ("cd {};" "ANSIBLE_STDOUT_CALLBACK=debug;" "ansible-playbook -e ireallymeanit=yes -vvvv -i " "hosts infrastructure-playbooks/rolling_update.yml".format( ansible_dir)) else: ceph_installer.exec_command( sudo=True, cmd="cd {} ; cp infrastructure-playbooks/rolling_update.yml .". format(ansible_dir), ) cmd = ( "cd {};" "ANSIBLE_STDOUT_CALLBACK=debug;" "ansible-playbook -e ireallymeanit=yes -vvvv -i hosts rolling_update.yml" .format(ansible_dir)) if jewel_minor_update: cmd += " -e jewel_minor_update=true" log.info("Upgrade is jewel_minor_update, cmd: {cmd}".format(cmd=cmd)) if config.get("ansi_cli_args"): cmd += config_dict_to_string(config["ansi_cli_args"]) out, rc = ceph_installer.exec_command(cmd=cmd, long_running=True) if rc != 0: log.error("Failed during upgrade (rc = {})".format(rc)) return rc # set build to new version log.info("Setting install_version to {build}".format(build=build)) test_data["install_version"] = build ceph_cluster.rhcs_version = build # check if all mon's and osd's are in correct state num_osds = ceph_cluster.ceph_demon_stat["osd"] num_mons = ceph_cluster.ceph_demon_stat["mon"] test_data["ceph-ansible"] = { "num-osds": num_osds, "num-mons": num_mons, "rhbuild": build, } # compare pre and post upgrade versions if skip_version_compare: log.warning("Skipping version comparison.") else: if not jewel_minor_update: post_upgrade_versions = get_ceph_versions(ceph_nodes, containerized) version_compare_fail = compare_ceph_versions( pre_upgrade_versions, post_upgrade_versions) if version_compare_fail: return version_compare_fail # compare pre and post upgrade container counts if containerized: post_upgrade_container_counts = get_container_counts(ceph_cluster) container_count_fail = compare_container_counts( pre_upgrade_container_counts, post_upgrade_container_counts, prev_install_version, ) if container_count_fail: return container_count_fail client = ceph_cluster.get_ceph_object("mon") if build.startswith("5"): cmd = ("cd {};" "ANSIBLE_STDOUT_CALLBACK=debug;" "ansible-playbook -e ireallymeanit=yes -vvvv -i " "hosts infrastructure-playbooks/cephadm-adopt.yml".format( ansible_dir)) out, rc = ceph_installer.exec_command(cmd=cmd, long_running=True) if rc != 0: log.error("Failed during cephadm adopt (rc = {})".format(rc)) return rc client = ceph_cluster.get_nodes("mon")[0] return ceph_cluster.check_health( build, cluster_name=cluster_name, client=client, timeout=config.get("timeout", 300), )