diff --git a/include/ImagePool.h b/include/ImagePool.h index 3a7b4bd05d..2530fcb20c 100644 --- a/include/ImagePool.h +++ b/include/ImagePool.h @@ -40,7 +40,8 @@ public: ImagePool(SqlDB * db, const string& _default_type, - const string& _default_dev_prefix); + const string& _default_dev_prefix, + vector<const Attribute *>& restricted_attrs); ~ImagePool(){}; diff --git a/include/ImageTemplate.h b/include/ImageTemplate.h index df7661e96a..243e9f3f45 100644 --- a/include/ImageTemplate.h +++ b/include/ImageTemplate.h @@ -30,6 +30,23 @@ public: ImageTemplate() : Template(true,'=',"TEMPLATE"){}; ~ImageTemplate(){}; + + /** + * Checks the template for RESTRICTED ATTRIBUTES + * @param rs_attr the first restricted attribute found if any + * @return true if a restricted attribute is found in the template + */ + bool check(string& rs_attr) + { + return Template::check(rs_attr, restricted_attributes); + }; + +private: + friend class ImagePool; + + static vector<string> restricted_attributes; + + static void set_restricted_attributes(vector<const Attribute *>& rattrs); }; /* -------------------------------------------------------------------------- */ diff --git a/include/RequestManagerChmod.h b/include/RequestManagerChmod.h index 815ba561a7..60282af845 100644 --- a/include/RequestManagerChmod.h +++ b/include/RequestManagerChmod.h @@ -31,7 +31,7 @@ class RequestManagerChmod : public Request protected: RequestManagerChmod(const string& method_name, const string& help, - const string& params = "A:siii") + const string& params = "A:siiiiiiiiii") :Request(method_name,params,help){}; ~RequestManagerChmod(){}; @@ -50,7 +50,7 @@ class VirtualMachineChmod : public RequestManagerChmod public: VirtualMachineChmod(): RequestManagerChmod("VirtualMachineChmod", - "Changes ownership of a virtual machine") + "Changes permission bits of a virtual machine") { Nebula& nd = Nebula::instance(); pool = nd.get_vmpool(); @@ -68,7 +68,7 @@ class TemplateChmod : public RequestManagerChmod public: TemplateChmod(): RequestManagerChmod("TemplateChmod", - "Changes ownership of a virtual machine template") + "Changes permission bits of a virtual machine template") { Nebula& nd = Nebula::instance(); pool = nd.get_tpool(); @@ -87,7 +87,7 @@ class VirtualNetworkChmod: public RequestManagerChmod public: VirtualNetworkChmod(): RequestManagerChmod("VirtualNetworkChmod", - "Changes ownership of a virtual network") + "Changes permission bits of a virtual network") { Nebula& nd = Nebula::instance(); pool = nd.get_vnpool(); @@ -106,7 +106,7 @@ class ImageChmod: public RequestManagerChmod public: ImageChmod(): RequestManagerChmod("ImageChmod", - "Changes ownership of an image") + "Changes permission bits of an image") { Nebula& nd = Nebula::instance(); pool = nd.get_ipool(); diff --git a/include/Template.h b/include/Template.h index 79d2ec45bb..8a1dbe8b9a 100644 --- a/include/Template.h +++ b/include/Template.h @@ -221,6 +221,13 @@ protected: */ Attribute* vector_xml_att(const xmlNode * node); + /** + * Checks the template for RESTRICTED ATTRIBUTES + * @param rs_attr the first restricted attribute found if any + * @return true if a restricted attribute is found in the template + */ + bool check(string& rs_attr, const vector<string> &restricted_attributes); + private: bool replace_mode; diff --git a/include/VirtualMachinePool.h b/include/VirtualMachinePool.h index 2b90c15002..7e3ea7e6e2 100644 --- a/include/VirtualMachinePool.h +++ b/include/VirtualMachinePool.h @@ -35,7 +35,8 @@ public: VirtualMachinePool(SqlDB * db, vector<const Attribute *> hook_mads, const string& hook_location, - const string& remotes_location); + const string& remotes_location, + vector<const Attribute *>& restricted_attrs); ~VirtualMachinePool(){}; diff --git a/include/VirtualMachineTemplate.h b/include/VirtualMachineTemplate.h index 394de28d7f..422a73cfa4 100644 --- a/include/VirtualMachineTemplate.h +++ b/include/VirtualMachineTemplate.h @@ -41,22 +41,18 @@ public: * @param rs_attr the first restricted attribute found if any * @return true if a restricted attribute is found in the template */ - bool check(string& rs_attr); - -private: - /** - * Number of restricted attributes - */ - const static int RS_ATTRS_LENGTH; - - /** - * Restricted template attributes in the form - * 'SINGLE' or 'VECTOR/ATTR'. Restricted attributes are only - * allowed for ONE_ADMIN Group. - */ - const static string RESTRICTED_ATTRIBUTES[]; + bool check(string& rs_attr) + { + return Template::check(rs_attr, restricted_attributes); + }; - friend class VirtualMachine; +private: + + friend class VirtualMachinePool; + + static vector<string> restricted_attributes; + + static void set_restricted_attributes(vector<const Attribute *>& rattrs); }; /* -------------------------------------------------------------------------- */ diff --git a/share/etc/oned.conf b/share/etc/oned.conf index 63c0b70e62..88fd8c0b29 100644 --- a/share/etc/oned.conf +++ b/share/etc/oned.conf @@ -471,4 +471,19 @@ AUTH_MAD = [ SESSION_EXPIRATION_TIME = 900 -#ENABLE_OTHER_PERMISSIONS = "YES" \ No newline at end of file +#ENABLE_OTHER_PERMISSIONS = "YES" + + +#******************************************************************************* +# Restricted Attributes Configuration +#******************************************************************************* +# The following attributes are restricted to users outside the oneadmin group +#******************************************************************************* + +VM_RESTRICTED_ATTR = "CONTEXT/FILES" +VM_RESTRICTED_ATTR = "DISK/SOURCE" +VM_RESTRICTED_ATTR = "NIC/MAC" +VM_RESTRICTED_ATTR = "NIC/VLAN_ID" +VM_RESTRICTED_ATTR = "RANK" + +IMAGE_RESTRICTED_ATTR = "SOURCE" diff --git a/src/acct/accounting.rb b/src/acct/accounting.rb index 3b8b7ce5c5..b30be641d6 100644 --- a/src/acct/accounting.rb +++ b/src/acct/accounting.rb @@ -93,29 +93,30 @@ module OneWatch last_register = vm_sql.registers.last seq = last_register ? last_register.seq : 0 - if hr = vm['HISTORY_RECORDS'] - unless hr['HISTORY'].instance_of?(Array) - if hr['HISTORY']['SEQ'] == seq - # The VM has not moved from the Host - insert_register(vm_sql, last_register, hr['HISTORY']) - return - else + hr = vm['HISTORY_RECORDS'] + if hr and !hr.empty? + if hr['HISTORY']['SEQ'] == seq + # The VM has not moved from the Host + insert_register(vm_sql, last_register, hr['HISTORY']) + return + else + unless hr['HISTORY'].instance_of?(Array) # Get the full HISTORY vm = OpenNebula::VirtualMachine.new_with_id(vm['ID'], @client) vm.info vm_hash = vm.to_hash['VM'] hr = vm_hash['HISTORY_RECORDS'] - - # Insert a new entry for each new history record - [hr['HISTORY']].flatten.each { |history| - if history['SEQ'].to_i < seq - next - else - insert_register(vm_sql, last_register, history) - end - } end + + # Insert a new entry for each new history record + [hr['HISTORY']].flatten.each { |history| + if history['SEQ'].to_i < seq + next + else + insert_register(vm_sql, last_register, history) + end + } end end end diff --git a/src/authm/AuthManager.cc b/src/authm/AuthManager.cc index cbfb2741fc..348782c68a 100644 --- a/src/authm/AuthManager.cc +++ b/src/authm/AuthManager.cc @@ -88,7 +88,7 @@ void AuthRequest::add_auth(Operation op, if ( auth == false ) { - ostringstream oss; + oss.str(""); oss << message; diff --git a/src/authm/test/AuthManagerTest.cc b/src/authm/test/AuthManagerTest.cc index d0a82b8f86..38635216ff 100644 --- a/src/authm/test/AuthManagerTest.cc +++ b/src/authm/test/AuthManagerTest.cc @@ -180,10 +180,11 @@ public: //OBJECT:OBJECT_ID:ACTION:OWNER:PUBLIC:CORE_RESULT - string astr = "VM:VGhpcyBpcyBhIHRlbXBsYXRlCg==:CREATE:-1:0:0 " - "IMAGE:2:USE:3:0:0 " - "NET:4:MANAGE:5:1:0 " - "HOST:6:MANAGE:7:1:0 0"; + string astr = "VM:VGhpcyBpcyBhIHRlbXBsYXRlCg==:CREATE:2:0 " + "IMAGE:2:USE:3:0 " + "NET:4:MANAGE:5:0 " + "HOST:6:MANAGE:7:0 " + "0"; PoolObjectAuth perm; @@ -230,7 +231,7 @@ public: AuthRequest ar1(2, 2); - string astr1= "VM:VGhpcyBpcyBhIHRlbXBsYXRlCg==:CREATE:-1:0:0 0"; + string astr1= "VM:VGhpcyBpcyBhIHRlbXBsYXRlCg==:CREATE:2:0 0"; ar1.add_create_auth(PoolObjectSQL::VM, "This is a template\n"); @@ -259,15 +260,15 @@ public: am->trigger(AuthManager::AUTHORIZE,&ar2); ar2.wait(); //* - if ( ar1.result != false ) + if ( ar2.result != false ) { - cout << endl << "ar.result: " << ar1.result << endl; + cout << endl << "ar2.result: " << ar2.result << endl; } - if ( ar1.message != astr1 ) + if ( ar2.message != astr2 ) { - cout << endl << "ar.message: " << ar1.message; - cout << endl << "expected: " << astr1 << endl; + cout << endl << "ar2.message: " << ar2.message; + cout << endl << "expected: " << astr2 << endl; } //*/ CPPUNIT_ASSERT(ar2.result==false); diff --git a/src/authm_mad/remotes/quota/quota.rb b/src/authm_mad/remotes/quota/quota.rb index c86854526e..fedddd5f3e 100644 --- a/src/authm_mad/remotes/quota/quota.rb +++ b/src/authm_mad/remotes/quota/quota.rb @@ -82,7 +82,7 @@ class Quota if template['TYPE'] == 'DATABLOCK' template['SIZE'].to_i elsif template['PATH'] - (File.size(template['PATH']).to_f / 2**20).round(2) + (File.size(template['PATH']).to_f / 2**20).round elsif template['SAVED_VM_ID'] vm_id = template['SAVED_VM_ID'].to_i disk_id = template['SAVED_DISK_ID'].to_i diff --git a/src/cloud/occi/lib/ImageOCCI.rb b/src/cloud/occi/lib/ImageOCCI.rb index 8f873aaa93..c15cd97c0e 100755 --- a/src/cloud/occi/lib/ImageOCCI.rb +++ b/src/cloud/occi/lib/ImageOCCI.rb @@ -22,7 +22,8 @@ class ImageOCCI < Image OCCI_IMAGE = %q{ <STORAGE href="<%= base_url %>/storage/<%= self.id.to_s %>"> <ID><%= self.id.to_s %></ID> - <NAME><%= self.name %></NAME> + <NAME><%= self.name %></NAME + <STATE><%= self.state_str %></STATE> <% if self['TYPE'] != nil %> <TYPE><%= self.type_str %></TYPE> <% end %> diff --git a/src/cloud/occi/lib/occi-server.rb b/src/cloud/occi/lib/occi-server.rb index cfadd287a2..5eb9a97846 100755 --- a/src/cloud/occi/lib/occi-server.rb +++ b/src/cloud/occi/lib/occi-server.rb @@ -324,7 +324,7 @@ post '/config' do end get '/ui/login' do - File.read(File.dirname(__FILE__)+'/ui/templates/login.html') + redirect to('ui') end post '/ui/login' do diff --git a/src/cloud/occi/lib/ui/public/js/plugins/compute.js b/src/cloud/occi/lib/ui/public/js/plugins/compute.js index c5bc985d1b..5550566e49 100644 --- a/src/cloud/occi/lib/ui/public/js/plugins/compute.js +++ b/src/cloud/occi/lib/ui/public/js/plugins/compute.js @@ -1101,7 +1101,7 @@ $(document).ready(function(){ tableCheckboxesListener(dataTable_vMachines); vMachineInfoListener(); - $('#li_vms_tab a').click(function(){ + $('#li_vms_tab').click(function(){ popUpVMDashboard(); }); diff --git a/src/cloud/occi/lib/ui/public/js/plugins/configuration.js b/src/cloud/occi/lib/ui/public/js/plugins/configuration.js index e25007fe91..c92844ac1e 100644 --- a/src/cloud/occi/lib/ui/public/js/plugins/configuration.js +++ b/src/cloud/occi/lib/ui/public/js/plugins/configuration.js @@ -55,7 +55,7 @@ $(document).ready(function(){ setLang($(this).val()); }); - $('#li_config_tab a').click(function(){ + $('#li_config_tab').click(function(){ hideDialog(); }); diff --git a/src/cloud/occi/lib/ui/public/js/plugins/dashboard.js b/src/cloud/occi/lib/ui/public/js/plugins/dashboard.js index 9e733ecb38..47b53d6278 100644 --- a/src/cloud/occi/lib/ui/public/js/plugins/dashboard.js +++ b/src/cloud/occi/lib/ui/public/js/plugins/dashboard.js @@ -169,7 +169,7 @@ $(document).ready(function(){ quickstart_setup(); - $('#li_dashboard_tab a').click(function(){ + $('#li_dashboard_tab').click(function(){ hideDialog(); }); diff --git a/src/cloud/occi/lib/ui/public/js/plugins/network.js b/src/cloud/occi/lib/ui/public/js/plugins/network.js index 257eb9cf04..98853b4202 100644 --- a/src/cloud/occi/lib/ui/public/js/plugins/network.js +++ b/src/cloud/occi/lib/ui/public/js/plugins/network.js @@ -445,7 +445,7 @@ $(document).ready(function(){ tableCheckboxesListener(dataTable_vNetworks); vNetworkInfoListener(); - $('#li_vnets_tab a').click(function(){ + $('#li_vnets_tab').click(function(){ popUpVNetDashboard(); //return false; }); diff --git a/src/cloud/occi/lib/ui/public/js/plugins/storage.js b/src/cloud/occi/lib/ui/public/js/plugins/storage.js index b4542daa82..f505615b1e 100644 --- a/src/cloud/occi/lib/ui/public/js/plugins/storage.js +++ b/src/cloud/occi/lib/ui/public/js/plugins/storage.js @@ -631,7 +631,7 @@ $(document).ready(function(){ tableCheckboxesListener(dataTable_images); imageInfoListener(); - $('#li_images_tab a').click(function(){ + $('#li_images_tab').click(function(){ popUpImageDashboard(); //return false; }); diff --git a/src/host/test/HostPoolTest.cc b/src/host/test/HostPoolTest.cc index 1e87ecbde0..044d154d63 100644 --- a/src/host/test/HostPoolTest.cc +++ b/src/host/test/HostPoolTest.cc @@ -181,7 +181,7 @@ protected: host->to_xml(xml_str); // A little help for debugging -/* +//* if( xml_str != xmls[index] ) { cout << endl << xml_str << endl << "========" @@ -284,7 +284,7 @@ public: string result = oss.str(); // A little help for debugging -/* +//* if( result != xml_dump ) { cout << endl << result << endl << "========" @@ -311,14 +311,14 @@ public: ostringstream oss; - rc = ((HostPool*)pool)->dump(oss, "name LIKE 'a%' ORDER BY oid"); + rc = ((HostPool*)pool)->dump(oss, "name LIKE 'a%'"); CPPUNIT_ASSERT(rc == 0); string result = oss.str(); // A little help for debugging -/* +//* if( result != xml_dump_like_a ) { cout << endl << result << endl << "========" diff --git a/src/image/Image.cc b/src/image/Image.cc index dca65bf838..181300ce56 100644 --- a/src/image/Image.cc +++ b/src/image/Image.cc @@ -93,6 +93,23 @@ int Image::insert(SqlDB *db, string& error_str) string persistent_attr; string dev_prefix; string source_attr; + string aname; + + ostringstream oss; + + // ------------------------------------------------------------------------ + // Check template for restricted attributes + // ------------------------------------------------------------------------ + + if ( uid != 0 && gid != GroupPool::ONEADMIN_ID ) + { + ImageTemplate *img_template = static_cast<ImageTemplate *>(obj_template); + + if (img_template->check(aname)) + { + goto error_restricted; + } + } // --------------------------------------------------------------------- // Check default image attributes @@ -204,6 +221,11 @@ error_path_and_source: error_str = "Template malformed, PATH and SOURCE are mutually exclusive."; goto error_common; +error_restricted: + oss << "Template includes a restricted attribute " << aname << "."; + error_str = oss.str(); + goto error_common; + error_common: NebulaLog::log("IMG", Log::ERROR, error_str); return -1; diff --git a/src/image/ImagePool.cc b/src/image/ImagePool.cc index bebcfdf35c..7e023b3868 100644 --- a/src/image/ImagePool.cc +++ b/src/image/ImagePool.cc @@ -33,7 +33,8 @@ string ImagePool::_default_dev_prefix; ImagePool::ImagePool(SqlDB * db, const string& __default_type, - const string& __default_dev_prefix): + const string& __default_dev_prefix, + vector<const Attribute *>& restricted_attrs): PoolSQL(db,Image::table) { ostringstream sql; @@ -50,6 +51,9 @@ ImagePool::ImagePool(SqlDB * db, NebulaLog::log("IMG", Log::ERROR, "Bad default for type, setting OS"); _default_type = "OS"; } + + // Set restricted attributes + ImageTemplate::set_restricted_attributes(restricted_attrs); } /* -------------------------------------------------------------------------- */ diff --git a/src/image/ImageTemplate.cc b/src/image/ImageTemplate.cc new file mode 100644 index 0000000000..6df1942c3d --- /dev/null +++ b/src/image/ImageTemplate.cc @@ -0,0 +1,44 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +#include "ImageTemplate.h" + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +vector<string> ImageTemplate::restricted_attributes; + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +void ImageTemplate::set_restricted_attributes(vector<const Attribute *>& rattrs) +{ + const SingleAttribute * sattr; + string attr; + + for (unsigned int i = 0 ; i < rattrs.size() ; i++ ) + { + sattr = static_cast<const SingleAttribute *>(rattrs[i]); + + attr = sattr->value(); + transform (attr.begin(),attr.end(),attr.begin(),(int(*)(int))toupper); + + restricted_attributes.push_back(attr); + } +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ diff --git a/src/image/SConstruct b/src/image/SConstruct index c906501b31..26d5f70e35 100644 --- a/src/image/SConstruct +++ b/src/image/SConstruct @@ -26,7 +26,8 @@ source_files=[ 'ImagePool.cc', 'ImageManagerDriver.cc', 'ImageManager.cc', - 'ImageManagerActions.cc' + 'ImageManagerActions.cc', + 'ImageTemplate.cc' ] # Build library diff --git a/src/image/test/ImagePoolTest.cc b/src/image/test/ImagePoolTest.cc index c127433492..feb835aea9 100644 --- a/src/image/test/ImagePoolTest.cc +++ b/src/image/test/ImagePoolTest.cc @@ -40,7 +40,6 @@ const string templates[] = "NAME = \"Second Image\"\n" "PATH = /tmp/image_second_test\n" - "PUBLIC = YES\n" "DESCRIPTION = \"This is a rather short description.\"\n", "NAME = \"The third image\"\n" @@ -52,20 +51,20 @@ const string templates[] = const string xmls[] = { -"<IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><TYPE>0</TYPE><PUBLIC>0</PUBLIC><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE>", +"<IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE>", -"<IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><TYPE>0</TYPE><PUBLIC>1</PUBLIC><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE>", +"<IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE>", -"<IMAGE><ID>0</ID><UID>2</UID><GID>1</GID><UNAME>three</UNAME><GNAME>users</GNAME><NAME>The third image</NAME><TYPE>0</TYPE><PUBLIC>0</PUBLIC><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><BUS><![CDATA[SCSI]]></BUS><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX><PROFILE><![CDATA[STUDENT]]></PROFILE></TEMPLATE></IMAGE>", +"<IMAGE><ID>0</ID><UID>2</UID><GID>1</GID><UNAME>three</UNAME><GNAME>users</GNAME><NAME>The third image</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><BUS><![CDATA[SCSI]]></BUS><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX><PROFILE><![CDATA[STUDENT]]></PROFILE></TEMPLATE></IMAGE>", }; // This xml dump result has the STIMEs modified to 0000000000 const string xml_dump = -"<IMAGE_POOL><IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><TYPE>0</TYPE><PUBLIC>0</PUBLIC><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><TYPE>0</TYPE><PUBLIC>1</PUBLIC><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>2</ID><UID>2</UID><GID>1</GID><UNAME>three</UNAME><GNAME>users</GNAME><NAME>The third image</NAME><TYPE>0</TYPE><PUBLIC>0</PUBLIC><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><BUS><![CDATA[SCSI]]></BUS><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX><PROFILE><![CDATA[STUDENT]]></PROFILE></TEMPLATE></IMAGE></IMAGE_POOL>"; +"<IMAGE_POOL><IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>2</ID><UID>2</UID><GID>1</GID><UNAME>three</UNAME><GNAME>users</GNAME><NAME>The third image</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><BUS><![CDATA[SCSI]]></BUS><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX><PROFILE><![CDATA[STUDENT]]></PROFILE></TEMPLATE></IMAGE></IMAGE_POOL>"; const string xml_dump_where = -"<IMAGE_POOL><IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><TYPE>0</TYPE><PUBLIC>0</PUBLIC><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><TYPE>0</TYPE><PUBLIC>1</PUBLIC><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE></IMAGE_POOL>"; +"<IMAGE_POOL><IMAGE><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>one</UNAME><GNAME>oneadmin</GNAME><NAME>Image one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>1</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a very long description of an image, and to achieve the longness I will copy this over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over. This is a very long description of an image, and to achieve the longness I will copy this over. And over.This is a very long description of an image, and to achieve the longness I will copy this over.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE><IMAGE><ID>1</ID><UID>1</UID><GID>1</GID><UNAME>two</UNAME><GNAME>oneadmin</GNAME><NAME>Second Image</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><PERSISTENT>0</PERSISTENT><REGTIME>0000000000</REGTIME><SOURCE></SOURCE><PATH>/tmp/image_second_test</PATH><FSTYPE></FSTYPE><SIZE>0</SIZE><STATE>4</STATE><RUNNING_VMS>0</RUNNING_VMS><TEMPLATE><DESCRIPTION><![CDATA[This is a rather short description.]]></DESCRIPTION><DEV_PREFIX><![CDATA[hd]]></DEV_PREFIX></TEMPLATE></IMAGE></IMAGE_POOL>"; /* ************************************************************************* */ /* ************************************************************************* */ @@ -190,7 +189,7 @@ protected: ((Image*)obj)->to_xml(xml_str); fix_regtimes(xml_str); -/* +//* if( xml_str != xmls[index] ) { cout << endl << xml_str << endl << xmls[index] << endl; @@ -860,7 +859,7 @@ public: string result = oss.str(); fix_regtimes(result); -/* +//* if( result != xml_dump ) { cout << endl << result << endl << xml_dump << endl; @@ -893,7 +892,7 @@ public: string result = oss.str(); fix_regtimes(result); -/* +//* if( result != xml_dump_where ) { cout << endl << result << endl << xml_dump_where << endl; diff --git a/src/mad/ruby/ssh_stream.rb b/src/mad/ruby/ssh_stream.rb index f4ac1da47d..42ada93462 100644 --- a/src/mad/ruby/ssh_stream.rb +++ b/src/mad/ruby/ssh_stream.rb @@ -193,6 +193,10 @@ class SshStreamCommand < RemotesCommand return self end + + def close + @stream.close + end end diff --git a/src/nebula/Nebula.cc b/src/nebula/Nebula.cc index 785e485ab6..96523349dd 100644 --- a/src/nebula/Nebula.cc +++ b/src/nebula/Nebula.cc @@ -276,14 +276,20 @@ void Nebula::start() vector<const Attribute *> vm_hooks; vector<const Attribute *> host_hooks; + vector<const Attribute *> vm_restricted_attrs; + vector<const Attribute *> img_restricted_attrs; nebula_configuration->get("VM_HOOK", vm_hooks); nebula_configuration->get("HOST_HOOK", host_hooks); + nebula_configuration->get("VM_RESTRICTED_ATTR", vm_restricted_attrs); + nebula_configuration->get("IMAGE_RESTRICTED_ATTR", img_restricted_attrs); + vmpool = new VirtualMachinePool(db, vm_hooks, hook_location, - remotes_location); + remotes_location, + vm_restricted_attrs); hpool = new HostPool(db, host_hooks, hook_location, remotes_location); nebula_configuration->get("MAC_PREFIX", mac_prefix); @@ -301,7 +307,8 @@ void Nebula::start() ipool = new ImagePool(db, default_image_type, - default_device_prefix); + default_device_prefix, + img_restricted_attrs); tpool = new VMTemplatePool(db); } diff --git a/src/ozones/Server/public/js/ozones-util.js b/src/ozones/Server/public/js/ozones-util.js index fb3dcb36df..f7edb069d1 100644 --- a/src/ozones/Server/public/js/ozones-util.js +++ b/src/ozones/Server/public/js/ozones-util.js @@ -70,15 +70,15 @@ function updateVMsList(req,list,tag,zone_id,zone_name){ state, vm.CPU, humanize_size(vm.MEMORY), - vm.HISTORY_RECORDS ? vm.HISTORY_RECORDS.HISTORY.HOSTNAME : "--", + hostname, pretty_time(vm.STIME) ]); }; }); - updateView(vms_array,vmsDataTable); - -} + vmsDataTable.fnAddData(vms_array); + vmsDataTable.fnDraw(false); +}; function updateVNsList(req,list,tag,zone_id,zone_name){ var vnDataTable = $(tag).dataTable(); @@ -103,7 +103,6 @@ function updateVNsList(req,list,tag,zone_id,zone_name){ network.NAME, parseInt(network.TYPE) ? "FIXED" : "RANGED", network.BRIDGE, - parseInt(network.PUBLIC) ? "yes" : "no", total_leases ]); } else { @@ -114,14 +113,14 @@ function updateVNsList(req,list,tag,zone_id,zone_name){ network.NAME, parseInt(network.TYPE) ? "FIXED" : "RANGED", network.BRIDGE, - parseInt(network.PUBLIC) ? "yes" : "no", total_leases ]); } }); - updateView(vn_array,vnDataTable); -} + vnDataTable.fnAddData(vn_array); + vnDataTable.fnDraw(false); +}; function updateTemplatesList(req,list,tag,zone_id,zone_name){ var templateDataTable = $(tag).dataTable(); @@ -138,7 +137,6 @@ function updateTemplatesList(req,list,tag,zone_id,zone_name){ template.GNAME, template.NAME, pretty_time(template.REGTIME), - parseInt(template.PUBLIC) ? "yes" : "no" ]); } else { template_array.push([ @@ -147,11 +145,11 @@ function updateTemplatesList(req,list,tag,zone_id,zone_name){ template.GNAME, template.NAME, pretty_time(template.REGTIME), - parseInt(template.PUBLIC) ? "yes" : "no" ]); }; }); - updateView(template_array,templateDataTable); + templateDataTable.fnAddData(template_array); + templateDataTable.fnDraw(false); } function updateUsersList(req,list,tag, zone_id,zone_name){ @@ -186,8 +184,9 @@ function updateUsersList(req,list,tag, zone_id,zone_name){ } }); - updateView(user_array,userDataTable); -} + userDataTable.fnAddData(user_array); + userDataTable.fnDraw(false); +}; function updateImagesList(req,list,tag,zone_id,zone_name){ var imageDataTable = $(tag).dataTable(); @@ -206,7 +205,6 @@ function updateImagesList(req,list,tag,zone_id,zone_name){ image.NAME, oZones.Helper.image_type(image.TYPE), pretty_time(image.REGTIME), - parseInt(image.PUBLIC) ? "yes" : "no", parseInt(image.PERSISTENT) ? "yes" : "no", oZones.Helper.resource_state("image",image.STATE), image.RUNNING_VMS @@ -219,15 +217,15 @@ function updateImagesList(req,list,tag,zone_id,zone_name){ image.NAME, oZones.Helper.image_type(image.TYPE), pretty_time(image.REGTIME), - parseInt(image.PUBLIC) ? "yes" : "no", parseInt(image.PERSISTENT) ? "yes" : "no", oZones.Helper.resource_state("image",image.STATE), image.RUNNING_VMS ]); }; }); - updateView(image_array,imageDataTable); -} + imageDataTable.fnAddData(image_array); + imageDataTable.fnDraw(false); +}; function hostElementArray(host,zone_id,zone_name){ diff --git a/src/ozones/Server/public/js/plugins/aggregated-tab.js b/src/ozones/Server/public/js/plugins/aggregated-tab.js index 5afb381c3a..3286773632 100644 --- a/src/ozones/Server/public/js/plugins/aggregated-tab.js +++ b/src/ozones/Server/public/js/plugins/aggregated-tab.js @@ -70,7 +70,6 @@ var aggregated_vns_tab_content = <th>Name</th>\ <th>Type</th>\ <th>Bridge</th>\ - <th>Public?</th>\ <th>Total Leases</th>\ </tr>\ </thead>\ @@ -91,7 +90,6 @@ var aggregated_images_tab_content = <th>Name</th>\ <th>Type</th>\ <th>Registration time</th>\ - <th>Public</th>\ <th>Persistent</th>\ <th>State</th>\ <th>#VMS</th>\ @@ -129,7 +127,6 @@ var aggregated_templates_tab_content = <th>Group</th>\ <th>Name</th>\ <th>Registration time</th>\ - <th>Public</th>\ </tr>\ </thead>\ <tbody>\ @@ -410,80 +407,98 @@ Sunstone.addMainTab("agg_templates_tab",templates_tab); function hostsListCB(req,list){ dataTable_agg_hosts.fnClearTable(); + var total_hosts = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var host_json = oZones.Helper.pool("HOST",this.ZONE); + total_hosts = total_hosts.concat(host_json); updateHostsList(req, host_json,'#datatable_agg_hosts',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("hosts",host_json); }); + + updateZonesDashboard("hosts",total_hosts); } function vmsListCB(req,list){ dataTable_agg_vms.fnClearTable(); + var total_vms = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var vms_json = oZones.Helper.pool("VM",this.ZONE); + total_vms = total_vms.concat(vms_json); updateVMsList(req, vms_json,'#datatable_agg_vms',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("vms",vms_json); }); + + updateZonesDashboard("vms",total_vms); } function vnsListCB(req,list){ dataTable_agg_vns.fnClearTable(); + var total_vns = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var vn_json = oZones.Helper.pool("VNET",this.ZONE); + total_vns = total_vns.concat(vn_json); updateVNsList(req, vn_json,'#datatable_agg_vnets',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("vnets",vn_json); }); + + updateZonesDashboard("vnets",total_vns); } function imagesListCB(req,list){ dataTable_agg_images.fnClearTable(); + total_images = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var image_json = oZones.Helper.pool("IMAGE",this.ZONE); + total_images = total_images.concat(image_json); updateImagesList(req,image_json,'#datatable_agg_images',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("images",image_json); }); + + updateZonesDashboard("images",total_images); } function usersListCB(req,list){ dataTable_agg_users.fnClearTable(); + var total_users = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var user_json = oZones.Helper.pool("USER",this.ZONE); + total_users = total_users.concat(user_json); updateUsersList(req,user_json,'#datatable_agg_users',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("users",user_json); }); + + updateZonesDashboard("users",total_users); } function templatesListCB(req,list){ dataTable_agg_templates.fnClearTable(); + var total_templates = []; $.each(list,function(){ if (this.ZONE.error){ notifyError(this.ZONE.error.message); return; }; var template_json = oZones.Helper.pool("VMTEMPLATE",this.ZONE); + total_templates = total_templates.concat(template_json); updateTemplatesList(req,template_json,'#datatable_agg_templates',this.ZONE.ID,this.ZONE.NAME); - updateZonesDashboard("templates",template_json); }); + + updateZonesDashboard("templates",total_templates); } function setAutorefreshes(){ @@ -566,7 +581,7 @@ $(document).ready(function(){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "60px", "aTargets": [6,7,8,9] }, + { "sWidth": "60px", "aTargets": [6,7,8] }, { "sWidth": "35px", "aTargets": [0,2] }, { "sWidth": "100px", "aTargets": [1,3,4] } ] @@ -578,8 +593,8 @@ $(document).ready(function(){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "60px", "aTargets": [10] }, - { "sWidth": "35px", "aTargets": [0,2,8,9,11] }, + { "sWidth": "60px", "aTargets": [9] }, + { "sWidth": "35px", "aTargets": [0,2,8,10] }, { "sWidth": "100px", "aTargets": [1,3,4,6,7] } ] }); @@ -590,7 +605,7 @@ $(document).ready(function(){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "35px", "aTargets": [0,2,7] }, + { "sWidth": "35px", "aTargets": [0,2] }, { "sWidth": "100px", "aTargets": [1,3,4,6] } ] }); diff --git a/src/ozones/Server/public/js/plugins/dashboard-tab.js b/src/ozones/Server/public/js/plugins/dashboard-tab.js index 46eec7465b..4403394e5c 100644 --- a/src/ozones/Server/public/js/plugins/dashboard-tab.js +++ b/src/ozones/Server/public/js/plugins/dashboard-tab.js @@ -81,10 +81,6 @@ var dashboard_tab_content = <td class="key_td">Total</td>\ <td class="value_td"><span id="total_templates"></span></td>\ </tr>\ - <tr>\ - <td class="key_td">Public</td>\ - <td class="value_td"><span id="public_templates"></span></td>\ - </tr>\ </table>\ </div>\ </div>\ @@ -124,10 +120,6 @@ var dashboard_tab_content = <td class="key_td">Total</td>\ <td class="value_td"><span id="total_vnets"></span></td>\ </tr>\ - <tr>\ - <td class="key_td">Public</td>\ - <td class="value_td"><span id="public_vnets"></span></td>\ - </tr>\ </table>\ </div>\ </div>\ @@ -146,10 +138,6 @@ var dashboard_tab_content = <td class="key_td">Total</td>\ <td class="value_td"><span id="total_images"></span></td>\ </tr>\ - <tr>\ - <td class="key_td">Public</td>\ - <td class="value_td"><span id="public_images"></span></td>\ - </tr>\ </table>\ </div>\ </div>\ @@ -180,7 +168,6 @@ var dashboard_tab = { Sunstone.addMainTab('dashboard_tab',dashboard_tab); $(document).ready(function(){ - //Dashboard link listener $("#dashboard_table h3 a").live("click", function (){ var tab = $(this).attr('href'); showTab(tab); @@ -220,15 +207,7 @@ function updateZonesDashboard(what,json_info){ break; case "templates": var total_templates=json_info.length; - var public_templates=0; - $.each(json_info,function(){ - if (parseInt(this.VMTEMPLATE.PUBLIC)){ - public_templates++; - }; - }); - $('#total_templates',db).html(total_templates); - $('#public_templates',db).html(public_templates); break; case "vms": var total_vms=json_info.length; @@ -248,14 +227,8 @@ function updateZonesDashboard(what,json_info){ $('#failed_vms',db).html(failed_vms); break; case "vnets": - var public_vnets=0; var total_vnets=json_info.length; - $.each(json_info,function(){ - if (parseInt(this.VNET.PUBLIC)){ - public_vnets++;} - }); $('#total_vnets',db).html(total_vnets); - $('#public_vnets',db).html(public_vnets); break; case "users": var total_users=json_info.length; @@ -263,13 +236,7 @@ function updateZonesDashboard(what,json_info){ break; case "images": var total_images=json_info.length; - var public_images=0; - $.each(json_info,function(){ - if (parseInt(this.IMAGE.PUBLIC)){ - public_images++;} - }); $('#total_images',db).html(total_images); - $('#public_images',db).html(public_images); break; } } diff --git a/src/ozones/Server/public/js/plugins/zones-tab.js b/src/ozones/Server/public/js/plugins/zones-tab.js index d8ea22a55a..4fbb8daeb4 100644 --- a/src/ozones/Server/public/js/plugins/zones-tab.js +++ b/src/ozones/Server/public/js/plugins/zones-tab.js @@ -352,7 +352,6 @@ function updateZoneInfo(req,zone_json){ <th>Group</th>\ <th>Name</th>\ <th>Registration time</th>\ - <th>Public</th>\ </tr>\ </thead>\ <tbody>\ @@ -396,7 +395,6 @@ function updateZoneInfo(req,zone_json){ <th>Name</th>\ <th>Type</th>\ <th>Bridge</th>\ - <th>Public?</th>\ <th>Total Leases</th>\ </tr>\ </thead>\ @@ -418,7 +416,6 @@ function updateZoneInfo(req,zone_json){ <th>Name</th>\ <th>Type</th>\ <th>Registration time</th>\ - <th>Public</th>\ <th>Persistent</th>\ <th>State</th>\ <th>#VMS</th>\ @@ -490,7 +487,7 @@ function updateZoneInfo(req,zone_json){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "60px", "aTargets": [4,5,6,7] }, + { "sWidth": "60px", "aTargets": [4,5,6] }, { "sWidth": "35px", "aTargets": [0] }, { "sWidth": "100px", "aTargets": [1,2] } ] @@ -502,8 +499,8 @@ function updateZoneInfo(req,zone_json){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "60px", "aTargets": [8] }, - { "sWidth": "35px", "aTargets": [0,6,7,9] }, + { "sWidth": "60px", "aTargets": [7] }, + { "sWidth": "35px", "aTargets": [0,6,8] }, { "sWidth": "100px", "aTargets": [1,2,4,5] } ] }); @@ -514,7 +511,7 @@ function updateZoneInfo(req,zone_json){ "bAutoWidth":false, "sPaginationType": "full_numbers", "aoColumnDefs": [ - { "sWidth": "35px", "aTargets": [0,5] }, + { "sWidth": "35px", "aTargets": [0] }, { "sWidth": "100px", "aTargets": [1,2,4] } ] }); diff --git a/src/sunstone/public/js/sunstone-util.js b/src/sunstone/public/js/sunstone-util.js index b09f67013d..24a4cf81ae 100644 --- a/src/sunstone/public/js/sunstone-util.js +++ b/src/sunstone/public/js/sunstone-util.js @@ -326,7 +326,14 @@ function onError(request,error_json) { //redirect to login if unauthenticated if (error_json.error.http_status=="401") { - window.location.href = "login"; + switch (whichUI()){ + case "selfservice": + window.location.href = "ui"; + break; + default: + window.location.href = "login"; + }; + onError.disabled=false; return false; }; diff --git a/src/sunstone/public/js/sunstone.js b/src/sunstone/public/js/sunstone.js index bc9770fa5d..73cb79fd84 100644 --- a/src/sunstone/public/js/sunstone.js +++ b/src/sunstone/public/js/sunstone.js @@ -403,7 +403,7 @@ function setLogin(){ case "ozones": username = cookie["ozones-user"]; break; - case "occi": + case "selfservice": username = cookie["occi-user"]; break; }; @@ -420,7 +420,7 @@ function setLogin(){ case "ozones": oZones.Auth.logout({success:redirect}); break; - case "occi": + case "selfservice": OCCI.Auth.logout({success:function(){window.location.href = "ui";}}); break; } @@ -436,7 +436,7 @@ function whichUI(){ if (typeof(oZones)!="undefined") return "ozones"; if (typeof(OCCI)!="undefined") - return "occi"; + return "selfservice"; }; //Inserts all main tabs in the DOM diff --git a/src/template/Template.cc b/src/template/Template.cc index bc4fe03011..73e4f829d8 100644 --- a/src/template/Template.cc +++ b/src/template/Template.cc @@ -533,3 +533,57 @@ void Template::rebuild_attributes(const xmlNode * root_element) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +bool Template::check(string& rs_attr, const vector<string> &restricted_attributes) +{ + size_t pos; + string avector, vattr; + vector<const Attribute *> values; + + for (unsigned int i=0; i < restricted_attributes.size(); i++) + { + pos = restricted_attributes[i].find("/"); + + if (pos != string::npos) //Vector Attribute + { + int num; + + avector = restricted_attributes[i].substr(0,pos); + vattr = restricted_attributes[i].substr(pos+1); + + if ((num = get(avector,values)) > 0 ) //Template contains the attr + { + const VectorAttribute * attr; + + for (int j=0; j<num ; j++ ) + { + attr = dynamic_cast<const VectorAttribute *>(values[j]); + + if (attr == 0) + { + continue; + } + + if ( !attr->vector_value(vattr.c_str()).empty() ) + { + rs_attr = restricted_attributes[i]; + return true; + } + } + } + } + else //Single Attribute + { + if (get(restricted_attributes[i],values) > 0 ) + { + rs_attr = restricted_attributes[i]; + return true; + } + } + } + + return false; +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + diff --git a/src/um/test/UserPoolTest.cc b/src/um/test/UserPoolTest.cc index 8e37a4d080..9ae1b6f78b 100644 --- a/src/um/test/UserPoolTest.cc +++ b/src/um/test/UserPoolTest.cc @@ -362,7 +362,7 @@ public: // by" is a dirty fix (SQL injection, actually) because MySQL orders the // results by user_name ostringstream oss; - ((UserPool*)pool)->dump(oss, "name LIKE 'a%' ORDER BY oid"); + ((UserPool*)pool)->dump(oss, "name LIKE 'a%'"); //* if( oss.str() != dump_where_result ) diff --git a/src/vm/VirtualMachinePool.cc b/src/vm/VirtualMachinePool.cc index f56a74301d..65beced047 100644 --- a/src/vm/VirtualMachinePool.cc +++ b/src/vm/VirtualMachinePool.cc @@ -27,7 +27,8 @@ VirtualMachinePool::VirtualMachinePool(SqlDB * db, vector<const Attribute *> hook_mads, const string& hook_location, - const string& remotes_location) + const string& remotes_location, + vector<const Attribute *>& restricted_attrs) : PoolSQL(db,VirtualMachine::table) { const VectorAttribute * vattr; @@ -182,6 +183,9 @@ VirtualMachinePool::VirtualMachinePool(SqlDB * db, add_hook(hook); } + + // Set restricted attributes + VirtualMachineTemplate::set_restricted_attributes(restricted_attrs); } /* -------------------------------------------------------------------------- */ diff --git a/src/vm/VirtualMachineTemplate.cc b/src/vm/VirtualMachineTemplate.cc index 20fdf122c0..4a199ac7e7 100644 --- a/src/vm/VirtualMachineTemplate.cc +++ b/src/vm/VirtualMachineTemplate.cc @@ -15,72 +15,31 @@ /* -------------------------------------------------------------------------- */ #include "VirtualMachineTemplate.h" -#include <vector> /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -const string VirtualMachineTemplate::RESTRICTED_ATTRIBUTES[] = { - "CONTEXT/FILES", - "DISK/SOURCE", - "NIC/MAC", - "NIC/VLAN_ID", - "RANK" -}; +vector<string> VirtualMachineTemplate::restricted_attributes; -const int VirtualMachineTemplate::RS_ATTRS_LENGTH = 3; - /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -bool VirtualMachineTemplate::check(string& rs_attr) +void VirtualMachineTemplate::set_restricted_attributes( + vector<const Attribute *>& rattrs) { - size_t pos; - string avector, vattr; - vector<const Attribute *> values; + const SingleAttribute * sattr; + string attr; - for (int i=0; i < RS_ATTRS_LENGTH ;i++) - { - pos = RESTRICTED_ATTRIBUTES[i].find("/"); + for (unsigned int i = 0 ; i < rattrs.size() ; i++ ) + { + sattr = static_cast<const SingleAttribute *>(rattrs[i]); - if (pos != string::npos) //Vector Attribute - { - int num; + attr = sattr->value(); + transform (attr.begin(),attr.end(),attr.begin(),(int(*)(int))toupper); - avector = RESTRICTED_ATTRIBUTES[i].substr(0,pos); - vattr = RESTRICTED_ATTRIBUTES[i].substr(pos+1); + restricted_attributes.push_back(attr); + } +} - if ((num = get(avector,values)) > 0 ) //Template contains the attr - { - const VectorAttribute * attr; - - for (int j=0; j<num ; j++ ) - { - attr = dynamic_cast<const VectorAttribute *>(values[j]); - - if (attr == 0) - { - continue; - } - - if ( !attr->vector_value(vattr.c_str()).empty() ) - { - rs_attr = RESTRICTED_ATTRIBUTES[i]; - return true; - } - } - - } - } - else //Single Attribute - { - if (get(avector,values) > 0 ) - { - rs_attr = RESTRICTED_ATTRIBUTES[i]; - return true; - } - } - } - - return false; -} \ No newline at end of file +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ diff --git a/src/vm/test/VirtualMachinePoolTest.cc b/src/vm/test/VirtualMachinePoolTest.cc index 75e93edd45..ae6ecd8b1d 100644 --- a/src/vm/test/VirtualMachinePoolTest.cc +++ b/src/vm/test/VirtualMachinePoolTest.cc @@ -46,19 +46,9 @@ const string templates[] = const string xmls[] = { - "<VM><ID>0</ID><UID>123</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><ST" - "ATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ET" - "IME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX" - "><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]" - "]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID>" - "</TEMPLATE><HISTORY_RECORDS/></VM>", + "<VM><ID>0</ID><UID>123</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM>", - "<VM><ID>1</ID><UID>261</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><LAST_POLL>0</LAST_POLL>" - "<STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0<" - "/ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET" - "_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY>" - "<![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID>" - "<![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM>", + "<VM><ID>1</ID><UID>261</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID><![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM>", "<VM><ID>0</ID><UID>123</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><ST" "ATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ET" @@ -70,13 +60,13 @@ const string xmls[] = // This xml dump result has the STIMEs modified to 0000000000 const string xml_dump = - "<VM_POOL><VM><ID>0</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM><VM><ID>1</ID><UID>2</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID><![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; + "<VM_POOL><VM><ID>0</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM><VM><ID>1</ID><UID>2</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID><![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; const string xml_dump_where = - "<VM_POOL><VM><ID>0</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; + "<VM_POOL><VM><ID>0</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; const string xml_history_dump = - "<VM_POOL><VM><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM><VM><ID>1</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID><![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS><HISTORY><SEQ>0</SEQ><HOSTNAME>A_hostname</HOSTNAME><VM_DIR>A_vm_dir</VM_DIR><HID>0</HID><STIME>0</STIME><ETIME>0</ETIME><VMMMAD>A_vmm_mad</VMMMAD><VNMMAD>A_vnm_mad</VNMMAD><TMMAD>A_tm_mad</TMMAD><PSTIME>0</PSTIME><PETIME>0</PETIME><RSTIME>0</RSTIME><RETIME>0</RETIME><ESTIME>0</ESTIME><EETIME>0</EETIME><REASON>0</REASON></HISTORY></HISTORY_RECORDS></VM><VM><ID>2</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[1024]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[2]]></VMID></TEMPLATE><HISTORY_RECORDS><HISTORY><SEQ>1</SEQ><HOSTNAME>C_hostname</HOSTNAME><VM_DIR>C_vm_dir</VM_DIR><HID>2</HID><STIME>0</STIME><ETIME>0</ETIME><VMMMAD>C_vmm_mad</VMMMAD><VNMMAD>C_vnm_mad</VNMMAD><TMMAD>C_tm_mad</TMMAD><PSTIME>0</PSTIME><PETIME>0</PETIME><RSTIME>0</RSTIME><RETIME>0</RETIME><ESTIME>0</ESTIME><EETIME>0</EETIME><REASON>0</REASON></HISTORY></HISTORY_RECORDS></VM><VM><ID>3</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><LAST_POLL>0</LAST_POLL><STATE>6</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[3]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; + "<VM_POOL><VM><ID>0</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>1</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[0]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM><VM><ID>1</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>Second VM</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second VM]]></NAME><VMID><![CDATA[1]]></VMID></TEMPLATE><HISTORY_RECORDS><HISTORY><SEQ>0</SEQ><HOSTNAME>A_hostname</HOSTNAME><VM_DIR>A_vm_dir</VM_DIR><HID>0</HID><STIME>0</STIME><ETIME>0</ETIME><VMMMAD>A_vmm_mad</VMMMAD><VNMMAD>A_vnm_mad</VNMMAD><TMMAD>A_tm_mad</TMMAD><PSTIME>0</PSTIME><PETIME>0</PETIME><RSTIME>0</RSTIME><RETIME>0</RETIME><ESTIME>0</ESTIME><EETIME>0</EETIME><REASON>0</REASON></HISTORY></HISTORY_RECORDS></VM><VM><ID>2</ID><UID>0</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>2</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[1024]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[2]]></VMID></TEMPLATE><HISTORY_RECORDS><HISTORY><SEQ>1</SEQ><HOSTNAME>C_hostname</HOSTNAME><VM_DIR>C_vm_dir</VM_DIR><HID>2</HID><STIME>0</STIME><ETIME>0</ETIME><VMMMAD>C_vmm_mad</VMMMAD><VNMMAD>C_vnm_mad</VNMMAD><TMMAD>C_tm_mad</TMMAD><PSTIME>0</PSTIME><PETIME>0</PETIME><RSTIME>0</RSTIME><RETIME>0</RETIME><ESTIME>0</ESTIME><EETIME>0</EETIME><REASON>0</REASON></HISTORY></HISTORY_RECORDS></VM><VM><ID>3</ID><UID>1</UID><GID>1</GID><UNAME>the_user</UNAME><GNAME>users</GNAME><NAME>VM one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><LAST_POLL>0</LAST_POLL><STATE>6</STATE><LCM_STATE>0</LCM_STATE><STIME>0000000000</STIME><ETIME>0</ETIME><DEPLOY_ID></DEPLOY_ID><MEMORY>0</MEMORY><CPU>0</CPU><NET_TX>0</NET_TX><NET_RX>0</NET_RX><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[VM one]]></NAME><VMID><![CDATA[3]]></VMID></TEMPLATE><HISTORY_RECORDS/></VM></VM_POOL>"; /* ************************************************************************* */ /* ************************************************************************* */ @@ -169,7 +159,7 @@ protected: ((VirtualMachine*)obj)->to_xml(xml_str); fix_stimes(xml_str); -/* +//* if( xml_str != xmls[index] ) { cout << endl << xml_str << endl << "========" @@ -260,13 +250,11 @@ public: string result = oss.str(); fix_stimes(result); -/* if( result != xml_dump ) { cout << endl << result << endl << "========" << endl << xml_dump << endl << "--------"; } -*/ CPPUNIT_ASSERT( result == xml_dump ); } @@ -290,6 +278,12 @@ public: string result = oss.str(); fix_stimes(result); + if( result != xml_dump_where ) + { + cout << endl << result << endl << "========" + << endl << xml_dump_where << endl << "--------"; + } + CPPUNIT_ASSERT( result == xml_dump_where ); } diff --git a/src/vm_template/test/VMTemplatePoolTest.cc b/src/vm_template/test/VMTemplatePoolTest.cc index 142d6f7a8f..5e5c074b9d 100644 --- a/src/vm_template/test/VMTemplatePoolTest.cc +++ b/src/vm_template/test/VMTemplatePoolTest.cc @@ -45,9 +45,9 @@ const string templates[] = const string xmls[] = { - "<VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE>", + "<VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE>", - "<VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE>", + "<VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE>", "<VMTEMPLATE><ID>2</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Third Template</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[3]]></CPU><MEMORY><![CDATA[1024]]></MEMORY><NAME><![CDATA[Third Template]]></NAME><TEMPLATE_ID><![CDATA[2]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE>" }; @@ -55,9 +55,9 @@ const string xmls[] = // This xml dump result has the STIMEs modified to 0000000000 const string xml_dump = - "<VMTEMPLATE_POOL><VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>2</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Third Template</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[3]]></CPU><MEMORY><![CDATA[1024]]></MEMORY><NAME><![CDATA[Third Template]]></NAME><TEMPLATE_ID><![CDATA[2]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE></VMTEMPLATE_POOL>"; + "<VMTEMPLATE_POOL><VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>2</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Third Template</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[3]]></CPU><MEMORY><![CDATA[1024]]></MEMORY><NAME><![CDATA[Third Template]]></NAME><TEMPLATE_ID><![CDATA[2]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE></VMTEMPLATE_POOL>"; const string xml_dump_where = - "<VMTEMPLATE_POOL><VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PUBLIC>0</PUBLIC><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE></VMTEMPLATE_POOL>"; + "<VMTEMPLATE_POOL><VMTEMPLATE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Template one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[1]]></CPU><MEMORY><![CDATA[128]]></MEMORY><NAME><![CDATA[Template one]]></NAME><TEMPLATE_ID><![CDATA[0]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE><VMTEMPLATE><ID>1</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Second Template</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><REGTIME>0000000000</REGTIME><TEMPLATE><CPU><![CDATA[2]]></CPU><MEMORY><![CDATA[256]]></MEMORY><NAME><![CDATA[Second Template]]></NAME><TEMPLATE_ID><![CDATA[1]]></TEMPLATE_ID></TEMPLATE></VMTEMPLATE></VMTEMPLATE_POOL>"; class VMTemplatePoolFriend : public VMTemplatePool { @@ -108,7 +108,6 @@ class VMTemplatePoolTest : public PoolTest CPPUNIT_TEST ( get_using_name ); CPPUNIT_TEST ( wrong_get_name ); CPPUNIT_TEST ( duplicates ); -// CPPUNIT_TEST ( public_attribute ); CPPUNIT_TEST ( dump ); CPPUNIT_TEST ( dump_where ); @@ -146,7 +145,7 @@ protected: ((VMTemplate*)obj)->to_xml(xml_str); fix_regtimes( xml_str ); -/* +//* if( xml_str != xmls[index] ) { cout << endl << xml_str << endl << xmls[index] << endl; @@ -384,90 +383,6 @@ public: CPPUNIT_ASSERT( oid == rc ); } -/* -------------------------------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ -/* - void public_attribute() - { - int oid; - VMTemplatePoolFriend * tpool = static_cast<VMTemplatePoolFriend *>(pool); - VMTemplate * temp; - - string templates[] = - { - // false - "NAME = \"name A\"\n", - - // true - "NAME = \"name B\"\n" - "PUBLIC = YES", - - // false - "NAME = \"name C\"\n" - "PUBLIC = NO", - - // false - "NAME = \"name D\"\n" - "PUBLIC = 1", - - // true - "NAME = \"name E\"\n" - "PUBLIC = Yes", - - // false - "NAME = \"name F\"\n" - "PUBLIC = TRUE", - - // true - "NAME = \"name G\"\n" - "PUBLIC = yes", - - // false - "NAME = \"name H\"\n" - "PUBLIC = 'YES'", - - // true - "NAME = \"name I\"\n" - "PUBLIC = \"YES\"", - - "END" - }; - - bool results[] = { false, true, false, false, - true, false, true, false, true }; - - int i = 0; - while( templates[i] != "END" ) - { - - tpool->allocate(0, templates[i], &oid); - - CPPUNIT_ASSERT( oid >= 0 ); - - temp = tpool->get( oid, false ); - CPPUNIT_ASSERT( temp != 0 ); -//cout << endl << i << " : exp. " << results[i] << " got " << temp->is_public(); - - CPPUNIT_ASSERT( temp->isPublic() == results[i] ); - - i++; - } - - int success; - - // temp 0 is not public. - temp = tpool->get( 0, false ); - CPPUNIT_ASSERT( temp != 0 ); - - success = temp->publish(false); - CPPUNIT_ASSERT( success == 0 ); - CPPUNIT_ASSERT( temp->isPublic() == false ); - - success = temp->publish(true); - CPPUNIT_ASSERT( success == 0 ); - CPPUNIT_ASSERT( temp->isPublic() == true ); - } -*/ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ @@ -489,7 +404,7 @@ public: string result = oss.str(); fix_regtimes(result); -/* +//* if( result != xml_dump ) { cout << endl << result << endl << xml_dump << endl; @@ -522,7 +437,7 @@ public: string result = oss.str(); fix_regtimes(result); -/* +//* if( result != xml_dump_where ) { cout << endl << result << endl << xml_dump_where << endl; diff --git a/src/vmm_mad/exec/one_vmm_exec.rb b/src/vmm_mad/exec/one_vmm_exec.rb index e26787c032..3570203cef 100755 --- a/src/vmm_mad/exec/one_vmm_exec.rb +++ b/src/vmm_mad/exec/one_vmm_exec.rb @@ -94,6 +94,9 @@ class VmmAction def run(steps, info_on_success = nil) result = execute_steps(steps) + @ssh_src.close if @ssh_src + @ssh_dst.close if @ssh_dst + #Prepare the info for the OpenNebula core if DriverExecHelper.failed?(result) info = @data[:failed_info] diff --git a/src/vmm_mad/remotes/poll_ganglia.rb b/src/vmm_mad/remotes/poll_ganglia.rb index c9eaa91180..94a74cb946 100755 --- a/src/vmm_mad/remotes/poll_ganglia.rb +++ b/src/vmm_mad/remotes/poll_ganglia.rb @@ -50,9 +50,8 @@ GANGLIA_PORT=8649 domain=ARGV[0] -dom_id=ARGV[1] -host=ARGV[2] - +dom_id=ARGV[2] +host=ARGV[1] # Gets monitoring data from ganglia or file begin @@ -69,6 +68,12 @@ end doms_info=ganglia.get_vms_information dom_id=domain.split('-').last +# Unknown state when the VM is not found +if !doms_info || !(doms_info[domain] || doms_info[dom_id]) + puts "STATE=d" + exit(0) +end + # Get key one-<vmid> or <vmid> key from the hash dom_info=doms_info[domain] dom_info=doms_info[dom_id] if !dom_info diff --git a/src/vnm/test/VirtualNetworkPoolTest.cc b/src/vnm/test/VirtualNetworkPoolTest.cc index d63cf50dcd..a88378a321 100644 --- a/src/vnm/test/VirtualNetworkPoolTest.cc +++ b/src/vnm/test/VirtualNetworkPoolTest.cc @@ -43,8 +43,7 @@ const string templates[] = "TYPE = RANGED\n" "BRIDGE = br0\n" "NETWORK_SIZE = C\n" - "NETWORK_ADDRESS = 192.168.0.0\n" - "PUBLIC = YES", + "NETWORK_ADDRESS = 192.168.0.0", "NAME = \"Net number two\"\n" "TYPE = fixed\n" @@ -71,18 +70,18 @@ const string templates[] = const string xmls[] = { - "<VNET><ID>0</ID><UID>123</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number one</NAME><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><PUBLIC>0</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", + "<VNET><ID>0</ID><UID>123</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", - "<VNET><ID>1</ID><UID>261</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><PUBLIC>1</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE><LEASES></LEASES></VNET>", + "<VNET><ID>1</ID><UID>261</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE><LEASES></LEASES></VNET>", - "<VNET><ID>0</ID><UID>133</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number two</NAME><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><PUBLIC>0</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.2.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", + "<VNET><ID>0</ID><UID>133</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number two</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.2.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", }; const string xml_dump = - "<VNET_POOL><VNET><ID>0</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number one</NAME><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><PUBLIC>0</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE></VNET><VNET><ID>1</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><PUBLIC>1</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE></VNET></VNET_POOL>"; + "<VNET_POOL><VNET><ID>0</ID><UID>1</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>Net number one</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>1</TYPE><BRIDGE>br1</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE></VNET><VNET><ID>1</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE></VNET></VNET_POOL>"; const string xml_dump_where = - "<VNET_POOL><VNET><ID>1</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><PUBLIC>1</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE></VNET></VNET_POOL>"; + "<VNET_POOL><VNET><ID>1</ID><UID>2</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>A virtual network</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>0</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV/><VLAN_ID/><RANGE><IP_START>192.168.0.1</IP_START><IP_END>192.168.0.254</IP_END></RANGE><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE><NETWORK_MASK><![CDATA[255.255.255.0]]></NETWORK_MASK></TEMPLATE></VNET></VNET_POOL>"; /* ************************************************************************* */ /* ************************************************************************* */ @@ -165,7 +164,6 @@ class VirtualNetworkPoolTest : public PoolTest CPPUNIT_TEST (overlapping_leases_rf); CPPUNIT_TEST (overlapping_leases_rr); CPPUNIT_TEST (drop_leases); -// CPPUNIT_TEST (public_attribute); CPPUNIT_TEST (vnpool_nic_attribute); CPPUNIT_TEST (add_lease_fixed); @@ -213,7 +211,7 @@ protected: ((VirtualNetwork*)obj)->to_xml_extended(xml_str); -/* +//* if( xml_str != xmls[index] ) { cout << endl << xml_str << endl << "========" @@ -312,8 +310,8 @@ public: }; string phydev_xml[] = { - "<VNET><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>BRIDGE and PHYDEV</NAME><TYPE>1</TYPE><BRIDGE>br0</BRIDGE><VLAN>0</VLAN><PHYDEV>eth0</PHYDEV><VLAN_ID/><PUBLIC>0</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", - "<VNET><ID>1</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>No BRIDGE only PHYDEV</NAME><TYPE>1</TYPE><BRIDGE>onebr1</BRIDGE><VLAN>0</VLAN><PHYDEV>eth0</PHYDEV><VLAN_ID/><PUBLIC>0</PUBLIC><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>" + "<VNET><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>BRIDGE and PHYDEV</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>1</TYPE><BRIDGE>br0</BRIDGE><VLAN>1</VLAN><PHYDEV>eth0</PHYDEV><VLAN_ID/><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>", + "<VNET><ID>1</ID><UID>0</UID><GID>0</GID><UNAME>the_user</UNAME><GNAME>oneadmin</GNAME><NAME>No BRIDGE only PHYDEV</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>0</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><TYPE>1</TYPE><BRIDGE>onebr1</BRIDGE><VLAN>1</VLAN><PHYDEV>eth0</PHYDEV><VLAN_ID/><TOTAL_LEASES>0</TOTAL_LEASES><TEMPLATE></TEMPLATE><LEASES><LEASE><IP>130.10.0.1</IP><MAC>50:20:20:20:20:20</MAC><USED>0</USED><VID>-1</VID></LEASE></LEASES></VNET>" }; // test vm with bridge and phydev @@ -325,6 +323,14 @@ public: ((VirtualNetwork*)vn)->to_xml_extended(xml_str); +//* + if( xml_str != phydev_xml[0] ) + { + cout << endl << xml_str << endl << "========" + << endl << phydev_xml[0] << endl << "--------"; + } +//*/ + CPPUNIT_ASSERT( xml_str == phydev_xml[0] ); // test vm with phydev only @@ -337,6 +343,15 @@ public: CPPUNIT_ASSERT( vn != 0 ); ((VirtualNetwork*)vn)->to_xml_extended(xml_str); + +//* + if( xml_str != phydev_xml[1] ) + { + cout << endl << xml_str << endl << "========" + << endl << phydev_xml[1] << endl << "--------"; + } +//*/ + CPPUNIT_ASSERT( xml_str == phydev_xml[1] ); } @@ -522,7 +537,7 @@ public: string result = oss.str(); -/* +//* if( result != xml_dump ) { cout << endl << result << endl << "========" @@ -553,7 +568,7 @@ public: string result = oss.str(); -/* +//* if( result != xml_dump_where ) { cout << endl << result << endl << "========" @@ -1039,103 +1054,6 @@ public: CPPUNIT_ASSERT(results.size() == 0); } -/* -------------------------------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ -/* - void public_attribute() - { - int oid; - VirtualNetworkPoolFriend * vnp = - static_cast<VirtualNetworkPoolFriend*>(pool); - VirtualNetwork * vn; - - string templates[] = - { - // false - "NAME = \"name A\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n", - - // true - "NAME = \"name B\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = YES", - - // false - "NAME = \"name C\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = NO", - - // false - "NAME = \"name D\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = 1", - - // true - "NAME = \"name E\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = Yes", - - // false - "NAME = \"name F\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = TRUE", - - // true - "NAME = \"name G\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = yes", - - // false - "NAME = \"name H\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = 'YES'", - - // true - "NAME = \"name I\"\n" - "TYPE = FIXED\n" - "BRIDGE = br1\n" - "LEASES = [IP=130.10.0.1, MAC=50:20:20:20:20:20]\n" - "PUBLIC = \"YES\"", - - "END" - }; - - bool results[] = { false, true, false, false, - true, false, true, false, true }; - - int i = 0; - while( templates[i] != "END" ) - { - - vnp->allocate(0, templates[i], &oid); - - CPPUNIT_ASSERT( oid >= 0 ); - - vn = vnp->get( oid, false ); - CPPUNIT_ASSERT( vn != 0 ); - -//cout << endl << i << ":expected " << results[i] << " got " << vn->is_public(); - CPPUNIT_ASSERT( vn->isPublic() == results[i] ); - i++; - } - } -*/ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */