def get_nodes_from_services_map(self, service_type="n1ql", get_all_nodes=False, servers=None, master=None): if not servers: servers = self.cluster.servers if not master: master = self.cluster.master services_map = self.get_services_map(master=master) if service_type not in services_map: self.log.warning("Cannot find service node {0} in cluster " .format(service_type)) else: node_list = [] for server_info in services_map[service_type]: tokens = server_info.rsplit(":", 1) ip = tokens[0] port = int(tokens[1]) for server in servers: """ In tests use hostname, if IP in ini file use IP, we need to convert it to hostname to compare it with hostname in cluster """ if "couchbase.com" in ip and "couchbase.com" not in server.ip: shell = RemoteMachineShellConnection(server) hostname = shell.get_full_hostname() self.log.debug("convert IP: {0} to hostname: {1}" .format(server.ip, hostname)) server.ip = hostname shell.disconnect() elif "couchbase.com" in server.ip and "couchbase.com" not in ip: node = TestInputServer() node.ip = ip """ match node.ip to server in ini file to get correct credential """ for server in servers: shell = RemoteMachineShellConnection(server) ips = shell.get_ip_address() ips_new = [] for ele in ips: ele = ele.replace('\n', '') ips_new.append(ele) if node.ip in ips_new: node.ssh_username = server.ssh_username node.ssh_password = server.ssh_password break shell = RemoteMachineShellConnection(node) hostname = shell.get_full_hostname() self.log.info("convert IP: {0} to hostname: {1}" \ .format(ip, hostname)) ip = hostname shell.disconnect() if (port != constants.port and port == int(server.port)) \ or (port == constants.port and server.ip == ip): node_list.append(server) self.log.debug("All nodes in cluster: {0}".format(node_list)) if get_all_nodes: return node_list else: return node_list[0]
def get_nodes_from_services_map(self, service_type="n1ql", get_all_nodes=False, servers=None, master=None): if not servers: servers = self.cluster.servers if not master: master = self.cluster.master self.get_services_map(master=master) if (service_type not in self.services_map): self.log.info("cannot find service node {0} in cluster " \ .format(service_type)) else: list = [] for server_info in self.services_map[service_type]: tokens = server_info.split(":") ip = tokens[0] port = int(tokens[1]) for server in servers: """ In tests use hostname, if IP in ini file use IP, we need to convert it to hostname to compare it with hostname in cluster """ if "couchbase.com" in ip and "couchbase.com" not in server.ip: shell = RemoteMachineShellConnection(server) hostname = shell.get_full_hostname() self.log.info("convert IP: {0} to hostname: {1}" \ .format(server.ip, hostname)) server.ip = hostname shell.disconnect() if (port != 8091 and port == int(server.port)) or \ (port == 8091 and server.ip == ip): list.append(server) self.log.info("list of all nodes in cluster: {0}".format(list)) if get_all_nodes: return list else: return list[0]
def rename_nodes(servers): """Rename server name from ip to their hostname @param servers: list of server objects. @return: dictionary whose key is server and value is hostname """ hostnames = {} for server in servers: shell = RemoteMachineShellConnection(server) try: hostname = shell.get_full_hostname() rest = RestConnection(server) renamed, content = rest.rename_node( hostname, username=server.rest_username, password=server.rest_password) raise_if( not renamed, Exception( "Server %s is not renamed! Hostname %s. Error %s" % (server, hostname, content))) hostnames[server] = hostname server.hostname = hostname finally: shell.disconnect() return hostnames
def get_nodes_from_services_map(self, service_type="n1ql", get_all_nodes=False, servers=None, master=None): if not servers: servers = self.servers if not master: master = self.master self.get_services_map(master=master) if (service_type not in self.services_map): log.info("cannot find service node {0} in cluster " \ .format(service_type)) else: list = [] for server_info in self.services_map[service_type]: tokens = server_info.rsplit(":", 1) ip = tokens[0] port = int(tokens[1]) for server in servers: """ In tests use hostname, if IP in ini file use IP, we need to convert it to hostname to compare it with hostname in cluster """ if "couchbase.com" in ip and "couchbase.com" not in server.ip: shell = RemoteMachineShellConnection(server) hostname = shell.get_full_hostname() log.info("convert IP: {0} to hostname: {1}" \ .format(server.ip, hostname)) server.ip = hostname shell.disconnect() elif ip.endswith(".svc"): from kubernetes import client as kubeClient, config as kubeConfig currNamespace = ip.split('.')[2] kubeConfig.load_incluster_config() v1 = kubeClient.CoreV1Api() nodeList = v1.list_pod_for_all_namespaces(watch=False) for node in nodeList.items: if node.metadata.namespace == currNamespace and \ node.status.pod_ip == server.ip: ip = node.status.pod_ip break elif "couchbase.com" in server.ip and "couchbase.com" not in ip: node = TestInputServer() node.ip = ip """ match node.ip to server in ini file to get correct credential """ for server in servers: shell = RemoteMachineShellConnection(server) ips = shell.get_ip_address() if node.ip in ips: node.ssh_username = server.ssh_username node.ssh_password = server.ssh_password break shell = RemoteMachineShellConnection(node) hostname = shell.get_full_hostname() log.info("convert IP: {0} to hostname: {1}" \ .format(ip, hostname)) ip = hostname shell.disconnect() if (port != 8091 and port == int(server.port)) or \ (port == 8091 and server.ip.lower() == ip.lower()): list.append(server) log.info("list of {0} nodes in cluster: {1}".format( service_type, list)) if get_all_nodes: return list else: try: if len(list) == 0: list.append(servers[0]) return list[0] except IndexError as e: log.info(self.services_map) raise e