Beispiel #1
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
        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]
Beispiel #2
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