def create_xdcr_cluster(self, cluster_servers):
        num_hostname_add = 1
        add_host_name = False
        if self.add_hostname_node_at_src:
            add_host_name = True
        if self.add_hostname_node_at_des:
            add_host_name = True
        shell = RemoteMachineShellConnection(cluster_servers[0])
        services_in = self.alt_addr_services_in
        if "-" in services_in:
            set_services = services_in.split("-")
        else:
            set_services = services_in.split(",")

        for server in cluster_servers[1:]:
            add_node_IP = self.get_internal_IP(server)
            node_services = "kv"
            if len(set_services) == 1:
                node_services = set_services[0]
            elif len(set_services) > 1:
                if len(set_services) == len(cluster_servers):
                    node_services = set_services[i]
                    i += 1
            if add_host_name and num_hostname_add <= self.num_hostname_add:
                add_node_IP = server.ip
                num_hostname_add += 1

            try:
                shell.alt_addr_add_node(main_server=cluster_servers[0],
                                        internal_IP=add_node_IP,
                                        server_add=server,
                                        services=node_services,
                                        cmd_ext=self.cmd_ext)
            except Exception as e:
                if e:
                    self.fail("Error: {0}".format(e))
        rest = RestConnection(cluster_servers[0])
        rest.rebalance(otpNodes=[node.id for node in rest.node_statuses()],
                       ejectedNodes=[])
        rest.monitorRebalance()
예제 #2
0
    def test_setting_alternate_address(self):
        server1 = self.servers[0]
        url_format = ""
        secure_port = ""
        secure_conn = ""
        self.skip_set_alt_addr = False
        shell = RemoteMachineShellConnection(server1)
        if self.secure_conn:
            cacert = self.get_cluster_certificate_info(server1)
            secure_port = "1"
            url_format = "s"
            if not self.no_cacert:
                secure_conn = "--cacert {0}".format(cacert)
            if self.no_ssl_verify:
                secure_conn = "--no-ssl-verify"
        output = self.list_alt_address(server=server1,
                                       url_format=url_format,
                                       secure_port=secure_port,
                                       secure_conn=secure_conn)
        if self._check_output(server1.ip, output):
            output, _ = self.remove_alt_address_setting(
                server=server1,
                url_format=url_format,
                secure_port=secure_port,
                secure_conn=secure_conn)
            mesg = 'SUCCESS: Alternate address configuration deleted'
            if not self._check_output(mesg, output):
                self.fail("Fail to remove alternate address")
        output = self.list_alt_address(server=server1,
                                       url_format=url_format,
                                       secure_port=secure_port,
                                       secure_conn=secure_conn)
        if output and self._check_output(server1.ip, output):
            self.fail("Fail to remove alternate address with remove command")

        self.log.info("Start to set alternate address")
        internal_IP = self.get_internal_IP(server1)
        setting_cmd = "{0}couchbase-cli{1} {2}"\
                       .format(self.cli_command_path, self.cmd_ext,
                               "setting-alternate-address")
        setting_cmd += " -c http{0}://{1}:{2}{3} --username {4} --password {5} {6}"\
                       .format(url_format, internal_IP , secure_port, server1.port,
                               server1.rest_username, server1.rest_password, secure_conn)
        setting_cmd = setting_cmd + "--set --node {0} --hostname {1} "\
                                        .format(internal_IP, server1.ip)
        shell.execute_command(setting_cmd)
        output = self.list_alt_address(server=server1,
                                       url_format=url_format,
                                       secure_port=secure_port,
                                       secure_conn=secure_conn)
        if output and output[2]:
            if not self._check_output(server1.ip, output):
                self.fail("Fail to set correct hostname")
        else:
            self.fail("Fail to set alternate address")
        self.log.info("Start to add node to cluster use internal IP")
        services_in = self.alt_addr_services_in
        if "-" in services_in:
            set_services = services_in.split("-")
        else:
            set_services = services_in.split(",")
        i = 0
        num_hostname_add = 1
        for server in self.servers[1:]:
            add_node_IP = self.get_internal_IP(server)
            node_services = "kv"
            if len(set_services) == 1:
                node_services = set_services[0]
            elif len(set_services) > 1:
                if len(set_services) == len(self.servers[1:]):
                    node_services = set_services[i]
                    i += 1
            if self.add_hostname_node and num_hostname_add <= self.num_hostname_add:
                add_node_IP = server.ip
                num_hostname_add += 1

            try:
                shell.alt_addr_add_node(main_server=server1,
                                        internal_IP=add_node_IP,
                                        server_add=server,
                                        services=node_services,
                                        cmd_ext=self.cmd_ext)
            except Exception as e:
                if e:
                    self.fail("Error: {0}".format(e))
        rest = RestConnection(self.master)
        rest.rebalance(otpNodes=[node.id for node in rest.node_statuses()],
                       ejectedNodes=[])
        rest.monitorRebalance()
        self.log.info("Create default bucket")
        self._create_default_bucket(self.master)
        buckets = rest.get_buckets()
        status = RestHelper(rest).vbucket_map_ready(buckets[0].name)
        if not status:
            self.fail("Failed to create bucket.")

        if self.run_alt_addr_loader:
            if self.alt_addr_kv_loader:
                self.kv_loader(server1, client_os=self.client_os)
            if self.alt_addr_n1ql_query:
                self.n1ql_query(server1.ip,
                                self.client_os,
                                create_travel_sample_bucket=True)
            if self.alt_addr_eventing_function:
                self.create_eventing_function(server1,
                                              self.client_os,
                                              create_travel_sample_bucket=True)
                self.skip_set_alt_addr = True
        alt_addr_status = []
        if not self.skip_set_alt_addr:
            for server in self.servers[1:]:
                internal_IP = self.get_internal_IP(server)
                status = self.set_alternate_address(server,
                                                    url_format=url_format,
                                                    secure_port=secure_port,
                                                    secure_conn=secure_conn,
                                                    internal_IP=internal_IP)
                alt_addr_status.append(status)
            if False in alt_addr_status:
                self.fail("Fail to set alt address")
            else:
                self.all_alt_addr_set = True
                if self.run_alt_addr_loader:
                    if self.alt_addr_kv_loader:
                        self.kv_loader(server1, self.client_os)
                    if self.alt_addr_n1ql_query:
                        self.n1ql_query(server1.ip, self.client_os)
        remove_node = ""
        if self.alt_addr_rebalance_out:
            internal_IP = self.get_internal_IP(self.servers[-1])
            reject_node = "ns_1@{0}".format(internal_IP)
            self.log.info("Rebalance out a node {0}".format(internal_IP))
            rest.rebalance(otpNodes=[node.id for node in rest.node_statuses()],\
                                                     ejectedNodes=[reject_node])
            reb_status = rest.monitorRebalance()
            self.assertTrue(
                reb_status,
                "Rebalance out node {0} failed".format(internal_IP))
            remove_node = internal_IP
        if self.alt_addr_rebalance_in and self.alt_addr_rebalance_out:
            if remove_node:
                free_node = remove_node
                if self.add_hostname_node:
                    free_node = self.get_external_IP(remove_node)
                cmd = 'curl -X POST -d  "hostname={0}&user={1}&password={2}&services={3}" '\
                             .format(free_node, server1.rest_username, server1.rest_password,
                                     self.alt_addr_rebalance_in_services)
                cmd += '-u Administrator:password https://{0}:18091/controller/addNode'\
                             .format(server1.ip)
                shell.execute_command(cmd)
                rest.rebalance(otpNodes=[node.id for node in rest.node_statuses()],\
                                                                    ejectedNodes=[])
                reb_status = rest.monitorRebalance()
                self.assertTrue(reb_status, "Rebalance back in failed")
                status = self.set_alternate_address(self.servers[-1],
                                                    url_format=url_format,
                                                    secure_port=secure_port,
                                                    secure_conn=secure_conn,
                                                    internal_IP=free_node)
                if status:
                    self.all_alt_addr_set = True
                else:
                    self.all_alt_addr_set = False
            else:
                self.fail("We need a free node to add to cluster")
            if self.run_alt_addr_loader:
                if self.alt_addr_kv_loader:
                    self.kv_loader(server1, self.client_os)
                if self.alt_addr_n1ql_query:
                    self.n1ql_query(server1.ip, self.client_os)
        status = self.remove_all_alternate_address_settings()
        if not status:
            self.fail("Failed to remove all alternate address setting")