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