Display image size when creating vcluster.
Compare image size and disk size when creating vcluster.
This commit is contained in:
parent
613c5cee4a
commit
ad84d416bb
|
@ -116,6 +116,8 @@ class VclusterMgr(object):
|
||||||
def create_cluster(self, clustername, username, image, user_info, setting):
|
def create_cluster(self, clustername, username, image, user_info, setting):
|
||||||
if self.is_cluster(clustername, username):
|
if self.is_cluster(clustername, username):
|
||||||
return [False, "cluster:%s already exists" % clustername]
|
return [False, "cluster:%s already exists" % clustername]
|
||||||
|
if self.imgmgr.get_image_size(image) + 100 > int(setting["disk"]):
|
||||||
|
return [False, "the size of disk is not big enough for the image"]
|
||||||
clustersize = int(self.defaultsize)
|
clustersize = int(self.defaultsize)
|
||||||
logger.info ("starting cluster %s with %d containers for %s" % (clustername, int(clustersize), username))
|
logger.info ("starting cluster %s with %d containers for %s" % (clustername, int(clustersize), username))
|
||||||
workers = self.nodemgr.get_nodeips()
|
workers = self.nodemgr.get_nodeips()
|
||||||
|
@ -202,6 +204,8 @@ class VclusterMgr(object):
|
||||||
def scale_out_cluster(self,clustername,username, image,user_info, setting):
|
def scale_out_cluster(self,clustername,username, image,user_info, setting):
|
||||||
if not self.is_cluster(clustername,username):
|
if not self.is_cluster(clustername,username):
|
||||||
return [False, "cluster:%s not found" % clustername]
|
return [False, "cluster:%s not found" % clustername]
|
||||||
|
if self.imgmgr.get_image_size(image) + 100 > int(setting["disk"]):
|
||||||
|
return [False, "the size of disk is not big enough for the image"]
|
||||||
workers = self.nodemgr.get_nodeips()
|
workers = self.nodemgr.get_nodeips()
|
||||||
if (len(workers) == 0):
|
if (len(workers) == 0):
|
||||||
logger.warning("no workers to start containers, scale out failed")
|
logger.warning("no workers to start containers, scale out failed")
|
||||||
|
|
|
@ -380,6 +380,29 @@ class ImageMgr():
|
||||||
return ""
|
return ""
|
||||||
return image.description
|
return image.description
|
||||||
|
|
||||||
|
def get_image_size(self, image):
|
||||||
|
imagename = image['name']
|
||||||
|
imagetype = image['type']
|
||||||
|
imageowner = image['owner']
|
||||||
|
if imagename == "base" and imagetype == "base":
|
||||||
|
return 0
|
||||||
|
if imagetype == "private":
|
||||||
|
imgpath = self.imgpath + "private/" + user + "/"
|
||||||
|
else:
|
||||||
|
imgpath = self.imgpath + "public/" + imageowner + "/"
|
||||||
|
return os.stat(os.path.join(imgpath, imagename)).st_size // (1024*1024)
|
||||||
|
|
||||||
|
|
||||||
|
def format_size(self, size_in_byte):
|
||||||
|
if size_in_byte < 1024:
|
||||||
|
return str(size_in_byte) + "B"
|
||||||
|
elif size_in_byte < 1024*1024:
|
||||||
|
return str(size_in_byte//1024) + "KB"
|
||||||
|
elif size_in_byte < 1024*1024*1024:
|
||||||
|
return str(size_in_byte//(1024*1024)) + "MB"
|
||||||
|
else:
|
||||||
|
return str(size_in_byte//(1024*1024*1024)) + "GB"
|
||||||
|
|
||||||
def list_images(self,user):
|
def list_images(self,user):
|
||||||
images = {}
|
images = {}
|
||||||
images["private"] = []
|
images["private"] = []
|
||||||
|
@ -398,6 +421,9 @@ class ImageMgr():
|
||||||
[time, description] = self.get_image_info(user, imagename, "private")
|
[time, description] = self.get_image_info(user, imagename, "private")
|
||||||
fimage["time"] = time
|
fimage["time"] = time
|
||||||
fimage["description"] = description
|
fimage["description"] = description
|
||||||
|
fimage["size"] = os.stat(os.path.join(imgpath, image)).st_size
|
||||||
|
fimage["size_format"] = self.format_size(fimage["size"])
|
||||||
|
fimage["size_in_mb"] = fimage["size"] // (1024*1024)
|
||||||
images["private"].append(fimage)
|
images["private"].append(fimage)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
@ -423,6 +449,9 @@ class ImageMgr():
|
||||||
[time, description] = self.get_image_info(public_user, imagename, "public")
|
[time, description] = self.get_image_info(public_user, imagename, "public")
|
||||||
fimage["time"] = time
|
fimage["time"] = time
|
||||||
fimage["description"] = description
|
fimage["description"] = description
|
||||||
|
fimage["size"] = os.stat(os.path.join(imgpath, image)).st_size
|
||||||
|
fimage["size_format"] = self.format_size(fimage["size"])
|
||||||
|
fimage["size_in_mb"] = fimage["size"] // (1024*1024)
|
||||||
images["public"][public_user].append(fimage)
|
images["public"][public_user].append(fimage)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
<th>ImageName</th>
|
<th>ImageName</th>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
<th>Owner</th>
|
<th>Owner</th>
|
||||||
|
<th>Size</th>
|
||||||
<th>Description</th>
|
<th>Description</th>
|
||||||
<th>Choose</th>
|
<th>Choose</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -73,16 +74,18 @@
|
||||||
<td>base</td>
|
<td>base</td>
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>docklet</td>
|
<td>docklet</td>
|
||||||
|
<td>--</td>
|
||||||
<td>A base image for you</td>
|
<td>A base image for you</td>
|
||||||
<td><div class="i-checks"><label><input type="radio" name="image" value="base_base_base" checked="checked"></label></div></td>
|
<td><div class="i-checks"><label><input type="radio" name="image" value="base_base_base" checked="checked" onchange="setMinDiskSize(0)"></label></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% for image in images['private'] %}
|
{% for image in images['private'] %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{image['name']}}</td>
|
<td>{{image['name']}}</td>
|
||||||
<td>private</td>
|
<td>private</td>
|
||||||
<td>{{user}}</td>
|
<td>{{user}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><a href="/image/{{masterips[0].split("@")[0]}}/description/{{image['name']}}_{{user}}_private/" target="_blank">{{image['description']}}</a></td>
|
<td><a href="/image/{{masterips[0].split("@")[0]}}/description/{{image['name']}}_{{user}}_private/" target="_blank">{{image['description']}}</a></td>
|
||||||
<td><div class="i-checks"><label><input type="radio" name="image" value="{{image['name']}}_{{user}}_private"></label></div></td>
|
<td><div class="i-checks"><label><input type="radio" name="image" value="{{image['name']}}_{{user}}_private" onchange="setMinDiskSize({{image['size_in_mb']}})"></label></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for p_user,p_images in images['public'].items() %}
|
{% for p_user,p_images in images['public'].items() %}
|
||||||
|
@ -91,8 +94,9 @@
|
||||||
<td>{{image['name']}}</td>
|
<td>{{image['name']}}</td>
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>{{p_user}}</td>
|
<td>{{p_user}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><a href="/image/{{masterips[0].split("@")[0]}}/description/{{image['name']}}_{{p_user}}_public/" target="_blank">{{image['description']}}</a></td>
|
<td><a href="/image/{{masterips[0].split("@")[0]}}/description/{{image['name']}}_{{p_user}}_public/" target="_blank">{{image['description']}}</a></td>
|
||||||
<td><div class="i-checks"><label><input type="radio" name="image" value="{{image['name']}}_{{p_user}}_public"></label></div></td>
|
<td><div class="i-checks"><label><input type="radio" name="image" value="{{image['name']}}_{{p_user}}_public" onchange="setMinDiskSize({{image['size_in_mb']}})"></label></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -125,7 +129,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">DISK</label>
|
<label class="col-sm-2 control-label">DISK</label>
|
||||||
<div class="col-sm-3"><input type="number" class="form-control" name="diskSetting" id="diskSetting" value= {{defaultsetting['disk']}} /> {{usage['disk']}} MB/{{quota['disk']}}MB
|
<div class="col-sm-3"><input type="number" class="form-control" name="diskSetting" id="diskSetting" value= {{defaultsetting['disk']}} /> {{usage['disk']}} MB/{{quota['disk']}}MB (min value is the size of image + 100)
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -167,6 +171,12 @@
|
||||||
<script src="http://cdn.bootcss.com/datatables/1.10.11/js/dataTables.bootstrap.js"></script>
|
<script src="http://cdn.bootcss.com/datatables/1.10.11/js/dataTables.bootstrap.js"></script>
|
||||||
<script src="http://cdn.bootcss.com/datatables-tabletools/2.1.5/js/TableTools.min.js"></script>
|
<script src="http://cdn.bootcss.com/datatables-tabletools/2.1.5/js/TableTools.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function setMinDiskSize(minSize) {
|
||||||
|
var disk = document.getElementById('diskSetting');
|
||||||
|
disk.setAttribute('min', minSize+100);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$("select#masterselector").change(function() {
|
$("select#masterselector").change(function() {
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
<th>ImageName</th>
|
<th>ImageName</th>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
<th>Owner</th>
|
<th>Owner</th>
|
||||||
|
<th>Size</th>
|
||||||
<th>Choose</th>
|
<th>Choose</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -88,6 +89,7 @@
|
||||||
<td>base</td>
|
<td>base</td>
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>docklet</td>
|
<td>docklet</td>
|
||||||
|
<td>--</td>
|
||||||
<td><input type="radio" name="image" value="base_base_base" checked="checked"></td>
|
<td><input type="radio" name="image" value="base_base_base" checked="checked"></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% for image in allimages[master]['private'] %}
|
{% for image in allimages[master]['private'] %}
|
||||||
|
@ -95,6 +97,7 @@
|
||||||
<td>{{image['name']}}</td>
|
<td>{{image['name']}}</td>
|
||||||
<td>private</td>
|
<td>private</td>
|
||||||
<td>{{mysession['username']}}</td>
|
<td>{{mysession['username']}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><input type="radio" name="image" value="{{image['name']}}_{{mysession['username']}}_private"></td>
|
<td><input type="radio" name="image" value="{{image['name']}}_{{mysession['username']}}_private"></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -104,6 +107,7 @@
|
||||||
<td>{{image['name']}}</td>
|
<td>{{image['name']}}</td>
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>{{p_user}}</td>
|
<td>{{p_user}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><input type="radio" name="image" value="{{image['name']}}_{{p_user}}_public"></td>
|
<td><input type="radio" name="image" value="{{image['name']}}_{{p_user}}_public"></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -327,6 +331,7 @@
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
<th>Owner</th>
|
<th>Owner</th>
|
||||||
<th>CreateTime</th>
|
<th>CreateTime</th>
|
||||||
|
<th>Size</th>
|
||||||
<th>Description</th>
|
<th>Description</th>
|
||||||
<th>Location</th>
|
<th>Location</th>
|
||||||
<th>Status</th>
|
<th>Status</th>
|
||||||
|
@ -339,6 +344,7 @@
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>docklet</td>
|
<td>docklet</td>
|
||||||
<td>2015-01-01 00:00:00</td>
|
<td>2015-01-01 00:00:00</td>
|
||||||
|
<td>--</td>
|
||||||
<td>A Base Image For You</td>
|
<td>A Base Image For You</td>
|
||||||
<td>--</td>
|
<td>--</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
@ -351,6 +357,7 @@
|
||||||
<td>private</td>
|
<td>private</td>
|
||||||
<td>{{mysession['username']}}</td>
|
<td>{{mysession['username']}}</td>
|
||||||
<td>{{image['time']}}</td>
|
<td>{{image['time']}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><a href="/image/{{master.split("@")[0]}}/description/{{image['name']}}_{{mysession['username']}}_private/" target="_blank">{{image['description']}}</a></td>
|
<td><a href="/image/{{master.split("@")[0]}}/description/{{image['name']}}_{{mysession['username']}}_private/" target="_blank">{{image['description']}}</a></td>
|
||||||
<td>{{master.split("@")[1]}}</td>
|
<td>{{master.split("@")[1]}}</td>
|
||||||
{% if image['isshared'] == 'false' %}
|
{% if image['isshared'] == 'false' %}
|
||||||
|
@ -414,6 +421,7 @@
|
||||||
<td>public</td>
|
<td>public</td>
|
||||||
<td>{{p_user}}</td>
|
<td>{{p_user}}</td>
|
||||||
<td>{{image['time']}}</td>
|
<td>{{image['time']}}</td>
|
||||||
|
<td>{{image['size_format']}}</td>
|
||||||
<td><a href="/image/{{master.split("@")[0]}}/description/{{image['name']}}_{{p_user}}_public/" target="_blank">{{image['description']}}</a></td>
|
<td><a href="/image/{{master.split("@")[0]}}/description/{{image['name']}}_{{p_user}}_public/" target="_blank">{{image['description']}}</a></td>
|
||||||
<td>{{master.split("@")[1]}}</td>
|
<td>{{master.split("@")[1]}}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
|
|
Loading…
Reference in New Issue