You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2011/12/08 13:19:23 UTC
[PATCH core] CIMI: Added CIMISelect query param to filter Collection output
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
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