foreman_chef 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e67f70cef7f3befb5de89b4ed9ba5164a1bf78e
4
- data.tar.gz: c93ad84ca9bffac5f641373dc1656c8885780363
3
+ metadata.gz: 4ca6ce84d67a9c71ce00228a2cab0999e53662de
4
+ data.tar.gz: 97027fe6bc7f56b742a8d568d81a7c047ced35c2
5
5
  SHA512:
6
- metadata.gz: f47ceac026045db387dc16f6485c5e0fd340cf81dbfad967114c0b8c04f3ad8c2ebfad35f3f872dd570155919fa8305c8066173516e15e505eff132020d00747
7
- data.tar.gz: 6a513a09021f79f978217a7a96d465b9e7f9d254859f914a8b85578d5be6e6a63614b7457ecfd62f5b3d2aa2994d9b0cca939b97d2853a624345dae472f70e6f
6
+ metadata.gz: e28b20f1dabcfa8e5a82d66214cf4ad5b54ca54e537816967d625bdd1917814ae66a330ede1ac2371ee751cc2f00221d3e78453860af8820b7d791558c767b1b
7
+ data.tar.gz: 59891a29fe06894f06155574b0ca0f96c42bab8f5b9472481dae3f3fb971083cf07b3c44976c6f56398af6c4644b5981b49655132f57123d6dfa0ef9793e104c
@@ -1,4 +1,4 @@
1
- $(function () {
1
+ $(document).on('ContentLoad', function (){
2
2
  $("#host_chef_proxy_id, #hostgroup_chef_proxy_id").change(function () {
3
3
  var element = $(this);
4
4
  var attrs = attribute_hash(['chef_proxy_id']);
@@ -23,4 +23,3 @@ $(function () {
23
23
  });
24
24
  });
25
25
  });
26
-
@@ -0,0 +1,19 @@
1
+ module ForemanChef
2
+ module Concerns
3
+ module EnvironmentParameters
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def environment_params_filter
8
+ Foreman::ParameterFilter.new(::ForemanChef::Environment).tap do |filter|
9
+ filter.permit(:name, :description, :chef_proxy_id)
10
+ end
11
+ end
12
+ end
13
+
14
+ def environment_params
15
+ self.class.environment_params_filter.filter_params(params, parameter_filter_context, 'foreman_chef_environment')
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,6 +1,8 @@
1
1
  module ForemanChef
2
2
  class EnvironmentsController < ::ForemanChef::ApplicationController
3
3
  include Foreman::Controller::AutoCompleteSearch
4
+ include ForemanChef::Concerns::EnvironmentParameters
5
+
4
6
  before_filter :find_resource, :only => [:edit, :update, :destroy]
5
7
 
6
8
  def import
@@ -34,7 +36,7 @@ module ForemanChef
34
36
  end
35
37
 
36
38
  def create
37
- @environment = ForemanChef::Environment.new(params[:foreman_chef_environment])
39
+ @environment = ForemanChef::Environment.new(environment_params)
38
40
  if @environment.save
39
41
  process_success
40
42
  else
@@ -46,7 +48,7 @@ module ForemanChef
46
48
  end
47
49
 
48
50
  def update
49
- if @environment.update_attributes(params[:foreman_chef_environment])
51
+ if @environment.update_attributes(environment_params)
50
52
  process_success
51
53
  else
52
54
  process_error
@@ -0,0 +1,36 @@
1
+ module Actions
2
+ module ForemanChef
3
+ module Client
4
+ class Create < Actions::EntryAction
5
+
6
+ def plan(name, proxy)
7
+ client_exists_in_chef = proxy.show_client(name)
8
+ if client_exists_in_chef
9
+ raise ::ForemanChef::ObjectExistsException.new(N_('Client with name %s already exist on this Chef proxy' % name))
10
+ else
11
+ plan_self :chef_proxy_id => proxy.id, :name => name
12
+ end
13
+ rescue => e
14
+ Rails.logger.debug "Unable to communicate with Chef proxy, #{e.message}"
15
+ Rails.logger.debug e.backtrace.join("\n")
16
+ raise ::ForemanChef::ProxyException.new(N_('CLIENT Unable to communicate with Chef proxy, %s' % e.message))
17
+ end
18
+
19
+ def run
20
+ proxy = ::SmartProxy.find_by_id(input[:chef_proxy_id])
21
+ action_logger.debug "Creating client #{input[:name]} on proxy #{proxy.name} at #{proxy.url}"
22
+ self.output = proxy.create_client(input[:name])
23
+ end
24
+
25
+ def humanized_name
26
+ _("Create client")
27
+ end
28
+
29
+ def humanized_input
30
+ input[:name]
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,51 @@
1
+ module Actions
2
+ module ForemanChef
3
+ module Host
4
+ class Create < Actions::EntryAction
5
+
6
+ def plan(host)
7
+ action_subject(host)
8
+
9
+ if host.chef_proxy
10
+ client_exists_in_chef = host.chef_proxy.show_client(host.name)
11
+
12
+ sequence do
13
+ if client_exists_in_chef
14
+ plan_action Actions::ForemanChef::Client::Destroy, host.name, host.chef_proxy
15
+ end
16
+
17
+ unless ::Setting::ForemanChef.validate_bootstrap_method
18
+ client_creation = plan_action Actions::ForemanChef::Client::Create, host.name, host.chef_proxy
19
+ end
20
+
21
+ plan_self(:create_action_output => client_creation.output)
22
+ end
23
+ end
24
+ rescue => e
25
+ Rails.logger.debug "Unable to communicate with Chef proxy, #{e.message}"
26
+ Rails.logger.debug e.backtrace.join("\n")
27
+ raise ::ForemanChef::ProxyException.new(N_('Unable to communicate with Chef proxy, %s' % e.message))
28
+ end
29
+
30
+ # def run
31
+ # # TODO create node with runlist?
32
+ # end
33
+
34
+ def finalize
35
+ if input[:create_action_output][:private_key].present?
36
+ ::Host.find(self.input[:host][:id]).update_attribute(:chef_private_key, input[:create_action_output][:private_key])
37
+ end
38
+ end
39
+
40
+ def humanized_name
41
+ _("Create node")
42
+ end
43
+
44
+ def humanized_input
45
+ input[:host][:name]
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -7,7 +7,7 @@ module Actions
7
7
 
8
8
  def plan(host)
9
9
  action_subject(host)
10
- if (::Setting::ForemanChef.auto_deletion && proxy = ::SmartProxy.find_by_id(host.chef_proxy_id))
10
+ if (::Setting::ForemanChef.auto_deletion && proxy = host.chef_proxy)
11
11
  node_exists_in_chef = proxy.show_node(host.name)
12
12
  if node_exists_in_chef
13
13
  plan_self :chef_proxy_id => host.chef_proxy_id
@@ -43,14 +43,21 @@ module ProxyAPI
43
43
  end
44
44
 
45
45
  # Shows a Chef Client entry
46
- # [+key+] : String containing the hostname
47
- # Returns : Hash representation of host on chef server
46
+ # [+key+] : String containing the client name
47
+ # Returns : Hash representation of client on chef server
48
48
  def show_client(key)
49
49
  Client.new(@args).send(:get, key)
50
50
  end
51
51
 
52
+ # Creates a Chef Client entry
53
+ # [+key+] : String containing the client name
54
+ # Returns : Hash representation of client on chef server
55
+ def create_client(key)
56
+ Client.new(@args).send(:post, :client => {:name => key})
57
+ end
58
+
52
59
  # Deletes a Chef Client entry
53
- # [+key+] : String containing the hostname
60
+ # [+key+] : String containing the client name
54
61
  # Returns : Boolean status
55
62
  def delete_client(key)
56
63
  Client.new(@args).send(:delete, key)
@@ -5,6 +5,11 @@ module ForemanChef
5
5
  include ForemanTasks::Concerns::ActionSubject
6
6
  include ForemanTasks::Concerns::ActionTriggering
7
7
 
8
+ def create_action
9
+ sync_action!
10
+ ::Actions::ForemanChef::Host::Create
11
+ end
12
+
8
13
  def destroy_action
9
14
  sync_action!
10
15
  ::Actions::ForemanChef::Host::Destroy
@@ -18,5 +23,5 @@ module ForemanChef
18
23
  end
19
24
 
20
25
  class ::Host::Managed::Jail < Safemode::Jail
21
- allow :chef_proxy, :chef_environment
26
+ allow :chef_proxy, :chef_environment, :chef_private_key
22
27
  end
@@ -6,8 +6,6 @@ module ForemanChef
6
6
  included do
7
7
  belongs_to :chef_proxy, :class_name => "SmartProxy"
8
8
  belongs_to :chef_environment, :class_name => "ForemanChef::Environment"
9
-
10
- attr_accessible :chef_proxy_id, :chef_environment_id
11
9
  end
12
10
 
13
11
  def available_chef_environments
@@ -0,0 +1,14 @@
1
+ module ForemanChef
2
+ module Concerns
3
+ module HostBuild
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ include ForemanTasks::Concerns::ActionSubject
7
+ include ForemanTasks::Concerns::ActionTriggering
8
+
9
+ after_build :plan_destroy_action
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -9,6 +9,10 @@ module ForemanChef
9
9
  raise SecurityError, 'snippet contains not white-listed characters' unless snippet_name =~ /\A[a-zA-Z0-9 _-]+\Z/
10
10
  snippet snippet_name
11
11
  end
12
+
13
+ def validation_bootstrap_method?
14
+ ::Setting::ForemanChef.validate_bootstrap_method
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -32,6 +32,13 @@ module ForemanChef
32
32
  return false
33
33
  end
34
34
 
35
+ def create_client(fqdn)
36
+ begin
37
+ reply = ProxyAPI::ForemanChef::ChefProxy.new(:url => url).create_client(fqdn)
38
+ JSON.parse(reply)
39
+ end
40
+ end
41
+
35
42
  def delete_client(fqdn)
36
43
  begin
37
44
  reply = ProxyAPI::ForemanChef::ChefProxy.new(:url => url).delete_client(fqdn)
@@ -9,8 +9,6 @@ module ForemanChef
9
9
  has_many :hostgroups, :class_name => '::Hostgroup'
10
10
  belongs_to :chef_proxy, :class_name => '::SmartProxy'
11
11
 
12
- attr_accessible :name, :description, :chef_proxy_id
13
-
14
12
  validates :name, :uniqueness => true, :presence => true, :format => { :with => /\A[\w\d\.]+\z/, :message => N_('is alphanumeric and cannot contain spaces') }
15
13
 
16
14
  scoped_search :on => :name, :complete_value => true
@@ -1,5 +1,4 @@
1
1
  module ForemanChef
2
2
  class FactName < ::FactName
3
- attr_accessible :compose
4
3
  end
5
4
  end
@@ -6,7 +6,8 @@ class Setting::ForemanChef < Setting
6
6
 
7
7
  self.transaction do
8
8
  [
9
- self.set('auto_deletion', N_("Enable the auto deletion of mapped objects in chef-server through foreman-proxy (currently node and client upon host deletion)"), true),
9
+ self.set('auto_deletion', N_("Enable the auto deletion of mapped objects in chef-server through foreman-proxy (currently node and client upon host deletion, client on host rebuild)"), true),
10
+ self.set('validation_bootstrap_method', N_("Use validation.pem or create client directly storing private key in Foreman DB)"), true),
10
11
  ].each { |s| self.create! s.update(:category => "Setting::ForemanChef")}
11
12
  end
12
13
 
@@ -0,0 +1,4 @@
1
+ module ForemanChef
2
+ class ObjectExistsException < Foreman::Exception
3
+ end
4
+ end
@@ -1,12 +1,17 @@
1
+ <% if validation_bootstrap_method? -%>
1
2
  echo "Creating validation.pem"
2
3
  mkdir /etc/chef
3
4
  touch /etc/chef/validation.pem
4
5
  chmod 600 /etc/chef/validation.pem
5
6
 
6
- ## You need to paste here foreman's private key
7
7
  cat << 'EOF' > /etc/chef/validation.pem
8
8
  <%= @host.params['chef_validation_private_key'] %>
9
9
  EOF
10
+ <% else -%>
11
+ cat << 'EOF' > /etc/chef/client.pem
12
+ <%= @host.chef_private_key %>
13
+ EOF
14
+ <% end -%>
10
15
 
11
16
  ## If chef_server_certificate is present, install it into /etc/chef/trusted_certs
12
17
  <% chef_server_certificate = @host.params['chef_server_certificate'] -%>
@@ -7,7 +7,7 @@
7
7
  {:class => 'btn btn-default', :"data-no-turbolink" => true})
8
8
  end.flatten)
9
9
  ) %>
10
- <% title_actions button_group(display_link_if_authorized(_('New Chef Environment'), hash_for_new_foreman_chef_environment_path)) %>
10
+ <% title_actions button_group(new_link(_('New Chef Environment'))) %>
11
11
 
12
12
  <table class="table table-bordered table-striped">
13
13
  <tr>
@@ -2,7 +2,7 @@ class CreateChefEnvironment < ActiveRecord::Migration
2
2
  def up
3
3
  create_table :foreman_chef_environments do |t|
4
4
  t.string :name, :default => '', :null => false
5
- t.text :description, :default => ''
5
+ t.text :description
6
6
  t.integer :chef_proxy_id, :null => false
7
7
  t.timestamps
8
8
  end
@@ -0,0 +1,5 @@
1
+ class AddChefPrivateKeyToHost < ActiveRecord::Migration
2
+ def change
3
+ add_column :hosts, :chef_private_key, :text
4
+ end
5
+ end
@@ -45,10 +45,10 @@ module ForemanChef
45
45
  ForemanTasks.dynflow.config.eager_load_paths.concat(%W[#{ForemanChef::Engine.root}/app/lib/actions])
46
46
  end
47
47
 
48
- initializer 'foreman_chef.register_plugin', :after => :finisher_hook do |app|
48
+ initializer 'foreman_chef.register_plugin', :before => :finisher_hook do |app|
49
49
  Foreman::Plugin.register :foreman_chef do
50
- requires_foreman '>= 1.11'
51
- allowed_template_helpers :chef_bootstrap
50
+ requires_foreman '>= 1.13'
51
+ allowed_template_helpers :chef_bootstrap, :validation_bootstrap_method?
52
52
 
53
53
  permission :import_chef_environments, { :environments => [:import, :synchronize] }, :resource_type => 'ForemanChef::Environment'
54
54
  permission :view_chef_environments, { :environments => [:index, :environments_for_chef_proxy] }, :resource_type => 'ForemanChef::Environment'
@@ -61,6 +61,9 @@ module ForemanChef
61
61
  caption: N_('Environments'),
62
62
  parent: :configure_menu,
63
63
  last: true
64
+
65
+ parameter_filter Host::Managed, :chef_private_key, :chef_proxy_id, :chef_environment_id
66
+ parameter_filter Hostgroup, :chef_proxy_id, :chef_environment_id
64
67
  end
65
68
  end
66
69
 
@@ -85,6 +88,7 @@ module ForemanChef
85
88
  ::Hostgroup.send :include, ForemanChef::Concerns::HostgroupExtensions
86
89
  ::SmartProxy.send :include, ForemanChef::Concerns::SmartProxyExtensions
87
90
  ::Host::Base.send :include, ForemanChef::Concerns::HostActionSubject
91
+ ::Host::Managed.send :include, ForemanChef::Concerns::HostBuild
88
92
  ::HostsController.send :include, ForemanChef::Concerns::HostsControllerRescuer
89
93
  # Renderer Concern needs to be injected to controllers, ForemanRenderer was already included
90
94
  (TemplatesController.descendants + [TemplatesController]).each do |klass|
@@ -1,3 +1,3 @@
1
1
  module ForemanChef
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_chef
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marek Hulan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-07 00:00:00.000000000 Z
11
+ date: 2016-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deface
@@ -29,9 +29,6 @@ dependencies:
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.6.9
34
- - - "<"
35
32
  - !ruby/object:Gem::Version
36
33
  version: 0.8.0
37
34
  type: :runtime
@@ -39,9 +36,6 @@ dependencies:
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 0.6.9
44
- - - "<"
45
39
  - !ruby/object:Gem::Version
46
40
  version: 0.8.0
47
41
  - !ruby/object:Gem::Dependency
@@ -70,14 +64,18 @@ files:
70
64
  - Rakefile
71
65
  - app/assets/javascripts/foreman_chef/chef_proxy_environment_refresh.js
72
66
  - app/controllers/foreman_chef/application_controller.rb
67
+ - app/controllers/foreman_chef/concerns/environment_parameters.rb
73
68
  - app/controllers/foreman_chef/concerns/hosts_controller_rescuer.rb
74
69
  - app/controllers/foreman_chef/environments_controller.rb
75
70
  - app/helpers/foreman_chef/chef_proxy_form.rb
71
+ - app/lib/actions/foreman_chef/client/create.rb
76
72
  - app/lib/actions/foreman_chef/client/destroy.rb
73
+ - app/lib/actions/foreman_chef/host/create.rb
77
74
  - app/lib/actions/foreman_chef/host/destroy.rb
78
75
  - app/lib/proxy_api/foreman_chef/chef_proxy.rb
79
76
  - app/models/foreman_chef/concerns/host_action_subject.rb
80
77
  - app/models/foreman_chef/concerns/host_and_hostgroup_extensions.rb
78
+ - app/models/foreman_chef/concerns/host_build.rb
81
79
  - app/models/foreman_chef/concerns/host_extensions.rb
82
80
  - app/models/foreman_chef/concerns/hostgroup_extensions.rb
83
81
  - app/models/foreman_chef/concerns/renderer.rb
@@ -89,6 +87,7 @@ files:
89
87
  - app/models/setting/foreman_chef.rb
90
88
  - app/overrides/add_chef_proxy.rb
91
89
  - app/services/foreman_chef/chef_server_importer.rb
90
+ - app/services/foreman_chef/object_exists_exception.rb
92
91
  - app/services/foreman_chef/proxy_exception.rb
93
92
  - app/views/foreman/unattended/snippets/_chef_client_bootstrap.erb
94
93
  - app/views/foreman/unattended/snippets/_chef_client_gem_bootstrap.erb
@@ -103,6 +102,7 @@ files:
103
102
  - db/migrate/20140220145827_add_chef_proxy_id_to_host.rb
104
103
  - db/migrate/20140513144804_add_chef_proxy_id_to_hostgroup.rb
105
104
  - db/migrate/20150916141657_create_chef_environment.rb
105
+ - db/migrate/20160408091653_add_chef_private_key_to_host.rb
106
106
  - db/seeds.rb
107
107
  - lib/foreman_chef.rb
108
108
  - lib/foreman_chef/engine.rb