def prepare_for_install(settings_dict, envs=None, verbose=None, proxy=None, key=None): envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': use_sudo_flag = True run_func = sudo else: use_sudo_flag = False run_func = run with settings(**settings_dict), hide(*verbose), shell_env(**envs): if exists("/etc/gai.conf"): append("/etc/gai.conf", "precedence ::ffff:0:0/96 100", use_sudo=use_sudo_flag) warn_if_fail(run_func("yum -y update")) warn_if_fail(run_func("yum -y install -y git python-pip vim ntpdate patch")) update_time(run_func) warn_if_fail(run_func("ssh-keygen -f ~/.ssh/id_rsa -t rsa -N ''")) warn_if_fail(run_func("cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys")) append("/etc/ssh/ssh_config", "\nStrictHostKeyChecking no\nUserKnownHostsFile=/dev/null", use_sudo=use_sudo_flag) #warn_if_fail(run_func("/bin/systemctl stop NetworkManager.service")) #warn_if_fail(run_func("/bin/systemctl disable NetworkManager.service")) append("~/.bashrc", "export TERM=xterm") if key: warn_if_fail(run_func("echo '%s' >> ~/.ssh/authorized_keys" % key)) return run_func("cat ~/.ssh/id_rsa.pub")
def write(text, path, filename, sudo): fd = StringIO(text) warn_if_fail(put(fd, os.path.join(path, filename), use_sudo=sudo)) warn_if_fail( put(fd, os.path.join(path, filename.replace("-", "_")), use_sudo=sudo))
def prepare_answers(path, topo, config): with NamedTemporaryFile() as temp: warn_if_fail(get(path, temp.name)) temp.flush() parser = SafeConfigParser() parser.optionxform = str parser.read(temp.name) parser.set("general", "CONFIG_PROVISION_DEMO", "y") parser.set("general", "CONFIG_PROVISION_TEMPEST", "y") parser.set("general", "CONFIG_PROVISION_TEMPEST_REPO_REVISION", "master") parser.set("general", "CONFIG_KEYSTONE_ADMIN_PW", "Cisco123") parser.set("general", "CONFIG_KEYSTONE_DEMO_PW", "secret") parser.set("general", "CONFIG_DEBUG_MODE", "y") parser.set("general", "CONFIG_NTP_SERVERS", "10.81.254.202,ntp.esl.cisco.com") parser.set("general", "CONFIG_NOVA_NETWORK_DEFAULTFLOATINGPOOL", "public") if topo == "2role": parser.set("general", "CONFIG_CONTROLLER_HOST", config['servers']['control-server'][0]['ip']) parser.set("general", "CONFIG_COMPUTE_HOSTS", config['servers']['compute-server'][0]['ip']) if topo == "3role": parser.set("general", "CONFIG_CONTROLLER_HOST", config['servers']['build-server'][0]['ip']) parser.set("general", "CONFIG_NETWORK_HOSTS", config['servers']['control-server'][0]['ip']) parser.set("general", "CONFIG_COMPUTE_HOSTS", config['servers']['compute-server'][0]['ip']) with open("installed_answers", "w") as f: parser.write(f) warn_if_fail(put("installed_answers", "~/installed_answers"))
def make_local(filepath, sudo_flag, opts): ipversion = "4+6" if opts.ipversion == 64 else str(opts.ipversion) mgmt = "4+6" if opts.mgmt == 64 else str(opts.mgmt) tempest = "" if opts.tempest_disbale else """ enable_service tempest TEMPEST_REPO={repo} TEMPEST_BRANCH={branch}""".format(repo=opts.repo, branch=opts.branch) conf = """[[local|localrc]] ADMIN_PASSWORD=Cisco123 DATABASE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=1112f596-76f3-11e3-b3b2-e716f9080d50 MYSQL_PASSWORD=nova ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit enable_service mysql disable_service n-net enable_service q-svc enable_service q-agt enable_service q-l3 enable_service q-dhcp enable_service q-meta enable_service q-lbaas enable_service neutron {tempest} NOVA_USE_NEUTRON_API=v2 VOLUME_BACKING_FILE_SIZE=2052M API_RATE_LIMIT=False VERBOSE=True DEBUG=True LOGFILE=/tmp/stack.sh.log USE_SCREEN=True SCREEN_LOGDIR=/opt/stack/logs IP_VERSION={ipversion} MGMT_NET={mgmt} IPV6_PRIVATE_RANGE=2001:dead:beef:deed::/64 IPV6_PRIVATE_NETWORK_GATEWAY=2001:dead:beef:deed::1 REMOVE_PUBLIC_BRIDGE=False RECLONE=True #OFFLINE=True """.format(ipversion=ipversion, mgmt=mgmt, tempest=tempest) fd = StringIO(conf) warn_if_fail(put(fd, filepath, use_sudo=sudo_flag))
def make_local(filepath, sudo_flag, opts): ipversion = "4+6" if opts.ipversion == 64 else str(opts.ipversion) mgmt = "4+6" if opts.mgmt == 64 else str(opts.mgmt) tempest = "" if opts.tempest_disbale else """ enable_service tempest TEMPEST_REPO={repo} TEMPEST_BRANCH={branch}""".format(repo=opts.repo, branch=opts.branch) conf = """[[local|localrc]] ADMIN_PASSWORD=Cisco123 DATABASE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD SERVICE_TOKEN=1112f596-76f3-11e3-b3b2-e716f9080d50 MYSQL_PASSWORD=nova ENABLED_SERVICES=g-api,g-reg,key,n-api,n-crt,n-obj,n-cpu,n-cond,cinder,c-sch,c-api,c-vol,n-sch,n-novnc,n-xvnc,n-cauth,horizon,rabbit enable_service mysql disable_service n-net enable_service q-svc enable_service q-agt enable_service q-l3 enable_service q-dhcp enable_service q-meta enable_service q-lbaas enable_service neutron {tempest} NOVA_USE_NEUTRON_API=v2 VOLUME_BACKING_FILE_SIZE=2052M API_RATE_LIMIT=False VERBOSE=True DEBUG=True LOGFILE=/tmp/stack.sh.log USE_SCREEN=True SCREEN_LOGDIR=/opt/stack/logs IP_VERSION={ipversion} MGMT_NET={mgmt} IPV6_PRIVATE_RANGE=2001:dead:beef:deed::/64 IPV6_NETWORK_GATEWAY=2001:dead:beef:deed::1 REMOVE_PUBLIC_BRIDGE=False RECLONE=True #OFFLINE=True """.format(ipversion=ipversion, mgmt=mgmt, tempest=tempest) fd = StringIO(conf) warn_if_fail(put(fd, filepath, use_sudo=sudo_flag))
def run_services(host, settings_dict, envs=None, verbose=None, config=None): """ Install OS with COI on other servers :param host: configuration of current lab box :param settings_dict: settings dictionary for Fabric :param envs: environment variables to inject when executing job :param verbose: if to hide all output or print everything :param config: configurations of all boxes for /etc/hosts """ envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': run_func = sudo use_sudo_flag = True else: run_func = run use_sudo_flag = False print >> sys.stderr, "FABRIC connecting to", settings_dict[ "host_string"], host["hostname"] with settings(**settings_dict), hide(*verbose), shell_env(**envs): with cd("/root/"): update_time(run_func) run_func("apt-get update") run_func('DEBIAN_FRONTEND=noninteractive apt-get -y ' '-o Dpkg::Options::="--force-confdef" -o ' 'Dpkg::Options::="--force-confold" dist-upgrade') # prepare /etc/hosts if config: append("/etc/hosts", prepare_hosts(config)) run_func("apt-get install -y git") run_func( "git clone -b icehouse https://github.com/CiscoSystems/puppet_openstack_builder" ) # use latest, not i.0 release #with cd("/root/puppet_openstack_builder"): # run_func('git checkout i.0') sed("/root/puppet_openstack_builder/install-scripts/cisco.install.sh", "icehouse/snapshots/i.0", "icehouse-proposed", use_sudo=use_sudo_flag) sed("/root/puppet_openstack_builder/data/hiera_data/vendor/cisco_coi_common.yaml", "/snapshots/i.0", "-proposed", use_sudo=use_sudo_flag) with cd("/root/puppet_openstack_builder/install-scripts"): warn_if_fail(run_func("./setup.sh")) warn_if_fail(run_func('puppet agent --enable')) warn_if_fail( run_func( "puppet agent -td --server=build-server.domain.name --pluginsync" )) collect_logs(run_func=run_func, hostname=host["hostname"])
def install_devstack(settings_dict, envs=None, verbose=None, proxy=None, topo=None, config=None): envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': use_sudo_flag = True run_func = sudo else: use_sudo_flag = False run_func = run with settings(**settings_dict), hide(*verbose), shell_env(**envs): warn_if_fail(run_func("yum install -y http://rdo.fedorapeople.org/rdo-release.rpm")) warn_if_fail(run_func("yum install -y openstack-packstack")) warn_if_fail(run_func("packstack --gen-answer-file=~/answers.txt")) prepare_answers("~/answers.txt", topo=topo, config=config) # Workaround for Centos 7 if contains("/etc/redhat-release", "CentOS Linux release 7"): patch = os.path.join(os.path.dirname(__file__), "centos7.patch") warn_if_fail(put(patch, "~/centos7.patch")) with cd("/usr/share/openstack-puppet"): run_func("patch -p1 < ~/centos7.patch") run_func("packstack --answer-file=~/installed_answers") run_func("iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited") if exists('~/keystonerc_admin'): get('~/keystonerc_admin', "./openrc") else: print (red("No openrc file, something went wrong! :(")) if exists('~/keystonerc_demo'): get('~/keystonerc_demo', "./openrc_demo") if exists('~/packstack-answers-*'): get('~/packstack-answers-*', ".") collect_logs(run_func=run_func, hostname='build_box', clean=True) print (green("Finished!")) return True
def run_services(host, settings_dict, envs=None, verbose=None, config=None): """ Install OS with COI on other servers :param host: configuration of current lab box :param settings_dict: settings dictionary for Fabric :param envs: environment variables to inject when executing job :param verbose: if to hide all output or print everything :param config: configurations of all boxes for /etc/hosts """ envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': run_func = sudo use_sudo_flag = True else: run_func = run use_sudo_flag = False print >> sys.stderr, "FABRIC connecting to", settings_dict["host_string"], host["hostname"] with settings(**settings_dict), hide(*verbose), shell_env(**envs): with cd("/root/"): update_time(run_func) run_func("apt-get update") run_func('DEBIAN_FRONTEND=noninteractive apt-get -y ' '-o Dpkg::Options::="--force-confdef" -o ' 'Dpkg::Options::="--force-confold" dist-upgrade') # prepare /etc/hosts if config: append("/etc/hosts", prepare_hosts(config)) run_func("apt-get install -y git") run_func("git clone -b icehouse https://github.com/CiscoSystems/puppet_openstack_builder") # use latest, not i.0 release #with cd("/root/puppet_openstack_builder"): # run_func('git checkout i.0') sed("/root/puppet_openstack_builder/install-scripts/cisco.install.sh", "icehouse/snapshots/i.0", "icehouse-proposed", use_sudo=use_sudo_flag) sed("/root/puppet_openstack_builder/data/hiera_data/vendor/cisco_coi_common.yaml", "/snapshots/i.0", "-proposed", use_sudo=use_sudo_flag) with cd("/root/puppet_openstack_builder/install-scripts"): warn_if_fail(run_func("./setup.sh")) warn_if_fail(run_func('puppet agent --enable')) warn_if_fail(run_func("puppet agent -td --server=build-server.domain.name --pluginsync")) collect_logs(run_func=run_func, hostname=host["hostname"])
def write(text, path, filename, sudo): fd = StringIO(text) warn_if_fail(put(fd, os.path.join(path, filename), use_sudo=sudo)) warn_if_fail(put(fd, os.path.join(path, filename.replace("-", "_")), use_sudo=sudo))
def install_devstack(settings_dict, envs=None, verbose=None, proxy=None, patch=False, opts=None): envs = envs or {} verbose = verbose or [] with settings(**settings_dict), hide(*verbose), shell_env(**envs): if exists("/etc/gai.conf"): append("/etc/gai.conf", "precedence ::ffff:0:0/96 100", use_sudo=True) if proxy: warn_if_fail(put(StringIO('Acquire::http::proxy "http://proxy.esl.cisco.com:8080/";'), "/etc/apt/apt.conf.d/00proxy", use_sudo=True)) warn_if_fail(put(StringIO('Acquire::http::Pipeline-Depth "0";'), "/etc/apt/apt.conf.d/00no_pipelining", use_sudo=True)) update_time(sudo) if opts.ipversion != 4: sudo("/sbin/sysctl -w net.ipv6.conf.all.forwarding=1") append("/etc/sysctl.conf", "net.ipv6.conf.all.forwarding=1", use_sudo=True) warn_if_fail(sudo("apt-get update")) warn_if_fail(sudo("apt-get install -y git python-pip")) warn_if_fail(run("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'")) run("rm -rf ~/devstack") quit_if_fail(run("git clone https://github.com/openstack-dev/devstack.git")) make_local("devstack/local.conf", sudo_flag=False, opts=opts) with cd("devstack"): warn_if_fail(run("./stack.sh")) if patch: apply_changes() if exists('~/devstack/openrc'): get('~/devstack/openrc', "./openrc") else: print (red("No openrc file, something went wrong! :(")) if exists('/opt/stack/tempest/etc/tempest.conf'): get('/opt/stack/tempest/etc/tempest.conf', "./tempest.conf") else: print (red("No openrc file, something went wrong! :(")) print (green("Finished!")) return True
def install(aggregated_configs, apt_cacher_proxy=None, patch="", proxy="", devstack_repo="", devstack_br="", quiet=False): verbose = [] fab_settings = aggregated_configs[env.host]["fab_settings"] local_conf = aggregated_configs[env.host]["devstack_config"] config_files = aggregated_configs[env.host]["config_files"] hostname = aggregated_configs[env.host]["hostname"] exec_command_before = aggregated_configs[env.host]["exec_commands_before"] exec_command_after = aggregated_configs[env.host]["exec_commands_after"] if quiet: verbose = ['output', 'running', 'warnings'] with settings(**fab_settings), hide(*verbose): if exists("/etc/gai.conf"): append("/etc/gai.conf", "precedence ::ffff:0:0/96 100", use_sudo=True) if proxy: warn_if_fail(put(StringIO( 'Acquire::http::proxy "http://proxy.esl.cisco.com:8080/";'), "/etc/apt/apt.conf.d/00proxy", use_sudo=True)) warn_if_fail(put(StringIO('Acquire::http::Pipeline-Depth "0";'), "/etc/apt/apt.conf.d/00no_pipelining", use_sudo=True)) if apt_cacher_proxy: warn_if_fail( put(StringIO('Acquire::http { Proxy "{url}"; };'.format( url=apt_cacher_proxy)), "/etc/apt/apt.conf.d/02proxy", use_sudo=True)) update_time(sudo) warn_if_fail(sudo("apt-get update")) warn_if_fail(sudo("apt-get install -y git python-pip")) warn_if_fail( run("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'")) if exists("devstack"): with cd("devstack"): warn_if_fail(run("./unstack.sh")) run("rm -rf ~/devstack") quit_if_fail(run( "git clone -b {branch} {devstack}".format(devstack=devstack_repo, branch=devstack_br))) if patch: with cd("devstack"): warn_if_fail( run( "git fetch https://review.openstack.org/openstack-dev/devstack {patch} " "&& git cherry-pick FETCH_HEAD".format(patch=patch))) warn_if_fail(put(StringIO(local_conf), "devstack/local.conf")) if exec_command_before: run(exec_command_before) if config_files: for path, conf_file in config_files.iteritems(): warn_if_fail(put(StringIO(conf_file), path)) with cd("devstack"): warn_if_fail(run("./stack.sh")) path = os.environ.get("WORKSPACE", os.getcwd()) if os.path.exists( "{path}/id_rsa_{key}".format(path=path, key=hostname)): path = os.environ.get("WORKSPACE", os.getcwd()) put("{path}/id_rsa_{key}".format(path=path, key=hostname), "~/.ssh/id_rsa") put("{path}/id_rsa_{key}.pub".format(path=path, key=hostname), "~/.ssh/id_rsa.pub") put("{0}/id_rsa_all.pub".format(path), "/tmp/all_authorized") warn_if_fail(run("chmod 500 ~/.ssh/id_rsa")) warn_if_fail( run("cat /tmp/all_authorized >> ~/.ssh/authorized_keys")) append("/etc/ssh/ssh_config", "\nStrictHostKeyChecking no\nUserKnownHostsFile=/dev/null", use_sudo=True) if exec_command_after: run(exec_command_after) collect_logs(run, hostname) collect_logs_devstack("install_{host}".format(host=hostname))
def apply_patches(): warn_if_fail(run("git fetch https://review.openstack.org/openstack-dev/devstack " "refs/changes/87/87987/12 && git format-patch -1 FETCH_HEAD"))
def prepare(host, topo_config_file, devstack_config_file, apt_cacher_proxy, ssh_key_file, gateway, user, password, branch, repo, tempest_disable, devstack_repo, devstack_br, patch, quiet): fab_settings = {"host_string": None, "abort_on_prompts": True, "gateway": gateway, "user": user, "password": password, "warn_only": True} tempest = "" if tempest_disable else TEMPEST_CONF.format(repo=repo, branch=branch) extras = os.environ.get("QA_DEVSTACK_EXTRAS", "") local_ssh_key_file = os.path.join(os.path.dirname(__file__), "..", "libvirt-scripts", "id_rsa") fab_settings.update({"key_filename": ssh_key_file or local_ssh_key_file}) devstack_config = yaml.load(devstack_config_file) with open(os.path.join(DEV_CONF_PATH, "devstack_template.yaml")) as f: devstack_template = yaml.load(f) if host: fab_settings.update({"host_string": host}) topo_config = { 'servers': { 'devstack-server': [{"ip": host, "hostname": "devstack-server00"}]}} else: topo_config = yaml.load(topo_config_file) # Generate ssh-keys for new nodes with settings(warn_only=True, abort_on_prompts=True): path = os.environ.get("WORKSPACE", os.getcwd()) warn_if_fail(local("rm {0}/id_rsa_*".format(path))) keys = len(topo_config['servers']['devstack-server']) or 1 for i in range(keys): local("ssh-keygen -f {path}/id_rsa_{i} -t rsa -N ''".format(path=path, i=topo_config['servers']['devstack-server'][i]['hostname'])) local("cat {path}/id_rsa_{i}.pub >> {path}/id_rsa_all.pub".format( path=path, i=topo_config['servers']['devstack-server'][i]['hostname'])) # Install control node first control_node = topo_config['servers']['devstack-server'][0] fab_settings["host_string"] = control_node["ip"] node_devstack_config = devstack_config["servers"][0]["local_conf"].format( control_node_ip=control_node["ip"], node_ip=control_node["ip"], tempest=tempest) devstack_full_config = devstack_template["TEMPLATE"].format( host_specific=node_devstack_config, extras=extras) config_files = devstack_config["servers"][0].get("files", None) exec_commands_before = devstack_config["servers"][0].get("commands_before") exec_commands_after = devstack_config["servers"][0].get("commands_after") node_configs = {control_node["ip"]: { "fab_settings": fab_settings, "devstack_config": devstack_full_config, "hostname": control_node["hostname"], "config_files": config_files, "exec_commands_before": exec_commands_before, "exec_commands_after": exec_commands_after }} execute(install, aggregated_configs=node_configs, apt_cacher_proxy=apt_cacher_proxy, patch=patch, devstack_repo=devstack_repo, devstack_br=devstack_br, quiet=quiet, hosts=control_node["ip"]) # Install other nodes in parallel if len(topo_config["servers"]["devstack-server"]) > 1: nodes = [] node_configs = {} for node, conf in zip(topo_config['servers']['devstack-server'][1:], devstack_config["servers"][1:]): fab_settings["host_string"] = node["ip"] node_devstack_config = conf["local_conf"].format( control_node_ip=control_node["ip"], node_ip=node['ip'], tempest=tempest) devstack_full_config = devstack_template["TEMPLATE"].format( host_specific=node_devstack_config, extras=extras) config_files = conf.get("files", None) exec_commands_before = conf.get("commands_before") exec_commands_after = conf.get("commands_after") nodes.append(node["ip"]) node_configs[node["ip"]] = {"fab_settings": fab_settings, "hostname": node["hostname"], "devstack_config": devstack_full_config, "config_files": config_files, "exec_commands_before": exec_commands_before, "exec_commands_after": exec_commands_after} execute(install, aggregated_configs=node_configs, apt_cacher_proxy=apt_cacher_proxy, patch=patch, devstack_repo=devstack_repo, devstack_br=devstack_br, quiet=quiet, hosts=nodes)
def apply_changes(): warn_if_fail(run("./unstack.sh")) kill_services() apply_patches() warn_if_fail(run("./stack.sh"))
def prepare_files(config, paths, use_sudo_flag): def prepare_fullha(config, ha_file): """ Prepare user.full_ha.file """ conf = yaml.load(ha_file) net_ip = ".".join( (config['servers']['control-server'][0]['ip'].split(".")[:3])) vipc = net_ip + ".253" conf["coe::base::controller_hostname"] = "control-server" conf["horizon::keystone_url"] = change_ip_to( conf["horizon::keystone_url"], vipc) conf["controller_names"] = [ c["hostname"] for c in config['servers']['control-server'] ] conf["openstack-ha::load-balancer::controller_ipaddresses"] = [ c["ip"] for c in config['servers']['control-server'] ] conf["openstack-ha::load-balancer::swift_proxy_ipaddresses"] = [ c["ip"] for c in config['servers']['swift-proxy'] ] conf["openstack-ha::load-balancer::swift_proxy_names"] = [ c["hostname"] for c in config['servers']['swift-proxy'] ] vipsw = net_ip + ".252" conf[ "openstack::swift::proxy::swift_proxy_net_ip"] = "%{ipaddress_eth1}" conf["openstack::swift::proxy::swift_memcache_servers"] = [ i["ip"] + ":11211" for i in config['servers']['swift-proxy'] ] conf["nova::memcached_servers"] = [ i["ip"] + ":11211" for i in config['servers']['control-server'] ] conf["rabbit_hosts"] = [ i["hostname"] + ":5672" for i in config['servers']['control-server'] ] conf["galera::galera_servers"] = [ c["ip"] for c in config['servers']['control-server'] ] conf["galera::galera_master"] = config['servers']['control-server'][0][ "hostname"] + "." + DOMAIN_NAME conf["galera_master_name"] = config['servers']['control-server'][0][ "hostname"] conf["galera_master_ipaddress"] = config['servers']['control-server'][ 0]["ip"] conf["galera_backup_names"] = [ i["hostname"] for i in config['servers']['control-server'][1:] ] conf["galera_backup_ipaddresses"] = [ i["ip"] for i in config['servers']['control-server'][1:] ] conf["openstack::swift::storage-node::storage_devices"] = [ "vdb", "vdc", "vdd" ] return dump(conf) def prepare_common(config, common_file): """ Prepare user.common.file """ conf = yaml.load(common_file) net_ip = ".".join( (config['servers']['control-server'][0]['ip'].split(".")[:3])) vipc = net_ip + ".253" conf["controller_public_address"] = vipc conf["controller_admin_address"] = vipc conf["controller_internal_address"] = vipc conf["coe::base::controller_hostname"] = "control-server" conf["domain_name"] = "domain.name" conf["ntp_servers"] = ["ntp.esl.cisco.com"] conf["external_interface"] = "eth4" conf[ "nova::compute::vncserver_proxyclient_address"] = "%{ipaddress_eth0}" conf["build_node_name"] = "build-server" conf["controller_public_url"] = change_ip_to( conf["controller_public_url"], vipc) conf["controller_admin_url"] = change_ip_to( conf["controller_admin_url"], vipc) conf["controller_internal_url"] = change_ip_to( conf["controller_internal_url"], vipc) conf["cobbler_node_ip"] = config['servers']['build-server'][0]['ip'] conf["node_subnet"] = ".".join( conf["cobbler_node_ip"].split(".")[:3]) + ".0" conf["node_gateway"] = ".".join( conf["cobbler_node_ip"].split(".")[:3]) + ".1" vipsw = ".".join( (config['servers']['control-server'][0]['ip'].split(".")[:3] )) + ".252" conf["swift_internal_address"] = vipsw conf["swift_public_address"] = vipsw conf["swift_admin_address"] = vipsw conf["swift_proxy_net_ip"] = "%{ipaddress_eth0}" conf['mysql::server::override_options']['mysqld'][ 'bind-address'] = "0.0.0.0" # config['servers']['control-server'][0]['ip'] conf['swift_storage_interface'] = "eth0" conf['swift_local_net_ip'] = "%{ipaddress_eth0}" conf['internal_ip'] = "%{ipaddress_eth0}" conf['public_interface'] = "eth0" conf['private_interface'] = "eth0" conf['install_drive'] = "/dev/vda" conf['mon_initial_members'] = config['servers']['control-server'][0][ "hostname"] conf['ceph_primary_mon'] = config['servers']['control-server'][0][ "hostname"] conf['ceph_monitor_address'] = config['servers']['control-server'][0][ "ip"] conf['ceph_cluster_interface'] = "eth0" conf['ceph_cluster_network'] = net_ip + ".0/24" conf['ceph_public_interface'] = "eth0" conf['ceph_public_network'] = net_ip + ".0/24" return dump(conf) def prepare_cobbler(config, cob_file): """ Prepare cobbler.yaml.file """ new_conf = {} name = "trusty" with open(os.path.join(CONFIG_PATH, "cobbler.yaml")) as f: text_cobbler = f.read() text_cobbler = text_cobbler.format( int_ipadd="{$eth0_ip-address}", ip_gateway=".".join( (config['servers']['build-server'][0]["ip"].split(".")[:3])) + ".1", ip_dns=".".join( (config['servers']['build-server'][0]["ip"].split(".")[:3])) + ".1") servers = config['servers']['control-server'] + \ config["servers"]["compute-server"] + \ config["servers"]["swift-storage"] + \ config["servers"]["swift-proxy"] + \ config["servers"]["load-balancer"] for c in servers: new_conf[c['hostname']] = { "hostname": c['hostname'] + "." + DOMAIN_NAME, "power_address": c["ip"], "profile": "%s-x86_64" % name, "interfaces": { "eth0": { "mac-address": c["mac"], "dns-name": c['hostname'] + "." + DOMAIN_NAME, "ip-address": c["ip"], "static": "0" } } } return text_cobbler + "\n" + yaml.dump(new_conf) def prepare_role(config, role_file): """ Prepare role_mappings file """ roles = {config["servers"]["build-server"][0]["hostname"]: "build"} for c in config["servers"]["control-server"]: roles[c["hostname"]] = "controller" for c in config["servers"]["compute-server"]: roles[c["hostname"]] = "compute" for c in config["servers"]["swift-storage"]: roles[c["hostname"]] = "swift_storage" for c in config["servers"]["swift-proxy"]: roles[c["hostname"]] = "swift_proxy" for c in config["servers"]["load-balancer"]: roles[c["hostname"]] = "load_balancer" return dump(roles) def prepare_build(config, build_file): return build_file map = { "user.common.yaml": prepare_common, "user.full_ha.yaml": prepare_fullha, "role_mappings.yaml": prepare_role, "cobbler.yaml": prepare_cobbler, "build_server.yaml": prepare_build } for path in paths: fd = StringIO() warn_if_fail(get(path, fd)) old_file = fd.getvalue() file_name = os.path.basename(path) print " >>>> FABRIC OLD %s\n" % file_name, old_file new_file = map[file_name](config, old_file) print " >>>> FABRIC NEW %s\n" % file_name, new_file warn_if_fail(put(StringIO(new_file), path, use_sudo=use_sudo_flag))
def install_devstack(fab_settings, string_descriptor, hostname, download_conf=False, ipversion="4", patch="", proxy="", quiet=False): verbose = [] if quiet: verbose = ['output', 'running', 'warnings'] with settings(**fab_settings), hide(*verbose): if exists("/etc/gai.conf"): append("/etc/gai.conf", "precedence ::ffff:0:0/96 100", use_sudo=True) if proxy: warn_if_fail(put(StringIO('Acquire::http::proxy "http://proxy.esl.cisco.com:8080/";'), "/etc/apt/apt.conf.d/00proxy", use_sudo=True)) warn_if_fail(put(StringIO('Acquire::http::Pipeline-Depth "0";'), "/etc/apt/apt.conf.d/00no_pipelining", use_sudo=True)) update_time(sudo) if ipversion != "4": sudo("/sbin/sysctl -w net.ipv6.conf.all.forwarding=1") append("/etc/sysctl.conf", "net.ipv6.conf.all.forwarding=1", use_sudo=True) warn_if_fail(sudo("apt-get update")) warn_if_fail(sudo("apt-get install -y git python-pip")) warn_if_fail(run("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'")) run("rm -rf ~/devstack") quit_if_fail(run("git clone https://github.com/openstack-dev/devstack.git")) if patch: warn_if_fail(run("git fetch https://review.openstack.org/openstack-dev/devstack {patch} " "&& git cherry-pick FETCH_HEAD".format(patch))) warn_if_fail(put(string_descriptor, "devstack/local.conf", use_sudo=False)) with cd("devstack"): warn_if_fail(run("./stack.sh")) if download_conf: get('~/devstack/openrc', "./openrc") get('/opt/stack/tempest/etc/tempest.conf', "./tempest.conf") collect_logs(run, hostname)
def install_openstack(settings_dict, envs=None, verbose=None, url_script=None, prepare=False, force=False): """ Install OS with COI with script provided by Chris on any host(s) :param settings_dict: settings dictionary for Fabric :param envs: environment variables to inject when executing job :param verbose: if to hide all output or print everything :param url_script: URl of Cisco installer script from Chris :param force: Use if you don't connect via interface you gonna bridge later :return: always true """ envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': use_sudo_flag = True run_func = sudo else: use_sudo_flag = False run_func = run with settings(**settings_dict), hide(*verbose), shell_env(**envs): # TODO: check statuses of commands with cd("/root/"): warn_if_fail(run_func("apt-get update")) ## avoid grub and other prompts warn_if_fail(run_func('DEBIAN_FRONTEND=noninteractive apt-get -y ' '-o Dpkg::Options::="--force-confdef" -o ' 'Dpkg::Options::="--force-confold" dist-upgrade')) warn_if_fail(run_func("apt-get install -y git")) warn_if_fail(run_func("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'")) warn_if_fail(sed("/etc/hosts", "127.0.1.1.*", "127.0.1.1 all-in-one all-in-one.domain.name", use_sudo=use_sudo_flag)) warn_if_fail(put(StringIO("all-in-one"), "/etc/hostname", use_sudo=use_sudo_flag)) warn_if_fail(run_func("hostname all-in-one")) if use_sudo_flag: append("/etc/sudoers", "{user} ALL=(ALL) NOPASSWD: ALL".format(user=settings_dict['user']), use_sudo=True) warn_if_fail(run_func("git clone -b icehouse " "https://github.com/CiscoSystems/puppet_openstack_builder")) if not force and not prepare: with cd("puppet_openstack_builder"): ## run the latest, not i.0 release sed("/root/puppet_openstack_builder/install-scripts/cisco.install.sh", "icehouse/snapshots/i.0", "icehouse-proposed", use_sudo=use_sudo_flag) sed("/root/puppet_openstack_builder/data/hiera_data/vendor/cisco_coi_common.yaml", "/snapshots/i.0", "-proposed", use_sudo=use_sudo_flag) with cd("install-scripts"): run_func("./install.sh") result = run_func('puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries = 1 error = "Error:" while error in result and tries <= APPLY_LIMIT: time.sleep(60) print >> sys.stderr, "Some errors found, running apply again" result = run_func('puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries += 1 if exists('/root/openrc'): get('/root/openrc', "./openrc") else: print (red("No openrc file, something went wrong! :(")) print (green("Copying logs and configs")) collect_logs(run_func=run_func, hostname="aio", clean=True) print (green("Finished!")) return True if force and not prepare: shell_envs = ";".join(["export " + k + "=" + v for k, v in envs.iteritems()]) or "" sudo_mode = "sudo " if use_sudo_flag else '' if not settings_dict['gateway']: local("{shell_envs}; ssh -t -t -i {id_rsa} {user}@{host} \ '/bin/bash /root/install_icehouse_cisco.sh'".format( shell_envs=shell_envs, id_rsa=settings_dict['key_filename'], user=settings_dict['user'], host=settings_dict['host_string'])) local("scp -i {id_rsa} {user}@{host}:/root/openrc ./openrc".format( id_rsa=settings_dict['key_filename'], user=settings_dict['user'], host=settings_dict['host_string'])) else: local('ssh -t -t -i {id_rsa} {user}@{gateway} \ "{shell_envs}; ssh -t -t -i {id_rsa} {user}@{host} \ \'{sudo_mode}/bin/bash /root/install_icehouse_cisco.sh\'"'.format( shell_envs=shell_envs, id_rsa=settings_dict['key_filename'], user=settings_dict['user'], host=settings_dict['host_string'], gateway=settings_dict['gateway'], sudo_mode=sudo_mode)) local('scp -Cp -o "ProxyCommand ssh {user}@{gateway} ' 'nc {host} 22" root@{host}:/root/openrc ./openrc'.format( user=settings_dict['user'], host=settings_dict['host_string'], gateway=settings_dict['gateway'], )) print (green("Finished!")) return True
def install_openstack(settings_dict, envs=None, verbose=None, url_script=None, prepare=False, force=False, config=None, use_cobbler=False, proxy=None): """ Install OS with COI on build server :param settings_dict: settings dictionary for Fabric :param envs: environment variables to inject when executing job :param verbose: if to hide all output or print everything :param url_script: URl of Cisco installer script from Chris :param force: Use if you don't connect via interface you gonna bridge later :return: always true """ envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': use_sudo_flag = True run_func = sudo else: use_sudo_flag = False run_func = run with settings(**settings_dict), hide(*verbose), shell_env(**envs): with cd("/root/"): if proxy: warn_if_fail( put(StringIO( 'Acquire::http::proxy "http://proxy.esl.cisco.com:8080/";' ), "/etc/apt/apt.conf.d/00proxy", use_sudo=use_sudo_flag)) warn_if_fail( put(StringIO('Acquire::http::Pipeline-Depth "0";'), "/etc/apt/apt.conf.d/00no_pipelining", use_sudo=use_sudo_flag)) run_func("apt-get update") run_func("apt-get install -y git") run_func("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'") if not force and not prepare: update_time(run_func) # avoid grub and other prompts warn_if_fail( run_func('DEBIAN_FRONTEND=noninteractive apt-get -y ' '-o Dpkg::Options::="--force-confdef" -o ' 'Dpkg::Options::="--force-confold" dist-upgrade')) # prepare /etc/hosts file append("/etc/hosts", prepare_hosts(config)) with cd("/root"): warn_if_fail( run_func( "git clone -b icehouse " "https://github.com/CiscoSystems/puppet_openstack_builder" )) with cd("puppet_openstack_builder"): ## run the latest, not i.0 release #run_func('git checkout i.0') sed("/root/puppet_openstack_builder/install-scripts/cisco.install.sh", "icehouse/snapshots/i.0", "icehouse-proposed", use_sudo=use_sudo_flag) sed("/root/puppet_openstack_builder/data/hiera_data/vendor/cisco_coi_common.yaml", "/snapshots/i.0", "-proposed", use_sudo=use_sudo_flag) with cd("install-scripts"): warn_if_fail(run_func("./install.sh")) prepare_files( config, paths=( "/etc/puppet/data/hiera_data/user.common.yaml", "/etc/puppet/data/hiera_data/user.full_ha.yaml", "/etc/puppet/data/cobbler/cobbler.yaml", "/etc/puppet/data/role_mappings.yaml", "/etc/puppet/data/hiera_data/hostname/build_server.yaml" ), use_sudo_flag=use_sudo_flag) prepare_new_files(config, path="/etc/puppet/data/hiera_data/hostname", use_sudo_flag=use_sudo_flag) resolve_names(run_func, use_sudo_flag) result = run_func( 'puppet apply -v /etc/puppet/manifests/site.pp') tries = 1 if use_cobbler: cobbler_error = "[cobbler-sync]/returns: unable to connect to cobbler on localhost using cobbler" while cobbler_error in result and tries <= APPLY_LIMIT: time.sleep(60) print >> sys.stderr, "Cobbler is not installed properly, running apply again" result = run_func( 'puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries += 1 error = "Error:" while error in result and tries <= APPLY_LIMIT: time.sleep(60) print >> sys.stderr, "Some errors found, running apply again" result = run_func( 'puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries += 1 if exists('/root/openrc'): get('/root/openrc', "./openrc") else: print(red("No openrc file, something went wrong! :(")) print(green("Copying logs and configs")) collect_logs( run_func=run_func, hostname=config["servers"]["build-server"][0]["hostname"], clean=True) print(green("Finished!")) return True elif not force and prepare: return True print(green("Finished!")) return True
def prepare_files(config, paths, use_sudo_flag): def prepare_fullha(config, ha_file): """ Prepare user.full_ha.file """ conf = yaml.load(ha_file) net_ip = ".".join((config['servers']['control-servers'][0]['ip'].split(".")[:3])) vipc = net_ip + ".253" conf["coe::base::controller_hostname"] = "control-server" conf["horizon::keystone_url"] = change_ip_to(conf["horizon::keystone_url"], vipc) conf["controller_names"] = [c["hostname"] for c in config['servers']['control-servers']] conf["openstack-ha::load-balancer::controller_ipaddresses"] = [c["ip"] for c in config['servers']['control-servers']] conf["openstack-ha::load-balancer::swift_proxy_ipaddresses"] = [c["ip"] for c in config['servers']['swift-proxy']] conf["openstack-ha::load-balancer::swift_proxy_names"] = [c["hostname"] for c in config['servers']['swift-proxy']] vipsw = net_ip + ".252" conf["openstack::swift::proxy::swift_proxy_net_ip"] = "%{ipaddress_eth2}" conf["openstack::swift::proxy::swift_memcache_servers"] = [i["ip"] + ":11211" for i in config['servers']['swift-proxy']] conf["nova::memcached_servers"] = [i["ip"] + ":11211" for i in config['servers']['control-servers']] conf["rabbit_hosts"] = [i["hostname"] + ":5672" for i in config['servers']['control-servers']] conf["galera::galera_servers"] = [c["ip"] for c in config['servers']['control-servers']] conf["galera::galera_master"] = config['servers']['control-servers'][0]["hostname"] + "." + DOMAIN_NAME conf["galera_master_name"] = config['servers']['control-servers'][0]["hostname"] conf["galera_master_ipaddress"] = config['servers']['control-servers'][0]["ip"] conf["galera_backup_names"] = [i["hostname"] for i in config['servers']['control-servers'][1:]] conf["galera_backup_ipaddresses"] = [i["ip"] for i in config['servers']['control-servers'][1:]] conf["openstack::swift::storage-node::storage_devices"] = ["vdb", "vdc", "vdd"] return dump(conf) def prepare_common(config, common_file): """ Prepare user.common.file """ conf = yaml.load(common_file) net_ip = ".".join((config['servers']['control-servers'][0]['ip'].split(".")[:3])) vipc = net_ip + ".253" conf["controller_public_address"] = vipc conf["controller_admin_address"] = vipc conf["controller_internal_address"] = vipc conf["coe::base::controller_hostname"] = "control-server" conf["domain_name"] = "domain.name" conf["ntp_servers"] = ["ntp.esl.cisco.com"] conf["external_interface"] = "eth4" conf["nova::compute::vncserver_proxyclient_address"] = "%{ipaddress_eth0}" conf["build_node_name"] = "build-server" conf["controller_public_url"] = change_ip_to( conf["controller_public_url"], vipc) conf["controller_admin_url"] = change_ip_to( conf["controller_admin_url"], vipc) conf["controller_internal_url"] = change_ip_to( conf["controller_internal_url"], vipc) conf["cobbler_node_ip"] = config['servers']['build-server']['ip'] conf["node_subnet"] = ".".join(conf["cobbler_node_ip"].split(".")[:3]) + ".0" conf["node_gateway"] = ".".join(conf["cobbler_node_ip"].split(".")[:3]) + ".1" vipsw = ".".join((config['servers']['control-servers'][0]['ip'].split(".")[:3])) + ".252" conf["swift_internal_address"] = vipsw conf["swift_public_address"] = vipsw conf["swift_admin_address"] = vipsw conf['mysql::server::override_options']['mysqld']['bind-address'] = "0.0.0.0" # config['servers']['control-servers'][0]['ip'] conf['swift_storage_interface'] = "eth2" conf['swift_local_net_ip'] = "%{ipaddress_eth2}" conf['internal_ip'] = "%{ipaddress_eth0}" conf['public_interface'] = "eth0" conf['private_interface'] = "eth0" conf['install_drive'] = "/dev/vda" conf['mon_initial_members'] = config['servers']['control-servers'][0]["hostname"] conf['ceph_primary_mon'] = config['servers']['control-servers'][0]["hostname"] conf['ceph_monitor_address'] = config['servers']['control-servers'][0]["ip"] conf['ceph_cluster_interface'] = "eth0" conf['ceph_cluster_network'] = net_ip + ".0/24" conf['ceph_public_interface'] = "eth0" conf['ceph_public_network'] = net_ip + ".0/24" return dump(conf) def prepare_cobbler(config, cob_file): """ Prepare cobbler.yaml.file """ new_conf = {} name = "trusty" with open(os.path.join(CONFIG_PATH, "cobbler.yaml")) as f: text_cobbler = f.read() text_cobbler = text_cobbler.format( int_ipadd="{$eth0_ip-address}", ip_gateway=".".join((config['servers']['build-server']["ip"].split(".")[:3])) + ".1", ip_dns=".".join((config['servers']['build-server']["ip"].split(".")[:3])) + ".1" ) servers = config['servers']['control-servers'] + \ config["servers"]["compute-servers"] + \ config["servers"]["swift-storage"] + \ config["servers"]["swift-proxy"] + \ config["servers"]["load-balancer"] for c in servers: new_conf[c['hostname']] = { "hostname": c['hostname'] + "." + DOMAIN_NAME, "power_address": c["ip"], "profile": "%s-x86_64" % name, "interfaces": { "eth0": { "mac-address": c["mac"], "dns-name": c['hostname'] + "." + DOMAIN_NAME, "ip-address": c["ip"], "static": "0" } } } return text_cobbler + "\n" + yaml.dump(new_conf) def prepare_role(config, role_file): """ Prepare role_mappings file """ roles = {config["servers"]["build-server"]["hostname"]: "build"} for c in config["servers"]["control-servers"]: roles[c["hostname"]] = "controller" for c in config["servers"]["compute-servers"]: roles[c["hostname"]] = "compute" for c in config["servers"]["swift-storage"]: roles[c["hostname"]] = "swift_storage" for c in config["servers"]["swift-proxy"]: roles[c["hostname"]] = "swift_proxy" for c in config["servers"]["load-balancer"]: roles[c["hostname"]] = "load_balancer" return dump(roles) def prepare_build(config, build_file): return build_file map = { "user.common.yaml": prepare_common, "user.full_ha.yaml": prepare_fullha, "role_mappings.yaml": prepare_role, "cobbler.yaml": prepare_cobbler, "build_server.yaml": prepare_build } for path in paths: fd = StringIO() warn_if_fail(get(path, fd)) old_file = fd.getvalue() file_name = os.path.basename(path) print " >>>> FABRIC OLD %s\n" % file_name, old_file new_file = map[file_name](config, old_file) print " >>>> FABRIC NEW %s\n" % file_name, new_file warn_if_fail(put(StringIO(new_file), path, use_sudo=use_sudo_flag))
def install_openstack(settings_dict, envs=None, verbose=None, url_script=None, prepare=False, force=False, config=None, use_cobbler=False, proxy=None): """ Install OS with COI on build server :param settings_dict: settings dictionary for Fabric :param envs: environment variables to inject when executing job :param verbose: if to hide all output or print everything :param url_script: URl of Cisco installer script from Chris :param force: Use if you don't connect via interface you gonna bridge later :return: always true """ envs = envs or {} verbose = verbose or [] if settings_dict['user'] != 'root': use_sudo_flag = True run_func = sudo else: use_sudo_flag = False run_func = run with settings(**settings_dict), hide(*verbose), shell_env(**envs): with cd("/root/"): if proxy: warn_if_fail(put(StringIO('Acquire::http::proxy "http://proxy.esl.cisco.com:8080/";'), "/etc/apt/apt.conf.d/00proxy", use_sudo=use_sudo_flag)) warn_if_fail(put(StringIO('Acquire::http::Pipeline-Depth "0";'), "/etc/apt/apt.conf.d/00no_pipelining", use_sudo=use_sudo_flag)) run_func("apt-get update") run_func("apt-get install -y git") run_func("git config --global user.email '*****@*****.**';" "git config --global user.name 'Test Node'") if not force and not prepare: update_time(run_func) # avoid grub and other prompts warn_if_fail(run_func('DEBIAN_FRONTEND=noninteractive apt-get -y ' '-o Dpkg::Options::="--force-confdef" -o ' 'Dpkg::Options::="--force-confold" dist-upgrade')) # prepare /etc/hosts file append("/etc/hosts", prepare_hosts(config)) with cd("/root"): warn_if_fail(run_func("git clone -b icehouse " "https://github.com/CiscoSystems/puppet_openstack_builder")) with cd("puppet_openstack_builder"): ## run the latest, not i.0 release #run_func('git checkout i.0') sed("/root/puppet_openstack_builder/install-scripts/cisco.install.sh", "icehouse/snapshots/i.0", "icehouse-proposed", use_sudo=use_sudo_flag) with cd("install-scripts"): warn_if_fail(run_func("./install.sh")) prepare_files(config, paths=( "/etc/puppet/data/hiera_data/user.common.yaml", "/etc/puppet/data/hiera_data/user.full_ha.yaml", "/etc/puppet/data/cobbler/cobbler.yaml", "/etc/puppet/data/role_mappings.yaml", "/etc/puppet/data/hiera_data/hostname/build_server.yaml" ), use_sudo_flag=use_sudo_flag) prepare_new_files( config, path="/etc/puppet/data/hiera_data/hostname", use_sudo_flag=use_sudo_flag ) resolve_names(run_func, use_sudo_flag) result = run_func('puppet apply -v /etc/puppet/manifests/site.pp') tries = 1 if use_cobbler: cobbler_error = "[cobbler-sync]/returns: unable to connect to cobbler on localhost using cobbler" while cobbler_error in result and tries <= APPLY_LIMIT: time.sleep(60) print >> sys.stderr, "Cobbler is not installed properly, running apply again" result = run_func('puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries += 1 error = "Error:" while error in result and tries <= APPLY_LIMIT: time.sleep(60) print >> sys.stderr, "Some errors found, running apply again" result = run_func('puppet apply -v /etc/puppet/manifests/site.pp', pty=False) tries += 1 if exists('/root/openrc'): get('/root/openrc', "./openrc") else: print (red("No openrc file, something went wrong! :(")) print (green("Copying logs and configs")) collect_logs(run_func=run_func, hostname=config["servers"]["build-server"]["hostname"], clean=True) print (green("Finished!")) return True elif not force and prepare: return True print (green("Finished!")) return True