Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 126 lines (106 sloc) 4.595 kb
#!/usr/bin/env python
import os, sys, getopt, urllib2, urllib, json
from urllib2 import HTTPError
valid_bucket_types = ["membase", "memcached"]
valid_service_types = {"kv", "n1ql", "index"}
def usage():
print "usage: \n\
-n <number of nodes>\n\
-T <services to run. kv if unspecified> (eg: n0:kv,n1:index+n1ql)\n\
-s <memory size (min 256) default: 256\n\
-t <bucket type> (membase, memcached) default: membase\n\
-r <num replicas> (max 3) default: 1 (Only for membase buckets!)\n\
-i (don't index replicas) default: replica index enabled\n\
-S <start index> default: 0"
class PasswordManager(urllib2.HTTPPasswordMgr):
def __init__(self, username, password):
self.auth = (username, password)
def find_user_password(self, realm, authuri):
return self.auth
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "n:t:s:r:iS:T:")
except getopt.GetoptError, err:
print str(err)
usage()
sys.exit()
nodes = 0
buckettype = "membase"
memsize = 256
replicas = 1
replica_index = True
start_index = 0
deploy = {}
data_base_path = os.getcwd() + "/data"
for o, a in opts:
if o == "-n":
nodes = int(a)
elif o == "-t":
buckettype = a
elif o == "-s":
memsize = a
elif o == "-r":
replicas = a
elif o == "-i":
replica_index = False
elif o == "-S":
start_index = int(a)
elif o == "-T":
plan = dict(e.split(':') for e in a.replace(' ','').split(','))
deploy = dict([(k, v.split('+')) for k, v in plan.items()])
else:
usage()
sys.exit()
deploy["n0"] = deploy.get("n0", []) + ["kv"]
if nodes == 0 or buckettype not in valid_bucket_types or \
int(memsize) < 256 or int(replicas) > 3 or \
not set(deploy.keys()) <= set(["n" + str(i) for i in range(nodes)]) or \
not set(reduce(lambda x,y:x+y, deploy.values(), [])) <= valid_service_types:
usage()
sys.exit()
password_mgr = PasswordManager("Administrator", "asdasd")
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
o = urllib2.build_opener(handler)
print "Connecting {0} nodes, bucket type {1}, mem size {2} " \
"with {3} replica copies, start index {4}, password asdasd, "\
"deployment plan {5}\n".format(nodes, buckettype,
memsize, replicas, start_index,
str(deploy))
base_port = 9000 + start_index
services = deploy["n0"]
print "Connecting node 0 with services {0}".format(str(services))
o.open("http://127.0.0.1:{0}/node/controller/setupServices".format(base_port),
"services={0}".format(",".join(services))).read()
o.open("http://127.0.0.1:{0}/pools/default".format(base_port),
"memoryQuota=" + str(memsize)).read()
o.open("http://127.0.0.1:{0}/pools/default/buckets".format(base_port),
"name=default" +
"&authType=sasl" +
"&saslPassword=" +
"&bucketType=" + buckettype +
"&ramQuotaMB=" + str(memsize) +
"&replicaNumber=" + str(replicas) +
"&replicaIndex=" + bool_request_value(replica_index)).read()
o.open("http://127.0.0.1:{0}/settings/web".format(base_port),
"port=SAME&username=Administrator&password=asdasd").read()
for i in range(1, nodes):
port = base_port + i
services = deploy.get("n" + str(i), [])
if not services: services = ["kv"]
print "Connecting node {0} with services {1}".format(i, str(services))
o.open("http://127.0.0.1:{0}/node/controller/doJoinCluster".format(port),
"user=Administrator&password=asdasd&" +
"clusterMemberHostIp=127.0.0.1" +
"&clusterMemberPort={0}".format(base_port) +
"&services={0}".format(",".join(services))).read()
print "Getting node list"
info = json.loads(o.open("http://127.0.0.1:{0}/nodeStatuses".format(base_port)).read())
print "Servers added, triggering rebalance."
o.open("http://127.0.0.1:{0}/controller/rebalance".format(base_port),
urllib.urlencode(
{'knownNodes': ",".join([info[k]['otpNode'] for k in info]),
'ejectedNodes': ''})).read()
def bool_request_value(Value):
return "1" if Value else "0"
if __name__ == '__main__':
main()
Jump to Line
Something went wrong with that request. Please try again.