def get_nodes(): """ Generator that returns a node name / IP addr tuple for every node returned by running "nova list" """ stack_name = CredentialHelper.get_overcloud_name().lower() # A dictionary that maps nova node names to something shorter and easier # to type. node_names = { stack_name + '-controller': 'cntl', stack_name + '-novacompute': 'nova', stack_name + '-dell-compute': 'nova', stack_name + '-cephstorage': 'stor' } # Ensure 'nova list' is performed on the undercloud! undercloudrc = CredentialHelper.get_undercloudrc_name() nova_list_cmd = 'source {} && nova list'.format(undercloudrc) for line in subprocess.check_output( nova_list_cmd, shell=True).decode('utf-8').split('\n'): # Create a match object that chops up the "nova list" output so we # can extract the pieces we need. m = re.search('(.+ \| )(\S+)(-)(\d+)( .+ctlplane=)(\S+)( .+)', line) # noqa: W605 if not m: # No match (probably banner text) continue try: node_type = m.group(2) node_num = m.group(4) addr = m.group(6) if node_type in node_names: node = node_names[node_type] + node_num full_name = node_type + "-" + node_num else: node = node_type + node_num full_name = node_type + "-" + node_num except IndexError: pass yield node, addr, full_name
def main(): parser = argparse.ArgumentParser() parser.add_argument("-l", "--logging-level", default="INFO", type=logging_level, help="""logging level defined by the logging module; choices include CRITICAL, ERROR, WARNING, INFO, and DEBUG""", metavar="LEVEL") args = parser.parse_args() home_dir = os.path.expanduser('~') undercloudrc_name = os.path.join(home_dir, 'stackrc') oc_stack_name = CredentialHelper.get_overcloud_name() ssh_config = os.path.join(home_dir, '.ssh/config') undercloud_config = os.path.join(home_dir, 'undercloud_nodes.txt') # Run update_ssh_config.py cmd = os.path.join(os.getcwd(), 'update_ssh_config.py') os.system(cmd) # Run identify_nodes.py > ~/undercloud_nodes.txt cmd = os.path.join(os.getcwd(), 'identify_nodes.py > ~/undercloud_nodes.txt') os.system(cmd) # Get first_controller_node p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/cntl0/ {print $2}\''), stdin=p1.stdout, stdout=subprocess.PIPE) first_controller_node = p2.communicate()[0].rstrip() # Get first_controller_node_ip p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl0"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) first_controller_node_ip = p3.communicate()[0].rstrip() # Get COMPUTE_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) controller_nodes_ip = p3.communicate()[0].split() # Get first_compute_node p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen( shlex.split('awk \'/nova0/ || /compute0/ {print $2}\''), stdin=p1.stdout, stdout=subprocess.PIPE) first_compute_node = p2.communicate()[0].rstrip() # Get first_compute_node_ip p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('egrep -A1 -h "nova0|compute0"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) first_compute_node_ip = p3.communicate()[0].rstrip() # Get COMPUTE_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('egrep -A1 -h "nova|compute"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) compute_nodes_ip = p3.communicate()[0].split() # Get COMPUTE_NOVA_NAMES p1 = subprocess.Popen(['nova', 'list'], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/compute/ {print $4}\''), stdin=p1.stdout, stdout=subprocess.PIPE) compute_nova_names = p2.communicate()[0].split() first_compute_nova_name = compute_nova_names[0] # Get CONTROLLER_NOVA_NAMES p1 = subprocess.Popen(['nova', 'list'], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/controller/ {print $4}\''), stdin=p1.stdout, stdout=subprocess.PIPE) controller_nova_names = p2.communicate()[0].split() first_controller_nova_name = controller_nova_names[0] oc_auth_url, oc_tenant_name, oc_username, oc_password = \ CredentialHelper.get_overcloud_creds() LOG.setLevel(args.logging_level) # Install RA instanceHA Configuration LOG.info( "*** Removing Instance HA for stack {} ***".format(oc_stack_name)) LOG.debug("home_dir: {}".format(home_dir)) LOG.debug("oc_stack_name: {}".format(oc_stack_name)) LOG.debug("oc_auth_url: {}".format(oc_auth_url)) LOG.debug("oc_username: {}".format(oc_username)) LOG.debug("oc_password: {}".format(oc_password)) LOG.debug("oc_tenant_name: {}".format(oc_tenant_name)) LOG.debug("first_controller_node: {}".format(first_controller_node)) LOG.debug("first_controller_node_ip: {}".format(first_controller_node_ip)) LOG.debug("controller_nodes_ip: {}".format(controller_nodes_ip)) LOG.debug("first_compute_node: {}".format(first_compute_node)) LOG.debug("first_compute_node_ip: {}".format(first_compute_node_ip)) LOG.debug("compute_nodes_ip: {}".format(compute_nodes_ip)) LOG.debug("compute_nova_names: {}".format(compute_nova_names)) LOG.debug("first_compute_nova_name: {}".format(first_compute_nova_name)) LOG.debug("controller_nova_names: {}".format(controller_nova_names)) LOG.debug( "first_controller_nova_name: {}".format(first_controller_nova_name)) cmd = "source {} ".format(undercloudrc_name) os.system(cmd) out = ssh_cmd( first_controller_node_ip, "heat-admin", "sudo pcs property show stonith-enabled \ | awk '/stonith/ {print $2}'") result = out[0].rstrip() LOG.debug("result: {}".format(result)) if result == 'true': ssh_cmd(first_controller_node_ip, "heat-admin", "sudo pcs property set stonith-enabled=false") ssh_cmd(first_controller_node_ip, "heat-admin", "sudo pcs property set maintenance-mode=true") disable_control_plane_services(first_controller_node_ip) delete_compute_nodeName_resource(compute_nodes_ip, first_controller_node_ip) delete_compute_nodes_resources(first_controller_node_ip) delete_compute_nodes_stonith_devices(compute_nodes_ip, first_controller_node_ip) delete_nova_evacuate_resource(first_controller_node_ip) disable_remote_pacemaker(compute_nodes_ip) enable_openstack_services(compute_nodes_ip) ssh_cmd(first_controller_node_ip, "heat-admin", "sudo pcs property set maintenance-mode=false") ssh_cmd(first_controller_node_ip, "heat-admin", "sudo pcs property set stonith-enabled=true")
def main(): parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-compute", "--compute", dest="compute_node_ip", action="store", default='') group.add_argument("-controller", "--controller", dest="controller_node_ip", action="store", default='') parser.add_argument('-f', '--file', help='name of json file containing the node being set', default=Constants.INSTACKENV_FILENAME) parser.add_argument("-l", "--logging-level", default="INFO", type=logging_level, help="""logging level defined by the logging module; choices include CRITICAL, ERROR, WARNING, INFO, and DEBUG""", metavar="LEVEL") args = parser.parse_args() home_dir = os.path.expanduser('~') undercloudrc_name = os.path.join(home_dir, 'stackrc') oc_stack_name = CredentialHelper.get_overcloud_name() ssh_config = os.path.join(home_dir, '.ssh/config') undercloud_config = os.path.join(home_dir, 'undercloud_nodes.txt') instack_file = os.path.expanduser(args.file) # Run ~/pilot/identify_nodes.py > ~/undercloud_nodes.txt cmd = os.path.join(home_dir, 'pilot/identify_nodes.py > ~/undercloud_nodes.txt') os.system(cmd) # Get CONTROLLER_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) controller_nodes_ip = p3.communicate()[0].split() # Get CONTROLLER_NODE_NAMES p1 = subprocess.Popen(['nova', 'list'], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/controller/ {print $4}\''), stdin=p1.stdout, stdout=subprocess.PIPE) controller_node_names = p2.communicate()[0].split() # Get COMPUTE_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('egrep -A1 -h "nova|compute"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) compute_nodes_ip = p3.communicate()[0].split() # Get COMPUTE_NOVA_NAMES p1 = subprocess.Popen(['nova', 'list'], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/compute/ {print $4}\''), stdin=p1.stdout, stdout=subprocess.PIPE) compute_nova_names = p2.communicate()[0].split() # Get first_controller_node_ip p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl0"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) first_controller_node_ip = p3.communicate()[0].rstrip() oc_auth_url, oc_tenant_name, oc_username, oc_password = \ CredentialHelper.get_overcloud_creds() LOG.setLevel(args.logging_level) LOG.debug("home_dir: {}".format(home_dir)) LOG.debug("oc_stack_name: {}".format(oc_stack_name)) LOG.debug("oc_auth_url: {}".format(oc_auth_url)) LOG.debug("oc_username: {}".format(oc_username)) LOG.debug("oc_password: {}".format(oc_password)) LOG.debug("oc_tenant_name: {}".format(oc_tenant_name)) LOG.debug("controller_nodes_ip: {}".format(controller_nodes_ip)) LOG.debug("controller_nodes_names: {}".format(controller_nodes_ip)) LOG.debug("compute_nodes_ip: {}".format(compute_nodes_ip)) LOG.debug("compute_nova_names: {}".format(compute_nodes_ip)) # Execute Compute node deletion if args.compute_node_ip != '': compute_node_ip = args.compute_node_ip.rstrip() if check_ip_validity(compute_node_ip): LOG.info("*** Removing a compute node {} to InstanceHA" " configuration.".format(compute_node_ip)) delete_compute_node_resources(compute_node_ip, first_controller_node_ip) else: LOG.critical("!!! - Fatal Error: Invalid IP address: {}".format( compute_node_ip)) exit(-1) # Execute Controller node deletion if args.controller_node_ip != '': controller_node_ip = args.controller_node_ip.rstrip() if check_ip_validity(controller_node_ip): LOG.info("*** Removing a controller node {} to InstanceHA" " configuration.".format(controller_node_ip)) LOG.debug("controller_node_ip: {}".format(controller_node_ip)) delete_controller_node_resources(controller_node_ip, first_controller_node_ip) else: LOG.critical("!!! - Fatal Error: Invalid IP address: {}".format( controller_node_ip)) exit(-1)
def main(): parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-compute", "--compute", dest="compute_node_ip", action="store", default='') group.add_argument("-controller", "--controller", dest="controller_node_ip", action="store", default='') parser.add_argument('-f', '--file', help='name of json file containing the node being set', default=Constants.INSTACKENV_FILENAME) parser.add_argument("-l", "--logging-level", default="INFO", type=logging_level, help="""logging level defined by the logging module; choices include CRITICAL, ERROR, WARNING, INFO, and DEBUG""", metavar="LEVEL") args = parser.parse_args() home_dir = os.path.expanduser('~') undercloudrc_name = os.path.join(home_dir, 'stackrc') oc_stack_name = CredentialHelper.get_overcloud_name() ssh_config = os.path.join(home_dir, '.ssh/config') undercloud_config = os.path.join(home_dir, 'undercloud_nodes.txt') instack_file = os.path.join(home_dir, args.file) # Run update_ssh_config.py cmd = os.path.join(os.getcwd(), 'update_ssh_config.py') os.system(cmd) # Run identify_nodes.py > ~/undercloud_nodes.txt cmd = os.path.join(os.getcwd(), 'identify_nodes.py > ~/undercloud_nodes.txt') os.system(cmd) # Get first_controller_node p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/cntl0/ {print $2}\''), stdin=p1.stdout, stdout=subprocess.PIPE) first_controller_node = p2.communicate()[0].rstrip() # Get first_controller_node_ip p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl0"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) first_controller_node_ip = p3.communicate()[0].rstrip() # Get COMPUTE_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('grep -A1 "cntl"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) controller_nodes_ip = p3.communicate()[0].split() # Get first_compute_node p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen( shlex.split('awk \'/nova0/ || /compute0/ {print $2}\''), stdin=p1.stdout, stdout=subprocess.PIPE) first_compute_node = p2.communicate()[0].rstrip() # Get first_compute_node_ip p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('egrep -A1 -h "nova0|compute0"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) first_compute_node_ip = p3.communicate()[0].rstrip() # Get COMPUTE_NODES_IP p1 = subprocess.Popen(['cat', ssh_config], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('egrep -A1 -h "nova|compute"'), stdin=p1.stdout, stdout=subprocess.PIPE) p3 = subprocess.Popen(shlex.split('awk \'/Hostname/ {print $2}\''), stdin=p2.stdout, stdout=subprocess.PIPE) compute_nodes_ip = p3.communicate()[0].split() # Get COMPUTE_NOVA_NAMES p1 = subprocess.Popen(['nova', 'list'], stdout=subprocess.PIPE) p2 = subprocess.Popen(shlex.split('awk \'/compute/ {print $4}\''), stdin=p1.stdout, stdout=subprocess.PIPE) compute_nova_names = p2.communicate()[0].split() oc_auth_url, oc_tenant_name, oc_username, oc_password = \ CredentialHelper.get_overcloud_creds() domainname = get_domainname(first_compute_node_ip) LOG.setLevel(args.logging_level) # Install RA instanceHA Configuration if args.compute_node_ip == '' and args.controller_node_ip == '': LOG.info("*** Configuring Instance HA for stack {} ***".format( oc_stack_name)) LOG.debug("home_dir: {}".format(home_dir)) LOG.debug("oc_stack_name: {}".format(oc_stack_name)) LOG.debug("oc_auth_url: {}".format(oc_auth_url)) LOG.debug("oc_username: {}".format(oc_username)) LOG.debug("oc_password: {}".format(oc_password)) LOG.debug("oc_tenant_name: {}".format(oc_tenant_name)) LOG.debug("first_controller_node: {}".format(first_controller_node)) LOG.debug( "first_controller_node_ip: {}".format(first_controller_node_ip)) LOG.debug("controller_nodes_ip: {}".format(controller_nodes_ip)) LOG.debug("first_compute_node: {}".format(first_compute_node)) LOG.debug("first_compute_node_ip: {}".format(first_compute_node_ip)) LOG.debug("compute_nodes_ip: {}".format(compute_nodes_ip)) LOG.debug("compute_nova_names: {}".format(compute_nova_names)) LOG.debug("domainname: {}".format(domainname)) if (verify_fencing(first_controller_node_ip) != "false"): LOG.debug("Stonith is enabled.") else: LOG.critical("!!! - Error: Fencing must be enabled.") LOG.info("Use agent_fencing.sh script to enable fencing.") sys.exit(-1) stop_disable_openstack_services(compute_nodes_ip) create_authkey(first_compute_node_ip) distribute_all_authkey(compute_nodes_ip, controller_nodes_ip) enable_start_pacemaker(compute_nodes_ip) create_nova_evacuate_resource(first_controller_node_ip, domainname) confirm_nova_evacuate_resource(first_controller_node_ip) tag_controllers_with_osprole(first_controller_node_ip) tag_the_control_plane(first_controller_node_ip) populate_compute_nodes_resources(first_controller_node_ip, domainname) add_compute_nodes_stonith_devices(compute_nodes_ip, undercloud_config, first_controller_node_ip, instack_file) create_fence_nova_device(first_controller_node_ip, domainname) enable_compute_nodes_recovery(first_controller_node_ip) create_compute_nodes_resources(compute_nodes_ip, first_controller_node_ip) enable_control_plane_services(first_controller_node_ip) final_resource_cleanup(first_controller_node_ip) # Execute Compute node addition if args.compute_node_ip != '': compute_node_ip = args.compute_node_ip.rstrip() if check_ip_validity(compute_node_ip): LOG.info("*** Adding a compute node {} to InstanceHA" " configuration.".format(compute_node_ip)) LOG.debug("compute_nodes_ip: {}".format(compute_nodes_ip)) LOG.debug("compute_node_ip: {}".format(compute_node_ip)) LOG.debug("first_controller_node_ip: {}".format( first_controller_node_ip)) LOG.debug("undercloud_config: {}".format(undercloud_config)) LOG.debug("instack_file: {}".format(instack_file)) stop_disable_openstack_services(compute_nodes_ip) distribute_node_authkey(compute_node_ip) enable_start_compute_pacemaker(compute_node_ip) add_compute_node_stonith_devices(compute_node_ip, undercloud_config, first_controller_node_ip, instack_file) create_compute_node_resources(compute_node_ip, first_controller_node_ip) enable_control_plane_services(first_controller_node_ip) final_resource_cleanup(first_controller_node_ip) else: LOG.critical("!!! - Fatal Error: Invalid IP address: {}".format( compute_node_ip)) exit(-1) # Execute Controller node addition if args.controller_node_ip != '': controller_node_ip = args.controller_node_ip.rstrip() if check_ip_validity(controller_node_ip): LOG.info("*** Adding a controller node {} to InstanceHA" " configuration.".format(controller_node_ip)) LOG.debug("controller_node_ip: {}".format(controller_node_ip)) LOG.debug("first_controller_node_ip: {}".format( first_controller_node_ip)) distribute_node_authkey(controller_node_ip) tag_controllers_with_osprole(first_controller_node_ip) final_resource_cleanup(first_controller_node_ip) else: LOG.critical("!!! - Fatal Error: Invalid IP address: {}".format( controller_node_ip)) sys.exit(-1)