[V1 0/2] Add Users/Groups to VM

From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> Yu Xin Huo (2): Add users/groups to VM update po po/en_US.po | 9 +++ po/kimchi.pot | 9 +++ po/pt_BR.po | 39 ++++++++----- po/zh_CN.po | 9 +++ ui/css/theme-default/guest-edit.css | 106 +++++++++++++++++++++++++++++++++ ui/images/theme-default/group.png | Bin 0 -> 1703 bytes ui/images/theme-default/user.png | Bin 0 -> 1322 bytes ui/js/src/kimchi.api.js | 28 +++++++++ ui/js/src/kimchi.guest_edit_main.js | 112 ++++++++++++++++++++++++++++++++++- ui/pages/guest-edit.html.tmpl | 33 ++++++++++ 10 files changed, 327 insertions(+), 18 deletions(-) create mode 100644 ui/images/theme-default/group.png create mode 100644 ui/images/theme-default/user.png

From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> Yu Xin Huo (2): Add users/groups to VM update po po/en_US.po | 9 +++ po/kimchi.pot | 9 +++ po/pt_BR.po | 39 ++++++++----- po/zh_CN.po | 9 +++ ui/css/theme-default/guest-edit.css | 106 +++++++++++++++++++++++++++++++++ ui/images/theme-default/group.png | Bin 0 -> 1703 bytes ui/images/theme-default/user.png | Bin 0 -> 1322 bytes ui/js/src/kimchi.api.js | 28 +++++++++ ui/js/src/kimchi.guest_edit_main.js | 112 ++++++++++++++++++++++++++++++++++- ui/pages/guest-edit.html.tmpl | 33 ++++++++++ 10 files changed, 327 insertions(+), 18 deletions(-) create mode 100644 ui/images/theme-default/group.png create mode 100644 ui/images/theme-default/user.png

From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- ui/css/theme-default/guest-edit.css | 106 +++++++++++++++++++++++++++++++++ ui/images/theme-default/group.png | Bin 0 -> 1703 bytes ui/images/theme-default/user.png | Bin 0 -> 1322 bytes ui/js/src/kimchi.api.js | 28 +++++++++ ui/js/src/kimchi.guest_edit_main.js | 112 ++++++++++++++++++++++++++++++++++- ui/pages/guest-edit.html.tmpl | 33 ++++++++++ 6 files changed, 276 insertions(+), 3 deletions(-) create mode 100644 ui/images/theme-default/group.png create mode 100644 ui/images/theme-default/user.png diff --git a/ui/css/theme-default/guest-edit.css b/ui/css/theme-default/guest-edit.css index 3ce48be..9713801 100644 --- a/ui/css/theme-default/guest-edit.css +++ b/ui/css/theme-default/guest-edit.css @@ -162,3 +162,109 @@ .guest-edit-interface .hide { display: none; } + +.guest-edit-permission { + height: 240px; + padding: 5px 10px!important; +} + +.guest-edit-permission .column { + display: inline-block; + vertical-align: top; + height: 100%; +} + +.guest-edit-permission .title { + margin-bottom: 3px; +} + +.guest-edit-permission input[type="text"] { + margin-bottom: 3px; + font-size: 12px; + width: 97%; +} + +.guest-edit-permission .body { + border: 1px solid #999999; + font-size: 12px; + padding: 1px; + overflow: auto; +} + +.guest-edit-permission .body .item { + padding: 2px 3px; + margin-bottom: 1px; + cursor: pointer; +} + +.guest-edit-permission .body .item:hover { + background-color: #AAAAAA; +} + +.guest-edit-permission .body .item-picked { + background-color: #BBBBBB; +} + +.guest-edit-permission .body .item .icon { + display: inline-block; + height: 15px; + width: 15px; + vertical-align: bottom; +} + +.guest-edit-permission .body .item .user-icon { + background: url('/images/theme-default/user.png') no-repeat scroll; + background-size: 15px 15px; +} + +.guest-edit-permission .body .item .group-icon { + background: url('/images/theme-default/group.png') no-repeat scroll; + background-size: 15px 15px; +} + +.guest-edit-permission .avail { + width: 58%; +} + +.guest-edit-permission .avail .body { + height: 192px; +} + +.guest-edit-permission .avail .body .column-user { + width: 48%; +} +.guest-edit-permission .avail .body .column-group { + width: 50%; +} + +.guest-edit-permission .control { + width: 9%; +} + +.guest-edit-permission .control button { + width: 26px; + margin-left: 18px; +} + +.guest-edit-permission .control button:first-child { + margin-top: 110px; + margin-bottom: 2px; +} + +.guest-edit-permission .control .ui-button-text-only .ui-button-text { + padding: 2px 8px; +} + +.guest-edit-permission .selected { + width: 30%; + float: right; +} + +.guest-edit-permission .selected .body { + height: 217px; +} + +#form-guest-edit-permission-save { + float: right; + margin-right: 10px; +} diff --git a/ui/images/theme-default/group.png b/ui/images/theme-default/group.png new file mode 100644 index 0000000000000000000000000000000000000000..1160bd97178375f202c3c20fef689ddf4a6dcfae GIT binary patch literal 1703 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 literal 0 HcmV?d00001 diff --git a/ui/images/theme-default/user.png b/ui/images/theme-default/user.png new file mode 100644 index 0000000000000000000000000000000000000000..c57a81a92757ef31c424a4e6c741f71db62a1092 GIT binary patch literal 1322 zcmV+_1=aeAP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$%t=H+RCwCFS6xgTRTRGSvwt(QEW2!% zZEC<RY*%PmU|~TT(9l}brY~)zO*HkzHZ`VcV>GER{yyo84?Y{zXpHs6S4l9Y#$eJ` zmI9TeNz<hS;wC6n(*0#;*YAuwlVv;L6r^`@m^(Xj@A=NT=X~eDmCI%J$6w2=dc>kV zY@@+(9ODK4xF85;1zu=k91CHOq^hbvsYP|PR4&aWrYD(|;jiDtI5Pm<(b&U^nWnhO zZnuB!bUFte4hIuOQ3F&emDt+a8q4K!YCf0$1oO+2)4!@#0EkwQl5$ualok1!EXhHq z%gJmu8{>K206<bG6ogDB^F}6}*^Ol{S=pO6{k6PaIG$r3kLNqL+Z|Ng3M1<QNK>wD z0wClKm&?WQ4U=X0#ew+2^IHe7-h8rlfP@r~VhtmXu2yJ}XCzr-e!u_2cz2($B>?5B zi|2UO+S2;E!|Bj0HB)Q`0>S806y@n{9{~c7$%@p!ndP-YM`IIhEY=e{_Fn+RjXY4D zb{x;w(OtLDQsClyUxV+7?FS)7Fxa?e#qxE6tFbYV-gXdDdWFN`J9K{(0F)I&&kRj$ zI|#vW?8M0vpCb(|D<`nShlY!hry^t9K7x{3LJ-PdzWUnvKdl1r@A9)#r$@fP4l7&p zK#etB9o>b2g9B$ST)a@CRMeTzOi1}V@4bC5&=`2jO0Zg@ViXxFP-BUi$(LJN_Ksfp z=3D3WYuB~o(FYyT;UkCH$jA$KK}644v0lp-vto3ht%C^2h1~xbJa874jpHaz!TRjf zY@!{XyqnEtPcAMl+BGYX^P$j_DNIKpA3+{;9_VVv`tOm%b^yJ6^VZZ?maAd3z0;0@ z^8+}4h*+&yEHYHNtJz%k6}(OoDNW5J6wD))C57Iu_-s)vYB2+#M<hwQVt3em#0U9& zo&oSVtQoZgARg=c6uf^<=YBd{Y`}8a9F^U1Jl{ry%u<!a_#1N%?h2Ge@cpwW*%8Sl zF#ymAiApspWGS6aAB88zHwA!z8&qWFXDTRUy%7gEZ}J3fMsuAPv~1!2Wj+Ec3L+D2 zqQ(OhuzFCF7qC8cf8~C7W^Vd{X+O}>78M%&4WH3QB-PYQo53<|<J#h5P&Rc-l^#J? ztdGi32J7nTKEUIfrfCS5pT-%6Ny$cqM^~a*D~g8DbG5~0>&O6nb1AyN(`O36>+`;^ zE8i^Fw<;AciT(!v#fQ?cbAMMCx}7NsJl&F=7!*g?e<hVl1yaAKR6|o}Z|D*QkY09o zN@#y%ln=dSY#kHg^-=2m9;N1QW$4+`+|+aik2gd;`n?U_M)dhR4nPNiKf{Ix&_Fij z3wd5}JSG6RifhF^Mi%tOdm`1jyVF9%1!9s64=8STpq4mxa*!S{s%Us%UnHDGZax<4 zb!iSYtJOTviuu)rdkcFeCVpX4i3FROnWX~qzgZm!1kk2;v%da**4x{|>b>>js0Gj0 z79%RJ$03IxgUidyp5)ymo1dR&^T~O(w6w(16;L1%wz|4%C<yKjGVr{ij5;GUFVxVY zR|qke<XXV1A0cCv`|^h6xNTp%_8-x2w{KCTwpR&x%A<1^#8<T}S=9xRvL(nY<R)Z} gniR8!<R1YB09_*wa#VgYhyVZp07*qoM6N<$f^kM~^#A|> literal 0 HcmV?d00001 diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 021be63..936e964 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1056,5 +1056,33 @@ var kimchi = { kimchi.message.error(data.responseJSON.reason); } }); + }, + + getHostUsers : function(suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'host/users', + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); + }, + + getHostGroups : function(suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'host/groups', + 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.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 99dbe96..2e21e70 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -19,12 +19,13 @@ kimchi.guest_edit_main = function() { var buttonContainer = $('#action-button-container'); $('#guest-edit-tabs').tabs({ beforeActivate: function(event, ui) { + $(buttonContainer).addClass('hidden'); + $("#form-guest-edit-permission-save").addClass('hidden'); var deactivated = ui['newPanel']; if($(deactivated).attr('id') === 'form-guest-edit-general') { $(buttonContainer).removeClass('hidden'); - } - else { - $(buttonContainer).addClass('hidden'); + }else if($(deactivated).attr('id') === 'form-guest-edit-permission'){ + $("#form-guest-edit-permission-save").removeClass('hidden'); } } }); @@ -236,6 +237,110 @@ kimchi.guest_edit_main = function() { }); }; + var setupPermission = function() { + var userNodes = {}, groupNodes = {}; + kimchi.retrieveVM(kimchi.selectedGuest, function(vm){ + kimchi.getHostUsers(function(users){ + kimchi.getHostGroups(function(groups){ + var subArray = function(a1, a2){ //a1-a2 + for(var i=0; i<a2.length; i++){ + for(var j=0; j<a1.length; j++){ + if(a2[i] == a1[j]){ + a1.splice(j, 1); + break; + } + } + } + }; + subArray(users, vm.users); subArray(groups, vm.groups); + init(users, groups, vm.users, vm.groups); + }); + }); + }); + var sortNodes = function(container, isUser){ + nodes = container.children(); + var keys = []; + nodes.each(function(){ + keys.push($("label", this).text()); + }); + keys.sort(); + container.empty(); + for(var i=0; i<keys.length; i++){ + var itemNode = isUser ? userNodes[keys[i]] : groupNodes[keys[i]]; + $(itemNode).click(function(){ + $(this).toggleClass("item-picked"); + }); + container.append(itemNode); + } + }; + var init = function(availUsers, availGroups, selUsers, selGroups){ + var initNode = function(key, isUserNode){ + var nodeGroups = isUserNode ? userNodes : groupNodes; + nodeGroups[key] = $.parseHTML(kimchi.substitute($('#permission-item').html(), { + val: key, + class: isUserNode? "user-icon" : "group-icon" + })); + }; + for(var i=0; i<availUsers.length; i++){ + initNode(availUsers[i], true); + $("#permission-avail-users").append(userNodes[availUsers[i]]); + sortNodes($("#permission-avail-users"), true); + } + for(var i=0; i<selUsers.length; i++){ + initNode(selUsers[i], true); + $("#permission-sel-users").append(userNodes[selUsers[i]]); + sortNodes($("#permission-sel-users"), true); + } + for(var i=0; i<availGroups.length; i++){ + initNode(availGroups[i], false); + $("#permission-avail-groups").append(groupNodes[availGroups[i]]); + sortNodes($("#permission-avail-groups"), false); + } + for(var i=0; i<selGroups.length; i++){ + initNode(selGroups[i], false); + $("#permission-sel-groups").append(groupNodes[selGroups[i]]); + sortNodes($("#permission-sel-groups"), false); + } + }; + var filterNodes = function(key, container){ + container.children().each(function(){ + $(this).css("display", $("label", this).text().indexOf(key)==-1 ? "none" : ""); + }); + } + $("#permission-searchBox").on("keyup", function() { + var key = $(this).val(); + filterNodes(key, $("#permission-avail-users")); + filterNodes(key, $("#permission-avail-groups")); + }); + $('#permissionGo').button().click(function() { + $("#permission-avail-users").children(".item-picked").appendTo("#permission-sel-users").removeClass("item-picked"); + sortNodes($("#permission-sel-users"), true); + $("#permission-avail-groups").children(".item-picked").appendTo("#permission-sel-groups").removeClass("item-picked"); + sortNodes($("#permission-sel-groups"), false); + }); + $('#permissionBack').button().click(function() { + $("#permission-sel-users").children(".item-picked").appendTo("#permission-avail-users").removeClass("item-picked"); + sortNodes($("#permission-avail-users"), true); + $("#permission-sel-groups").children(".item-picked").appendTo("#permission-avail-groups").removeClass("item-picked"); + sortNodes($("#permission-avail-groups"), false); + $("#permission-searchBox").val(""); + filterNodes("", $("#permission-avail-users")); + filterNodes("", $("#permission-avail-groups")); + }); + $("#form-guest-edit-permission-save").on("click", function(){ + var content = { users: [], groups: [] }; + $("#permission-sel-users").children().each(function(){ + content.users.push($("label", this).text()); + }); + $("#permission-sel-groups").children().each(function(){ + content.groups.push($("label", this).text()); + }); + kimchi.updateVM(kimchi.selectedGuest, content, function(){ + kimchi.window.close(); + }); + }); + }; + var initContent = function(guest) { guest['icon'] = guest['icon'] || 'images/icon-vm.png'; $('#form-guest-edit-general').fillWithObject(guest); @@ -265,6 +370,7 @@ kimchi.guest_edit_main = function() { initStorageListeners(); setupInterface(); + setupPermission(); kimchi.topic('kimchi/vmCDROMAttached').subscribe(onAttached); kimchi.topic('kimchi/vmCDROMReplaced').subscribe(onReplaced); diff --git a/ui/pages/guest-edit.html.tmpl b/ui/pages/guest-edit.html.tmpl index ded892c..2749b7d 100644 --- a/ui/pages/guest-edit.html.tmpl +++ b/ui/pages/guest-edit.html.tmpl @@ -38,6 +38,9 @@ <li> <a href="#form-guest-edit-interface">$_("Interface")</a> </li> + <li> + <a href="#form-guest-edit-permission">$_("Permission")</a> + </li> </ul> <form id="form-guest-edit-general"> <fieldset class="guest-edit-fieldset"> @@ -109,6 +112,27 @@ </div> <div class="body"></div> </form> + <form id="form-guest-edit-permission" class="guest-edit-permission"> + <div class="column avail"> + <div class="title">$_("available users/groups")</div> + <input type="text" id="permission-searchBox"> + <div class="body"> + <div id="permission-avail-users" class="column column-user"></div> + <div id="permission-avail-groups" class="column column-group"></div> + </div> + </div> + <div class="column control"> + <button id="permissionGo"> > </button> + <button id="permissionBack"> < </button> + </div> + <div class="column selected"> + <div class="title">$_("selected users/groups")</div> + <div class="body"> + <div id="permission-sel-users"></div> + <div id="permission-sel-groups"></div> + </div> + </div> + </form> </div> </div> <footer> @@ -117,6 +141,9 @@ <span class="text">$_("Save")</span> </button> </div> + <button id="form-guest-edit-permission-save" class="btn-normal hidden"> + <span class="text">$_("Save")</span> + </button> </footer> </div> <script id="cdrom-row-tmpl" type="text/html"> @@ -186,6 +213,12 @@ </span> </div> </script> +<script id="permission-item" type="text/html"> +<div class="item"> + <span class="icon {class}"></span> + <label>{val}</label> +</div> +</script> <script type="text/javascript"> kimchi.guest_edit_main(); </script> -- 1.7.1

From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- po/en_US.po | 9 +++++++++ po/kimchi.pot | 9 +++++++++ po/pt_BR.po | 39 ++++++++++++++++++++++++--------------- po/zh_CN.po | 9 +++++++++ 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/po/en_US.po b/po/en_US.po index 1a67074..2c18fdd 100644 --- a/po/en_US.po +++ b/po/en_US.po @@ -1817,3 +1817,12 @@ msgstr "No templates found." msgid "Clone" msgstr "Clone" + +msgid "available users/groups" +msgstr "available users/groups" + +msgid "selected users/groups" +msgstr "selected users/groups" + +msgid "Permission" +msgstr "Permission" diff --git a/po/kimchi.pot b/po/kimchi.pot index 635d4ae..0541550 100755 --- a/po/kimchi.pot +++ b/po/kimchi.pot @@ -1722,3 +1722,12 @@ msgstr "" msgid "Clone" msgstr "" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po index 0bd80fe..16dc6d9 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -24,10 +24,10 @@ msgstr "" "PO-Revision-Date: 2013-06-27 10:48+0000\n" "Last-Translator: Crístian Viana <vianac@linux.vnet.ibm.com>\n" "Language-Team: Aline Manera <alinefm@br.ibm.com>\n" -"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" "Generated-By: pygettext.py 1.5\n" "X-Poedit-Country: Brazil\n" "X-Poedit-Language: Portuguese\n" @@ -143,8 +143,8 @@ msgstr "Mal formato na leitura de um descritor de volume na ISO %(filename)s" msgid "" "The hypervisor doesn't have permission to use this ISO %(filename)s. " "Consider moving it under /var/lib/libvirt, or set the search permission to " -"file access control lists for '%(user)s' user if possible, or add the " -"'%(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " +"file access control lists for '%(user)s' user if possible, or add the '%" +"(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " "'path_to_iso'.Details: %(err)s" msgstr "" "O servidor não tem permissões para acessar a ISO %(filename)s. Considere " @@ -410,8 +410,8 @@ msgstr "Não é possível criar o storage pool %(name)s.Detalhes: %(err)s" #, python-format msgid "" -"Unable to get number of storage volumes in storage pool %(name)s. Details: " -"%(err)s" +"Unable to get number of storage volumes in storage pool %(name)s. Details: %" +"(err)s" msgstr "" "Não é possível saber o número de volumes no storage pool %(name)s. Detalhes: " "%(err)s" @@ -438,8 +438,8 @@ msgstr "" #, python-format msgid "Unable to create NFS Pool as export path %(path)s mount failed" msgstr "" -"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação " -"%(path)s falhou" +"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação %" +"(path)s falhou" #, python-format msgid "Unsupported storage pool type: %(type)s" @@ -487,8 +487,8 @@ msgstr "Para criar um storage pool, especifique nome e tipo" #, python-format msgid "" -"%(disk)s is not a valid disk/partition. Could not add it to the pool " -"%(pool)s." +"%(disk)s is not a valid disk/partition. Could not add it to the pool %(pool)" +"s." msgstr "" "%(disk)s não é um disco/partição válido. Não pode adicionar ao pool %(pool)s." @@ -584,11 +584,11 @@ msgstr "Incapaz de listar volumes pois o storage pool %(pool)s não está ativo" #, python-format msgid "" -"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: " -"%(err)s" +"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: %" +"(err)s" msgstr "" -"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: " -"%(err)s" +"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: %(err)" +"s" #, python-format msgid "" @@ -962,8 +962,8 @@ msgstr "Não foi possível remover o repositório %(repo_id)s." #, python-format msgid "Could not write repository configuration file %(repo_file)s" msgstr "" -"Não foi possível escrever o arquivo de configuração do repositório " -"%(repo_file)s" +"Não foi possível escrever o arquivo de configuração do repositório %" +"(repo_file)s" msgid "Specify repository distribution in order to create a DEB repository." msgstr "" @@ -1881,3 +1881,12 @@ msgstr "Nenhum modelo encontrado." msgid "Clone" msgstr "Clonar" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index df37e71..7a6e8cd 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -1747,3 +1747,12 @@ msgstr "没有发现模板" msgid "Clone" msgstr "制作副本" + +msgid "available users/groups" +msgstr "可选用户及组" + +msgid "selected users/groups" +msgstr "已选用户及组" + +msgid "Permission" +msgstr "权限" -- 1.7.1

On 07/18/2014 07:14 AM, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- po/en_US.po | 9 +++++++++ po/kimchi.pot | 9 +++++++++ po/pt_BR.po | 39 ++++++++++++++++++++++++--------------- po/zh_CN.po | 9 +++++++++ 4 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/po/en_US.po b/po/en_US.po index 1a67074..2c18fdd 100644 --- a/po/en_US.po +++ b/po/en_US.po @@ -1817,3 +1817,12 @@ msgstr "No templates found."
msgid "Clone" msgstr "Clone" + +msgid "available users/groups" +msgstr "available users/groups"
Available system users and groups
+ +msgid "selected users/groups" +msgstr "selected users/groups"
Selected system users and groups
+ +msgid "Permission" +msgstr "Permission" diff --git a/po/kimchi.pot b/po/kimchi.pot index 635d4ae..0541550 100755 --- a/po/kimchi.pot +++ b/po/kimchi.pot @@ -1722,3 +1722,12 @@ msgstr ""
msgid "Clone" msgstr "" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po index 0bd80fe..16dc6d9 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -24,10 +24,10 @@ msgstr "" "PO-Revision-Date: 2013-06-27 10:48+0000\n" "Last-Translator: Crístian Viana <vianac@linux.vnet.ibm.com>\n" "Language-Team: Aline Manera <alinefm@br.ibm.com>\n" -"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" "Generated-By: pygettext.py 1.5\n" "X-Poedit-Country: Brazil\n" "X-Poedit-Language: Portuguese\n" @@ -143,8 +143,8 @@ msgstr "Mal formato na leitura de um descritor de volume na ISO %(filename)s" msgid "" "The hypervisor doesn't have permission to use this ISO %(filename)s. " "Consider moving it under /var/lib/libvirt, or set the search permission to " -"file access control lists for '%(user)s' user if possible, or add the " -"'%(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " +"file access control lists for '%(user)s' user if possible, or add the '%" +"(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " "'path_to_iso'.Details: %(err)s" msgstr "" "O servidor não tem permissões para acessar a ISO %(filename)s. Considere " @@ -410,8 +410,8 @@ msgstr "Não é possível criar o storage pool %(name)s.Detalhes: %(err)s"
#, python-format msgid "" -"Unable to get number of storage volumes in storage pool %(name)s. Details: " -"%(err)s" +"Unable to get number of storage volumes in storage pool %(name)s. Details: %" +"(err)s" msgstr "" "Não é possível saber o número de volumes no storage pool %(name)s. Detalhes: " "%(err)s" @@ -438,8 +438,8 @@ msgstr "" #, python-format msgid "Unable to create NFS Pool as export path %(path)s mount failed" msgstr "" -"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação " -"%(path)s falhou" +"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação %" +"(path)s falhou"
#, python-format msgid "Unsupported storage pool type: %(type)s" @@ -487,8 +487,8 @@ msgstr "Para criar um storage pool, especifique nome e tipo"
#, python-format msgid "" -"%(disk)s is not a valid disk/partition. Could not add it to the pool " -"%(pool)s." +"%(disk)s is not a valid disk/partition. Could not add it to the pool %(pool)" +"s." msgstr "" "%(disk)s não é um disco/partição válido. Não pode adicionar ao pool %(pool)s."
@@ -584,11 +584,11 @@ msgstr "Incapaz de listar volumes pois o storage pool %(pool)s não está ativo"
#, python-format msgid "" -"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: " -"%(err)s" +"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: %" +"(err)s" msgstr "" -"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: " -"%(err)s" +"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: %(err)" +"s"
#, python-format msgid "" @@ -962,8 +962,8 @@ msgstr "Não foi possível remover o repositório %(repo_id)s." #, python-format msgid "Could not write repository configuration file %(repo_file)s" msgstr "" -"Não foi possível escrever o arquivo de configuração do repositório " -"%(repo_file)s" +"Não foi possível escrever o arquivo de configuração do repositório %" +"(repo_file)s"
msgid "Specify repository distribution in order to create a DEB repository." msgstr "" @@ -1881,3 +1881,12 @@ msgstr "Nenhum modelo encontrado."
msgid "Clone" msgstr "Clonar" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index df37e71..7a6e8cd 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -1747,3 +1747,12 @@ msgstr "没有发现模板"
msgid "Clone" msgstr "制作副本" + +msgid "available users/groups" +msgstr "可选用户及组" + +msgid "selected users/groups" +msgstr "已选用户及组" + +msgid "Permission" +msgstr "权限"

On 7/22/2014 1:23 AM, Aline Manera wrote:
On 07/18/2014 07:14 AM, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Signed-off-by: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com> --- po/en_US.po | 9 +++++++++ po/kimchi.pot | 9 +++++++++ po/pt_BR.po | 39 ++++++++++++++++++++++++--------------- po/zh_CN.po | 9 +++++++++ 4 files changed, 51 insertions(+), 15 deletions(-)
diff --git a/po/en_US.po b/po/en_US.po index 1a67074..2c18fdd 100644 --- a/po/en_US.po +++ b/po/en_US.po @@ -1817,3 +1817,12 @@ msgstr "No templates found." msgid "Clone" msgstr "Clone" + +msgid "available users/groups" +msgstr "available users/groups"
Available system users and groups
addressed in v2
+ +msgid "selected users/groups" +msgstr "selected users/groups"
Selected system users and groups
addressed in v2
+ +msgid "Permission" +msgstr "Permission" diff --git a/po/kimchi.pot b/po/kimchi.pot index 635d4ae..0541550 100755 --- a/po/kimchi.pot +++ b/po/kimchi.pot @@ -1722,3 +1722,12 @@ msgstr "" msgid "Clone" msgstr "" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po index 0bd80fe..16dc6d9 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -24,10 +24,10 @@ msgstr "" "PO-Revision-Date: 2013-06-27 10:48+0000\n" "Last-Translator: Crístian Viana <vianac@linux.vnet.ibm.com>\n" "Language-Team: Aline Manera <alinefm@br.ibm.com>\n" -"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" "Generated-By: pygettext.py 1.5\n" "X-Poedit-Country: Brazil\n" "X-Poedit-Language: Portuguese\n" @@ -143,8 +143,8 @@ msgstr "Mal formato na leitura de um descritor de volume na ISO %(filename)s" msgid "" "The hypervisor doesn't have permission to use this ISO %(filename)s. " "Consider moving it under /var/lib/libvirt, or set the search permission to " -"file access control lists for '%(user)s' user if possible, or add the " -"'%(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " +"file access control lists for '%(user)s' user if possible, or add the '%" +"(user)s' to the ISO path group, or (not recommended) 'chmod -R o+x " "'path_to_iso'.Details: %(err)s" msgstr "" "O servidor não tem permissões para acessar a ISO %(filename)s. Considere " @@ -410,8 +410,8 @@ msgstr "Não é possível criar o storage pool %(name)s.Detalhes: %(err)s" #, python-format msgid "" -"Unable to get number of storage volumes in storage pool %(name)s. Details: " -"%(err)s" +"Unable to get number of storage volumes in storage pool %(name)s. Details: %" +"(err)s" msgstr "" "Não é possível saber o número de volumes no storage pool %(name)s. Detalhes: " "%(err)s" @@ -438,8 +438,8 @@ msgstr "" #, python-format msgid "Unable to create NFS Pool as export path %(path)s mount failed" msgstr "" -"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação " -"%(path)s falhou" +"Incapaz de criar NFS Pool uma vez que a montagem do caminho de exportação %" +"(path)s falhou" #, python-format msgid "Unsupported storage pool type: %(type)s" @@ -487,8 +487,8 @@ msgstr "Para criar um storage pool, especifique nome e tipo" #, python-format msgid "" -"%(disk)s is not a valid disk/partition. Could not add it to the pool " -"%(pool)s." +"%(disk)s is not a valid disk/partition. Could not add it to the pool %(pool)" +"s." msgstr "" "%(disk)s não é um disco/partição válido. Não pode adicionar ao pool %(pool)s." @@ -584,11 +584,11 @@ msgstr "Incapaz de listar volumes pois o storage pool %(pool)s não está ativo" #, python-format msgid "" -"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: " -"%(err)s" +"Unable to create storage volume %(name)s in storage pool %(pool)s. Details: %" +"(err)s" msgstr "" -"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: " -"%(err)s" +"Incapaz de criar o volume %(name)s no storage pool %(pool)s. Detalhes: %(err)" +"s" #, python-format msgid "" @@ -962,8 +962,8 @@ msgstr "Não foi possível remover o repositório %(repo_id)s." #, python-format msgid "Could not write repository configuration file %(repo_file)s" msgstr "" -"Não foi possível escrever o arquivo de configuração do repositório " -"%(repo_file)s" +"Não foi possível escrever o arquivo de configuração do repositório %" +"(repo_file)s" msgid "Specify repository distribution in order to create a DEB repository." msgstr "" @@ -1881,3 +1881,12 @@ msgstr "Nenhum modelo encontrado." msgid "Clone" msgstr "Clonar" + +msgid "available users/groups" +msgstr "" + +msgid "selected users/groups" +msgstr "" + +msgid "Permission" +msgstr "" diff --git a/po/zh_CN.po b/po/zh_CN.po index df37e71..7a6e8cd 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -1747,3 +1747,12 @@ msgstr "没有发现模板" msgid "Clone" msgstr "制作副本" + +msgid "available users/groups" +msgstr "可选用户及组" + +msgid "selected users/groups" +msgstr "已选用户及组" + +msgid "Permission" +msgstr "权限"

General comments: 1) I'd like to edit the VM permission when it is running I think it is possible but it is good to have a input from the original authors - Sheldon and Cristian Sheldon, Cristian, is it possible to set the metadata element to a running VM? 2) Some suggestions about it UI * Update the labels to: "Available system users and groups" and "Selected system users and groups" * I think it would be good to insert some instructions to user like: "Select system users and groups to have full access to this virtual machine" * I needed some time to understand that one column is a user list and other one the group list Maybe add headers to the columns On 07/18/2014 07:14 AM, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo <huoyuxin@linux.vnet.ibm.com>
Yu Xin Huo (2): Add users/groups to VM update po
po/en_US.po | 9 +++ po/kimchi.pot | 9 +++ po/pt_BR.po | 39 ++++++++----- po/zh_CN.po | 9 +++ ui/css/theme-default/guest-edit.css | 106 +++++++++++++++++++++++++++++++++ ui/images/theme-default/group.png | Bin 0 -> 1703 bytes ui/images/theme-default/user.png | Bin 0 -> 1322 bytes ui/js/src/kimchi.api.js | 28 +++++++++ ui/js/src/kimchi.guest_edit_main.js | 112 ++++++++++++++++++++++++++++++++++- ui/pages/guest-edit.html.tmpl | 33 ++++++++++ 10 files changed, 327 insertions(+), 18 deletions(-) create mode 100644 ui/images/theme-default/group.png create mode 100644 ui/images/theme-default/user.png
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel

On 7/22/2014 1:28 AM, Aline Manera wrote:
General comments:
1) I'd like to edit the VM permission when it is running I think it is possible but it is good to have a input from the original authors - Sheldon and Cristian
Sheldon, Cristian, is it possible to set the metadata element to a running VM?
2) Some suggestions about it UI
* Update the labels to: "Available system users and groups" and "Selected system users and groups"
addressed in v2.
* I think it would be good to insert some instructions to user like:
"Select system users and groups to have full access to this virtual machine"
in sprint 2, when adding a user to vm, there are 2 roles: admin or user. then this message will be redundant and does not match overall design.
* I needed some time to understand that one column is a user list and other one the group list Maybe add headers to the columns
addressed in v2
On 07/18/2014 07:14 AM, huoyuxin@linux.vnet.ibm.com wrote:
From: Yu Xin Huo<huoyuxin@linux.vnet.ibm.com>
Yu Xin Huo (2): Add users/groups to VM update po
po/en_US.po | 9 +++ po/kimchi.pot | 9 +++ po/pt_BR.po | 39 ++++++++----- po/zh_CN.po | 9 +++ ui/css/theme-default/guest-edit.css | 106 +++++++++++++++++++++++++++++++++ ui/images/theme-default/group.png | Bin 0 -> 1703 bytes ui/images/theme-default/user.png | Bin 0 -> 1322 bytes ui/js/src/kimchi.api.js | 28 +++++++++ ui/js/src/kimchi.guest_edit_main.js | 112 ++++++++++++++++++++++++++++++++++- ui/pages/guest-edit.html.tmpl | 33 ++++++++++ 10 files changed, 327 insertions(+), 18 deletions(-) create mode 100644 ui/images/theme-default/group.png create mode 100644 ui/images/theme-default/user.png
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel

On 21-07-2014 14:28, Aline Manera wrote:
General comments:
1) I'd like to edit the VM permission when it is running I think it is possible but it is good to have a input from the original authors - Sheldon and Cristian
Sheldon, Cristian, is it possible to set the metadata element to a running VM?
It should be. The function "setMetadata" has the parameter "flags" (the last one, optional) which is used to indicate whether the change will affect the live VM, the persistent configuration or both. I haven't tested it, but that should work. However I'm not sure how that will work on systems without a libvirt version which supports the function "setMetadata". Currently, we're redefining the VM by rewriting its XML description just to update the metadata information. I'd say that this doesn't affect a live VM because it's a redefinition, not a VM update. In other words, what would happen if we redefine a VM XML for anything else (e.g. CPU count, memory, disk, etc)? Does that change happen on the live VM? The same thing should happen when updating the metadata via this method.
participants (4)
-
Aline Manera
-
Crístian Viana
-
huoyuxin@linux.vnet.ibm.com
-
Yu Xin Huo