foreman_userdata 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b7112089e0d77990b90ae1a8a04904532408f8a9
4
- data.tar.gz: 3a024af5e6b794776a672973c2fff5dddd52d30c
2
+ SHA256:
3
+ metadata.gz: 5d6869feb991a28777d8dbb81c5245bf558a1b5749dfa256f4fd4a6e0e5c9db5
4
+ data.tar.gz: 5b76c05add078863aeed559e72964bdd8896c9bc92c06422e59aa7648fc131dd
5
5
  SHA512:
6
- metadata.gz: 8eae493b1aee10360801ddffe9c8024551359ee9e002474f8f68abe60970f08f7df1b54792a26b06452526775a7c8199aa13b0db6fb95242230b724b6d26a82e
7
- data.tar.gz: b8a09691e46e1280295a0105ac0284e664ad35013b316d00811443f0b40132aafe983677ece1c13ec7cebc5fb33108be9d155cd547121e4edc3a2f5a9d1692e6
6
+ metadata.gz: 06075e10a78c2bf3f38f570ff9aee40759ba45604a37dcf1b252d70b52db6f718ece840a018738f0158966a6e17b6c5f3bd33afb8b22d3683e738257b98d5555
7
+ data.tar.gz: b23336f4d8f2ef1ecb9753355e3821e9f7634abfaa405afdd81036014e95e7418496b071984daffcdd4dd744d78dc7bdacbab28c97fa075de3ff5b010f5a18d9
data/README.md CHANGED
@@ -14,6 +14,22 @@ See [Plugins install instructions](https://theforeman.org/plugins/)
14
14
  for how to install Foreman plugins.
15
15
  You need to install the package `tfm-rubygem-foreman_userdata`.
16
16
 
17
+ ## Motivation
18
+
19
+ This plug-in was developed to be used with VMWare vSphere provisioning from VMWare templates.
20
+ vSphere offers the functionality to customize the templates during cloning. This is very handy for changing the network settings of a newly cloned VM.
21
+ Foreman fully supports this feature via a userdata template. [The Foreman handbook](https://theforeman.org/manuals/1.17/index.html#image-provisioning-without-ssh) has details on how to configure this.
22
+ The amount of things vSphere allows a user to customize are very limited, though. It's not possible to run a finish script or setup puppet with valid certificates on the new VM.
23
+ This can be worked around by setting up a two step process: vSphere customization is just used to set up the network config of the host. Cloud-init is used to do the rest of the customization on first boot.
24
+ Templates for Linux hosts are seeded when you install this plugin. Make sure you associate both `CloudInit default` and `UserData open-vm-tools` templates with the operatingsystem of your host and choose them as the default `userdata` and `cloud-init` templates.
25
+
26
+ This leads to this workflow:
27
+ 1. An administrator creates a vSphere VM template and makes sure the cloud-init application is installed in the template VM as described below in the client setup section.
28
+ 2. Foreman creates a new cloned VM in vSphere and passes the userdata template (UserData open-vm-tools) to vSphere if the template is properly assigned to the host.
29
+ 3. vSphere changes the network settings of the new host as defined in the userdata template and boots the new VM.
30
+ 4. The VM runs cloud-init and asks Foreman for the cloud-init template (CloudInit default) if the template has been properly assinged to the host. Your VM needs network access to Foreman on ports `tcp/80` and `tcp/443`. Cloud-init then runs the template and executes the defined actions.
31
+ 5. Cloud-init signals Foreman that the host has been built successfully.
32
+
17
33
  ## Client setup
18
34
 
19
35
  On RHEL7 using cloud-init from EPEL:
data/Rakefile CHANGED
@@ -38,7 +38,7 @@ task default: :test
38
38
  begin
39
39
  require 'rubocop/rake_task'
40
40
  RuboCop::RakeTask.new
41
- rescue => _
41
+ rescue StandardError => _
42
42
  puts 'Rubocop not loaded.'
43
43
  end
44
44
 
@@ -51,7 +51,12 @@ class UserdataController < ApplicationController
51
51
  end
52
52
 
53
53
  def safe_render(template)
54
- @host.render_template(template)
54
+ # Foreman >= 1.20
55
+ if template.respond_to?(:render)
56
+ template.render(host: @host, params: params)
57
+ else
58
+ @host.render_template(template)
59
+ end
55
60
  rescue StandardError => error
56
61
  Foreman::Logging.exception("Error rendering the #{template.name} template", error)
57
62
  render_error(
@@ -60,7 +65,7 @@ class UserdataController < ApplicationController
60
65
  :error => error.message,
61
66
  :status => :internal_server_error
62
67
  )
63
- return false
68
+ false
64
69
  end
65
70
 
66
71
  def skip_secure_headers
@@ -101,9 +106,7 @@ class UserdataController < ApplicationController
101
106
  ip = request.env['REMOTE_ADDR']
102
107
 
103
108
  # check if someone is asking on behalf of another system (load balancer etc)
104
- if request.env['HTTP_X_FORWARDED_FOR'].present? && (ip =~ Regexp.new(Setting[:remote_addr]))
105
- ip = request.env['HTTP_X_FORWARDED_FOR']
106
- end
109
+ ip = request.env['HTTP_X_FORWARDED_FOR'] if request.env['HTTP_X_FORWARDED_FOR'].present? && (ip =~ Regexp.new(Setting[:remote_addr]))
107
110
 
108
111
  ip
109
112
  end
@@ -0,0 +1,39 @@
1
+ <%#
2
+ kind: cloud_init
3
+ name: CloudInit default
4
+ model: ProvisioningTemplate
5
+ oses:
6
+ - CentOS
7
+ - Fedora
8
+ - Debian
9
+ - Ubuntu
10
+ -%>
11
+ <%#
12
+ This template accepts the following parameters:
13
+ - force-puppet: boolean (default=false)
14
+ - enable-puppetlabs-repo: boolean (default=false)
15
+ - enable-puppetlabs-pc1-repo: boolean (default=false)
16
+ - enable-puppetlabs-puppet5-repo: boolean (default=false)
17
+ %>
18
+ <%
19
+ pm_set = @host.puppetmaster.empty? ? false : true
20
+ puppet_enabled = pm_set || host_param_true?('force-puppet')
21
+ %>
22
+ #cloud-config
23
+ hostname: <%= @host.name %>
24
+ fqdn: <%= @host %>
25
+ manage_etc_hosts: true
26
+ users: {}
27
+ runcmd:
28
+ - |
29
+ <% if puppet_enabled %>
30
+ <% if host_param_true?('enable-puppetlabs-pc1-repo') || host_param_true?('enable-puppetlabs-repo') || host_param_true?('enable-puppetlabs-puppet5-repo') -%>
31
+ <%= snippet 'puppetlabs_repo' %>
32
+ <% end -%>
33
+ <%= indent(2) { snippet('puppet_setup_cloudinit') } %>
34
+ <% end -%>
35
+
36
+ phone_home:
37
+ url: <%= foreman_url('built') %>
38
+ post: []
39
+ tries: 10
@@ -0,0 +1,85 @@
1
+ <%#
2
+ kind: snippet
3
+ name: puppet_setup_cloudinit
4
+ model: ProvisioningTemplate
5
+ description: this snippet will configure the Puppet agent from within cloudinit
6
+ snippet: true
7
+ %>
8
+ <%
9
+ os_family = @host.operatingsystem.family
10
+ os_major = @host.operatingsystem.major.to_i
11
+ os_name = @host.operatingsystem.name
12
+ aio_enabled = host_param_true?('enable-puppetlabs-puppet5-repo') || host_param_true?('enable-puppetlabs-pc1-repo') || host_param_true?('enable-puppet4') || host_param_true?('enable-puppet5')
13
+ if os_family == 'Freebsd'
14
+ freebsd_package = host_param_true?('enable-puppet5') ? 'puppet5' : 'puppet4'
15
+ etc_path = '/usr/local/etc/puppet'
16
+ bin_path = '/usr/local/bin'
17
+ elsif aio_enabled
18
+ linux_package = 'puppet-agent'
19
+ etc_path = '/etc/puppetlabs/puppet'
20
+ bin_path = '/opt/puppetlabs/bin'
21
+ else
22
+ linux_package = os_family == 'Suse' ? 'rubygem-puppet' : 'puppet'
23
+ etc_path = '/etc/puppet'
24
+ bin_path = '/usr/bin'
25
+ end
26
+ %>
27
+
28
+ <% if os_family == 'Debian' -%>
29
+ apt-get update
30
+ apt-get install -y <%= linux_package %>
31
+ <% elsif os_family == 'Freebsd' -%>
32
+ pkg install -y <%= freebsd_package %>
33
+ <% elsif os_family == 'Redhat' -%>
34
+ if [ -f /usr/bin/dnf ]; then
35
+ dnf -y install <%= linux_package %>
36
+ else
37
+ yum -t -y install <%= linux_package %>
38
+ fi
39
+ <% elsif os_family == 'Suse' -%>
40
+ <% if host_param_true?('enable-puppetlabs-pc1-repo') || host_param_true?('enable-puppetlabs-puppet5-repo') -%>
41
+ rpmkeys --import http://yum.puppetlabs.com/RPM-GPG-KEY-puppetlabs
42
+ rpmkeys --import http://yum.puppetlabs.com/RPM-GPG-KEY-puppet
43
+ <% end -%>
44
+ <% if @host.provision_method == 'image' -%>
45
+ /usr/bin/zypper -n install <%= linux_package %>
46
+ <% end -%>
47
+
48
+ cat > <%= etc_path %>/puppet.conf << EOF
49
+ <%= snippet 'puppet.conf' %>
50
+ EOF
51
+
52
+ <% if os_family == 'Redhat' -%>
53
+ <% if os_major > 6 -%>
54
+ puppet_unit=puppet
55
+ /usr/bin/systemctl list-unit-files | grep -q puppetagent && puppet_unit=puppetagent
56
+ /usr/bin/systemctl enable ${puppet_unit}
57
+ <% else -%>
58
+ /sbin/chkconfig --level 345 puppet on
59
+ <% end -%>
60
+ <% end -%>
61
+ <% if os_family == 'Freebsd' -%>
62
+ echo 'puppet_enable="YES"' >>/etc/rc.conf
63
+ <% end -%>
64
+ <% unless aio_enabled -%>
65
+ <% if os_family == 'Debian' -%>
66
+ if [ -f "/etc/default/puppet" ]
67
+ then
68
+ /bin/sed -i 's/^START=no/START=yes/' /etc/default/puppet
69
+ fi
70
+ <%= bin_path %>/puppet agent --enable
71
+ <% elsif os_family == 'Suse' -%>
72
+ if [ -f "/etc/sysconfig/puppet" ]
73
+ then
74
+ /usr/bin/sed -ie s/^PUPPET_SERVER=.*/PUPPET_SERVER=<%= @host.puppetmaster.blank? ? '' : @host.puppetmaster %>/ /etc/sysconfig/puppet
75
+ fi
76
+ <% end -%>
77
+ <% end -%>
78
+ <% end -%>
79
+ <%= bin_path %>/puppet agent --config <%= etc_path %>/puppet.conf --onetime <%= @host.puppetmaster.blank? ? '' : "--server #{@host.puppetmaster}" %> --no-daemonize
80
+ <% if os_family == 'Suse' || (os_name == 'Debian' && os_major > 8) || (os_name == 'Ubuntu' && os_major >= 15) -%>
81
+ <%= bin_path %>/puppet resource service puppet enable=true
82
+ <% if @host.provision_method == 'image' -%>
83
+ <%= bin_path %>/puppet resource service puppet ensure=running
84
+ <% end -%>
85
+ <% end -%>
@@ -0,0 +1,36 @@
1
+ <%#
2
+ kind: user_data
3
+ name: UserData open-vm-tools
4
+ model: ProvisioningTemplate
5
+ oses:
6
+ - CentOS
7
+ - Fedora
8
+ - Debian
9
+ - Ubuntu
10
+ -%>
11
+ # Template for VMWare customization via open-vm-tools
12
+
13
+ identity:
14
+ LinuxPrep:
15
+ domain: <%= @host.domain %>
16
+ hostName: <%= @host.shortname %>
17
+ hwClockUTC: true
18
+ timeZone: <%= host_param('time-zone') || 'UTC' %>
19
+
20
+ globalIPSettings:
21
+ dnsSuffixList: [<%= @host.domain %>]
22
+ <%- @host.interfaces.each do |interface| -%>
23
+ <%- next unless interface.subnet -%>
24
+ dnsServerList: [<%= interface.subnet.dns_primary %>, <%= interface.subnet.dns_secondary %>]
25
+ <%- end -%>
26
+
27
+ nicSettingMap:
28
+ <%- @host.interfaces.each do |interface| -%>
29
+ <%- next unless interface.subnet -%>
30
+ - adapter:
31
+ dnsDomain: <%= interface.domain %>
32
+ dnsServerList: [<%= interface.subnet.dns_primary %>, <%= interface.subnet.dns_secondary %>]
33
+ gateway: [<%= interface.subnet.gateway %>]
34
+ ip: <%= interface.ip %>
35
+ subnetMask: <%= interface.subnet.mask %>
36
+ <%- end -%>
@@ -0,0 +1,19 @@
1
+ User.as_anonymous_admin do
2
+ templates = [
3
+ { name: 'CloudInit default', source: 'cloud_init/cloud_init_default.erb', template_kind: TemplateKind.find_by(name: 'cloud-init') },
4
+ { name: 'puppet_setup_cloudinit', source: 'snippet/puppet_setup_cloudinit.erb', snippet: true },
5
+ { name: 'UserData open-vm-tools', source: 'user_data/userdata_open_vm_tools.erb', template_kind: TemplateKind.find_by(name: 'user_data') }
6
+ ]
7
+ templates.each do |template|
8
+ template[:contents] = File.read(File.join(ForemanUserdata::Engine.root, 'app/views/foreman/unattended/provisioning_templates', template[:source]))
9
+ ProvisioningTemplate.where(name: template[:name]).first_or_create do |pt|
10
+ pt.vendor = 'ForemanUserdata'
11
+ pt.default = true
12
+ pt.locked = true
13
+ pt.name = template[:name]
14
+ pt.template = template[:contents]
15
+ pt.template_kind = template[:template_kind] if template[:template_kind]
16
+ pt.snippet = template[:snippet] if template[:snippet]
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module ForemanUserdata
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -29,7 +29,7 @@ namespace :foreman_userdata do
29
29
  "#{ForemanUserdata::Engine.root}/lib/**/*.rb",
30
30
  "#{ForemanUserdata::Engine.root}/test/**/*.rb"]
31
31
  end
32
- rescue
32
+ rescue LoadError
33
33
  puts 'Rubocop not loaded.'
34
34
  end
35
35
 
@@ -40,6 +40,4 @@ end
40
40
  Rake::Task[:test].enhance ['test:foreman_userdata']
41
41
 
42
42
  load 'tasks/jenkins.rake'
43
- if Rake::Task.task_defined?(:'jenkins:unit')
44
- Rake::Task['jenkins:unit'].enhance ['test:foreman_userdata', 'foreman_userdata:rubocop']
45
- end
43
+ Rake::Task['jenkins:unit'].enhance ['test:foreman_userdata', 'foreman_userdata:rubocop'] if Rake::Task.task_defined?(:'jenkins:unit')
@@ -2,14 +2,14 @@ require 'test_plugin_helper'
2
2
 
3
3
  class UserdataControllerTest < ActionController::TestCase
4
4
  context '#user-data' do
5
- let(:organization) { FactoryGirl.create(:organization) }
6
- let(:tax_location) { FactoryGirl.create(:location) }
5
+ let(:organization) { FactoryBot.create(:organization) }
6
+ let(:tax_location) { FactoryBot.create(:location) }
7
7
  let(:user_data_content) { 'template content user_data' }
8
8
  let(:cloud_init_content) { 'template content cloud-init' }
9
- let(:user_data_template_kind) { FactoryGirl.create(:template_kind, :name => 'user_data') }
10
- let(:cloud_init_template_kind) { FactoryGirl.create(:template_kind, :name => 'cloud-init') }
9
+ let(:user_data_template_kind) { FactoryBot.create(:template_kind, :name => 'user_data') }
10
+ let(:cloud_init_template_kind) { FactoryBot.create(:template_kind, :name => 'cloud-init') }
11
11
  let(:user_data_template) do
12
- FactoryGirl.create(
12
+ FactoryBot.create(
13
13
  :provisioning_template,
14
14
  :template_kind => user_data_template_kind,
15
15
  :template => user_data_content,
@@ -18,7 +18,7 @@ class UserdataControllerTest < ActionController::TestCase
18
18
  )
19
19
  end
20
20
  let(:cloud_init_template) do
21
- FactoryGirl.create(
21
+ FactoryBot.create(
22
22
  :provisioning_template,
23
23
  :template_kind => cloud_init_template_kind,
24
24
  :template => cloud_init_content,
@@ -27,7 +27,7 @@ class UserdataControllerTest < ActionController::TestCase
27
27
  )
28
28
  end
29
29
  let(:os) do
30
- FactoryGirl.create(
30
+ FactoryBot.create(
31
31
  :operatingsystem,
32
32
  :with_associations,
33
33
  :family => 'Redhat',
@@ -38,7 +38,7 @@ class UserdataControllerTest < ActionController::TestCase
38
38
  )
39
39
  end
40
40
  let(:host) do
41
- FactoryGirl.create(
41
+ FactoryBot.create(
42
42
  :host,
43
43
  :managed,
44
44
  :operatingsystem => os,
@@ -48,7 +48,7 @@ class UserdataControllerTest < ActionController::TestCase
48
48
  end
49
49
 
50
50
  setup do
51
- FactoryGirl.create(
51
+ FactoryBot.create(
52
52
  :os_default_template,
53
53
  :template_kind => user_data_template_kind,
54
54
  :provisioning_template => user_data_template,
@@ -67,7 +67,7 @@ class UserdataControllerTest < ActionController::TestCase
67
67
 
68
68
  context 'with cloud-init template' do
69
69
  setup do
70
- FactoryGirl.create(
70
+ FactoryBot.create(
71
71
  :os_default_template,
72
72
  :template_kind => cloud_init_template_kind,
73
73
  :provisioning_template => cloud_init_template,
@@ -84,7 +84,7 @@ class UserdataControllerTest < ActionController::TestCase
84
84
  end
85
85
 
86
86
  context '#metadata' do
87
- let(:host) { FactoryGirl.create(:host, :managed) }
87
+ let(:host) { FactoryBot.create(:host, :managed) }
88
88
  setup do
89
89
  @request.env['REMOTE_ADDR'] = host.ip
90
90
  end
@@ -93,7 +93,7 @@ class UserdataControllerTest < ActionController::TestCase
93
93
  get :metadata
94
94
  assert_response :success
95
95
  response = @response.body
96
- parsed = YAML.load(response)
96
+ parsed = YAML.safe_load(response)
97
97
  assert_equal host.mac, parsed['mac']
98
98
  assert_equal host.hostname, parsed['hostname']
99
99
  end
@@ -0,0 +1,33 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanUserdata
4
+ class SeedsTest < ActiveSupport::TestCase
5
+ setup do
6
+ Foreman.stubs(:in_rake?).returns(true)
7
+ end
8
+
9
+ test 'seeds cloud-init provisioning templates' do
10
+ seed
11
+ assert ProvisioningTemplate.unscoped.where(default: true).exists?
12
+ expected_template_names = [
13
+ 'CloudInit default',
14
+ 'puppet_setup_cloudinit',
15
+ 'UserData open-vm-tools'
16
+ ]
17
+
18
+ seeded_templates = ProvisioningTemplate.unscoped.where(default: true, vendor: 'ForemanUserdata').pluck(:name)
19
+
20
+ expected_template_names.each do |template|
21
+ assert_includes seeded_templates, template
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def seed
28
+ User.current = FactoryBot.build(:user, admin: true,
29
+ organizations: [], locations: [])
30
+ load Rails.root.join('db', 'seeds.rb')
31
+ end
32
+ end
33
+ end
@@ -1,18 +1,3 @@
1
1
  # This calls the main test_helper in Foreman-core
2
2
  require 'test_helper'
3
3
  require 'database_cleaner'
4
-
5
- # Foreman's setup doesn't handle cleaning up for Minitest::Spec
6
- DatabaseCleaner.strategy = :transaction
7
-
8
- module Minitest
9
- class Spec
10
- before :each do
11
- DatabaseCleaner.start
12
- end
13
-
14
- after :each do
15
- DatabaseCleaner.clean
16
- end
17
- end
18
- end
@@ -0,0 +1,103 @@
1
+ require 'test_plugin_helper'
2
+ require 'minitest/hooks'
3
+
4
+ module ForemanUserdata
5
+ class RendererTest < ActiveSupport::TestCase
6
+ # Disable AR transactional tests as we use DatabaseCleaner's truncation
7
+ # seeds are loaded once for every context block to speed up tests
8
+ self.use_transactional_tests = false
9
+
10
+ # active_support_test_case_helper loads all fixtures by default
11
+ # This overrides the seeded data so we reset the fixture list here
12
+ self.fixture_table_names = []
13
+
14
+ fixtures :settings, :taxonomies, :users
15
+
16
+ TEMPLATES = [
17
+ 'CloudInit default',
18
+ 'UserData open-vm-tools'
19
+ ].freeze
20
+
21
+ setup do
22
+ User.current = FactoryBot.create(:user, admin: true,
23
+ organizations: [], locations: [])
24
+ end
25
+
26
+ teardown do
27
+ User.current = nil
28
+ end
29
+
30
+ describe 'templates seeded by this plugin' do
31
+ include Minitest::Hooks
32
+ before(:all) do
33
+ DatabaseCleaner.clean_with :truncation
34
+ seed
35
+ end
36
+
37
+ after(:all) do
38
+ DatabaseCleaner.clean_with :truncation
39
+ end
40
+
41
+ let(:host) do
42
+ FactoryBot.create(
43
+ :host, :managed,
44
+ :with_puppet, :with_puppet_ca, :with_environment,
45
+ :with_subnet, :with_hostgroup
46
+ ).tap do |h|
47
+ h.subnet.dns_primary = '8.8.8.8'
48
+ h.subnet.dns_secondary = '8.8.4.4'
49
+ h.save!
50
+ end
51
+ end
52
+
53
+ context 'safe mode' do
54
+ setup do
55
+ Setting[:safemode_render] = true
56
+ end
57
+
58
+ TEMPLATES.each do |template_name|
59
+ test "renders #{template_name} template without errors" do
60
+ assert_template(template_name)
61
+ end
62
+ end
63
+ end
64
+
65
+ context 'unsafe mode' do
66
+ setup do
67
+ Setting[:safemode_render] = false
68
+ end
69
+
70
+ TEMPLATES.each do |template_name|
71
+ test "renders #{template_name} template without errors" do
72
+ assert_template(template_name)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def assert_template(template_name)
81
+ template = ProvisioningTemplate.unscoped.find_by(name: template_name)
82
+ assert_not_nil template
83
+ rendered_template = render_template(template)
84
+ assert rendered_template
85
+ assert YAML.safe_load(rendered_template)
86
+ end
87
+
88
+ def render_template(template)
89
+ # Foreman >= 1.20
90
+ if template.respond_to?(:render)
91
+ template.render(host: host)
92
+ else
93
+ host.render_template(template)
94
+ end
95
+ end
96
+
97
+ def seed
98
+ User.current = FactoryBot.build(:user, admin: true,
99
+ organizations: [], locations: [])
100
+ load Rails.root.join('db', 'seeds.rb')
101
+ end
102
+ end
103
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_userdata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Timo Goebel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-08 00:00:00.000000000 Z
11
+ date: 2018-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rubocop
14
+ name: minitest-hooks
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.54.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.54.0
41
55
  description: This plug-in adds support for serving user-data for cloud-init to The
42
56
  Foreman.
43
57
  email:
@@ -50,14 +64,20 @@ files:
50
64
  - README.md
51
65
  - Rakefile
52
66
  - app/controllers/userdata_controller.rb
67
+ - app/views/foreman/unattended/provisioning_templates/cloud_init/cloud_init_default.erb
68
+ - app/views/foreman/unattended/provisioning_templates/snippet/puppet_setup_cloudinit.erb
69
+ - app/views/foreman/unattended/provisioning_templates/user_data/userdata_open_vm_tools.erb
53
70
  - config/routes.rb
54
- - db/seeds.d/50_cloud_init_template_kind.rb
71
+ - db/seeds.d/050-cloud_init_template_kind.rb
72
+ - db/seeds.d/103-cloud_init_provisioning_templates.rb
55
73
  - lib/foreman_userdata.rb
56
74
  - lib/foreman_userdata/engine.rb
57
75
  - lib/foreman_userdata/version.rb
58
76
  - lib/tasks/foreman_userdata_tasks.rake
59
77
  - test/controllers/userdata_controller_test.rb
78
+ - test/lib/tasks/seeds_test.rb
60
79
  - test/test_plugin_helper.rb
80
+ - test/unit/foreman_userdata/renderer_test.rb
61
81
  homepage: http://github.com/theforeman/foreman_userdata
62
82
  licenses:
63
83
  - GPL-3
@@ -78,10 +98,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
98
  version: '0'
79
99
  requirements: []
80
100
  rubyforge_project:
81
- rubygems_version: 2.6.12
101
+ rubygems_version: 2.7.3
82
102
  signing_key:
83
103
  specification_version: 4
84
104
  summary: This plug-in adds support for serving user-data for cloud-init to The Foreman.
85
105
  test_files:
86
- - test/controllers/userdata_controller_test.rb
106
+ - test/unit/foreman_userdata/renderer_test.rb
107
+ - test/lib/tasks/seeds_test.rb
87
108
  - test/test_plugin_helper.rb
109
+ - test/controllers/userdata_controller_test.rb