예제 #1
0
    def replicate_pause_resume(self):
        if not self.replicator:
            print "Error: option --xdcr-replicator is needed to pause/resume a replication"
            return

        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)

        opts = {
            'error_msg': "unable to retrieve any replication streams",
            'success_msg': "list replication streams"
        }
        output_result = rest.restCmd('GET',
                                     '/pools/default/tasks',
                                     self.user,
                                     self.password,
                                     opts)
        tasks = rest.getJson(output_result)
        for task in tasks:
            if task["type"] == "xdcr" and task["id"] == self.replicator:
                if self.cmd == "pause" and task["status"] == "notRunning":
                    print "The replication is not running yet. Pause is not needed"
                    return
                if self.cmd == "resume" and task["status"] == "running":
                    print "The replication is running already. Resume is not needed"
                    return
                break

        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        self.rest_cmd = '/settings/replications/' + urllib.quote_plus(self.replicator)
        if self.cmd == "pause":
            rest.setParam('pauseRequested', node.bool_to_str(1))
        elif self.cmd == "resume":
            rest.setParam('pauseRequested', node.bool_to_str(0))

        opts = {
            'error_msg': "unable to %s replication" % self.cmd,
            'success_msg': "%s replication" % self.cmd
        }
        output_result = rest.restCmd('POST',
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #2
0
    def runCmd(self, cmd, server, port, user, password, ssl, opts):
        vm = 'ns_server'
        for (o, a) in opts:
            if o == '-d' or o == '--debug':
                self.debug = True

            if o == '--vm':
                vm = a

        rest = util.restclient_factory(server, port, {'debug': self.debug},
                                       ssl)
        opts = {'error_msg': 'server-info error'}

        data = rest.restCmd('GET', '/nodes/self', user, password, opts)

        json = rest.getJson(data)

        for x in ['license', 'licenseValid', 'licenseValidUntil']:
            if x in json:
                del (json[x])

        if cmd == 'server-eshell':
            node = json['otpNode']
            cookie = json['otpCookie']

            if vm != 'ns_server':
                rest = util.restclient_factory(server, port,
                                               {'debug': self.debug}, ssl)
                rest.setPayload('ns_server:get_babysitter_cookie().')
                cookie = rest.sendCmd('POST', '/diag/eval', user,
                                      password).read()

                [short, _] = node.split('@')

                if vm == 'babysitter':
                    node = 'babysitter_of_%[email protected]' % short
                elif vm == 'couchdb':
                    node = 'couchdb_%[email protected]' % short
                else:
                    raise ValueError("unknown vm type \'%s\'" % vm)

            name = self._remoteShellName()
            p = subprocess.call([
                'erl', '-name', name, '-setcookie', cookie, '-hidden',
                '-remsh', node
            ])
        elif cmd == 'get-server-info':
            return json
        else:
            print simplejson.dumps(json, sort_keys=True, indent=2)
예제 #3
0
    def runCmd(self, cmd, server, port,
               user, password, ssl, opts):
        for (o, a) in opts:
            if o == '-d' or o == '--debug':
                self.debug = True

        rest = util.restclient_factory(server, port, {'debug':self.debug}, ssl)
        opts = {'error_msg': 'server-info error'}

        data = rest.restCmd('GET', '/nodes/self',
                            user, password, opts)

        json = rest.getJson(data)

        for x in ['license', 'licenseValid', 'licenseValidUntil']:
            if x in json:
                del(json[x])

        if cmd == 'get-server-info':
            return json
        elif cmd == 'server-eshell':
            name = self._remoteShellName()
            p = subprocess.call(['erl','-name',name,
                '-setcookie',json['otpCookie'],'-hidden','-remsh',json['otpNode']])
        else:
            print simplejson.dumps(json, sort_keys=True, indent=2)
예제 #4
0
 def setup_list(self):
     rest = util.restclient_factory(self.server,
                                  self.port,
                                  {'debug':self.debug},
                                  self.ssl)
     opts = {
         'error_msg': "unable to list xdcr remote cluster",
         'success_msg': "list remote cluster successfully",
     }
     output_result = rest.restCmd('GET',
                                  self.rest_cmd,
                                  self.user,
                                  self.password,
                                  opts)
     clusters = rest.getJson(output_result)
     if self.output == 'json':
         print output_result
     else:
         for cluster in clusters:
             if not cluster.get('deleted'):
                 print "cluster name: %s" % cluster["name"]
                 print "        uuid: %s" % cluster["uuid"]
                 print "   host name: %s" % cluster["hostname"]
                 print "   user name: %s" % cluster["username"]
                 print "         uri: %s" % cluster["uri"]
예제 #5
0
    def replicate_start(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        if self.to_bucket:
            rest.setParam('toBucket', self.to_bucket)

        if self.remote_cluster:
            rest.setParam('toCluster', self.remote_cluster)

        if self.from_bucket:
            rest.setParam('fromBucket', self.from_bucket)

        if self.replication_mode:
            rest.setParam('type', self.replication_mode)

        if self.regex:
            rest.setParam('filterExpression', self.regex)

        rest.setParam('replicationType', 'continuous')

        opts = {
            'error_msg': "unable to create replication",
            'success_msg': "start replication"
        }
        output_result = rest.restCmd(self.method,
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #6
0
    def replicate_start(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        if self.to_bucket:
            rest.setParam('toBucket', self.to_bucket)

        if self.remote_cluster:
            rest.setParam('toCluster', self.remote_cluster)

        if self.from_bucket:
            rest.setParam('fromBucket', self.from_bucket)

        if self.replication_mode:
            rest.setParam('type', self.replication_mode)

        if self.regex:
            rest.setParam('filterExpression', self.regex)

        rest.setParam('replicationType', 'continuous')

        opts = {
            'error_msg': "unable to create replication",
            'success_msg': "start replication"
        }
        output_result = rest.restCmd(self.method, self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #7
0
    def runCmd(self, cmd, server, port,
               user, password, ssl, opts):
        vm = 'ns_server'
        for (o, a) in opts:
            if o == '-d' or o == '--debug':
                self.debug = True

            if o == '--vm':
                vm = a

        rest = util.restclient_factory(server, port, {'debug':self.debug}, ssl)
        opts = {'error_msg': 'server-info error'}

        data = rest.restCmd('GET', '/nodes/self',
                            user, password, opts)

        json = rest.getJson(data)

        for x in ['license', 'licenseValid', 'licenseValidUntil']:
            if x in json:
                del(json[x])

        if cmd == 'server-eshell':
            node = json['otpNode']
            cookie = json['otpCookie']

            if vm != 'ns_server':
                rest = util.restclient_factory(server, port, {'debug':self.debug}, ssl)
                rest.setPayload('ns_server:get_babysitter_cookie().')
                cookie = rest.sendCmd('POST', '/diag/eval', user, password).read()

                [short, _] = node.split('@')

                if vm == 'babysitter':
                    node = 'babysitter_of_%[email protected]' % short
                elif vm == 'couchdb':
                    node = 'couchdb_%[email protected]' % short
                else:
                    raise ValueError("unknown vm type \'%s\'" % vm)

            name = self._remoteShellName()
            p = subprocess.call(['erl', '-name', name, '-setcookie',
                                 cookie, '-hidden', '-remsh', node])
        elif cmd == 'get-server-info':
            return json
        else:
            print simplejson.dumps(json, sort_keys=True, indent=2)
예제 #8
0
    def replicate_settings(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        opts = {
            'error_msg': "unable to set xdcr replication settings",
            'success_msg': "set xdcr replication settings"
        }
        if self.replicator:
            self.rest_cmd = '/settings/replications/' + urllib.quote_plus(self.replicator)
        else:
            print "Error: option --xdcr-replicator is needed to update replication settings"
            return

        if self.checkpoint_interval:
            rest.setParam('checkpointInterval', self.checkpoint_interval)
            opts['success_msg'] += ' xdcrCheckpointInterval'

        if self.worker_batch_size:
            rest.setParam('workerBatchSize', self.worker_batch_size)
            opts['success_msg'] += ' xdcrWorkerBatchSize'

        if self.doc_batch_size:
            rest.setParam('docBatchSizeKb', self.doc_batch_size)
            opts['success_msg'] += ' xdcrDocBatchSizeKb'

        if self.failure_restart_interval:
            rest.setParam('failureRestartInterval', self.failure_restart_interval)
            opts['success_msg'] += ' xdcrFailureRestartInterval'

        if self.optimistic_replication_threshold:
            rest.setParam('optimisticReplicationThreshold', self.optimistic_replication_threshold)
            opts['success_msg'] += ' xdcrOptimisticReplicationThreshold'

        if self.source_nozzle_per_node:
            rest.setParam('sourceNozzlePerNode', self.source_nozzle_per_node)
            opts['success_msg'] += ' xdcrSourceNozzlePerNode'

        if self.target_nozzle_per_node:
            rest.setParam('targetNozzlePerNode', self.target_nozzle_per_node)
            opts['success_msg'] += ' xdcrTargetNozzlePerNode'

        if self.log_level:
            rest.setParam('logLevel', self.log_level)
            opts['success_msg'] += ' xdcrLogLevel'

        if self.stats_interval:
            rest.setParam('statsInterval', self.stats_interval)
            opts['success_msg'] += ' xdcrStatsInterval'

        output_result = rest.restCmd(self.method,
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #9
0
    def runCmd(self, cmd, server, port, user, password, ssl, opts):
        opts = {}
        opts['error_msg'] = "unable to %s" % cmd
        opts['success_msg'] = "%s" % cmd

        #print server, port, cmd, self.rest_cmd
        rest = util.restclient_factory(server, port, {'debug': self.debug},
                                       ssl)
        data = rest.restCmd(methods[cmd], self.rest_cmd, user, password, opts)
        return rest.getJson(data)
예제 #10
0
    def replicate_settings(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        opts = {
            'error_msg': "unable to set xdcr replication settings",
            'success_msg': "set xdcr replication settings"
        }
        if self.replicator:
            self.rest_cmd = '/settings/replications/' + urllib.quote_plus(
                self.replicator)
        else:
            print "Error: option --xdcr-replicator is needed to update replication settings"
            return

        if self.checkpoint_interval:
            rest.setParam('checkpointInterval', self.checkpoint_interval)
            opts['success_msg'] += ' xdcrCheckpointInterval'

        if self.worker_batch_size:
            rest.setParam('workerBatchSize', self.worker_batch_size)
            opts['success_msg'] += ' xdcrWorkerBatchSize'

        if self.doc_batch_size:
            rest.setParam('docBatchSizeKb', self.doc_batch_size)
            opts['success_msg'] += ' xdcrDocBatchSizeKb'

        if self.failure_restart_interval:
            rest.setParam('failureRestartInterval',
                          self.failure_restart_interval)
            opts['success_msg'] += ' xdcrFailureRestartInterval'

        if self.optimistic_replication_threshold:
            rest.setParam('optimisticReplicationThreshold',
                          self.optimistic_replication_threshold)
            opts['success_msg'] += ' xdcrOptimisticReplicationThreshold'

        if self.source_nozzle_per_node:
            rest.setParam('sourceNozzlePerNode', self.source_nozzle_per_node)
            opts['success_msg'] += ' xdcrSourceNozzlePerNode'

        if self.target_nozzle_per_node:
            rest.setParam('targetNozzlePerNode', self.target_nozzle_per_node)
            opts['success_msg'] += ' xdcrTargetNozzlePerNode'

        if self.log_level:
            rest.setParam('logLevel', self.log_level)
            opts['success_msg'] += ' xdcrLogLevel'

        if self.stats_interval:
            rest.setParam('statsInterval', self.stats_interval)
            opts['success_msg'] += ' xdcrStatsInterval'

        output_result = rest.restCmd(self.method, self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #11
0
    def runCmd(self, cmd, server, port,
               user, password, ssl, opts):
        opts = {}
        opts['error_msg'] = "unable to %s" % cmd
        opts['success_msg'] = "%s" % cmd

        #print server, port, cmd, self.rest_cmd
        rest = util.restclient_factory(server, port, {'debug':self.debug}, ssl)
        data = rest.restCmd(methods[cmd], self.rest_cmd,
                            user, password, opts)
        return rest.getJson(data)
예제 #12
0
    def getData(self, server, port, user, password):
        """
        getData()

        Obtain the raw json output from the server
        The reason for passing arguments which could be obtained
        from 'self' is because getData() must be callable externally
    """
        self.rest = util.restclient_factory(server, port,
                                            {'debug': self.debug}, self.ssl)
        return self.rest.restCmd('GET', self.rest_cmd, user, password)
예제 #13
0
    def replicate_pause_resume(self):
        if not self.replicator:
            print "Error: option --xdcr-replicator is needed to pause/resume a replication"
            return

        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)

        opts = {
            'error_msg': "unable to retrieve any replication streams",
            'success_msg': "list replication streams"
        }
        output_result = rest.restCmd('GET', '/pools/default/tasks', self.user,
                                     self.password, opts)
        tasks = rest.getJson(output_result)
        for task in tasks:
            if task["type"] == "xdcr" and task["id"] == self.replicator:
                if self.cmd == "pause" and task["status"] == "notRunning":
                    print "The replication is not running yet. Pause is not needed"
                    return
                if self.cmd == "resume" and task["status"] == "running":
                    print "The replication is running already. Resume is not needed"
                    return
                break

        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        self.rest_cmd = '/settings/replications/' + urllib.quote_plus(
            self.replicator)
        if self.cmd == "pause":
            rest.setParam('pauseRequested', node.bool_to_str(1))
        elif self.cmd == "resume":
            rest.setParam('pauseRequested', node.bool_to_str(0))

        opts = {
            'error_msg': "unable to %s replication" % self.cmd,
            'success_msg': "%s replication" % self.cmd
        }
        output_result = rest.restCmd('POST', self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #14
0
    def getData(self, server, port, user, password):
        """
        getData()

        Obtain the raw json output from the server
        The reason for passing arguments which could be obtained
        from 'self' is because getData() must be callable externally
    """
        self.rest = util.restclient_factory(server, port,
                                          {'debug':self.debug}, self.ssl)
        return self.rest.restCmd('GET', self.rest_cmd,
                                 user, password)
예제 #15
0
    def setting(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        opts = {
            'error_msg': "unable to set xdcr internal settings",
            'success_msg': "set xdcr settings"
        }

        if self.checkpoint_interval:
            rest.setParam('xdcrCheckpointInterval', self.checkpoint_interval)
            opts['success_msg'] += ' xdcrCheckpointInterval'

        if self.worker_batch_size:
            rest.setParam('xdcrWorkerBatchSize', self.worker_batch_size)
            opts['success_msg'] += ' xdcrWorkerBatchSize'

        if self.doc_batch_size:
            rest.setParam('xdcrDocBatchSizeKb', self.doc_batch_size)
            opts['success_msg'] += ' xdcrDocBatchSizeKb'

        if self.failure_restart_interval:
            rest.setParam('xdcrFailureRestartInterval', self.failure_restart_interval)
            opts['success_msg'] += ' xdcrFailureRestartInterval'

        if self.optimistic_replication_threshold:
            rest.setParam('xdcrOptimisticReplicationThreshold', self.optimistic_replication_threshold)
            opts['success_msg'] += ' xdcrOptimisticReplicationThreshold'

        if self.source_nozzle_per_node:
            rest.setParam('sourceNozzlePerNode', self.source_nozzle_per_node)
            opts['success_msg'] += ' xdcrSourceNozzlePerNode'

        if self.target_nozzle_per_node:
            rest.setParam('targetNozzlePerNode', self.target_nozzle_per_node)
            opts['success_msg'] += ' xdcrTargetNozzlePerNode'

        if self.log_level:
            rest.setParam('logLevel', self.log_level)
            opts['success_msg'] += ' xdcrLogLevel'

        if self.stats_interval:
            rest.setParam('statsInterval', self.stats_interval)
            opts['success_msg'] += ' xdcrStatsInterval'

        output_result = rest.restCmd(self.method,
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #16
0
 def compact_view(self, rest, server, port, bucket_name):
     opts = {}
     rest_query = util.restclient_factory(server, port, {'debug':self.debug}, self.ssl)
     rest_cmd = '/pools/default/buckets/%s/ddocs' % bucket_name
     ddoc_info = rest_query.restCmd('GET', urllib.quote(rest_cmd),
                                    self.user, self.password, opts)
     json = rest_query.getJson(ddoc_info)
     for row in json["rows"]:
         cmd = row["controllers"]["compact"]
         opts['error_msg'] = "fail to run task:%s" % cmd
         opts['success_msg'] = "run task:%s" % cmd
         data = rest.restCmd('POST', cmd,
                             self.user, self.password, opts)
         print data
예제 #17
0
 def compact_view(self, rest, server, port, bucket_name):
     opts = {}
     rest_query = util.restclient_factory(server, port,
                                          {'debug': self.debug}, self.ssl)
     rest_cmd = '/pools/default/buckets/%s/ddocs' % bucket_name
     ddoc_info = rest_query.restCmd('GET', urllib.quote(rest_cmd),
                                    self.user, self.password, opts)
     json = rest_query.getJson(ddoc_info)
     for row in json["rows"]:
         cmd = row["controllers"]["compact"]
         opts['error_msg'] = "fail to run task:%s" % cmd
         opts['success_msg'] = "run task:%s" % cmd
         data = rest.restCmd('POST', cmd, self.user, self.password, opts)
         print data
예제 #18
0
    def setting(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        opts = {
            'error_msg': "unable to set xdcr internal settings",
            'success_msg': "set xdcr settings"
        }

        if self.checkpoint_interval:
            rest.setParam('xdcrCheckpointInterval', self.checkpoint_interval)
            opts['success_msg'] += ' xdcrCheckpointInterval'

        if self.worker_batch_size:
            rest.setParam('xdcrWorkerBatchSize', self.worker_batch_size)
            opts['success_msg'] += ' xdcrWorkerBatchSize'

        if self.doc_batch_size:
            rest.setParam('xdcrDocBatchSizeKb', self.doc_batch_size)
            opts['success_msg'] += ' xdcrDocBatchSizeKb'

        if self.failure_restart_interval:
            rest.setParam('xdcrFailureRestartInterval',
                          self.failure_restart_interval)
            opts['success_msg'] += ' xdcrFailureRestartInterval'

        if self.optimistic_replication_threshold:
            rest.setParam('xdcrOptimisticReplicationThreshold',
                          self.optimistic_replication_threshold)
            opts['success_msg'] += ' xdcrOptimisticReplicationThreshold'

        if self.source_nozzle_per_node:
            rest.setParam('sourceNozzlePerNode', self.source_nozzle_per_node)
            opts['success_msg'] += ' xdcrSourceNozzlePerNode'

        if self.target_nozzle_per_node:
            rest.setParam('targetNozzlePerNode', self.target_nozzle_per_node)
            opts['success_msg'] += ' xdcrTargetNozzlePerNode'

        if self.log_level:
            rest.setParam('logLevel', self.log_level)
            opts['success_msg'] += ' xdcrLogLevel'

        if self.stats_interval:
            rest.setParam('statsInterval', self.stats_interval)
            opts['success_msg'] += ' xdcrStatsInterval'

        output_result = rest.restCmd(self.method, self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #19
0
    def setup_create(self, cmd):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        if not self.remote_cluster:
            print "Error: --xdcr-cluster-name is required to create/edit cluster connection"
            return
        else:
            rest.setParam('name', self.remote_cluster)
            if cmd == 'edit':
                self.rest_cmd = self.rest_cmd + "/" + urllib.quote(self.remote_cluster)

        if self.remote_hostname:
            rest.setParam('hostname', self.remote_hostname)
        else:
            print "Error: hostname (ip) is missing"
            return

        if self.remote_username:
            rest.setParam('username', self.remote_username)
        else:
            rest.setParam('username', "username")
        if self.remote_password:
            rest.setParam('password', self.remote_password)
        else:
            rest.setParam('password', "password")

        if self.demand_encryption:
            if self.demand_encryption not in [0, 1]:
                print "ERROR: xdcr-demand-encryption can only be either 0 or 1."
                return
            rest.setParam("demandEncryption", self.demand_encryption)
            if self.certificate:
                if os.path.isfile(self.certificate):
                    try:
                        fp = open(self.certificate, 'r')
                        raw_data = fp.read()
                        fp.close()
                        rest.setParam("certificate", raw_data)
                    except IOError, error:
                        print "Error:", error
                        return
                else:
                    print "ERROR: Fail to open certificate file from %s" % self.certificate
                    return
            else:
                print "ERROR: certificate required if encryption is demanded."
                return
예제 #20
0
    def compact_view(self, rest, server, port, bucket_name):
        opts = {}
        opts['error_msg'] = "unable to compact view; please check your username (-u) and password (-p);"
        opts['success_msg'] = "compact view for bucket"

        rest_query = util.restclient_factory(server, port, {'debug':self.debug}, self.ssl)
        rest_cmd = '/pools/default/buckets/%s/ddocs' % bucket_name
        ddoc_info = rest_query.restCmd('GET', urllib.quote(rest_cmd),
                                       self.user, self.password, opts)
        json = rest_query.getJson(ddoc_info)
        for row in json["rows"]:
            cmd = row["controllers"]["compact"]
            data = rest.restCmd('POST', cmd,
                                self.user, self.password, opts)
            print data
예제 #21
0
    def setup_create(self, cmd):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        if not self.remote_cluster:
            print "Error: --xdcr-cluster-name is required to create/edit cluster connection"
            return
        else:
            rest.setParam('name', self.remote_cluster)
            if cmd == 'edit':
                self.rest_cmd = self.rest_cmd + "/" + urllib.quote(
                    self.remote_cluster)

        if self.remote_hostname:
            rest.setParam('hostname', self.remote_hostname)
        else:
            print "Error: hostname (ip) is missing"
            return

        if self.remote_username:
            rest.setParam('username', self.remote_username)
        else:
            rest.setParam('username', "username")
        if self.remote_password:
            rest.setParam('password', self.remote_password)
        else:
            rest.setParam('password', "password")

        if self.demand_encryption:
            if self.demand_encryption not in [0, 1]:
                print "ERROR: xdcr-demand-encryption can only be either 0 or 1."
                return
            rest.setParam("demandEncryption", self.demand_encryption)
            if self.certificate:
                if os.path.isfile(self.certificate):
                    try:
                        fp = open(self.certificate, 'r')
                        raw_data = fp.read()
                        fp.close()
                        rest.setParam("certificate", raw_data)
                    except IOError, error:
                        print "Error:", error
                        return
                else:
                    print "ERROR: Fail to open certificate file from %s" % self.certificate
                    return
            else:
                print "ERROR: certificate required if encryption is demanded."
                return
예제 #22
0
    def setup_delete(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        if self.remote_cluster:
            self.rest_cmd = self.rest_cmd + "/" + urllib.quote(
                self.remote_cluster)
        else:
            print "Error: Cluster name is needed to delete cluster connections"
            return

        opts = {
            'error_msg': "unable to delete xdcr remote site %s" % self.server,
            'success_msg': "delete %s" % self.remote_cluster
        }
        output_result = rest.restCmd('DELETE', self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #23
0
    def replicate_stop(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)
        if self.replicator:
            self.rest_cmd = '/controller/cancelXCDR/' + urllib.quote_plus(
                self.replicator)
        else:
            print "Error: option --xdcr-replicator is needed to delete a replication"
            return

        opts = {
            'error_msg': "unable to delete replication",
            'success_msg': "delete replication"
        }
        output_result = rest.restCmd('DELETE', self.rest_cmd, self.user,
                                     self.password, opts)
        print output_result
예제 #24
0
    def replicate_list(self):
        rest = util.restclient_factory(self.server, self.port,
                                       {'debug': self.debug}, self.ssl)

        opts = {
            'error_msg': "unable to retrieve any replication streams",
            'success_msg': "list replication streams"
        }
        output_result = rest.restCmd('GET', '/pools/default/tasks', self.user,
                                     self.password, opts)
        tasks = rest.getJson(output_result)
        for task in tasks:
            if task["type"] == "xdcr":
                print 'stream id: %s' % task['id']
                print "   status: %s" % task["status"]
                print "   source: %s" % task["source"]
                print "   target: %s" % task["target"]
예제 #25
0
 def setup_list(self):
     rest = util.restclient_factory(self.server, self.port,
                                    {'debug': self.debug}, self.ssl)
     opts = {
         'error_msg': "unable to list xdcr remote cluster",
         'success_msg': "list remote cluster successfully",
     }
     output_result = rest.restCmd('GET', self.rest_cmd, self.user,
                                  self.password, opts)
     clusters = rest.getJson(output_result)
     if self.output == 'json':
         print output_result
     else:
         for cluster in clusters:
             if not cluster.get('deleted'):
                 print "cluster name: %s" % cluster["name"]
                 print "        uuid: %s" % cluster["uuid"]
                 print "   host name: %s" % cluster["hostname"]
                 print "   user name: %s" % cluster["username"]
                 print "         uri: %s" % cluster["uri"]
예제 #26
0
    def replicate_stop(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        if self.replicator:
            self.rest_cmd = '/controller/cancelXCDR/' + urllib.quote_plus(self.replicator)
        else:
            print "Error: option --xdcr-replicator is needed to delete a replication"
            return

        opts = {
            'error_msg': "unable to delete replication",
            'success_msg': "delete replication"
        }
        output_result = rest.restCmd('DELETE',
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #27
0
    def setup_delete(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)
        if self.remote_cluster:
            self.rest_cmd = self.rest_cmd + "/" + urllib.quote(self.remote_cluster)
        else:
            print "Error: Cluster name is needed to delete cluster connections"
            return

        opts = {
            'error_msg': "unable to delete xdcr remote site %s" % self.server,
            'success_msg': "delete %s" % self.remote_cluster
        }
        output_result = rest.restCmd('DELETE',
                                     self.rest_cmd,
                                     self.user,
                                     self.password,
                                     opts)
        print output_result
예제 #28
0
    def replicate_list(self):
        rest = util.restclient_factory(self.server,
                                     self.port,
                                     {'debug':self.debug},
                                     self.ssl)

        opts = {
            'error_msg': "unable to retrieve any replication streams",
            'success_msg': "list replication streams"
        }
        output_result = rest.restCmd('GET',
                                     '/pools/default/tasks',
                                     self.user,
                                     self.password,
                                     opts)
        tasks = rest.getJson(output_result)
        for task in tasks:
            if task["type"] == "xdcr":
                print 'stream id: %s' % task['id']
                print "   status: %s" % task["status"]
                print "   source: %s" % task["source"]
                print "   target: %s" % task["target"]
예제 #29
0
    def runCmd(self, cmd, server, port,
               user, password, ssl, opts):
        self.user = user
        self.password = password
        self.ssl = ssl

        bucketname = ''
        buckettype = ''
        authtype = 'sasl'
        bucketport = '11211'
        bucketpassword = ''
        bucketramsize = ''
        bucketreplication = ''
        bucketpriority = None
        eviction_policy = None
        output = 'default'
        wait_for_bucket_ready = False
        enable_flush = None
        enable_replica_index = None
        force = False
        compact_data_only = False
        compact_view_only = False
        enable_clock_sync = None

        for (o, a) in opts:
            if o in ('-b', '--bucket'):
                bucketname = a
            elif o == '--bucket-type':
                buckettype = a
            elif o == '--bucket-port':
                bucketport = a
            elif o == '--bucket-password':
                bucketpassword = a
            elif o == '--bucket-ramsize':
                bucketramsize = a
            elif o == '--bucket-replica':
                bucketreplication = a
            elif o == '--bucket-eviction-policy':
                eviction_policy = a
            elif o == '--bucket-priority':
                bucketpriority = a
            elif o == '-d' or o == '--debug':
                self.debug = True
            elif o in ('-o', '--output'):
                output = a
            elif o == '--enable-flush':
                enable_flush = a
            elif o == '--enable-index-replica':
                enable_replica_index = a
            elif o == '--wait':
                wait_for_bucket_ready = True
            elif o == '--force':
                force = True
            elif o == '--data-only':
                compact_data_only = True
            elif o == '--view-only':
                compact_view_only = True
            elif o == '--enable-clock-sync':
                enable_clock_sync = a

        self.rest_cmd = rest_cmds[cmd]
        rest = util.restclient_factory(server, port, {'debug':self.debug}, self.ssl)
        #rest = restclient.RestClient(server, port, {'debug':self.debug})
        # get the parameters straight
        opts = {}
        opts['error_msg'] = "unable to %s;" % cmd
        opts['success_msg'] = "%s" % cmd

        if cmd in ('bucket-create', 'bucket-edit'):
            if bucketname:
                rest.setParam('name', bucketname)
                if bucketname == "default":
                    if bucketport and bucketport != "11211":
                        command_error("default bucket must be on port 11211.")
                    if bucketpassword:
                        command_error("default bucket should only have empty password.")
                    authtype = 'sasl'
                else:
                    if bucketport == "11211":
                        authtype = 'sasl'
                    else:
                        authtype = 'none'
                        if bucketpassword:
                            command_error("a sasl bucket is supported only on port 11211.")
            if buckettype:
                rest.setParam('bucketType', buckettype)
            if authtype:
                rest.setParam('authType', authtype)
            if bucketport:
                rest.setParam('proxyPort', bucketport)
            if bucketpassword:
                rest.setParam('saslPassword', bucketpassword)
            if bucketramsize:
                rest.setParam('ramQuotaMB', bucketramsize)
            if bucketreplication:
                rest.setParam('replicaNumber', bucketreplication)
            if enable_flush:
                rest.setParam('flushEnabled', enable_flush)
            if enable_clock_sync:
                reset.setParam('enableClockSync', enable_clock_sync)
            if eviction_policy:
                if eviction_policy in ['valueOnly', 'fullEviction']:
                    rest.setParam('evictionPolicy', eviction_policy)
                else:
                    command_error("eviction policy value should be either 'valueOnly' or 'fullEviction'.")
            if enable_replica_index and cmd == 'bucket-create':
                rest.setParam('replicaIndex', enable_replica_index)
            if bucketpriority:
                if bucketpriority in priority:
                    rest.setParam('threadsNumber', priority[bucketpriority])
                else:
                    command_error("bucket priority must be either low or high.")

        if cmd in ('bucket-delete', 'bucket-flush', 'bucket-edit'):
            self.rest_cmd = self.rest_cmd + bucketname
        if cmd == 'bucket-flush':
            self.rest_cmd = self.rest_cmd + '/controller/doFlush'
            if not force:
                question = "Running this command will totally PURGE database data from disk. " + \
                           "Do you really want to do it? (Yes/No)"
                confirm = raw_input(question)
                if confirm in ('Y', 'Yes'):
                    print "\nDatabase data will be purged from disk ..."
                else:
                    print "\nDatabase data will not be purged. Done."
                    return False
            else:
                print "Database data will be purged from disk ..."
            opts['error_msg'] = "unable to %s; please check if the bucket exists or not;" % cmd
        elif cmd == 'bucket-compact':
            if compact_data_only and compact_view_only:
                print "You cannot compact data only and view only at the same time."
                return False
            elif compact_data_only:
                self.rest_cmd = self.rest_cmd + bucketname + '/controller/compactDatabases'
            elif compact_view_only:
                self.compact_view(rest, server, port, bucketname)
                return True
            else:
                self.rest_cmd = self.rest_cmd + bucketname + '/controller/compactBucket'
        elif cmd == 'bucket-ddocs':
            self.rest_cmd = self.rest_cmd % bucketname

        data = rest.restCmd(methods[cmd], urllib.quote(self.rest_cmd),
                            self.user, self.password, opts)

        if cmd in ("bucket-get", "bucket-stats", "bucket-node-stats", "bucket-ddocs"):
            return rest.getJson(data)
        elif cmd == "bucket-list":
            if output == 'json':
                print data
            else:
                json = rest.getJson(data)
                for bucket in json:
                    print '%s' % bucket['name']
                    print ' bucketType: %s' % bucket['bucketType']
                    print ' authType: %s' % bucket['authType']
                    if bucket['authType'] == "sasl":
                        print ' saslPassword: %s' % bucket['saslPassword']
                    else:
                        print ' proxyPort: %s' % bucket['proxyPort']
                    print ' numReplicas: %s' % bucket['replicaNumber']
                    print ' ramQuota: %s' % bucket['quota']['ram']
                    print ' ramUsed: %s' % bucket['basicStats']['memUsed']
        elif cmd == "bucket-create" and wait_for_bucket_ready:
            rest_query = util.restclient_factory(server, port, {'debug':self.debug}, self.ssl)
            timeout_in_seconds = 120
            start = time.time()
            # Make sure the bucket exists before querying its status
            bucket_exist = False
            while (time.time() - start) <= timeout_in_seconds and not bucket_exist:
                buckets = rest_query.restCmd('GET', rest_cmds['bucket-list'],
                                             self.user, self.password, opts)
                for bucket in rest_query.getJson(buckets):
                    if bucket["name"] == bucketname:
                        bucket_exist = True
                        break
                if not bucket_exist:
                    sys.stderr.write(".")
                    time.sleep(2)

            if not bucket_exist:
                print "\nFail to create bucket '%s' within %s seconds" %\
                      (bucketname, timeout_in_seconds)
                return False

            #Query status for all bucket nodes
            while (time.time() - start) <= timeout_in_seconds:
                bucket_info = rest_query.restCmd('GET', urllib.quote(rest_cmds['bucket-info'] % bucketname),
                                                 self.user, self.password, opts)
                json = rest_query.getJson(bucket_info)
                all_node_ready = True
                for node in json["nodes"]:
                    if node["status"] != "healthy":
                        all_node_ready = False
                        break
                if all_node_ready:
                    if output == 'json':
                        print rest.jsonMessage(data)
                    else:
                        print data
                    return True
                else:
                    sys.stderr.write(".")
                    time.sleep(2)

            print "\nBucket '%s' is created but not ready to use within %s seconds" %\
                 (bucketname, timeout_in_seconds)
            return False
        else:
            if output == 'json':
                print rest.jsonMessage(data)
            else:
                print data
예제 #30
0
    def runCmd(self, cmd, server, port, user, password, ssl, opts):
        self.user = user
        self.password = password
        self.ssl = ssl

        bucketname = ''
        buckettype = ''
        authtype = 'sasl'
        bucketport = '11211'
        bucketpassword = ''
        bucketramsize = ''
        bucketreplication = ''
        bucketpriority = None
        eviction_policy = None
        output = 'default'
        wait_for_bucket_ready = False
        enable_flush = None
        enable_replica_index = None
        force = False
        compact_data_only = False
        compact_view_only = False

        for (o, a) in opts:
            if o in ('-b', '--bucket'):
                bucketname = a
            elif o == '--bucket-type':
                buckettype = a
            elif o == '--bucket-port':
                bucketport = a
            elif o == '--bucket-password':
                bucketpassword = a
            elif o == '--bucket-ramsize':
                bucketramsize = a
            elif o == '--bucket-replica':
                bucketreplication = a
            elif o == '--bucket-eviction-policy':
                eviction_policy = a
            elif o == '--bucket-priority':
                bucketpriority = a
            elif o == '-d' or o == '--debug':
                self.debug = True
            elif o in ('-o', '--output'):
                output = a
            elif o == '--enable-flush':
                enable_flush = a
            elif o == '--enable-index-replica':
                enable_replica_index = a
            elif o == '--wait':
                wait_for_bucket_ready = True
            elif o == '--force':
                force = True
            elif o == '--data-only':
                compact_data_only = True
            elif o == '--view-only':
                compact_view_only = True

        self.rest_cmd = rest_cmds[cmd]
        rest = util.restclient_factory(server, port, {'debug': self.debug},
                                       self.ssl)
        #rest = restclient.RestClient(server, port, {'debug':self.debug})
        # get the parameters straight
        opts = {}
        opts['error_msg'] = "unable to %s;" % cmd
        opts['success_msg'] = "%s" % cmd

        if cmd in ('bucket-create', 'bucket-edit'):
            if bucketname:
                rest.setParam('name', bucketname)
                if bucketname == "default":
                    if bucketport and bucketport != "11211":
                        command_error("default bucket must be on port 11211.")
                    if bucketpassword:
                        command_error(
                            "default bucket should only have empty password.")
                    authtype = 'sasl'
                else:
                    if bucketport == "11211":
                        authtype = 'sasl'
                    else:
                        authtype = 'none'
                        if bucketpassword:
                            command_error(
                                "a sasl bucket is supported only on port 11211."
                            )
            if buckettype:
                rest.setParam('bucketType', buckettype)
            if authtype:
                rest.setParam('authType', authtype)
            if bucketport:
                rest.setParam('proxyPort', bucketport)
            if bucketpassword:
                rest.setParam('saslPassword', bucketpassword)
            if bucketramsize:
                rest.setParam('ramQuotaMB', bucketramsize)
            if bucketreplication:
                rest.setParam('replicaNumber', bucketreplication)
            if enable_flush:
                rest.setParam('flushEnabled', enable_flush)
            if eviction_policy:
                if eviction_policy in ['valueOnly', 'fullEviction']:
                    rest.setParam('evictionPolicy', eviction_policy)
                else:
                    command_error(
                        "eviction policy value should be either 'valueOnly' or 'fullEviction'."
                    )
            if enable_replica_index and cmd == 'bucket-create':
                rest.setParam('replicaIndex', enable_replica_index)
            if bucketpriority:
                if bucketpriority in priority:
                    rest.setParam('threadsNumber', priority[bucketpriority])
                else:
                    command_error(
                        "bucket priority must be either low or high.")

        if cmd in ('bucket-delete', 'bucket-flush', 'bucket-edit'):
            self.rest_cmd = self.rest_cmd + bucketname
        if cmd == 'bucket-flush':
            self.rest_cmd = self.rest_cmd + '/controller/doFlush'
            if not force:
                question = "Running this command will totally PURGE database data from disk. " + \
                           "Do you really want to do it? (Yes/No)"
                confirm = raw_input(question)
                if confirm in ('Y', 'Yes'):
                    print "\nDatabase data will be purged from disk ..."
                else:
                    print "\nDatabase data will not be purged. Done."
                    return False
            else:
                print "Database data will be purged from disk ..."
            opts[
                'error_msg'] = "unable to %s; please check if the bucket exists or not;" % cmd
        elif cmd == 'bucket-compact':
            if compact_data_only and compact_view_only:
                print "You cannot compact data only and view only at the same time."
                return False
            elif compact_data_only:
                self.rest_cmd = self.rest_cmd + bucketname + '/controller/compactDatabases'
            elif compact_view_only:
                self.compact_view(rest, server, port, bucketname)
                return True
            else:
                self.rest_cmd = self.rest_cmd + bucketname + '/controller/compactBucket'
        elif cmd == 'bucket-ddocs':
            self.rest_cmd = self.rest_cmd % bucketname

        data = rest.restCmd(methods[cmd], urllib.quote(self.rest_cmd),
                            self.user, self.password, opts)

        if cmd in ("bucket-get", "bucket-stats", "bucket-node-stats",
                   "bucket-ddocs"):
            return rest.getJson(data)
        elif cmd == "bucket-list":
            if output == 'json':
                print data
            else:
                json = rest.getJson(data)
                for bucket in json:
                    print '%s' % bucket['name']
                    print ' bucketType: %s' % bucket['bucketType']
                    print ' authType: %s' % bucket['authType']
                    if bucket['authType'] == "sasl":
                        print ' saslPassword: %s' % bucket['saslPassword']
                    else:
                        print ' proxyPort: %s' % bucket['proxyPort']
                    print ' numReplicas: %s' % bucket['replicaNumber']
                    print ' ramQuota: %s' % bucket['quota']['ram']
                    print ' ramUsed: %s' % bucket['basicStats']['memUsed']
        elif cmd == "bucket-create" and wait_for_bucket_ready:
            rest_query = util.restclient_factory(server, port,
                                                 {'debug': self.debug},
                                                 self.ssl)
            timeout_in_seconds = 120
            start = time.time()
            # Make sure the bucket exists before querying its status
            bucket_exist = False
            while (time.time() -
                   start) <= timeout_in_seconds and not bucket_exist:
                buckets = rest_query.restCmd('GET', rest_cmds['bucket-list'],
                                             self.user, self.password, opts)
                for bucket in rest_query.getJson(buckets):
                    if bucket["name"] == bucketname:
                        bucket_exist = True
                        break
                if not bucket_exist:
                    sys.stderr.write(".")
                    time.sleep(2)

            if not bucket_exist:
                print "\nFail to create bucket '%s' within %s seconds" %\
                      (bucketname, timeout_in_seconds)
                return False

            #Query status for all bucket nodes
            while (time.time() - start) <= timeout_in_seconds:
                bucket_info = rest_query.restCmd(
                    'GET', urllib.quote(rest_cmds['bucket-info'] % bucketname),
                    self.user, self.password, opts)
                json = rest_query.getJson(bucket_info)
                all_node_ready = True
                for node in json["nodes"]:
                    if node["status"] != "healthy":
                        all_node_ready = False
                        break
                if all_node_ready:
                    if output == 'json':
                        print rest.jsonMessage(data)
                    else:
                        print data
                    return True
                else:
                    sys.stderr.write(".")
                    time.sleep(2)

            print "\nBucket '%s' is created but not ready to use within %s seconds" %\
                 (bucketname, timeout_in_seconds)
            return False
        else:
            if output == 'json':
                print rest.jsonMessage(data)
            else:
                print data