foreman_rescue 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/locale/Makefile ADDED
@@ -0,0 +1,60 @@
1
+ #
2
+ # Makefile for PO merging and MO generation. More info in the README.
3
+ #
4
+ # make all-mo (default) - generate MO files
5
+ # make check - check translations using translate-tool
6
+ # make tx-update - download and merge translations from Transifex
7
+ # make clean - clean everything
8
+ #
9
+ DOMAIN = foreman_rescue
10
+ VERSION = $(shell ruby -e 'require "rubygems";spec = Gem::Specification::load(Dir.glob("../*.gemspec")[0]);puts spec.version')
11
+ POTFILE = $(DOMAIN).pot
12
+ MOFILE = $(DOMAIN).mo
13
+ POFILES = $(shell find . -name '$(DOMAIN).po')
14
+ MOFILES = $(patsubst %.po,%.mo,$(POFILES))
15
+ POXFILES = $(patsubst %.po,%.pox,$(POFILES))
16
+ EDITFILES = $(patsubst %.po,%.edit.po,$(POFILES))
17
+
18
+ %.mo: %.po
19
+ mkdir -p $(shell dirname $@)/LC_MESSAGES
20
+ msgfmt -o $(shell dirname $@)/LC_MESSAGES/$(MOFILE) $<
21
+
22
+ # Generate MO files from PO files
23
+ all-mo: $(MOFILES)
24
+
25
+ # Check for malformed strings
26
+ %.pox: %.po
27
+ msgfmt -c $<
28
+ pofilter --nofuzzy -t variables -t blank -t urls -t emails -t long -t newlines \
29
+ -t endwhitespace -t endpunc -t puncspacing -t options -t printf -t validchars --gnome $< > $@
30
+ cat $@
31
+ ! grep -q msgid $@
32
+
33
+ %.edit.po:
34
+ touch $@
35
+
36
+ check: $(POXFILES)
37
+
38
+ # Unify duplicate translations
39
+ uniq-po:
40
+ for f in $(shell find ./ -name "*.po") ; do \
41
+ msguniq $$f -o $$f ; \
42
+ done
43
+
44
+ tx-pull: $(EDITFILES)
45
+ tx pull -f
46
+ for f in $(EDITFILES) ; do \
47
+ sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
48
+ done
49
+
50
+ tx-update: tx-pull
51
+ @echo
52
+ @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation, then make -C locale mo-files to finish
53
+ @echo
54
+
55
+ mo-files: $(MOFILES)
56
+ git add $(POFILES) $(POTFILE) ../locale/*/LC_MESSAGES
57
+ git commit -m "i18n - pulling from tx"
58
+ @echo
59
+ @echo Changes commited!
60
+ @echo
@@ -0,0 +1,19 @@
1
+ # foreman_rescue
2
+ #
3
+ # This file is distributed under the same license as foreman_rescue.
4
+ #
5
+ #, fuzzy
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: version 0.0.1\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2014-08-20 08:46+0100\n"
11
+ "PO-Revision-Date: 2014-08-20 08:54+0100\n"
12
+ "Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
13
+ "Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19
+
@@ -0,0 +1,19 @@
1
+ # foreman_rescue
2
+ #
3
+ # This file is distributed under the same license as foreman_rescue.
4
+ #
5
+ #, fuzzy
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: version 0.0.1\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2014-08-20 08:46+0100\n"
11
+ "PO-Revision-Date: 2014-08-20 08:46+0100\n"
12
+ "Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
13
+ "Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
+
data/locale/gemspec.rb ADDED
@@ -0,0 +1,2 @@
1
+ # Matches foreman_rescue.gemspec
2
+ _('TODO: Description of ForemanRescue.')
@@ -0,0 +1,7 @@
1
+ FactoryGirl.modify do
2
+ factory :host do
3
+ trait :rescue_mode do
4
+ rescue_mode true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,121 @@
1
+ require 'test_plugin_helper'
2
+
3
+ module ForemanRescue
4
+ class HostsControllerTest < ::ActionController::TestCase
5
+ setup do
6
+ User.current = FactoryGirl.create(:user, :admin)
7
+ end
8
+
9
+ let(:host) { FactoryGirl.create(:host, :managed) }
10
+
11
+ describe '#set_rescue' do
12
+ setup do
13
+ @request.env['HTTP_REFERER'] = hosts_path
14
+ end
15
+
16
+ teardown do
17
+ @request.env['HTTP_REFERER'] = ''
18
+ end
19
+
20
+ context 'when host is not saved' do
21
+ test 'the flash should inform it' do
22
+ Host::Managed.any_instance.expects(:set_rescue).returns(false)
23
+ put :set_rescue, { :id => host.name }, set_session_user
24
+ assert_response :found
25
+ assert_redirected_to hosts_path
26
+ assert flash[:error] =~ /Failed to enable #{host} for rescue system/
27
+ end
28
+ end
29
+
30
+ context 'when host is saved' do
31
+ setup do
32
+ Host::Managed.any_instance.expects(:set_rescue).returns(true)
33
+ end
34
+
35
+ test 'the flash should inform it' do
36
+ put :set_rescue, { :id => host.name }, set_session_user
37
+ assert_response :found
38
+ assert_redirected_to hosts_path
39
+ assert_equal "Enabled #{host} for rescue system on next boot.", flash[:notice]
40
+ end
41
+
42
+ context 'when reboot is requested' do
43
+ let(:power_mock) { mock('power') }
44
+
45
+ setup do
46
+ Host::Managed.any_instance.stubs(:power).returns(power_mock)
47
+ end
48
+
49
+ test 'the flash should inform it' do
50
+ power_mock.stubs(:reset).returns(true)
51
+ put :set_rescue, { :id => host.name, :host => { :rescue_mode => '1' } }, set_session_user
52
+ assert_response :found
53
+ assert_redirected_to hosts_path
54
+ assert_equal "Enabled #{host} for reboot into rescue system.", flash[:notice]
55
+ end
56
+
57
+ test 'with failed reboot, the flash should inform it' do
58
+ power_mock.stubs(:reset).returns(false)
59
+ put :set_rescue, { :id => host.name, :host => { :rescue_mode => '1' } }, set_session_user
60
+ host.power.reset
61
+ assert_response :found
62
+ assert_redirected_to hosts_path
63
+ assert_equal "Enabled #{host} for boot into rescue system on next boot, but failed to power cycle the host.", flash[:notice]
64
+ end
65
+
66
+ test 'reboot raised exception, the flash should inform it' do
67
+ power_mock.stubs(:reset).raises(Foreman::Exception)
68
+ put :set_rescue, { :id => host.name, :host => { :rescue_mode => '1' } }, set_session_user
69
+ assert_response :found
70
+ assert_redirected_to hosts_path
71
+ assert_equal "Enabled #{host} for rescue system on next boot.", flash[:notice]
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ describe '#cancel_rescue' do
78
+ setup do
79
+ @request.env['HTTP_REFERER'] = hosts_path
80
+ end
81
+
82
+ teardown do
83
+ @request.env['HTTP_REFERER'] = ''
84
+ end
85
+
86
+ context 'when host is saved' do
87
+ setup do
88
+ Host::Managed.any_instance.expects(:cancel_rescue).returns(true)
89
+ end
90
+
91
+ test 'the flash should inform it' do
92
+ put :cancel_rescue, { :id => host.name }, set_session_user
93
+ assert_response :found
94
+ assert_redirected_to hosts_path
95
+ assert_equal "Canceled booting into rescue system for #{host}.", flash[:notice]
96
+ end
97
+ end
98
+
99
+ context 'when host is not saved' do
100
+ setup do
101
+ Host::Managed.any_instance.expects(:cancel_rescue).returns(false)
102
+ end
103
+
104
+ test 'the flash should inform it' do
105
+ put :cancel_rescue, { :id => host.name }, set_session_user
106
+ assert_response :found
107
+ assert_redirected_to hosts_path
108
+ assert_includes flash[:error], "Failed to cancel booting into rescue system for #{host}"
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#rescue' do
114
+ test 'renders page' do
115
+ get :rescue, { :id => host.name }, set_session_user
116
+ assert_response :success
117
+ assert_template 'foreman_rescue/hosts/rescue'
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,24 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+ require 'database_cleaner'
4
+
5
+ # Add plugin to FactoryGirl's paths
6
+ FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
7
+ FactoryGirl.reload
8
+
9
+ # Foreman's setup doesn't handle cleaning up for Minitest::Spec
10
+ DatabaseCleaner.strategy = :transaction
11
+
12
+ def setup_settings
13
+ Setting::Rescue.load_defaults
14
+ end
15
+
16
+ class Minitest::Spec
17
+ before :each do
18
+ DatabaseCleaner.start
19
+ end
20
+
21
+ after :each do
22
+ DatabaseCleaner.clean
23
+ end
24
+ end
@@ -0,0 +1,80 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class HostTest < ActiveSupport::TestCase
4
+ setup do
5
+ User.current = FactoryGirl.build(:user, :admin)
6
+ setup_settings
7
+ disable_orchestration
8
+ end
9
+
10
+ context 'a host with tftp orchestration' do
11
+ let(:organization) { FactoryGirl.create(:organization) }
12
+ let(:tax_location) { FactoryGirl.create(:location) }
13
+ let(:template) do
14
+ FactoryGirl.create(
15
+ :provisioning_template,
16
+ :template_kind => TemplateKind.find_by_name('PXELinux'),
17
+ :locations => [tax_location],
18
+ :organizations => [organization]
19
+ )
20
+ end
21
+ let(:os) do
22
+ FactoryGirl.create(
23
+ :operatingsystem,
24
+ :with_os_defaults,
25
+ :with_associations,
26
+ :family => 'Redhat',
27
+ :provisioning_templates => [template]
28
+ )
29
+ end
30
+ let(:host) do
31
+ FactoryGirl.create(
32
+ :host,
33
+ :managed,
34
+ :with_tftp_orchestration,
35
+ :operatingsystem => os,
36
+ :pxe_loader => 'PXELinux BIOS',
37
+ :organization => organization,
38
+ :location => tax_location
39
+ )
40
+ end
41
+
42
+ context 'with rescue mode enabled' do
43
+ setup do
44
+ host.queue.clear
45
+ host.rescue_mode = true
46
+ end
47
+
48
+ test 'should queue tftp update' do
49
+ assert_valid host
50
+ tasks = host.queue.all.map(&:name)
51
+ assert_includes tasks, "Deploy TFTP PXEGrub2 config for #{host}"
52
+ assert_includes tasks, "Deploy TFTP PXELinux config for #{host}"
53
+ assert_includes tasks, "Deploy TFTP PXEGrub config for #{host}"
54
+ assert_equal 3, tasks.size
55
+ end
56
+
57
+ test 'should deploy rescue template' do
58
+ Setting['rescue_pxelinux_tftp_template'] = template.name
59
+ ProxyAPI::TFTP.any_instance.expects(:set).with('PXELinux', host.mac, :pxeconfig => template.template).once
60
+ host.stubs(:skip_orchestration?).returns(false) # Enable orchestration
61
+ assert host.save
62
+ end
63
+ end
64
+ end
65
+
66
+ context 'rescue mode tftp remplate rendering' do
67
+ let(:host) { FactoryGirl.build(:host, :managed, :rescue_mode) }
68
+ let(:template) do
69
+ FactoryGirl.create(:provisioning_template, :name => 'my template',
70
+ :template => 'test content',
71
+ :template_kind => template_kinds(:pxelinux))
72
+ end
73
+
74
+ test 'renders tftp template' do
75
+ Setting['rescue_pxelinux_tftp_template'] = template.name
76
+ rendered = host.primary_interface.send(:rescue_mode_pxe_render, 'PXELinux')
77
+ assert_equal template.template, rendered
78
+ end
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foreman_rescue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Timo Goebel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rubocop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.49.1
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.49.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Foreman Plugin to provide the ability to boot a host into a rescue system.
42
+ email:
43
+ - timo.goebel@dm.de
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - app/controllers/foreman_rescue/hosts_controller.rb
52
+ - app/helpers/concerns/foreman_rescue/hosts_helper_extensions.rb
53
+ - app/models/concerns/foreman_rescue/host_extensions.rb
54
+ - app/models/concerns/foreman_rescue/orchestration/tftp.rb
55
+ - app/models/setting/rescue.rb
56
+ - app/views/foreman_rescue/hosts/rescue.html.erb
57
+ - config/routes.rb
58
+ - db/migrate/20170901131321_add_rescue_mode_to_host.foreman_rescue.rb
59
+ - lib/foreman_rescue.rb
60
+ - lib/foreman_rescue/engine.rb
61
+ - lib/foreman_rescue/version.rb
62
+ - lib/tasks/foreman_rescue_tasks.rake
63
+ - locale/Makefile
64
+ - locale/en/foreman_rescue.po
65
+ - locale/foreman_rescue.pot
66
+ - locale/gemspec.rb
67
+ - test/factories/host.rb
68
+ - test/functional/hosts_controller_test.rb
69
+ - test/test_plugin_helper.rb
70
+ - test/unit/host_test.rb
71
+ homepage: https://github.com/dm-drogeriemarkt/foreman_rescue
72
+ licenses:
73
+ - GPL-3.0
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.7.3
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Provides the ability to boot a host into a rescue system.
95
+ test_files:
96
+ - test/unit/host_test.rb
97
+ - test/factories/host.rb
98
+ - test/test_plugin_helper.rb
99
+ - test/functional/hosts_controller_test.rb