[PATCH conductor] pools api - create, show, and update endpoints - under RM 3542

Richard Su rwsu at redhat.com
Tue Aug 14 16:08:01 UTC 2012


https://www.aeolusproject.org/redmine/issues/3542

Updated controller to also render xml. Created specs to convert xml
into hash params and then to post the hash params to the controller
and verify xml responses.
---
 src/app/controllers/pools_controller.rb       |   15 +++
 src/app/views/pools/_detail.xml.haml          |    6 +
 src/app/views/pools/show.xml.haml             |    2 +
 src/config/routes.rb                          |    1 +
 src/spec/controllers/pools_controller_spec.rb |  159 +++++++++++++++++++++++++
 5 files changed, 183 insertions(+), 0 deletions(-)
 create mode 100644 src/app/views/pools/_detail.xml.haml
 create mode 100644 src/app/views/pools/show.xml.haml

diff --git a/src/app/controllers/pools_controller.rb b/src/app/controllers/pools_controller.rb
index 0668217..931d25d 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -166,6 +166,7 @@ class PoolsController < ApplicationController
           map{ |deployment| view_context.deployment_for_mustache(deployment) }
         render :json => @pool.as_json.merge({:deployments => deployments})
       end
+      format.xml { render :show, :locals => { :pool => @pool } }
     end
   end
 
@@ -186,6 +187,11 @@ class PoolsController < ApplicationController
 
   def create
     @title = t('pools.create_new_pool')
+    if !params.has_key? :quota and !params[:pool][:quota].nil?
+      params[:quota] = params[:pool][:quota]
+      params[:pool].delete(:quota)
+    end
+
     @pool = Pool.new(params[:pool])
     require_privilege(Privilege::CREATE, Pool, @pool.pool_family)
     @pool.quota = @quota = Quota.new
@@ -197,11 +203,14 @@ class PoolsController < ApplicationController
         flash[:notice] = t "pools.flash.notice.added"
         format.html { redirect_to pools_path }
         format.json { render :json => @pool, :status => :created }
+        format.xml {render :show, :locals => { :pool => @pool }
+        }
       else
         flash.now[:warning] = t "pools.flash.warning.creation_failed"
         format.html { render :new }
         format.js { render :partial => 'new' }
         format.json { render :json => @pool.errors, :status => :unprocessable_entity }
+        format.xml { render :template => 'api/validation_error', :locals => { :errors => @pool.errors }, :status => :bad_request}
       end
     end
   end
@@ -219,6 +228,10 @@ class PoolsController < ApplicationController
   end
 
   def update
+    if !params.has_key? :quota and !params[:pool][:quota].nil?
+      params[:quota] = params[:pool][:quota]
+      params[:pool].delete(:quota)
+    end
     @pool = Pool.find(params[:id])
     require_privilege(Privilege::MODIFY, @pool)
     set_quota
@@ -230,11 +243,13 @@ class PoolsController < ApplicationController
         format.html { redirect_to :action => 'show', :id => @pool.id }
         format.js { render :partial => 'show', :id => @pool.id }
         format.json { render :json => @pool }
+        format.xml {render :show, :locals => { :pool => @pool } }
       else
         flash[:error] = t "pools.flash.error.not_updated"
         format.html { render :action => :edit }
         format.js { render :partial => 'edit', :id => @pool.id }
         format.json { render :json => @pool.errors, :status => :unprocessable_entity }
+        format.xml { render :template => 'api/validation_error', :locals => { :errors => @pool.errors }, :status => :bad_request}
       end
     end
   end
diff --git a/src/app/views/pools/_detail.xml.haml b/src/app/views/pools/_detail.xml.haml
new file mode 100644
index 0000000..9214ec0
--- /dev/null
+++ b/src/app/views/pools/_detail.xml.haml
@@ -0,0 +1,6 @@
+!!! XML
+%pool{:id => pool.id, :url => api_pool_url(pool)}
+  %name= pool.name
+  %pool_family{:id => pool.pool_family.id, :url=> pool_family_url(pool.pool_family)}= pool.pool_family.name
+  %quota= pool.quota.maximum_running_instances
+  %enabled= pool.enabled
diff --git a/src/app/views/pools/show.xml.haml b/src/app/views/pools/show.xml.haml
new file mode 100644
index 0000000..297a082
--- /dev/null
+++ b/src/app/views/pools/show.xml.haml
@@ -0,0 +1,2 @@
+!!! XML
+=render 'detail', :pool => pool
\ No newline at end of file
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 119d740..8373342 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -287,6 +287,7 @@ Conductor::Application.routes.draw do
     resources :provider_accounts, :only => [:index, :show, :destroy]
     resources :provider_types, :only => [:index, :show]
     resources :hardware_profiles, :only => [:index, :show, :destroy, :create]
+    resources :pools, :only => [:index, :show, :create, :update]
   end
 
   #match 'matching_profiles', :to => '/hardware_profiles/matching_profiles/:hardware_profile_id/provider/:provider_id', :controller => 'hardware_profiles', :action => 'matching_profiles', :conditions => { :method => :get }, :as =>'matching_profiles'
diff --git a/src/spec/controllers/pools_controller_spec.rb b/src/spec/controllers/pools_controller_spec.rb
index ba68755..5afc66c 100644
--- a/src/spec/controllers/pools_controller_spec.rb
+++ b/src/spec/controllers/pools_controller_spec.rb
@@ -99,6 +99,165 @@ describe PoolsController do
     end
   end
 
+  context "API" do
+    render_views
+
+    before do
+      accept_xml
+      mock_warden(@admin)
+      @test_pool_name = "testpool1"
+      @pool_family = FactoryGirl.create :pool_family
+    end
+
+    def assert_pool_api_success_response(name, familyName, familyId, quota, enabled)
+      response.should be_success
+      response.should have_content_type("application/xml")
+      response.body.should be_xml
+      xml = Nokogiri::XML(response.body)
+      xml.xpath("/pool/name").text.should == name
+      xml.xpath("/pool/pool_family").text.should == familyName
+      xml.xpath("/pool/pool_family/@id").text.should == "#{familyId}"
+      xml.xpath("/pool/quota").text.should == quota
+      xml.xpath("/pool/enabled").text.should == enabled
+    end
+
+    describe "#create" do
+
+      it "post with all expected params" do
+        xmldata = "
+        <pool>
+          <name>#{@test_pool_name}</name>
+          <pool_family_id>#{@pool_family.id}</pool_family_id>
+          <enabled>true</enabled>
+          <quota>
+            <maximum_running_instances>1001</maximum_running_instances>
+          </quota>
+        </pool>"
+        post :create, Hash.from_xml(xmldata)
+
+        assert_pool_api_success_response(@test_pool_name,
+                                         @pool_family.name,
+                                         @pool_family.id,
+                                         "1001",
+                                         "true")
+      end
+
+      it "post missing pool family parameter should result in error message" do
+        xmldata = "
+        <pool>
+          <name>#{@test_pool_name}</name>
+          <!--<pool_family_id>#{@pool_family.id}</pool_family_id>-->
+          <enabled>true</enabled>
+          <quota>
+            <maximum_running_instances>1001</maximum_running_instances>
+          </quota>
+        </pool>"
+        post :create, Hash.from_xml(xmldata)
+
+        response.status.should be_eql(400) # Bad Request
+        response.should have_content_type("application/xml")
+        response.body.should be_xml
+        xml = Nokogiri::XML(response.body)
+        xml.xpath("/errors/error/message").text.should == "Pool family can't be blank"
+      end
+
+    end
+
+    describe "#show" do
+
+      it "show an existing pool" do
+        @pool = FactoryGirl.create :pool
+
+        get :show, :id => @pool.id
+
+        assert_pool_api_success_response(@pool.name,
+                                         @pool.pool_family.name,
+                                         @pool.pool_family.id,
+                                         "#{@pool.quota.maximum_running_instances}",
+                                         "#{@pool.enabled}")
+      end
+
+      it "show a missing pool" do
+        get :show, :id => -1
+
+        response.status.should be_eql(404)
+        response.should have_content_type("application/xml")
+        response.body.should be_xml
+        xml = Nokogiri::XML(response.body)
+        xml.xpath("/error/message").text.should == "Couldn't find Pool with id=-1"
+      end
+
+    end
+
+    describe "#update" do
+
+      it "update with all expected params" do
+        # we will receive unlimited quota if
+        # maximum_running_instances is not specified
+        # <quota></quota> denotes unlmited quota
+        xmldata = "
+        <pool>
+          <name>#{@test_pool_name}</name>
+          <pool_family_id>#{@pool_family.id}</pool_family_id>
+          <enabled>true</enabled>
+        </pool>"
+        post :create, Hash.from_xml(xmldata)
+
+        assert_pool_api_success_response(@test_pool_name,
+                                         @pool_family.name,
+                                         @pool_family.id,
+                                         "", #unlimited
+                                         "true")
+
+        xml = Nokogiri::XML(response.body)
+        pool_id = xml.xpath("/pool/@id").text
+
+        xmldata = "
+        <pool>
+          <name>pool-updated</name>
+          <pool_family_id>#{@pool_family.id}</pool_family_id>
+          <enabled>false</enabled>
+          <quota>
+            <maximum_running_instances>1002</maximum_running_instances>
+          </quota>
+        </pool>"
+        put :update, :id => pool_id, :pool => Hash.from_xml(xmldata)["pool"]
+
+        assert_pool_api_success_response("pool-updated",
+                                         @pool_family.name,
+                                         @pool_family.id,
+                                         "1002",
+                                         "false")
+      end
+
+      it "update missing pool" do
+        xmldata = "<pool><name>missing-pool</name></pool>"
+        put :update, :id => -1, :pool => Hash.from_xml(xmldata)["pool"]
+
+        response.status.should be_eql(404)
+        response.should have_content_type("application/xml")
+        response.body.should be_xml
+        xml = Nokogiri::XML(response.body)
+        xml.xpath("/error/message").text.should == "Couldn't find Pool with id=-1"
+      end
+
+      it "update with blank name" do
+        @pool = FactoryGirl.create :pool
+        xmldata = "<pool><name></name></pool>"
+        put :update, :id => @pool.id, :pool => Hash.from_xml(xmldata)["pool"]
+
+        response.status.should be_eql(400)
+        response.should have_content_type("application/xml")
+        response.body.should be_xml
+        xml = Nokogiri::XML(response.body)
+        xml.xpath("/errors/error/message").text.should == "Name can't be blank"
+      end
+
+    end
+
+  end
+
+
   context "JSON format responses for " do
     before do
       accept_json
-- 
1.7.7.6




More information about the aeolus-devel mailing list