From: Michal Fojtik <[email protected]>
Signed-off-by: Michal fojtik <[email protected]> --- server/lib/cimi/model/base.rb | 32 ++++++++++++++++++++++++++++++++ server/lib/cimi/server.rb | 25 ++++++++++++++----------- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/server/lib/cimi/model/base.rb b/server/lib/cimi/model/base.rb index cd49518..30ee240 100644 --- a/server/lib/cimi/model/base.rb +++ b/server/lib/cimi/model/base.rb @@ -209,4 +209,36 @@ class CIMI::Model::Base end def self.all(_self); find(:all, _self); end + + def filter_by(filter_opts) + return self if filter_opts.nil? + return filter_attributes(filter_opts.split(',').map{ |a| a.intern }) if filter_opts.include? ',' + case filter_opts + when /^([\w\_]+)$/ then filter_attributes([$1.intern]) + when /^([\w\_]+)\[(\d+\-\d+)\]$/ then filter_by_arr_range($1.intern, $2) + when /^([\w\_]+)\[(\d+)\]$/ then filter_by_arr_index($1.intern, $2) + else self + end + end + + private + + def filter_attributes(attr_list) + attrs = attr_list.inject({}) do |result, attr| + result[attr] = self.send(attr) if self.respond_to?(attr) + result + end + self.class.new(attrs) + end + + def filter_by_arr_index(attr, filter) + return self unless self.respond_to?(attr) + self.class.new(attr => [self.send(attr)[filter.to_i]]) + end + + def filter_by_arr_range(attr, filter) + return self unless self.respond_to?(attr) + filter = filter.split('-').inject { |s,e| s.to_i..e.to_i } + self.class.new(attr => self.send(attr)[filter]) + end end diff --git a/server/lib/cimi/server.rb b/server/lib/cimi/server.rb index 746587c..296e29b 100644 --- a/server/lib/cimi/server.rb +++ b/server/lib/cimi/server.rb @@ -92,9 +92,10 @@ global_collection :machine_configurations do description 'List all machine configurations' operation :index do + param :CIMISelect, :string, :optional description "List all machine configurations" control do - machine_configs = MachineConfigurationCollection.default(self) + machine_configs = MachineConfigurationCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { machine_configs.to_xml } format.json { machine_configs.to_json } @@ -125,8 +126,9 @@ global_collection :machine_images do operation :index do description "List all machine configurations" + param :CIMISelect, :string, :optional control do - machine_images = MachineImageCollection.default(self) + machine_images = MachineImageCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { machine_images.to_xml } format.json { machine_images.to_json } @@ -153,9 +155,10 @@ global_collection :machine_admins do operation :index do description "List all machine admins" + param :CIMISelect, :string, :optional with_capability :keys control do - machine_admins = MachineAdminCollection.default(self) + machine_admins = MachineAdminCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { machine_admins.to_xml } format.json { machine_admins.to_json } @@ -208,9 +211,10 @@ global_collection :machines do description 'List all machine' operation :index do + param :CIMISelect, :string, :optional description "List all machines" control do - machines = MachineCollection.default(self) + machines = MachineCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { machines.to_xml } format.json { machines.to_json } @@ -313,8 +317,9 @@ global_collection :volumes do operation :index do description "List all volumes" + param :CIMISelect, :string, :optional control do - volumes = VolumeCollection.default(self) + volumes = VolumeCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { volumes.to_xml } format.json { volumes.to_json } @@ -334,7 +339,6 @@ global_collection :volumes do end end - operation :create do description "Create a new Volume." control do @@ -361,9 +365,6 @@ global_collection :volumes do end end - - - end global_collection :volume_configurations do @@ -371,8 +372,9 @@ global_collection :volume_configurations do operation :index do description "Get list all VolumeConfigurations" + param :CIMISelect, :string, :optional control do - volume_configuration = VolumeConfigurationCollection.default(self) + volume_configuration = VolumeConfigurationCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { volume_configuration.to_xml } format.json { volume_configuration.to_json } @@ -397,8 +399,9 @@ global_collection :volume_images do operation :index do description "List all volumes images" + param :CIMISelect, :string, :optional control do - volume_images = VolumeImageCollection.default(self) + volume_images = VolumeImageCollection.default(self).filter_by(params[:CIMISelect]) respond_to do |format| format.xml { volume_images.to_xml } format.json { volume_images.to_json } -- 1.7.4.4
