diff --git a/app/controllers/api/v2/compute_resources_controller.rb b/app/controllers/api/v2/compute_resources_controller.rb index e93507d8adc..74619260a44 100644 --- a/app/controllers/api/v2/compute_resources_controller.rb +++ b/app/controllers/api/v2/compute_resources_controller.rb @@ -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") @@ -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 @@ -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 @@ -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 diff --git a/app/models/compute_resource.rb b/app/models/compute_resource.rb index c8038bc5eaa..5a7503c67c0 100644 --- a/app/models/compute_resource.rb +++ b/app/models/compute_resource.rb @@ -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 diff --git a/app/models/compute_resources/foreman/model/vmware.rb b/app/models/compute_resources/foreman/model/vmware.rb index 9b95bffb4af..83a738b449b 100644 --- a/app/models/compute_resources/foreman/model/vmware.rb +++ b/app/models/compute_resources/foreman/model/vmware.rb @@ -43,6 +43,10 @@ def datacenters client.datacenters.all end + def cluster(cluster) + dc.clusters.get(cluster) + end + def clusters dc.clusters end @@ -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 @@ -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", diff --git a/app/services/foreman/access_permissions.rb b/app/services/foreman/access_permissions.rb index 0e494c37b69..1b37ec08343 100644 --- a/app/services/foreman/access_permissions.rb +++ b/app/services/foreman/access_permissions.rb @@ -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], diff --git a/app/views/api/v2/compute_resources/available_folders.rabl b/app/views/api/v2/compute_resources/available_folders.rabl new file mode 100644 index 00000000000..3ff7cbbc0bf --- /dev/null +++ b/app/views/api/v2/compute_resources/available_folders.rabl @@ -0,0 +1,3 @@ +collection @available_folders + +attribute :name, :id, :parent, :datacenter, :path, :type diff --git a/app/views/api/v2/compute_resources/available_resource_pools.rabl b/app/views/api/v2/compute_resources/available_resource_pools.rabl new file mode 100644 index 00000000000..d511e0cf58d --- /dev/null +++ b/app/views/api/v2/compute_resources/available_resource_pools.rabl @@ -0,0 +1,3 @@ +collection @available_resource_pools + +attribute :name, :id diff --git a/config/routes/api/v2.rb b/config/routes/api/v2.rb index 0669e1809ed..b7d23fe9640 100644 --- a/config/routes/api/v2.rb +++ b/config/routes/api/v2.rb @@ -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] diff --git a/test/functional/api/v2/compute_resources_controller_test.rb b/test/functional/api/v2/compute_resources_controller_test.rb index 049b81f8074..09a750858cf 100644 --- a/test/functional/api/v2/compute_resources_controller_test.rb +++ b/test/functional/api/v2/compute_resources_controller_test.rb @@ -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')