diff --git a/include/ExtendedAttribute.h b/include/ExtendedAttribute.h index 1efd954960..4fa6155d3f 100644 --- a/include/ExtendedAttribute.h +++ b/include/ExtendedAttribute.h @@ -219,12 +219,21 @@ protected: /* ---------------------------------------------------------------------- */ /** * Adds a new VirtualMachine attribute to the set + * @param a the Extended attribute to add + * @param id of the new attribute */ void add_attribute(ExtendedAttribute * a, int id) { a_set.insert(make_pair(id, a)); } + /** + * Deletes an attribute from the set + * @param id of the attribute + * @return the attribute removed or 0 if not found + */ + ExtendedAttribute * delete_attribute(int id); + /** * Init the attribute set from a vector * @param id_name with the ID of the attribute diff --git a/include/RequestManagerZone.h b/include/RequestManagerZone.h index 806932fd0c..f83b508f05 100644 --- a/include/RequestManagerZone.h +++ b/include/RequestManagerZone.h @@ -67,4 +67,20 @@ public: /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------- */ + +class ZoneDeleteServer : public RequestManagerZone +{ +public: + ZoneDeleteServer(): + RequestManagerZone("ZoneDeleteServer", "Delete a server from zone", + "A:sii"){}; + + ~ZoneDeleteServer(){}; + + void request_execute(xmlrpc_c::paramList const& _paramList, + RequestAttributes& att); +}; + #endif diff --git a/include/Zone.h b/include/Zone.h index 179365c9a2..ffb406fb78 100644 --- a/include/Zone.h +++ b/include/Zone.h @@ -53,7 +53,16 @@ public: * * @return 0 on success, -1 otherwise */ - int add_servers(Template& tmpl, string& error); + int add_server(Template& tmpl, string& error); + + /** + * Delete a server from this zone + * @param it of the SERVER + * @param error if any + * + * @return 0 on success, -1 otherwise + */ + int delete_server(int id, string& error); private: // ------------------------------------------------------------------------- diff --git a/include/ZoneServer.h b/include/ZoneServer.h index 11685bd544..0691b9419f 100644 --- a/include/ZoneServer.h +++ b/include/ZoneServer.h @@ -168,6 +168,12 @@ public: return 0; }; + ZoneServer * delete_server(int id) + { + return static_cast(delete_attribute(id)); + }; + + protected: ExtendedAttribute * attribute_factory(VectorAttribute * va, int id) const { diff --git a/src/cli/onezone b/src/cli/onezone index 035e22af57..1e63b32ab4 100755 --- a/src/cli/onezone +++ b/src/cli/onezone @@ -118,6 +118,16 @@ cmd=CommandParser::CmdParser.new(ARGV) do end + delserver_desc = <<-EOT.unindent + Delete an OpenNebula server from this zone. + EOT + + command :"server-del", delserver_desc, :zoneid, :serverid do + helper.perform_action(args[0], options, "server deleted") do |o| + o.delete_servers(args[1].to_i) + end + + end update_desc = <<-EOT.unindent Update the template contents. If a path is not provided the editor will be launched to modify the current content. diff --git a/src/common/ExtendedAttribute.cc b/src/common/ExtendedAttribute.cc index 2378c3fb0c..7c7114f9cb 100644 --- a/src/common/ExtendedAttribute.cc +++ b/src/common/ExtendedAttribute.cc @@ -75,3 +75,20 @@ void ExtendedAttributeSet::init_attribute_map(const std::string& id_name, } }; +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + +ExtendedAttribute * ExtendedAttributeSet::delete_attribute(int id) +{ + std::map::iterator it = a_set.find(id); + + if ( it == a_set.end() ) + { + return 0; + } + + a_set.erase(it); + + return it->second; +} + diff --git a/src/oca/ruby/opennebula/zone.rb b/src/oca/ruby/opennebula/zone.rb index 8412eecc97..c43e482049 100644 --- a/src/oca/ruby/opennebula/zone.rb +++ b/src/oca/ruby/opennebula/zone.rb @@ -29,7 +29,8 @@ module OpenNebula :update => "zone.update", :rename => "zone.rename", :delete => "zone.delete", - :addserver => "zone.addserver" + :addserver => "zone.addserver", + :delserver => "zone.delserver" } # Creates a Zone description with just its identifier @@ -115,5 +116,15 @@ module OpenNebula def add_servers(servers) return call(ZONE_METHODS[:addserver], @pe_id, servers) end + + # Delete servers from this Zone + # + # @param id [Int] Server ID + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def delete_servers(server_id) + return call(ZONE_METHODS[:delserver], @pe_id, server_id) + end end end diff --git a/src/rm/RequestManager.cc b/src/rm/RequestManager.cc index 8300219d77..5c12bac494 100644 --- a/src/rm/RequestManager.cc +++ b/src/rm/RequestManager.cc @@ -760,6 +760,7 @@ void RequestManager::register_xml_methods() xmlrpc_c::method * zone_delete_pt; xmlrpc_c::method * zone_rename_pt; xmlrpc_c::method * zone_addserver_pt; + xmlrpc_c::method * zone_delserver_pt; if (nebula.is_federation_slave()) { @@ -768,6 +769,7 @@ void RequestManager::register_xml_methods() zone_delete_pt = new RequestManagerProxy("one.zone.delete"); zone_rename_pt = new RequestManagerProxy("one.zone.rename"); zone_addserver_pt = new RequestManagerProxy("one.zone.addserver"); + zone_delserver_pt = new RequestManagerProxy("one.zone.delserver"); } else { @@ -776,6 +778,7 @@ void RequestManager::register_xml_methods() zone_delete_pt = new ZoneDelete(); zone_rename_pt = new ZoneRename(); zone_addserver_pt = new ZoneAddServer(); + zone_delserver_pt = new ZoneDeleteServer(); } xmlrpc_c::methodPtr zone_allocate(zone_allocate_pt); @@ -783,6 +786,7 @@ void RequestManager::register_xml_methods() xmlrpc_c::methodPtr zone_delete(zone_delete_pt); xmlrpc_c::methodPtr zone_rename(zone_rename_pt); xmlrpc_c::methodPtr zone_addserver(zone_addserver_pt); + xmlrpc_c::methodPtr zone_delserver(zone_delserver_pt); xmlrpc_c::methodPtr zone_info(new ZoneInfo()); xmlrpc_c::methodPtr zonepool_info(new ZonePoolInfo()); @@ -794,6 +798,7 @@ void RequestManager::register_xml_methods() RequestManagerRegistry.addMethod("one.zone.rename", zone_rename); RequestManagerRegistry.addMethod("one.zone.addserver", zone_addserver); + RequestManagerRegistry.addMethod("one.zone.delserver", zone_delserver); RequestManagerRegistry.addMethod("one.zonepool.info",zonepool_info); diff --git a/src/rm/RequestManagerZone.cc b/src/rm/RequestManagerZone.cc index fb9ac4a2dc..36b0804d82 100644 --- a/src/rm/RequestManagerZone.cc +++ b/src/rm/RequestManagerZone.cc @@ -55,7 +55,7 @@ void ZoneAddServer::request_execute(xmlrpc_c::paramList const& paramList, return; } - if ( zone->add_servers(zs_tmpl, att.resp_msg) == -1 ) + if ( zone->add_server(zs_tmpl, att.resp_msg) == -1 ) { failure_response(ACTION, att); @@ -72,3 +72,44 @@ void ZoneAddServer::request_execute(xmlrpc_c::paramList const& paramList, /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ +void ZoneDeleteServer::request_execute(xmlrpc_c::paramList const& paramList, + RequestAttributes& att) +{ + int id = xmlrpc_c::value_int(paramList.getInt(1)); + int zs_id = xmlrpc_c::value_int(paramList.getInt(2)); + + string error_str; + + if ( basic_authorization(id, att) == false ) + { + return; + } + + Zone * zone = (static_cast(pool))->get(id, true); + + if ( zone == 0 ) + { + att.resp_id = id; + failure_response(NO_EXISTS, att); + + return; + } + + if ( zone->delete_server(zs_id, att.resp_msg) == -1 ) + { + failure_response(ACTION, att); + zone->unlock(); + + return; + } + + pool->update(zone); + + zone->unlock(); + + success_response(id, att); +} + +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ + diff --git a/src/zone/Zone.cc b/src/zone/Zone.cc index b966b34d9f..50f33ac032 100644 --- a/src/zone/Zone.cc +++ b/src/zone/Zone.cc @@ -300,7 +300,7 @@ int Zone::post_update_template(string& error) /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int Zone::add_servers(Template& tmpl, string& error) +int Zone::add_server(Template& tmpl, string& error) { vector vs; vector::iterator it; @@ -326,3 +326,21 @@ int Zone::add_servers(Template& tmpl, string& error) return 0; } +int Zone::delete_server(int id, string& error) +{ + ZoneServer * zs; + + zs = servers->delete_server(id); + + if ( zs == 0 ) + { + error = "SERVER not found in zone"; + return -1; + } + + delete servers_template.remove(zs->vector_attribute()); + + delete zs; + + return 0; +}