Merge branch 'master' into displayquota

This commit is contained in:
zhuyj17 2016-04-15 23:33:35 +08:00
commit 5f5ee95f8c
6 changed files with 81 additions and 19 deletions

View File

@ -25,7 +25,7 @@ class Container(object):
logger.info("create container %s of %s for %s" %(lxc_name, clustername, username))
try:
user_info = json.loads(user_info)
cpu = user_info["data"]["groupinfo"]["cpu"]
cpu = int(user_info["data"]["groupinfo"]["cpu"]) * 100000
memory = user_info["data"]["groupinfo"]["memory"]
disk = user_info["data"]["groupinfo"]["disk"]
image = json.loads(image)

View File

@ -23,9 +23,11 @@ class Guest(object):
subprocess.getoutput(self.libpath+"/userinit.sh guest")
user_info = {}
user_info["data"] = {}
user_info["data"]["group"] = "primary"
user_info["data"]["groupinfo"] = {}
user_info["data"]["groupinfo"]["cpu"] = 100000
user_info["data"]["groupinfo"]["cpu"] = 4
user_info["data"]["groupinfo"]["memory"] = 2000
user_info["data"]["groupinfo"]["disk"] = 2000
user_info = json.dumps(user_info)
self.G_vclustermgr.create_cluster("guestspace", "guest", image, user_info)
while True:

View File

@ -247,6 +247,7 @@ class NetworkMgr(object):
self.users = {}
self.vlanids = {}
self.init_vlanids(4095, 60)
self.init_shared_vlanids()
self.dump_center()
self.dump_system()
elif mode == 'recovery':
@ -258,6 +259,7 @@ class NetworkMgr(object):
self.load_center()
self.load_system()
self.load_vlanids()
self.load_shared_vlanids()
else:
logger.error("mode: %s not supported" % mode)
@ -270,6 +272,17 @@ class NetworkMgr(object):
self.vlanids['currentindex'] = i+1
self.etcd.setkey("network/vlanids/"+str(i+1), json.dumps(self.vlanids['currentpool']))
self.etcd.setkey("network/vlanids/current", str(i+1))
def init_shared_vlanids(self, vlannum = 128, sharenum = 128):
self.shared_vlanids = []
for i in range(vlannum):
shared_vlanid = {}
[status, shared_vlanid['vlanid']] = self.acquire_vlanid()
shared_vlanid['sharenum'] = sharenum
self.shared_vlanids.append(shared_vlanid)
self.etcd.setkey("network/shared_vlanids", json.dumps(self.shared_vlanids))
def load_vlanids(self):
[status, info] = self.etcd.getkey("network/vlanids/info")
@ -291,6 +304,13 @@ class NetworkMgr(object):
pass
else:
self.etcd.setkey("network/vlanids/"+str(self.vlanids['currentindex']), json.dumps(self.vlanids['currentpool']))
def load_shared_vlanids(self):
[status, shared_vlanids] = self.etcd.getkey("network/shared_vlanids")
self.shared_vlanids = json.loads(shared_vlanids)
def dump_shared_vlanids(self):
self.etcd.setkey("network/shared_vlanids", json.dumps(self.shared_vlanids))
def load_center(self):
[status, centerdata] = self.etcd.getkey("network/center")
@ -327,7 +347,18 @@ class NetworkMgr(object):
print ("<vlanids>")
print (str(self.vlanids['currentindex'])+":"+str(self.vlanids['currentpool']))
def acquire_vlanid(self):
def acquire_vlanid(self, isshared = False):
if isshared:
if self.shared_vlanids[0]['sharenum'] == 0:
self.shared_vlanids.append(self.shared_vlanids.pop(0))
if self.shared_vlanids[0]['sharenum'] == 0:
logger.info("shared vlanids not enough, add user to full vlanids")
for shared_vlanid in self.shared_vlanids:
shared_vlanid['sharenum'] = 128
self.shared_vlanids[0]['sharenum'] -= 1
self.dump_shared_vlanids()
return [True, self.shared_vlanids[0]['vlanid']]
if self.vlanids['currentpool'] == []:
if self.vlanids['currentindex'] == 0:
return [False, "No VLAN IDs"]
@ -350,7 +381,7 @@ class NetworkMgr(object):
self.dump_vlanids()
return [True, "Release VLAN ID success"]
def add_user(self, username, cidr):
def add_user(self, username, cidr, isshared = False):
logger.info ("add user %s with cidr=%s" % (username, str(cidr)))
if self.has_user(username):
return [False, "user already exists in users set"]
@ -358,7 +389,7 @@ class NetworkMgr(object):
self.dump_center()
if status == False:
return [False, result]
[status, vlanid] = self.acquire_vlanid()
[status, vlanid] = self.acquire_vlanid(isshared)
if status:
vlanid = int(vlanid)
else:
@ -372,7 +403,7 @@ class NetworkMgr(object):
del self.users[username]
return [True, 'add user success']
def del_user(self, username):
def del_user(self, username, isshared = False):
logger.info ("delete user %s with cidr=%s" % (username))
if not self.has_user(username):
return [False, username+" not in users set"]
@ -380,7 +411,8 @@ class NetworkMgr(object):
[addr, cidr] = self.users[username].info.split('/')
self.center.free(addr, int(cidr))
self.dump_center()
self.release_vlanid(self.users[username].vlanid)
if not isshared:
self.release_vlanid(self.users[username].vlanid)
netcontrol.del_gw('docklet-br', username)
self.etcd.deldir("network/users/"+username)
del self.users[username]

View File

@ -149,12 +149,24 @@ class userManager:
if not os.path.exists(fspath+"/global/sys/quota"):
groupfile = open(fspath+"/global/sys/quota",'w')
groups = []
groups.append({'name':'root', 'quotas':{ 'cpu':'100000', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'network':'8' }})
groups.append({'name':'admin', 'quotas':{'cpu':'100000', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'network':'8'}})
groups.append({'name':'primary', 'quotas':{'cpu':'100000', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'network':'8'}})
groups.append({'name':'fundation', 'quotas':{'cpu':'100000', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'network':'8'}})
groups.append({'name':'root', 'quotas':{ 'cpu':'4', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'vnode':'8' }})
groups.append({'name':'admin', 'quotas':{'cpu':'4', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'vnode':'8'}})
groups.append({'name':'primary', 'quotas':{'cpu':'4', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'vnode':'8'}})
groups.append({'name':'fundation', 'quotas':{'cpu':'4', 'disk':'2000', 'memory':'2000', 'image':'10', 'idletime':'24', 'vnode':'8'}})
groupfile.write(json.dumps(groups))
groupfile.close()
if not os.path.exists(fspath+"/global/sys/quotainfo"):
quotafile = open(fspath+"/global/sys/quotainfo",'w')
quotas = []
quotas.append({'name':'cpu', 'hint':'the cpu quota, number of cores, e.g. 4'})
quotas.append({'name':'memory', 'hint':'the memory quota, number of MB , e.g. 4000'})
quotas.append({'name':'disk', 'hint':'the disk quota, number of MB, e.g. 4000'})
quotas.append({'name':'image', 'hint':'how many images the user can save, e.g. 10'})
quotas.append({'name':'idletime', 'hint':'will stop cluster after idletime, number of hours, e.g. 24'})
quotas.append({'name':'vnode', 'hint':'how many containers the user can have, e.g. 8'})
quotafile.write(json.dumps(quotas))
quotafile.close()
def auth_local(self, username, password):
password = hashlib.sha512(password.encode('utf-8')).hexdigest()
@ -458,10 +470,13 @@ class userManager:
groupfile = open(fspath+"/global/sys/quota",'r')
groups = json.loads(groupfile.read())
groupfile.close()
quotafile = open(fspath+"/global/sys/quotainfo",'r')
quotas = json.loads(quotafile.read())
quotafile.close()
result = {
"success": 'true',
"groups": groups,
"quotas": list(groups[0]['quotas'].keys()),
"quotas": quotas,
}
return result
@ -608,6 +623,7 @@ class userManager:
form = kwargs.get('form')
quotaname = form.getvalue("quotaname")
default_value = form.getvalue("default_value")
hint = form.getvalue("hint")
if (quotaname == None):
return { "success":'false', "reason": "Empty quota name"}
if (default_value == None):
@ -620,6 +636,13 @@ class userManager:
groupfile = open(fspath+"/global/sys/quota",'w')
groupfile.write(json.dumps(groups))
groupfile.close()
quotafile = open(fspath+"/global/sys/quotainfo",'r')
quotas = json.loads(quotafile.read())
quotafile.close()
quotas.append({'name':quotaname, 'hint':hint})
quotafile = open(fspath+"/global/sys/quotainfo",'w')
quotafile.write(json.dumps(quotas))
quotafile.close()
return {"success":'true'}
@administration_required

View File

@ -59,12 +59,13 @@ class VclusterMgr(object):
logger.info ("starting cluster %s with %d containers for %s" % (clustername, int(clustersize), username))
workers = self.nodemgr.get_rpcs()
image_json = json.dumps(image)
groupname = json.loads(user_info)["data"]["group"]
if (len(workers) == 0):
logger.warning ("no workers to start containers, start cluster failed")
return [False, "no workers are running"]
# check user IP pool status, should be moved to user init later
if not self.networkmgr.has_user(username):
self.networkmgr.add_user(username, cidr=29)
self.networkmgr.add_user(username, cidr=29, isshared = True if str(groupname) == "fundation" else False)
[status, result] = self.networkmgr.acquire_userips_cidr(username, clustersize)
gateway = self.networkmgr.get_usergw(username)
vlanid = self.networkmgr.get_uservlanid(username)

View File

@ -57,8 +57,8 @@
</div>
{% for quota in quotas %}
<div class="form-group">
<label>{{ quota }}</label>
<input type="text" placeholder="Enter {{ quota }}" class="form-control" name={{ quota }} />
<label>{{ quota['name'] }}</label>
<input type="text" class="form-control" name={{ quota['name'] }} placeholder="{{quota['hint']}}" />
</div>
{% endfor %}
</form>
@ -92,6 +92,10 @@
<label>Default Value</label>
<input type="text" placeholder="Enter Default Value" class="form-control" name="default_value"/>
</div>
<div class="form-group">
<label>Hint</label>
<input type="text" placeholder="Enter Hint" class="form-control" name="hint"/>
</div>
</form>
</div>
@ -107,7 +111,7 @@
<tr>
<th>Name</th>
{% for quota in quotas %}
<th> {{ quota }} </th>
<th> {{ quota['name'] }} </th>
{% endfor %}
<th>Command</th>
</tr>
@ -117,7 +121,7 @@
<tr>
<th>{{ group['name'] }}</th>
{% for quota in quotas %}
<th> {{ group['quotas'][quota] }} </th>
<th> {{ group['quotas'][quota['name']] }} </th>
{% endfor %}
<th><a class="btn btn-xs btn-info" data-toggle="modal" data-target="#ModifyGroupModal_{{ group['name'] }}">Edit</a>&nbsp;
{% if group['name'] in [ "root", "primary", "admin", "fundation" ] %}
@ -142,8 +146,8 @@
</div>
{% for quota in quotas %}
<div class="form-group">
<label> {{ quota }}</label>
<input type="text" placeholder="Enter {{ quota }}" class="form-control" name={{ quota }} value={{ group['quotas'][quota] }} />
<label> {{ quota['name'] }}</label>
<input type="text" placeholder="{{ quota['hint'] }}" class="form-control" name={{ quota['name'] }} value={{ group['quotas'][quota['name']] }} />
</div>
{% endfor %}
</div>