Merge branch 'master' into displayquota
This commit is contained in:
commit
5f5ee95f8c
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
{% 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>
|
||||
|
|
Loading…
Reference in New Issue