pennyworth-tool 0.0.1

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.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.hound.yml +3 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +18 -0
  6. data/CONTRIBUTING.md +67 -0
  7. data/COPYING +674 -0
  8. data/Gemfile +28 -0
  9. data/README.md +339 -0
  10. data/Rakefile +33 -0
  11. data/bin/pennyworth +26 -0
  12. data/config/setup.yml +17 -0
  13. data/examples/README.md +23 -0
  14. data/examples/kiwi/definitions/base_opensuse13.1_kvm/config.sh +87 -0
  15. data/examples/kiwi/definitions/base_opensuse13.1_kvm/config.xml +64 -0
  16. data/examples/kiwi/definitions/base_opensuse13.1_kvm/root/etc/sysconfig/network/ifcfg-eth0 +2 -0
  17. data/examples/kiwi/definitions/base_opensuse13.1_kvm/root/home/vagrant/.ssh/authorized_keys +1 -0
  18. data/examples/vagrant/Vagrantfile +14 -0
  19. data/files/99-libvirt.rules +2 -0
  20. data/files/image_test-template.xml +43 -0
  21. data/files/pool-default.xml +6 -0
  22. data/lib/image_runner.rb +89 -0
  23. data/lib/pennyworth.rb +65 -0
  24. data/lib/pennyworth/cli.rb +339 -0
  25. data/lib/pennyworth/cli_host_controller.rb +107 -0
  26. data/lib/pennyworth/commands/base_command.rb +96 -0
  27. data/lib/pennyworth/commands/boot_command.rb +29 -0
  28. data/lib/pennyworth/commands/build_base_command.rb +103 -0
  29. data/lib/pennyworth/commands/command.rb +43 -0
  30. data/lib/pennyworth/commands/down_command.rb +25 -0
  31. data/lib/pennyworth/commands/import_base_command.rb +112 -0
  32. data/lib/pennyworth/commands/import_ssh_keys_command.rb +27 -0
  33. data/lib/pennyworth/commands/list_command.rb +41 -0
  34. data/lib/pennyworth/commands/setup_command.rb +209 -0
  35. data/lib/pennyworth/commands/shutdown_command.rb +28 -0
  36. data/lib/pennyworth/commands/status_command.rb +26 -0
  37. data/lib/pennyworth/commands/up_command.rb +27 -0
  38. data/lib/pennyworth/exceptions.rb +39 -0
  39. data/lib/pennyworth/helper.rb +39 -0
  40. data/lib/pennyworth/host_config.rb +86 -0
  41. data/lib/pennyworth/host_runner.rb +133 -0
  42. data/lib/pennyworth/image_runner.rb +89 -0
  43. data/lib/pennyworth/libvirt.rb +93 -0
  44. data/lib/pennyworth/local_command_runner.rb +77 -0
  45. data/lib/pennyworth/local_runner.rb +34 -0
  46. data/lib/pennyworth/lock_service.rb +87 -0
  47. data/lib/pennyworth/remote_command_runner.rb +144 -0
  48. data/lib/pennyworth/runner.rb +27 -0
  49. data/lib/pennyworth/settings.rb +42 -0
  50. data/lib/pennyworth/spec.rb +96 -0
  51. data/lib/pennyworth/spec_profiler.rb +85 -0
  52. data/lib/pennyworth/ssh_keys_importer.rb +107 -0
  53. data/lib/pennyworth/urls.rb +28 -0
  54. data/lib/pennyworth/vagrant.rb +81 -0
  55. data/lib/pennyworth/vagrant_command.rb +120 -0
  56. data/lib/pennyworth/vagrant_runner.rb +44 -0
  57. data/lib/pennyworth/version.rb +22 -0
  58. data/lib/pennyworth/vm.rb +62 -0
  59. data/man/.gitignore +2 -0
  60. data/man/pennyworth.1.md +28 -0
  61. data/pennyworth.gemspec +57 -0
  62. data/prophet/Gemfile +3 -0
  63. data/prophet/prophet.rb +82 -0
  64. data/spec/base_command_spec.rb +30 -0
  65. data/spec/build_base_command_spec.rb +147 -0
  66. data/spec/cli_host_controller_spec.rb +113 -0
  67. data/spec/data/hosts.yaml +10 -0
  68. data/spec/data/kiwi/base_opensuse12.3_kvm.box +1 -0
  69. data/spec/data/kiwi/base_opensuse13.1_kvm.box +1 -0
  70. data/spec/data/kiwi/definitions/base_opensuse12.3_kvm/config.sh +1 -0
  71. data/spec/data/kiwi/definitions/base_opensuse12.3_kvm/config.xml +1 -0
  72. data/spec/data/kiwi/definitions/base_opensuse12.3_kvm/root/home/vagrant/.ssh/authorized_keys +1 -0
  73. data/spec/data/kiwi/definitions/base_opensuse13.1_kvm/config.sh +1 -0
  74. data/spec/data/kiwi/definitions/base_opensuse13.1_kvm/config.xml +1 -0
  75. data/spec/data/kiwi/definitions/base_opensuse13.1_kvm/root/home/vagrant/.ssh/authorized_keys +1 -0
  76. data/spec/data/kiwi2/box_state.yaml +14 -0
  77. data/spec/data/kiwi2/definitions/base_opensuse12.3_kvm/config.sh +1 -0
  78. data/spec/data/kiwi2/definitions/base_opensuse12.3_kvm/config.xml +1 -0
  79. data/spec/data/kiwi2/definitions/base_opensuse12.3_kvm/root/home/vagrant/.ssh/authorized_keys +1 -0
  80. data/spec/data/kiwi2/definitions/base_opensuse13.1_kvm/config.sh +1 -0
  81. data/spec/data/kiwi2/definitions/base_opensuse13.1_kvm/config.xml +1 -0
  82. data/spec/data/kiwi2/definitions/base_opensuse13.1_kvm/root/home/vagrant/.ssh/authorized_keys +1 -0
  83. data/spec/data/kiwi3/box_state.yaml +13 -0
  84. data/spec/data/kiwi3/definitions/base_opensuse12.3_kvm/.gitkeep +0 -0
  85. data/spec/data/kiwi3/definitions/base_opensuse13.1_kvm/.gitkeep +0 -0
  86. data/spec/data/kiwi3/import_state.yaml +3 -0
  87. data/spec/data/kiwi4/definitions/base_opensuse12.3_kvm/.gitkeep +0 -0
  88. data/spec/data/kiwi4/definitions/base_opensuse13.1_kvm/.gitkeep +0 -0
  89. data/spec/data/kiwi4/import_state.yaml +3 -0
  90. data/spec/data/kiwi5/import_state.yaml +3 -0
  91. data/spec/data/vagrant/.gitkeep +0 -0
  92. data/spec/host_config_spec.rb +197 -0
  93. data/spec/host_runner_spec.rb +112 -0
  94. data/spec/image_runner_spec.rb +62 -0
  95. data/spec/import_base_command_spec.rb +189 -0
  96. data/spec/local_command_runner_spec.rb +117 -0
  97. data/spec/local_runner_spec.rb +42 -0
  98. data/spec/lock_service_spec.rb +95 -0
  99. data/spec/remote_command_runner_spec.rb +115 -0
  100. data/spec/settings_spec.rb +26 -0
  101. data/spec/setup_command_spec.rb +49 -0
  102. data/spec/spec_helper.rb +50 -0
  103. data/spec/spec_profiler_spec.rb +63 -0
  104. data/spec/spec_spec.rb +99 -0
  105. data/spec/support/command_runner_examples.rb +29 -0
  106. data/spec/support/runner_examples.rb +34 -0
  107. data/spec/urls_spec.rb +46 -0
  108. data/spec/vagrant_command_spec.rb +51 -0
  109. data/spec/vagrant_runner_spec.rb +40 -0
  110. data/spec/vagrant_spec.rb +288 -0
  111. data/spec/vm_spec.rb +56 -0
  112. metadata +257 -0
@@ -0,0 +1,26 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require "spec_helper"
19
+
20
+ describe Pennyworth::Settings do
21
+
22
+ it "is not verbose by default" do
23
+ expect(Pennyworth::Settings.new.verbose).to be(false)
24
+ end
25
+
26
+ end
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+ require_relative "../lib/pennyworth/commands/setup_command.rb"
18
+
19
+ describe Pennyworth::SetupCommand do
20
+ let(:setup_command) { Pennyworth::SetupCommand.new }
21
+
22
+ describe "#show_warning_for_unsupported_platforms" do
23
+ it "shows warning if current distribution is openSUSE 13.1" do
24
+ openSUSE131_release_file = <<-EOF
25
+ NAME=openSUSE
26
+ VERSION="13.1 (Bottle)"
27
+ VERSION_ID="13.1"
28
+ EOF
29
+ expect(setup_command).to receive(:read_os_release_file).and_return(openSUSE131_release_file)
30
+ expect(setup_command).to receive(:log).with(
31
+ "Warning: Pennyworth is not tested upstream on this platform. " \
32
+ "Use at your own risk."
33
+ )
34
+ setup_command.show_warning_for_unsupported_platforms
35
+ end
36
+
37
+ it "shows no warning for supported SLES 12 distribution" do
38
+ sles12_release_file = <<-EOF
39
+ NAME="SLES"
40
+ VERSION="12"
41
+ VERSION_ID="12"
42
+ PRETTY_NAME="SUSE Linux Enterprise Server 12"
43
+ EOF
44
+ expect(setup_command).to receive(:read_os_release_file).and_return(sles12_release_file)
45
+ expect(setup_command).not_to receive(:log)
46
+ setup_command.show_warning_for_unsupported_platforms
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require "pennyworth"
19
+ require "pennyworth/spec"
20
+ require "webmock/rspec"
21
+ require "given_filesystem/spec_helpers"
22
+
23
+ Dir[File.expand_path("../../spec/support/*.rb", __FILE__)].each do |f|
24
+ require f
25
+ end
26
+
27
+ bin_path = File.expand_path( "../../bin/", __FILE__ )
28
+
29
+ if ENV['PATH'] !~ /#{bin_path}/
30
+ ENV['PATH'] = bin_path + File::PATH_SEPARATOR + ENV['PATH']
31
+ end
32
+
33
+ def test_data_dir
34
+ File.expand_path("../data/", __FILE__)
35
+ end
36
+
37
+ RSpec.configure do |config|
38
+ # In the pennyworth unit tests we don't want to actually run images only test
39
+ # pennyworth and its rspec helper. Thus we have to disable the libvirt setup
40
+ # code in order to not be prompted for the root password each time the tests
41
+ # are run. We also don't want to profile the pennyworth tests, so that is
42
+ # disabled in pennyworth mode as well.
43
+ config.add_setting :pennyworth_mode, default: false
44
+ config.add_setting :vagrant_dir
45
+ config.add_setting :hosts_file
46
+
47
+ config.vagrant_dir = File.expand_path("../../vagrant", __FILE__)
48
+ config.hosts_file = File.join(test_data_dir, "hosts.yaml")
49
+ config.pennyworth_mode = true
50
+ end
@@ -0,0 +1,63 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require 'pennyworth/spec'
19
+
20
+ describe 'Spec Profiler' do
21
+ it "measures top level items" do
22
+ @measurements = []
23
+ measure("top level item") {}
24
+
25
+ expect(@measurements.size).to eq(1)
26
+ expect(@measurements.first[:label]).to eq("top level item")
27
+ expect(@measurements.first[:child_measurements]).to be_empty
28
+ end
29
+
30
+ it "measures multiple top level items" do
31
+ @measurements = []
32
+ measure("top level item 1") {}
33
+ measure("top level item 2") {}
34
+
35
+ expect(@measurements.size).to eq(2)
36
+ expect(@measurements.first[:label]).to eq("top level item 1")
37
+ expect(@measurements.last[:label]).to eq("top level item 2")
38
+ end
39
+
40
+ it "measures nested items" do
41
+ @measurements = []
42
+ measure("top level item") do
43
+ measure("level 1.1") do
44
+ measure("level 2.1") {}
45
+ end
46
+ measure("level 1.2") {}
47
+ end
48
+
49
+ expect(@measurements.size).to eq(1)
50
+ expect(@measurements.first[:label]).to eq("top level item")
51
+
52
+ children = @measurements.first[:child_measurements]
53
+ expect(children.size).to eq(3)
54
+
55
+ expect(children[0][:label]).to eq("level 1.1")
56
+ child_children = children[0][:child_measurements]
57
+ expect(child_children.size).to eq(2)
58
+ expect(child_children[0][:label]).to eq("level 2.1")
59
+
60
+ expect(children[1][:child_measurements].size).to eq(0)
61
+ expect(children[2][:label]).to eq("Other")
62
+ end
63
+ end
data/spec/spec_spec.rb ADDED
@@ -0,0 +1,99 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require "pennyworth/spec"
19
+
20
+ describe Pennyworth::SpecHelper do
21
+ let(:system_one) { "openSUSE_13.1" }
22
+ let(:system_two) { "openSUSE_12.3" }
23
+ let(:image_one) { "/path/to/openSUSE_13.1.iso" }
24
+ let(:image_two) { "/path/to/openSUSE_12.3.iso" }
25
+
26
+ after(:each) do
27
+ # Clear list of started systems, otherwise the helper will try to shutdown
28
+ # boxes which weren't actually started because those calls are stubbed in
29
+ # the tests.
30
+ @pennyworth_systems = []
31
+ end
32
+
33
+ describe "#start_system" do
34
+ it "raises an exception if no valid image parameter is given" do
35
+ expect {
36
+ start_system(foo: "bar")
37
+ }.to raise_error
38
+ end
39
+
40
+ it "starts the given vagrant boxes" do
41
+ runner_one = double
42
+ expect(Pennyworth::VagrantRunner).to receive(:new).with(system_one, anything, anything) { runner_one }
43
+ expect(runner_one).to receive(:start)
44
+ runner_two = double
45
+ expect(Pennyworth::VagrantRunner).to receive(:new).with(system_two, anything, anything) { runner_two }
46
+ expect(runner_two).to receive(:start)
47
+ expect(Pennyworth::SshKeysImporter).to receive(:import).twice
48
+
49
+ expect(self.class).to receive(:after).twice
50
+ start_system(box: system_one)
51
+ start_system(box: system_two)
52
+ end
53
+
54
+ it "starts the given images" do
55
+ runner_one = double
56
+ expect(Pennyworth::ImageRunner).to receive(:new).with(image_one, anything) { runner_one }
57
+ expect(runner_one).to receive(:start)
58
+ runner_two = double
59
+ expect(Pennyworth::ImageRunner).to receive(:new).with(image_two, anything) { runner_two }
60
+ expect(runner_two).to receive(:start)
61
+ expect(Pennyworth::SshKeysImporter).to receive(:import).twice
62
+
63
+ expect(self.class).to receive(:after).twice
64
+ start_system(image: image_one)
65
+ start_system(image: image_two)
66
+ end
67
+
68
+ it "starts the given host" do
69
+ runner = double
70
+ expect(runner).to receive(:start)
71
+ expect(Pennyworth::HostRunner).to receive(:new).
72
+ with("test_host", instance_of(Pennyworth::HostConfig), "root").
73
+ and_return(runner)
74
+ expect(Pennyworth::SshKeysImporter).to_not receive(:import)
75
+
76
+ expect(self.class).to receive(:after).once
77
+ start_system(host: "test_host")
78
+ end
79
+
80
+ it "forwards the username and password options" do
81
+ runner_one = double
82
+ expect(Pennyworth::VagrantRunner).to receive(:new).with(system_one, anything, "machinery") { runner_one }
83
+ expect(runner_one).to receive(:start)
84
+ expect(Pennyworth::SshKeysImporter).to receive(:import).with(anything, "machinery", "linux")
85
+
86
+ start_system(box: system_one, username: "machinery", password: "linux")
87
+ end
88
+
89
+ it "uses LocalRunner for local tests" do
90
+ opts = {
91
+ env: { "FOO" => "BAR" }
92
+ }
93
+ expect(Pennyworth::LocalRunner).to receive(:new).with(opts).and_call_original
94
+ expect(Pennyworth::SshKeysImporter).to_not receive(:import)
95
+
96
+ start_system(opts.merge(local: true))
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ shared_examples "a command runner" do
19
+ [
20
+ :run,
21
+ :inject_file,
22
+ :extract_file,
23
+ :inject_directory
24
+ ].each do |method|
25
+ it "has a #{method} method" do
26
+ expect(command_runner).to respond_to(method)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ shared_examples "a runner" do
19
+ it "has a start method" do
20
+ expect(runner).to respond_to(:start)
21
+ end
22
+
23
+ it "has a stop method" do
24
+ expect(runner).to respond_to(:stop)
25
+ end
26
+
27
+ it "has a command_runner method" do
28
+ expect(runner).to respond_to(:command_runner)
29
+ end
30
+
31
+ it "has a cleanup_directory method" do
32
+ expect(runner).to respond_to(:cleanup_directory)
33
+ end
34
+ end
data/spec/urls_spec.rb ADDED
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require "pennyworth/spec"
19
+
20
+ describe Pennyworth::URLs do
21
+ describe ".join" do
22
+ it "joins parts using slashes" do
23
+ expect(Pennyworth::URLs.join("a", "b", "c")).to eq("a/b/c")
24
+ end
25
+
26
+ it "doesn't duplicate slashes before parts containing leading slashes" do
27
+ expect(Pennyworth::URLs.join("a", "/b", "/c")).to eq("a/b/c")
28
+ end
29
+
30
+ it "doesn't duplicate slashes after parts containing trailing slashes" do
31
+ expect(Pennyworth::URLs.join("a/", "b/", "c")).to eq("a/b/c")
32
+ end
33
+
34
+ it "doesn't duplicate slashes around empty parts" do
35
+ expect(Pennyworth::URLs.join("a", "", "c")).to eq("a/c")
36
+ end
37
+
38
+ it "preserves leading slash in the first part" do
39
+ expect(Pennyworth::URLs.join("/a", "b", "c")).to eq("/a/b/c")
40
+ end
41
+
42
+ it "preserves trailing slash in the last part" do
43
+ expect(Pennyworth::URLs.join("a", "b", "c/")).to eq("a/b/c/")
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,51 @@
1
+ # Copyright (c) 2013-2014 SUSE LLC
2
+ #
3
+ # This program is free software; you can redistribute it and/or
4
+ # modify it under the terms of version 3 of the GNU General Public License as
5
+ # published by the Free Software Foundation.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program; if not, contact SUSE LLC.
14
+ #
15
+ # To contact SUSE about this file by physical or electronic mail,
16
+ # you may find current contact information at www.suse.com
17
+
18
+ require "spec_helper"
19
+
20
+ describe Pennyworth::VagrantCommand do
21
+
22
+ it "parses output of `vagrant status`" do
23
+ status_output = <<-EOT
24
+ Current machine states:
25
+
26
+ opensuse123 running (libvirt)
27
+ opensuse131 not created (libvirt)
28
+ master not created (libvirt)
29
+
30
+ This environment represents multiple VMs. The VMs are all listed
31
+ above with their current state. For more information about a specific
32
+ VM, run `vagrant status NAME`.
33
+ EOT
34
+ vms = Pennyworth::VagrantCommand.parse_status status_output
35
+ expect( vms ).to eq [ "opensuse123 (running)","opensuse131","master" ]
36
+ end
37
+
38
+ describe ".setup_environment" do
39
+ it "creates <dir> and calls vagrant init if there is no Vagrantfile" do
40
+ Dir.mktmpdir("vagrant_command_test") do |tmp_dir|
41
+ dir = File.join(tmp_dir, "pennyworth")
42
+ expect(Dir.exists?(dir)).to be(false)
43
+ expect(Pennyworth::Vagrant).to receive(:new).with(dir).and_call_original
44
+ expect_any_instance_of(Pennyworth::Vagrant).to receive(:run).with("init")
45
+
46
+ Pennyworth::VagrantCommand.setup_environment(dir)
47
+ expect(Dir.exists?(dir)).to be(true)
48
+ end
49
+ end
50
+ end
51
+ end