[PATCH] UI: List Kimchi Peers
by huoyuxin@linux.vnet.ibm.com
From: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
---
ui/css/theme-default/topbar.css | 37 ++++++++++++++++++++++++++++++++++++-
ui/js/src/kimchi.api.js | 14 ++++++++++++++
ui/js/src/kimchi.main.js | 13 +++++++++++++
ui/pages/kimchi-ui.html.tmpl | 7 +++++++
4 files changed, 70 insertions(+), 1 deletions(-)
diff --git a/ui/css/theme-default/topbar.css b/ui/css/theme-default/topbar.css
index bed4e19..8f2f79a 100644
--- a/ui/css/theme-default/topbar.css
+++ b/ui/css/theme-default/topbar.css
@@ -114,7 +114,7 @@
cursor: pointer;
display: block;
position: relative;
- height: 48px;
+ height: 52px;
margin: 0 12px;
}
@@ -174,3 +174,38 @@ a#btn-logout:hover {
display: none;
}
}
+
+.peers {
+ color: white;
+ cursor: pointer;
+ height: 52px;
+ margin: 0 12px;
+ display: none;
+}
+
+.peers span {
+ margin-top: 25px;
+}
+
+.peers .arrow {
+ border: 6px solid transparent;
+ border-bottom: none;
+ border-top-color: white;
+ display: inline-block;
+ width: 0;
+}
+
+.peers .drowdown {
+ top: 45px;
+ right: 110px;
+ color: black;
+ padding: 10px 15px;
+ white-space: nowrap;
+ line-height: 12px;
+ width: inherit;
+}
+
+.peers .drowdown a {
+ display: block;
+ padding: 10px;
+}
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 4562992..8966cff 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -1098,5 +1098,19 @@ var kimchi = {
kimchi.message.error(data.responseJSON.reason);
}
});
+ },
+
+ getPeers : function(suc, err) {
+ kimchi.requestJSON({
+ url : kimchi.url + 'peers',
+ type : 'GET',
+ contentType : 'application/json',
+ dataType : 'json',
+ resend : true,
+ success : suc,
+ error : err ? err : function(data) {
+ kimchi.message.error(data.responseJSON.reason);
+ }
+ });
}
};
diff --git a/ui/js/src/kimchi.main.js b/ui/js/src/kimchi.main.js
index ba54b26..ea9951b 100644
--- a/ui/js/src/kimchi.main.js
+++ b/ui/js/src/kimchi.main.js
@@ -20,10 +20,23 @@ kimchi.tabMode = {};
kimchi.capabilities = undefined;
kimchi.getCapabilities(function(result) {
kimchi.capabilities = result;
+ kimchi.setupPeers();
}, function() {
kimchi.capabilities = {};
});
+kimchi.setupPeers = function(){
+ if(kimchi.capabilities.federation=="enable"){
+ kimchi.getPeers(function(data){
+ if(data.length>0)
+ $('#peers').css("display", "block");
+ for(var i=0; i<data.length; i++){
+ $('.drowdown', '#peers').append("<a href='"+data[i]+"' target='_blank'>"+data[i]+"</a>");
+ }
+ });
+ }
+};
+
kimchi.main = function() {
kimchi.popable();
diff --git a/ui/pages/kimchi-ui.html.tmpl b/ui/pages/kimchi-ui.html.tmpl
index 7bdf441..4e7b3af 100644
--- a/ui/pages/kimchi-ui.html.tmpl
+++ b/ui/pages/kimchi-ui.html.tmpl
@@ -71,6 +71,13 @@
<h1 id="logo"><img alt="Project Kimchi" src="images/theme-default/logo-white.png"></h1>
<ul class="nav-top">
<li>
+ <div id="peers" class="peers popable">
+ <span>$_("Peers")</span>
+ <span class="arrow"></span>
+ <div class="drowdown popover right-side"></div>
+ </div>
+ </li>
+ <li>
<div id="user" class="popable">
<span id="user-icon"></span>
<span id="user-name" class="empty-when-logged-off"></span>
--
1.7.1
10 years, 4 months
[WIP][PATCH 0/4] Support upload volume to storagepool
by lvroyce0210@gmail.com
From: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
Note:
The UI patch is just used for testing.
Problem remains:
1. POST return 404 because the UI patch does not include accept json
2. task id does not returned in vol data and progress has not been added
3. Haven't tested large file, so not sure whether we need to split large file into peices
and call POST multi-times.
Royce Lv (3):
Storage volume upload: Dispatch volume create to right handler
Storage volume upload: Parse params for upload formdata
Storage volume upload: add model function of upload
ssdxiao (1):
Support to upload ISO
contrib/kimchi.spec.fedora.in | 3 +
contrib/kimchi.spec.suse.in | 3 +
po/en_US.po | 2 +
po/pt_BR.po | 3 +
po/zh_CN.po | 3 +
src/kimchi/API.json | 1 -
src/kimchi/control/storagepools.py | 4 +-
src/kimchi/control/utils.py | 2 +
src/kimchi/i18n.py | 1 +
src/kimchi/model/storagevolumes.py | 34 ++
src/nginx.conf.in | 1 +
ui/css/theme-default/upload.css | 43 ++
ui/js/resumable.js | 816 ++++++++++++++++++++++++++++++++++
ui/js/src/kimchi.template_add_main.js | 27 ++
ui/pages/kimchi-ui.html.tmpl | 1 +
ui/pages/template-add.html.tmpl | 13 +
16 files changed, 954 insertions(+), 3 deletions(-)
create mode 100644 ui/css/theme-default/upload.css
create mode 100644 ui/js/resumable.js
--
1.8.3.2
10 years, 4 months
[PATCH] Change function that verifies network interface status v2
by Ramon Medeiros
The old way does just consider if the interface has connectivity, not
the interface status. The new file can determine if the interface is up
or down and if cable is connected or not.
Signed-off-by: Ramon Medeiros <ramonn(a)linux.vnet.ibm.com>
---
src/kimchi/netinfo.py | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/kimchi/netinfo.py b/src/kimchi/netinfo.py
index 5fd6130..2d5cf29 100644
--- a/src/kimchi/netinfo.py
+++ b/src/kimchi/netinfo.py
@@ -29,7 +29,7 @@ BONDING_PATH = '/sys/class/net/*/bonding'
WLAN_PATH = '/sys/class/net/*/wireless'
NET_BRPORT = '/sys/class/net/%s/brport'
NET_MASTER = '/sys/class/net/%s/master'
-NET_STATE = '/sys/class/net/%s/operstate'
+NET_STATE = '/sys/class/net/%s/carrier'
PROC_NET_VLAN = '/proc/net/vlan/'
BONDING_SLAVES = '/sys/class/net/%s/bonding/slaves'
BRIDGE_PORTS = '/sys/class/net/%s/brif'
@@ -101,8 +101,18 @@ def is_bondlave(nic):
def operstate(dev):
- return open(NET_STATE % dev).readline().strip()
+
+ # try to read interface status
+ try:
+ open(NET_STATE % dev).readline().strip()
+
+ # when IOError is raised, interface is down
+ except IOError:
+ return "down"
+ # if value is 1, interface up with cable connected
+ # 0 corresponds to interface up with cable disconnected
+ return "up"
def get_vlan_device(vlan):
""" Return the device of the given VLAN. """
--
1.8.3.1
10 years, 4 months
[PATCH v2 1/3] Add persistent flag to VM info
by Christy Perez
Kimchi can manage guests not created by Kimchi. If a user creates a
non-persistent domain and uses the Power Off option, it will destroy
the user's domain. In order to warn users with non-persistent guests
on Power Off, this patch adds a 'persistent' field (like the one for
networks and storage pools) to a vm's JSON representation.
Signed-off-by: Christy Perez <christy(a)linux.vnet.ibm.com>
---
docs/API.md | 2 ++
src/kimchi/model/vms.py | 3 ++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/docs/API.md b/docs/API.md
index d75c55f..ebb6e61 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -45,6 +45,8 @@ the following general conventions:
* **POST**: Create a new Virtual Machine
* name *(optional)*: The name of the VM. Used to identify the VM in this
API. If omitted, a name will be chosen based on the template used.
+ * persistent: If 'true', vm will persist after a Power Off or host reboot.
+ All virtual machines created by Kimchi are persistent.
* template: The URI of a Template to use when building the VM
* storagepool *(optional)*: Assign a specific Storage Pool to the new VM
* graphics *(optional)*: Specify the graphics paramenter for this vm
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 476e4ac..5721b48 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -471,7 +471,8 @@ def lookup(self, name):
'ticket': self._get_ticket(dom),
'users': users,
'groups': groups,
- 'access': 'full'
+ 'access': 'full',
+ 'persistent': True if dom.isPersistent() else False
}
def _vm_get_disk_paths(self, dom):
--
1.9.3
10 years, 4 months
[PATCH] Detect and enable help page from plugins tabs
by Rodrigo Trujillo
Kimchi is currently not able to configure and open help pages of any
plugin tab. This patch fixes this problem and removes the HELP button
if the plugin does not have a help configured properly.
Help pages for a plugin tab follow same Kimchi system:
- html help file should have the same name of plugin html tab file
- html files should be in plugin's " ui/pages/help/<LANG> " path
- plugin should add following lines to <PLUGIN_NAME>.conf:
* [/help]
* tools.staticdir.on = True
* tools.nocache.on = True
- plugins should add a <help> element with tab help html name in
"ui/config/tab-ext.xml", for each configured tab. If this
element does not exist, 'Help' will be disabled
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo(a)linux.vnet.ibm.com>
---
plugins/sample/sample.conf.in | 4 ++++
plugins/sample/ui/config/tab-ext.xml | 1 +
plugins/sample/ui/pages/help/en_US/tab.html | 1 +
src/kimchi/config.py.in | 1 +
src/kimchi/utils.py | 9 +++++++--
ui/js/src/kimchi.main.js | 26 ++++++++++++++++++++++++--
6 files changed, 38 insertions(+), 4 deletions(-)
create mode 100644 plugins/sample/ui/pages/help/en_US/tab.html
diff --git a/plugins/sample/sample.conf.in b/plugins/sample/sample.conf.in
index 6e0908b..181616d 100644
--- a/plugins/sample/sample.conf.in
+++ b/plugins/sample/sample.conf.in
@@ -22,3 +22,7 @@ tools.kimchiauth.admin_methods = ['POST', 'PUT']
[/circles]
tools.kimchiauth.on = True
tools.kimchiauth.admin_methods = ['POST', 'PUT']
+
+[/help]
+tools.staticdir.on = True
+tools.nocache.on = True
diff --git a/plugins/sample/ui/config/tab-ext.xml b/plugins/sample/ui/config/tab-ext.xml
index a1fb1c2..5ca6e6b 100644
--- a/plugins/sample/ui/config/tab-ext.xml
+++ b/plugins/sample/ui/config/tab-ext.xml
@@ -6,5 +6,6 @@
<title>SampleTab</title>
<path>plugins/sample/tab.html</path>
+ <help>tab</help>
</tab>
</tabs-ext>
diff --git a/plugins/sample/ui/pages/help/en_US/tab.html b/plugins/sample/ui/pages/help/en_US/tab.html
new file mode 100644
index 0000000..cd32b47
--- /dev/null
+++ b/plugins/sample/ui/pages/help/en_US/tab.html
@@ -0,0 +1 @@
+Help page for Kimchi's Sample plugin.
diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
index fca32ee..e10f1f6 100644
--- a/src/kimchi/config.py.in
+++ b/src/kimchi/config.py.in
@@ -145,6 +145,7 @@ class PluginPaths(Paths):
self.ui_dir = self.add_prefix(os.path.join(self.plugin_dir, 'ui'))
self.mo_dir = self.add_prefix(os.path.join(self.plugin_dir, 'mo'))
self.conf_file = os.path.join(self.conf_dir, '%s.conf' % name)
+ self.help_dir = os.path.join(self.ui_dir + '/pages/help')
class UIConfig(dict):
diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
index 0977b9f..9e80e06 100644
--- a/src/kimchi/utils.py
+++ b/src/kimchi/utils.py
@@ -82,13 +82,18 @@ def is_digit(value):
def _load_plugin_conf(name):
- plugin_conf = PluginPaths(name).conf_file
+ plugin_paths = PluginPaths(name)
+ plugin_conf = plugin_paths.conf_file
if not os.path.exists(plugin_conf):
cherrypy.log.error_log.error("Plugin configuration file %s"
" doesn't exist." % plugin_conf)
return
try:
- return Parser().dict_from_file(plugin_conf)
+ plugin_dict = Parser().dict_from_file(plugin_conf)
+ if (os.path.exists(plugin_paths.help_dir) and '/help' in plugin_dict):
+ plugin_dict['/help']['tools.staticdir.dir'] = \
+ plugin_paths.help_dir
+ return plugin_dict
except ValueError as e:
cherrypy.log.error_log.error("Failed to load plugin "
"conf from %s: %s" %
diff --git a/ui/js/src/kimchi.main.js b/ui/js/src/kimchi.main.js
index ba54b26..71a8280 100644
--- a/ui/js/src/kimchi.main.js
+++ b/ui/js/src/kimchi.main.js
@@ -34,9 +34,15 @@ kimchi.main = function() {
var path = tab['path'];
var mode = tab['mode'];
if (mode != 'none') {
+ var disableHelp = "";
+ if (/^plugins/.test(path)) {
+ if (!tab['pluginTabHelp']) {
+ disableHelp = " disableHelp";
+ }
+ }
tabsHtml.push(
'<li>',
- '<a class="item" href="', path, '">',
+ '<a class="item', disableHelp,'" href="', path, '">',
title,
'</a>',
'</li>'
@@ -53,6 +59,7 @@ kimchi.main = function() {
var titleKey = $tab.find('title').text();
var title = i18n[titleKey] ? i18n[titleKey] : titleKey;
var path = $tab.find('path').text();
+ var pluginTabHelp = $tab.find('help').text();
var roles = kimchi.cookie.get('roles');
if (roles) {
var role = JSON.parse(roles)[titleKey.toLowerCase()];
@@ -61,7 +68,8 @@ kimchi.main = function() {
tabs.push({
title: title,
path: path,
- mode: mode
+ mode: mode,
+ pluginTabHelp: pluginTabHelp
});
} else {
document.location.href = 'login.html';
@@ -158,6 +166,15 @@ kimchi.main = function() {
$(tab).addClass('current');
$(tab).focus();
+ if ($(tab).hasClass("disableHelp")) {
+ $('#btn-help').prop('disabled', true);
+ $('#btn-help').hide();
+ }
+ else {
+ $('#btn-help').prop('disabled', false);
+ $('#btn-help').show();
+ }
+
// Load page content.
loadPage(url);
};
@@ -297,6 +314,11 @@ kimchi.getHelp = function(e) {
url = url.replace("#tabs", "/help/" + lang);
if (url == "/help" + lang)
url = url + "/index.html"
+ else if (/^#plugin/.test(url)) {
+ var plugin = url.split("/").pop();
+ url = url.replace("#", "");
+ url = url.replace(plugin, "help/" + lang + "/" + plugin + ".html");
+ }
else
url = url + ".html";
--
1.9.3
10 years, 4 months
[PATCH v3] Bug fix: Github #354
by Daniel Henrique Barboza
v3:
- changed the code to be generic (treat both netfs and iscsi targets)
v2:
- fixed "make check" issue
The following patch fixes the issue described in Github #354:
"storage: used nfs source path need to be filtered out in creation page"
https://github.com/kimchi-project/kimchi/issues/354
*** BLURB HERE ***
Daniel Henrique Barboza (1):
model/storagetargets: filtering used nfs paths
src/kimchi/model/storagetargets.py | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
--
1.8.3.1
10 years, 4 months
[PATCH 0/2] Fixes to issue #405
by Rodrigo Trujillo
https://github.com/kimchi-project/kimchi/issues/405
Patches fixes problem (1) and (3).
Problem (2) is caused by libvirt. Error has already been reported
to libvirt community.
Rodrigo Trujillo (2):
Fix cancel button in edit guest storage tab
Fix enter hit in storage tab under guest edit window
ui/js/src/kimchi.guest_edit_main.js | 1 +
ui/pages/guest-edit.html.tmpl | 12 ++++++------
2 files changed, 7 insertions(+), 6 deletions(-)
--
1.9.3
10 years, 4 months
[PATCH] UI: Display iSCSI targets for Selection
by huoyuxin@linux.vnet.ibm.com
From: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
---
ui/css/theme-default/storage.css | 50 +++++++++++++++++++
ui/js/src/kimchi.api.js | 16 ++++++
ui/js/src/kimchi.storagepool_add_main.js | 76 ++++++++++++++++++++++++++++++
ui/pages/storagepool-add.html.tmpl | 7 ++-
4 files changed, 147 insertions(+), 2 deletions(-)
diff --git a/ui/css/theme-default/storage.css b/ui/css/theme-default/storage.css
index 4f439e8..cb0caee 100644
--- a/ui/css/theme-default/storage.css
+++ b/ui/css/theme-default/storage.css
@@ -593,3 +593,53 @@
center no-repeat;
padding: 0 20px 0 26px;
}
+
+.storage-admin .filter-select {
+ display: inline-block;
+ position: relative;
+}
+
+.storage-admin .filter-select input {
+ border: 1px solid #CCCCCC;
+ border-radius: 1px;
+ font-size: 14px;
+ color: #666666;
+ padding: 3px 3px 3px 10px;
+ height: 30px;
+ width: 493px;
+}
+
+.storage-admin .filter-select input::-ms-clear {
+ display: none;
+}
+
+.storage-admin .filter-select .arrow {
+ display: inline-block;
+ vertical-align: middle;
+ position: relative;
+ left: -25px;
+}
+
+.storage-admin .filter-select .option {
+ border-style: solid;
+ border-color: #CCCCCC;
+ border-width: 0px 1px 1px 1px;
+ border-radius: 1px;
+ font-size: 14px;
+ background-color: white;
+ width: 506px;
+ max-height: 140px;
+ overflow: auto;
+ color: #666666;
+ position: absolute;
+ z-index: 1000;
+}
+
+.storage-admin .filter-select .option .item {
+ padding: 5px 10px;
+ cursor: pointer;
+}
+
+.storage-admin .filter-select .option .item:hover {
+ background-color: #DDDDDD;
+}
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 4562992..d89919e 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -1098,5 +1098,21 @@ var kimchi = {
kimchi.message.error(data.responseJSON.reason);
}
});
+ },
+
+ getISCSITargets : function(server, port, suc, err) {
+ server = encodeURIComponent(server);
+ port = encodeURIComponent(port);
+ kimchi.requestJSON({
+ url : kimchi.url + 'storageservers/'+server+'/storagetargets?_target_type=iscsi&_server_port='+port,
+ type : 'GET',
+ contentType : 'application/json',
+ dataType : 'json',
+ resend : true,
+ success : suc,
+ error : err ? err : function(data) {
+ kimchi.message.error(data.responseJSON.reason);
+ }
+ });
}
};
diff --git a/ui/js/src/kimchi.storagepool_add_main.js b/ui/js/src/kimchi.storagepool_add_main.js
index ecbc682..49ba9e1 100644
--- a/ui/js/src/kimchi.storagepool_add_main.js
+++ b/ui/js/src/kimchi.storagepool_add_main.js
@@ -34,6 +34,78 @@ kimchi.storagepool_add_main = function() {
});
};
+kimchi.storageFilterSelect = function(id, isUpdate) {
+ var input = $('input', '#'+id);
+ var options = $(".option", '#'+id);
+ var filter = function(container, key){
+ container.children().each(function(){
+ $(this).css("display", $(this).text().indexOf(key)==-1 ? "none" : "");
+ });
+ };
+ if(!isUpdate){
+ $('.arrow', '#'+id).click(function(){
+ options.toggleClass("hide-content");
+ });
+ input.focus(function(){
+ options.removeClass("hide-content");
+ }).on("keyup", function(){
+ filter(options, input.val());
+ });
+ }
+ options.children().each(function(){
+ $(this).click(function(){
+ input.val($(this).text());
+ $('.option', "#iSCSITarget").addClass("hide-content");
+ filter(options, "");
+ });
+ });
+};
+
+kimchi.initISCSITargets = function(){
+ var loadTargets = function(server, port, callback){
+ var isUpdate = $(".option", "#iSCSITarget").children().length > 0;
+ $(".option", "#iSCSITarget").empty();
+ $('input', "#iSCSITarget").val("loading targets...");
+ kimchi.getISCSITargets(server, port, function(data){
+ if(data.length==0){
+ $('input', "#iSCSITarget").val("no targets is got.");
+ }else{
+ for(var i=0; i<data.length; i++){
+ var itemNode = $.parseHTML("<div class='item'>"+data[i].target+"</div>");
+ $(".option", "#iSCSITarget").append(itemNode);
+ }
+ kimchi.storageFilterSelect('iSCSITarget', isUpdate);
+ $('input', "#iSCSITarget").attr("readonly", false);
+ $('input', "#iSCSITarget").val("");
+ $('input', "#iSCSITarget").trigger("focus");
+ }
+ callback();
+ }, function(data){
+ $('input', "#iSCSITarget").val("failed to load targets.");
+ kimchi.message.error(data.responseJSON.reason);
+ callback();
+ });
+ };
+ var triggerLoadTarget = function(){
+ var server = $("#iscsiserverId").val().trim();
+ var port = $("#iscsiportId").val().trim();
+ if(server!="" && port!="" && !$("#iscsiserverId").hasClass("invalid-field") && !$("#iscsiportId").hasClass("invalid-field")){
+ $("#iscsiserverId").attr("disabled", true);
+ $("#iscsiportId").attr("disabled", true);
+ loadTargets(server, port, function(){
+ $("#iscsiserverId").attr("disabled", false);
+ $("#iscsiportId").attr("disabled", false);
+ });
+ }
+ };
+ $("#iscsiserverId").change(function(){
+ triggerLoadTarget();
+ });
+ $("#iscsiportId").change(function(){
+ triggerLoadTarget();
+ });
+};
+
kimchi.initStorageAddPage = function() {
kimchi.listHostPartitions(function(data) {
if (data.length > 0) {
@@ -160,6 +232,10 @@ kimchi.initStorageAddPage = function() {
$('#iscsiportId').keyup(function(event) {
$(this).toggleClass("invalid-field",!/^[0-9]+$/.test($(this).val()));
});
+ $('#iscsiserverId').keyup(function(event) {
+ $(this).toggleClass("invalid-field",!kimchi.isServer($(this).val().trim()));
+ });
+ kimchi.initISCSITargets();
};
/* Returns 'true' if all form fields were filled, 'false' if
diff --git a/ui/pages/storagepool-add.html.tmpl b/ui/pages/storagepool-add.html.tmpl
index 1eb2029..ee19ed5 100644
--- a/ui/pages/storagepool-add.html.tmpl
+++ b/ui/pages/storagepool-add.html.tmpl
@@ -23,7 +23,7 @@
<!DOCTYPE html>
<html>
<body>
- <div class="window storage-window">
+ <div class="window storage-window storage-admin">
<header>
<h1 class="title">$_("Define a New Storage Pool")</h1>
<div class="close">X</div>
@@ -119,7 +119,10 @@
<h2>4. $_("Target")</h2>
<div class="field">
<p class="text-help">$_("The iSCSI target on iSCSI server")</p>
- <input id="iscsiTargetId" type="text" class="text storage-base-input-width">
+ <span class="filter-select" id="iSCSITarget">
+ <div><input id="iscsiTargetId" type="text" readonly><a class="ui-icon ui-icon-triangle-1-s arrow"></a></div>
+ <div class="option hide-content"></div>
+ </span>
</div>
</section>
<section class="form-section">
--
1.7.1
10 years, 4 months
[PATCH 0/2] Allow admin user change permission settings when VM is running
by Wen Wang
Changes:
1) Have the "Manage Media" function deleted from "Action" list
2) Enable "Edit" whether VM is running or off
3) Disable edit function of "General", "Storage", "Interface" except
"replace" of the cdrom under "Storage".
Wen Wang (2):
UI: Delete Manage Media function from action list
Allow admin user change permission settings when VM is running
ui/js/src/kimchi.guest_edit_main.js | 54 ++++++++++++++++++++++----------
ui/js/src/kimchi.guest_main.js | 14 --------
ui/pages/guest-edit.html.tmpl | 2 +-
ui/pages/guest-media.html.tmpl | 57 -----------------------------------
ui/pages/guest.html.tmpl | 1 -
5 files changed, 38 insertions(+), 90 deletions(-)
delete mode 100644 ui/pages/guest-media.html.tmpl
10 years, 4 months
[PATCH V2 0/2] Allow admin user change settings when VM is running
by Wen Wang
Changes:
V1 -> V2:
1) Have the "ui/css/theme-default/guest-media.css" deleted
2) Have the "edit" button in interface tab deleted when VM is running
1) Have the "Manage Media" function deleted from "Action" list
2) Enable "Edit" whether VM is running or off
3) Disable edit function of "General", "Storage", "Interface" except
"replace" of the cdrom under "Storage".
Wen Wang (2):
UI: Delete Manage Media function from action list
Allow admin user change permission settings when VM is running
ui/css/theme-default/guest-media.css | 42 -------------------------
ui/js/src/kimchi.guest_edit_main.js | 56 ++++++++++++++++++++++-----------
ui/js/src/kimchi.guest_main.js | 14 --------
ui/pages/guest-edit.html.tmpl | 2 +-
ui/pages/guest-media.html.tmpl | 57 ----------------------------------
ui/pages/guest.html.tmpl | 1 -
6 files changed, 39 insertions(+), 133 deletions(-)
delete mode 100644 ui/css/theme-default/guest-media.css
delete mode 100644 ui/pages/guest-media.html.tmpl
10 years, 4 months