Skip to content

Commit

Permalink
fixes theforeman#4250 - API v2 - add compute profiles
Browse files Browse the repository at this point in the history
  • Loading branch information
Joseph Magen authored and Dominic Cleal committed May 12, 2014
1 parent 17c95ca commit 10ac97b
Show file tree
Hide file tree
Showing 18 changed files with 234 additions and 6 deletions.
46 changes: 46 additions & 0 deletions app/controllers/api/v2/compute_attributes_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Api
module V2
class ComputeAttributesController < V2::BaseController

before_filter :find_resource, :only => :update

def_param_group :compute_attribute do
param :compute_attribute, Hash, :action_aware => true do
param :vm_attrs, Hash, :required => true
end
end

api :POST, "/compute_resources/:compute_resource_id/compute_profiles/:compute_profile_id/compute_attributes", "Create a compute attribute"
api :POST, "/compute_profiles/:compute_profile_id/compute_resources/:compute_resource_id/compute_attributes", "Create a compute attribute"
api :POST, "/compute_resources/:compute_resource_id/compute_attributes", "Create a compute attribute"
api :POST, "/compute_profiles/:compute_profile_id/compute_attributes", "Create a compute attribute"
api :POST, "/compute_attributes/", "Create a compute attribute."
param :compute_profile_id, :identifier, :required => true
param :compute_resource_id, :identifier, :required => true
param_group :compute_attribute, :as => :create

def create
params[:compute_attribute].merge!(:compute_profile_id => params[:compute_profile_id],
:compute_resource_id => params[:compute_resource_id])
@compute_attribute = ComputeAttribute.create!(params[:compute_attribute])
render :json => @compute_attribute.to_json
end

api :PUT, "/compute_resources/:compute_resource_id/compute_profiles/:compute_profile_id/compute_attributes/:id", "Update a compute attribute"
api :PUT, "/compute_profiles/:compute_profile_id/compute_resources/:compute_resource_id/compute_attributes/:id", "Update a compute attribute"
api :PUT, "/compute_resources/:compute_resource_id/compute_attributes/:id", "Update a compute attribute"
api :PUT, "/compute_profiles/:compute_profile_id/compute_attributes/:id", "Update a compute attribute"
api :PUT, "/compute_attributes/:id", "Update a compute attribute."

param :compute_profile_id, :identifier, :required => false
param :compute_resource_id, :identifier, :required => false
param :id, String, :required => true
param_group :compute_attribute

def update
process_response @compute_attribute.update_attributes(params[:compute_attribute])
end

end
end
end
56 changes: 56 additions & 0 deletions app/controllers/api/v2/compute_profiles_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module Api
module V2
class ComputeProfilesController < V2::BaseController
before_filter :find_resource, :only => [:show, :update, :destroy]

api :GET, "/compute_profiles", "List of compute profiles"
param :search, String, :desc => "filter results"
param :order, String, :desc => "sort results"
param :page, String, :desc => "paginate results"
param :per_page, String, :desc => "number of entries per request"

def index
@compute_profiles = ComputeProfile.authorized(:view_config_profiles).
search_for(*search_options).paginate(paginate_options)
end

api :GET, "/compute_profiles/:id/", "Show a compute profile."
param :id, :identifier, :required => true

def show
end

def_param_group :compute_profile do
param :compute_profile, Hash, :action_aware => true do
param :name, String, :required => true
end
end

api :POST, "/compute_profiles/", "Create a compute profile."
param_group :compute_profile, :as => :create

def create
@compute_profile = ComputeProfile.new(params[:compute_profile])
process_response @compute_profile.save
end

api :PUT, "/compute_profiles/:id/", "Update a compute profile."
param :id, String, :required => true
param_group :compute_profile

def update
process_response @compute_profile.update_attributes(params[:compute_profile])
end

api :DELETE, "/compute_profiles/:id/", "Delete a compute profile."
param :id, String, :required => true

def destroy
process_response @compute_profile.destroy
end

end
end
end


4 changes: 3 additions & 1 deletion app/controllers/api/v2/hosts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ class HostsController < V2::BaseController

before_filter :find_resource, :except => %w{index create facts}
before_filter :permissions_check, :only => %w{power boot puppetrun}

add_puppetmaster_filters :facts

api :GET, "/hosts/", "List all hosts."
Expand Down Expand Up @@ -57,6 +56,7 @@ def show
param :managed, :bool
param :progress_report_id, String, :desc => 'UUID to track orchestration tasks status, GET /api/orchestration/:UUID/tasks'
param :capabilities, String
param :compute_profile_id, :number
param :compute_attributes, Hash do
end
end
Expand Down Expand Up @@ -196,6 +196,8 @@ def permissions_check
permission = "#{params[:action]}_hosts".to_sym
deny_access unless Host.authorized(permission).find(@host.id)
end

end
end
end

2 changes: 1 addition & 1 deletion app/models/host/managed.rb
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ class Jail < ::Safemode::Jail
:allow_blank => true, :allow_nil => true
validates :provision_method, :inclusion => {:in => PROVISION_METHODS, :message => N_('is unknown')}, :if => Proc.new {|host| host.managed?}
validate :provision_method_in_capabilities
after_validation :set_compute_attributes
before_validation :set_compute_attributes, :only => :create
end

before_validation :set_hostgroup_defaults, :set_ip_address, :normalize_addresses, :normalize_hostname, :force_lookup_value_matcher
Expand Down
6 changes: 4 additions & 2 deletions app/services/foreman/access_permissions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,11 @@
}
map.permission :edit_compute_resources, {:compute_resources => [:edit, :update].push(*ajax_actions),
:compute_profiles => [:new, :create, :edit, :update, :destroy, :index, :show, :auto_complete_search],
:compute_attributes => [:new, :create, :edit, :update, :destroy, :index, :show],
:compute_attributes => [:new, :create, :edit, :update],
:"api/v1/compute_resources" => [:update],
:"api/v2/compute_resources" => [:update]
:"api/v2/compute_resources" => [:update],
:"api/v2/compute_profiles" => [:index, :show, :create, :update, :destroy],
:"api/v2/compute_attributes" => [:create, :update]
}
map.permission :destroy_compute_resources, {:compute_resources => [:destroy],
:"api/v1/compute_resources" => [:destroy],
Expand Down
4 changes: 4 additions & 0 deletions app/views/api/v2/compute_attributes/base.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
object @compute_attribute

attributes :id, :name, :compute_resource_id, :compute_resource_name,
:compute_profile_id, :compute_profile_name, :vm_attrs
3 changes: 3 additions & 0 deletions app/views/api/v2/compute_attributes/index.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collection @compute_attributes

extends "api/v2/compute_attributes/main"
5 changes: 5 additions & 0 deletions app/views/api/v2/compute_attributes/main.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
object @compute_attribute

extends "api/v2/compute_attributes/base"

attributes :created_at, :updated_at
4 changes: 4 additions & 0 deletions app/views/api/v2/compute_attributes/show.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
object @compute_attribute

extends "api/v2/compute_attributes/main"

3 changes: 3 additions & 0 deletions app/views/api/v2/compute_profiles/base.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
object @compute_profile

attributes :id, :name
3 changes: 3 additions & 0 deletions app/views/api/v2/compute_profiles/index.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
collection @compute_profiles

extends "api/v2/compute_profiles/main"
5 changes: 5 additions & 0 deletions app/views/api/v2/compute_profiles/main.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
object @compute_profile

extends "api/v2/compute_profiles/base"

attributes :created_at, :updated_at
7 changes: 7 additions & 0 deletions app/views/api/v2/compute_profiles/show.json.rabl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
object @compute_profile

extends "api/v2/compute_profiles/main"

child :compute_attributes do
extends "api/v2/compute_attributes/base"
end
4 changes: 4 additions & 0 deletions app/views/api/v2/compute_resources/show.json.rabl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ child :images do
extends "api/v2/images/base"
end

child :compute_attributes do
extends "api/v2/compute_attributes/base"
end

node do |compute_resource|
partial("api/v2/taxonomies/children_nodes", :object => compute_resource)
end
14 changes: 14 additions & 0 deletions config/routes/api/v2.rb
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@
resources :template_combinations, :only => [:show, :destroy]
resources :config_groups, :except => [:new, :edit]

resources :compute_attributes, :only => [:create, :update]

resources :compute_profiles, :except => [:new, :edit] do
resources :compute_attributes, :only => [:create, :update]
resources :compute_resources, :except => [:new, :edit] do
resources :compute_attributes, :only => [:create, :update]
end
end

# add "constraint" that unconstrained and allows :id to have dot notation ex. sat.redhat.com
constraints(:id => /[^\/]+/) do
resources :compute_resources, :except => [:new, :edit] do
Expand All @@ -164,7 +173,12 @@
get 'available_clusters/(:cluster_id)/available_networks', :to => 'compute_resources#available_networks', :on => :member
(resources :locations, :only => [:index, :show]) if SETTINGS[:locations_enabled]
(resources :organizations, :only => [:index, :show]) if SETTINGS[:organizations_enabled]
resources :compute_attributes, :only => [:create, :update]
resources :compute_profiles, :except => [:new, :edit] do
resources :compute_attributes, :only => [:create, :update]
end
end

resources :realms, :except => [:new, :edit] do
(resources :locations, :only => [:index, :show]) if SETTINGS[:locations_enabled]
(resources :organizations, :only => [:index, :show]) if SETTINGS[:organizations_enabled]
Expand Down
27 changes: 27 additions & 0 deletions test/functional/api/v2/compute_attributes_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
require 'test_helper'

class Api::V2::ComputeAttributesControllerTest < ActionController::TestCase

test "should create compute attribute" do
assert_difference('ComputeAttribute.count') do
valid_attrs = {:vm_attrs => {"cpus"=>"2", "memory"=>"2147483648"}}
post :create, {:compute_attribute => valid_attrs,
:compute_profile_id => compute_profiles(:three).id,
:compute_resource_id => compute_resources(:one).id
}
end
assert_response :success
end

test "should update compute attribute" do
valid_attrs = {:vm_attrs => {"cpus"=>"4"}}
put :update, { :id => compute_attributes(:two).id,
:compute_profile_id => compute_profiles(:one).id,
:compute_resource_id =>compute_resources(:one).id,
:compute_attribute => valid_attrs
}
assert_response :success
assert_equal "4", compute_attributes(:two).reload.vm_attrs[:cpus]
end

end
39 changes: 39 additions & 0 deletions test/functional/api/v2/compute_profiles_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
require 'test_helper'

class Api::V2::ComputeProfilesControllerTest < ActionController::TestCase

test "should get index" do
get :index, { }
assert_response :success
assert_not_nil assigns(:compute_profiles)
compute_profiles = ActiveSupport::JSON.decode(@response.body)
assert !compute_profiles.empty?
end

test "should show individual record" do
get :show, { :id => compute_profiles(:one).to_param }
assert_response :success
show_response = ActiveSupport::JSON.decode(@response.body)
assert !show_response.empty?
end

test "should create compute profile" do
assert_difference('ComputeProfile.count') do
post :create, { :compute_profile => {:name => '4-Xlarge'} }
end
assert_response :success
end

test "should update compute_profile" do
put :update, { :id => compute_profiles(:one).to_param, :compute_profile => {:name => 'new name' } }
assert_response :success
end

test "should destroy compute profile" do
assert_difference('ComputeProfile.count', -1) do
delete :destroy, { :id => compute_profiles(:three).to_param }
end
assert_response :success
end

end
8 changes: 6 additions & 2 deletions test/unit/host_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1031,13 +1031,17 @@ def teardown

test "compute attributes are populated by hardware profile from hostgroup" do
# hostgroups(:common) fixture has compute_profiles(:one)
host = Host.create :name => "myhost", :mac => "aa-bb-cc-dd-ee-ff", :hostgroup_id => hostgroups(:common).id, :compute_resource_id => compute_resources(:ec2).id
host = Host.new :name => "myhost", :hostgroup_id => hostgroups(:common).id, :compute_resource_id => compute_resources(:ec2).id, :managed => true
host.expects(:queue_compute_create)
assert host.valid?, host.errors.full_messages.to_sentence
assert_equal compute_attributes(:one).vm_attrs, host.compute_attributes
end

test "compute attributes are populated by hardware profile passed to host" do
# hostgroups(:one) fixture has compute_profiles(:common)
host = Host.create :name => "myhost", :mac => "aa-bb-cc-dd-ee-ff", :compute_resource_id => compute_resources(:ec2).id, :compute_profile_id => compute_profiles(:two).id
host = Host.new :name => "myhost", :compute_resource_id => compute_resources(:ec2).id, :compute_profile_id => compute_profiles(:two).id, :managed => true, :domain => domains(:mydomain), :operatingsystem => operatingsystems(:redhat), :architecture => architectures(:x86_64), :environment => environments(:production)
host.expects(:queue_compute_create)
assert host.valid?, host.errors.full_messages.to_sentence
assert_equal compute_attributes(:three).vm_attrs, host.compute_attributes
end

Expand Down

0 comments on commit 10ac97b

Please sign in to comment.