Skip to content

Commit

Permalink
Fixes #6756 - exposes vmware resource pools and folders through the API
Browse files Browse the repository at this point in the history
  • Loading branch information
Greg Petras authored and Dominic Cleal committed Aug 15, 2014
1 parent 5743465 commit fe1a273
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 4 deletions.
21 changes: 19 additions & 2 deletions app/controllers/api/v2/compute_resources_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ class ComputeResourcesController < V2::BaseController
include Api::TaxonomyScope

before_filter :find_resource, :only => [:show, :update, :destroy, :available_images, :associate,
:available_networks, :available_clusters, :available_storage_domains]
:available_clusters, :available_folders, :available_networks,
:available_resource_pools, :available_storage_domains]

api :GET, "/compute_resources/", N_("List all compute resources")
param :search, String, :desc => N_("filter results")
Expand Down Expand Up @@ -81,6 +82,13 @@ def available_clusters
render :available_clusters, :layout => 'api/v2/layouts/index_layout'
end

api :GET, "/compute_resources/:id/available_folders", N_("List available folders for a compute resource")
param :id, :identifier, :required => true
def available_folders
@available_folders = @compute_resource.available_folders
render :available_folders, :layout => 'api/v2/layouts/index_layout'
end

api :GET, "/compute_resources/:id/available_networks", N_("List available networks for a compute resource")
api :GET, "/compute_resources/:id/available_clusters/:cluster_id/available_networks", N_("List available networks for a compute resource cluster")
param :id, :identifier, :required => true
Expand All @@ -90,6 +98,15 @@ def available_networks
render :available_networks, :layout => 'api/v2/layouts/index_layout'
end

api :GET, "/compute_resources/:id/available_clusters/:cluster_id/available_resource_pools", N_("List resource pools for a compute resource cluster")
param :id, :identifier, :required => true
param :cluster_id, String, :required => true
def available_resource_pools
@available_resource_pools = @compute_resource.available_resource_pools({ :cluster_id => params[:cluster_id] })
render :available_resource_pools, :layout => 'api/v2/layouts/index_layout'
end

api :GET, "/compute_resources/:id/available_storage_domains", "List storage_domains for a compute resource"
api :GET, "/compute_resources/:id/available_storage_domains", N_("List storage domains for a compute resource")
api :GET, "/compute_resources/:id/available_storage_domains/:storage_domain", N_("List attributes for a given storage domain")
param :id, :identifier, :required => true
Expand Down Expand Up @@ -121,7 +138,7 @@ def associate

def action_permission
case params[:action]
when 'available_images', 'available_clusters', 'available_networks', 'available_storage_domains', 'associate'
when 'available_images', 'available_clusters', 'available_folders', 'available_networks', 'available_resource_pools', 'available_storage_domains', 'associate'
:view
else
super
Expand Down
8 changes: 8 additions & 0 deletions app/models/compute_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,14 @@ def available_clusters
raise ::Foreman::Exception.new(N_("Not implemented for %s"), provider_friendly_name)
end

def available_folders
raise ::Foreman::Exception.new(N_("Not implemented for %s"), provider_friendly_name)
end

def available_resource_pools
raise ::Foreman::Exception.new(N_("Not implemented for %s"), provider_friendly_name)
end

def available_storage_domains(storage_domain=nil)
raise ::Foreman::Exception.new(N_("Not implemented for %s"), provider_friendly_name)
end
Expand Down
17 changes: 17 additions & 0 deletions app/models/compute_resources/foreman/model/vmware.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ def datacenters
client.datacenters.all
end

def cluster(cluster)
dc.clusters.get(cluster)
end

def clusters
dc.clusters
end
Expand All @@ -63,10 +67,19 @@ def networks(opts ={})
dc.networks.all(:accessible => true)
end

def resource_pools(opts ={})
cluster = cluster(opts[:cluster_id])
cluster.resource_pools.all(:accessible => true)
end

def available_clusters
clusters
end

def available_folders
folders
end

def available_networks(cluster_id=nil)
networks
end
Expand All @@ -75,6 +88,10 @@ def available_storage_domains(storage_domain=nil)
datastores({:storage_domain => storage_domain})
end

def available_resource_pools(opts={})
resource_pools({ :cluster_id => opts[:cluster_id] })
end

def nictypes
{
"VirtualE1000" => "E1000",
Expand Down
4 changes: 2 additions & 2 deletions app/services/foreman/access_permissions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@
ajax_actions = [:test_connection]
map.permission :view_compute_resources, {:compute_resources => [:index, :show, :auto_complete_search, :ping, :available_images],
:"api/v1/compute_resources" => [:index, :show],
:"api/v2/compute_resources" => [:index, :show, :available_images, :available_clusters, :available_networks,
:available_storage_domains]
:"api/v2/compute_resources" => [:index, :show, :available_images, :available_clusters, :available_folders,
:available_networks, :available_resource_pools, :available_storage_domains]
}
map.permission :create_compute_resources, {:compute_resources => [:new, :create].push(*ajax_actions),
:"api/v1/compute_resources" => [:create],
Expand Down
3 changes: 3 additions & 0 deletions app/views/api/v2/compute_resources/available_folders.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collection @available_folders

attribute :name, :id, :parent, :datacenter, :path, :type
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collection @available_resource_pools

attribute :name, :id
2 changes: 2 additions & 0 deletions config/routes/api/v2.rb
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,12 @@
resources :images, :except => [:new, :edit]
get :available_images, :on => :member
get :available_clusters, :on => :member
get :available_folders, :on => :member
get :available_networks, :on => :member
get :available_storage_domains, :on => :member
get 'available_storage_domains/(:storage_domain)', :to => 'compute_resources#available_storage_domains', :on => :member
get 'available_clusters/(:cluster_id)/available_networks', :to => 'compute_resources#available_networks', :on => :member
get 'available_clusters/(:cluster_id)/available_resource_pools', :to => 'compute_resources#available_resource_pools', :on => :member
put :associate, :on => :member
(resources :locations, :only => [:index, :show]) if SETTINGS[:locations_enabled]
(resources :organizations, :only => [:index, :show]) if SETTINGS[:organizations_enabled]
Expand Down
30 changes: 30 additions & 0 deletions test/functional/api/v2/compute_resources_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,36 @@ def teardown
assert !available_clusters.empty?
end

test "should get available vmware folders" do
folder = Object.new
folder.stubs(:name).returns('vmware_folder')
folder.stubs(:id).returns('group-12345')
folder.stubs(:datacenter).returns('DC-1')
folder.stubs(:parent).returns('cluster-12345')
folder.stubs(:path).returns('/Datacenters/DC-1/vm/cluster-12345/vmware_folder')
folder.stubs(:type).returns('vm')

Foreman::Model::Vmware.any_instance.stubs(:available_folders).returns([folder])

get :available_folders, { :id => compute_resources(:vmware).to_param, :cluster_id => '123-456-789' }
assert_response :success
available_folders = ActiveSupport::JSON.decode(@response.body)
assert !available_folders.empty?
end

test "should get available vmware resource pools" do
resource_pool = Object.new
resource_pool.stubs(:name).returns('Resource Pool 1')
resource_pool.stubs(:id).returns('resgroup-12345')

Foreman::Model::Vmware.any_instance.stubs(:available_resource_pools).returns([resource_pool])

get :available_resource_pools, { :id => compute_resources(:vmware).to_param, :cluster_id => '123-456-789' }
assert_response :success
available_resource_pools = ActiveSupport::JSON.decode(@response.body)
assert !available_resource_pools.empty?
end

test "should get available vmware storage domains" do
storage_domain = Object.new
storage_domain.stubs(:name).returns('test_vmware_cluster')
Expand Down

0 comments on commit fe1a273

Please sign in to comment.