dopi 0.17.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.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +322 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +102 -0
  8. data/LICENSE.txt +177 -0
  9. data/README.md +309 -0
  10. data/Rakefile +44 -0
  11. data/Vagrantfile +64 -0
  12. data/bin/dopi +4 -0
  13. data/doc/getting_started.md +247 -0
  14. data/doc/getting_started_examples/001_hello_world.yaml +17 -0
  15. data/doc/getting_started_examples/002_connecting_over_ssh.yaml +35 -0
  16. data/doc/plugins/custom.md +88 -0
  17. data/doc/plugins/mco/rpc.md +82 -0
  18. data/doc/plugins/ssh/custom.md +141 -0
  19. data/doc/plugins/ssh/file_contains.md +37 -0
  20. data/doc/plugins/ssh/file_deploy.md +52 -0
  21. data/doc/plugins/ssh/file_exists.md +31 -0
  22. data/doc/plugins/ssh/file_replace.md +37 -0
  23. data/doc/plugins/ssh/puppet_agent_run.md +50 -0
  24. data/doc/plugins/ssh/reboot.md +22 -0
  25. data/doc/plugins/ssh/wait_for_login.md +53 -0
  26. data/doc/plugins/winrm/cmd.md +161 -0
  27. data/doc/plugins/winrm/file_contains.md +39 -0
  28. data/doc/plugins/winrm/file_exists.md +31 -0
  29. data/doc/plugins/winrm/powershell.md +27 -0
  30. data/doc/plugins/winrm/puppet_agent_run.md +49 -0
  31. data/doc/plugins/winrm/reboot.md +17 -0
  32. data/doc/plugins/winrm/wait_for_login.md +55 -0
  33. data/dopi.gemspec +42 -0
  34. data/lib/dopi/cli/command_add.rb +35 -0
  35. data/lib/dopi/cli/command_list.rb +19 -0
  36. data/lib/dopi/cli/command_remove.rb +31 -0
  37. data/lib/dopi/cli/command_reset.rb +27 -0
  38. data/lib/dopi/cli/command_run.rb +68 -0
  39. data/lib/dopi/cli/command_show.rb +109 -0
  40. data/lib/dopi/cli/command_update.rb +37 -0
  41. data/lib/dopi/cli/command_validate.rb +27 -0
  42. data/lib/dopi/cli/global_options.rb +55 -0
  43. data/lib/dopi/cli/log.rb +33 -0
  44. data/lib/dopi/cli.rb +57 -0
  45. data/lib/dopi/command/custom.rb +52 -0
  46. data/lib/dopi/command/dummy.rb +27 -0
  47. data/lib/dopi/command/mco/rpc.rb +158 -0
  48. data/lib/dopi/command/ssh/custom.rb +48 -0
  49. data/lib/dopi/command/ssh/file_contains.rb +70 -0
  50. data/lib/dopi/command/ssh/file_deploy.rb +71 -0
  51. data/lib/dopi/command/ssh/file_exists.rb +54 -0
  52. data/lib/dopi/command/ssh/file_replace.rb +96 -0
  53. data/lib/dopi/command/ssh/puppet_agent_run.rb +63 -0
  54. data/lib/dopi/command/ssh/reboot.rb +50 -0
  55. data/lib/dopi/command/ssh/wait_for_login.rb +68 -0
  56. data/lib/dopi/command/winrm/cmd.rb +44 -0
  57. data/lib/dopi/command/winrm/file_contains.rb +66 -0
  58. data/lib/dopi/command/winrm/file_exists.rb +51 -0
  59. data/lib/dopi/command/winrm/powershell.rb +16 -0
  60. data/lib/dopi/command/winrm/puppet_agent_run.rb +61 -0
  61. data/lib/dopi/command/winrm/reboot.rb +33 -0
  62. data/lib/dopi/command/winrm/wait_for_login.rb +49 -0
  63. data/lib/dopi/command.rb +239 -0
  64. data/lib/dopi/command_parser/arguments.rb +38 -0
  65. data/lib/dopi/command_parser/credentials.rb +59 -0
  66. data/lib/dopi/command_parser/env.rb +37 -0
  67. data/lib/dopi/command_parser/exec.rb +27 -0
  68. data/lib/dopi/command_parser/exit_code.rb +73 -0
  69. data/lib/dopi/command_parser/output.rb +126 -0
  70. data/lib/dopi/command_set.rb +66 -0
  71. data/lib/dopi/connector/local.rb +77 -0
  72. data/lib/dopi/connector/ssh.rb +170 -0
  73. data/lib/dopi/connector/winrm.rb +167 -0
  74. data/lib/dopi/error.rb +43 -0
  75. data/lib/dopi/log.rb +18 -0
  76. data/lib/dopi/node.rb +70 -0
  77. data/lib/dopi/plan.rb +99 -0
  78. data/lib/dopi/pluginmanager.rb +62 -0
  79. data/lib/dopi/state.rb +226 -0
  80. data/lib/dopi/state_store.rb +155 -0
  81. data/lib/dopi/step.rb +227 -0
  82. data/lib/dopi/step_set.rb +70 -0
  83. data/lib/dopi/version.rb +3 -0
  84. data/lib/dopi.rb +165 -0
  85. data/spec/command_helper.rb +11 -0
  86. data/spec/fixtures/mco_client.cfg +26 -0
  87. data/spec/fixtures/plans/fail_on_timeout.yaml +20 -0
  88. data/spec/fixtures/plans/hello_world.yaml +34 -0
  89. data/spec/fixtures/plans/non_existing_node.yaml +26 -0
  90. data/spec/fixtures/plans/test_role_variable.yaml +29 -0
  91. data/spec/fixtures/puppet/Puppetfile +8 -0
  92. data/spec/fixtures/puppet/Puppetfile.lock +57 -0
  93. data/spec/fixtures/puppet/hiera.yaml +6 -0
  94. data/spec/fixtures/puppet/manifests/site.pp +52 -0
  95. data/spec/fixtures/test_configuration.yaml +54 -0
  96. data/spec/fixtures/test_credentials.yaml +11 -0
  97. data/spec/fixtures/test_deloyed_file.txt +5 -0
  98. data/spec/fixtures/test_infrastructure.yaml +12 -0
  99. data/spec/fixtures/test_nodes.yaml +45 -0
  100. data/spec/fixtures/testenv_plan.yaml +159 -0
  101. data/spec/integration/dopi/addrun_spec.rb +31 -0
  102. data/spec/integration/dopi/cli/command_run_spec.rb +38 -0
  103. data/spec/integration/dopi/cli/global_options_spec.rb +128 -0
  104. data/spec/integration/dopi/command_spec.rb +66 -0
  105. data/spec/integration/dopi/fail_check_plans/file_exists_fails.yaml +38 -0
  106. data/spec/integration/dopi/fail_check_plans/output_parser.yaml +39 -0
  107. data/spec/integration/dopi/fail_check_plans/powershell_fail.yaml +25 -0
  108. data/spec/integration/dopi/fail_check_plans/timeout.yaml +29 -0
  109. data/spec/integration/dopi/fail_check_plans/verify_commands.yaml +33 -0
  110. data/spec/integration/dopi/failplan.rb +27 -0
  111. data/spec/integration/dopi/plan.rb +27 -0
  112. data/spec/integration/dopi/plans/dummy.yaml +29 -0
  113. data/spec/integration/dopi/plans/max_per_role.yaml +55 -0
  114. data/spec/integration/dopi/plans/no_timeout.yaml +29 -0
  115. data/spec/integration/dopi/plans/node_and_role_patterns.yaml +58 -0
  116. data/spec/integration/dopi/plans/node_by_config.yaml +116 -0
  117. data/spec/integration/dopi/plans/plugin_defaults.yaml +86 -0
  118. data/spec/integration/dopi/plans/plugins/mco/rpc.yaml +33 -0
  119. data/spec/integration/dopi/plans/plugins/ssh/custom.yaml +97 -0
  120. data/spec/integration/dopi/plans/plugins/ssh/file_contains.yaml +51 -0
  121. data/spec/integration/dopi/plans/plugins/ssh/file_deploy.yaml +82 -0
  122. data/spec/integration/dopi/plans/plugins/ssh/file_exists.yaml +69 -0
  123. data/spec/integration/dopi/plans/plugins/ssh/file_replace.yaml +55 -0
  124. data/spec/integration/dopi/plans/plugins/ssh/puppet_agent_run.yaml +45 -0
  125. data/spec/integration/dopi/plans/plugins/ssh/reboot.yaml +43 -0
  126. data/spec/integration/dopi/plans/plugins/ssh/wait_for_login.yaml +45 -0
  127. data/spec/integration/dopi/plans/plugins/winrm/cmd.yaml +39 -0
  128. data/spec/integration/dopi/plans/plugins/winrm/file_contains.yaml +51 -0
  129. data/spec/integration/dopi/plans/plugins/winrm/file_exists.yaml +69 -0
  130. data/spec/integration/dopi/plans/plugins/winrm/reboot.yaml +31 -0
  131. data/spec/integration/dopi/plans/resolve_roles_on_validate.yaml +23 -0
  132. data/spec/integration/dopi/plans/ssh_parallel.yaml +37 -0
  133. data/spec/integration/dopi/plans/verify_commands.yaml +49 -0
  134. data/spec/spec_helper.rb +104 -0
  135. data/spec/unit/dopi/command/custom_spec.rb +58 -0
  136. data/spec/unit/dopi/command/mco/rpc_spec.rb +157 -0
  137. data/spec/unit/dopi/command/ssh/custom_spec.rb +30 -0
  138. data/spec/unit/dopi/command/ssh/file_deploy_spec.rb +42 -0
  139. data/spec/unit/dopi/command/ssh/file_replace_spec.rb +35 -0
  140. data/spec/unit/dopi/command_parser/credentials_spec.rb +53 -0
  141. data/spec/unit/dopi/command_parser/exit_code_spec.rb +63 -0
  142. data/spec/unit/dopi/command_parser/output_spec.rb +129 -0
  143. data/spec/unit/dopi/command_spec.rb +14 -0
  144. data/spec/unit/dopi/connector/winrm_spec.rb +111 -0
  145. data/spec/unit/dopi/node_spec.rb +24 -0
  146. data/spec/unit/dopi/plan_spec.rb +31 -0
  147. data/spec/unit/dopi/state_spec.rb +109 -0
  148. data/spec/unit/dopi/step_spec.rb +13 -0
  149. metadata +448 -0
@@ -0,0 +1,104 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/spec/'
4
+ add_filter '/.bundle/'
5
+ add_filter '/vendor/'
6
+ end
7
+
8
+ require 'dopi'
9
+ require 'command_helper'
10
+ require 'rspec_command'
11
+
12
+ Dopi.log.level = ::Logger::FATAL
13
+
14
+ # This file was generated by the `rspec --init` command. Conventionally, all
15
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
16
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
17
+ # file to always be loaded, without a need to explicitly require it in any files.
18
+ #
19
+ # Given that it is always loaded, you are encouraged to keep this file as
20
+ # light-weight as possible. Requiring heavyweight dependencies from this file
21
+ # will add to the boot time of your test suite on EVERY test run, even for an
22
+ # individual file that may not need all of that loaded. Instead, consider making
23
+ # a separate helper file that requires the additional dependencies and performs
24
+ # the additional setup, and require it from the spec files that actually need it.
25
+ #
26
+ # The `.rspec` file also contains a few flags that are not defaults but that
27
+ # users commonly want.
28
+ #
29
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
30
+ RSpec.configure do |config|
31
+ config.include CommandHelper
32
+ config.include RSpecCommand
33
+ # rspec-expectations config goes here. You can use an alternate
34
+ # assertion/expectation library such as wrong or the stdlib/minitest
35
+ # assertions if you prefer.
36
+ config.expect_with :rspec do |expectations|
37
+ # This option will default to `true` in RSpec 4. It makes the `description`
38
+ # and `failure_message` of custom matchers include text for helper methods
39
+ # defined using `chain`, e.g.:
40
+ # be_bigger_than(2).and_smaller_than(4).description
41
+ # # => "be bigger than 2 and smaller than 4"
42
+ # ...rather than:
43
+ # # => "be bigger than 2"
44
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
45
+ end
46
+
47
+ # rspec-mocks config goes here. You can use an alternate test double
48
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
49
+ config.mock_with :rspec do |mocks|
50
+ # Prevents you from mocking or stubbing a method that does not exist on
51
+ # a real object. This is generally recommended, and will default to
52
+ # `true` in RSpec 4.
53
+ mocks.verify_partial_doubles = true
54
+ end
55
+
56
+ # The settings below are suggested to provide a good initial experience
57
+ # with RSpec, but feel free to customize to your heart's content.
58
+ =begin
59
+ # These two settings work together to allow you to limit a spec run
60
+ # to individual examples or groups you care about by tagging them with
61
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
62
+ # get run.
63
+ config.filter_run :focus
64
+ config.run_all_when_everything_filtered = true
65
+
66
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
67
+ # For more details, see:
68
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
69
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
70
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
71
+ config.disable_monkey_patching!
72
+
73
+ # This setting enables warnings. It's recommended, but in some cases may
74
+ # be too noisy due to issues in dependencies.
75
+ config.warnings = true
76
+
77
+ # Many RSpec users commonly either run the entire suite or an individual
78
+ # file, and it's useful to allow more verbose output when running an
79
+ # individual spec file.
80
+ if config.files_to_run.one?
81
+ # Use the documentation formatter for detailed output,
82
+ # unless a formatter has already been configured
83
+ # (e.g. via a command-line flag).
84
+ config.default_formatter = 'doc'
85
+ end
86
+
87
+ # Print the 10 slowest examples and example groups at the
88
+ # end of the spec run, to help surface which specs are running
89
+ # particularly slow.
90
+ config.profile_examples = 10
91
+
92
+ # Run specs in random order to surface order dependencies. If you find an
93
+ # order dependency and want to debug it, you can fix the order by providing
94
+ # the seed, which is printed after each run.
95
+ # --seed 1234
96
+ config.order = :random
97
+
98
+ # Seed global randomization in this process using the `--seed` CLI option.
99
+ # Setting this allows you to use `--seed` to deterministically reproduce
100
+ # test failures related to randomization by passing the same `--seed` value
101
+ # as the one that triggered the failure.
102
+ Kernel.srand config.seed
103
+ =end
104
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dopi::Command do
4
+
5
+ describe '#exec' do
6
+ it 'should return the exec value if specified' do
7
+ command = create_command({:plugin => 'custom', :exec => 'echo'})
8
+ expect(command.exec).to eq('echo')
9
+ end
10
+ it 'will raise and error if exec is not specified' do
11
+ command = create_command({:plugin => 'custom'})
12
+ expect{command.exec}.to raise_error Dopi::CommandParsingError
13
+ end
14
+ it 'will raise and error if exec is not a String' do
15
+ command = create_command({:plugin => 'custom', :exec => 2})
16
+ expect{command.exec}.to raise_error Dopi::CommandParsingError
17
+ end
18
+ end
19
+
20
+ describe '#env' do
21
+ it 'should return the defaults hash if nothing is specified' do
22
+ command = create_command({:plugin => 'custom'})
23
+ expect(command.env).to eq({'DOP_NODE_FQDN' => 'test.example.com'})
24
+ end
25
+ it 'should return the specified hash merged with the defaults' do
26
+ command = create_command({:plugin => 'custom', :env => {'MYVAR' => 'MYVALUE'}})
27
+ expect(command.env).to eq({'DOP_NODE_FQDN' => 'test.example.com', 'MYVAR' => 'MYVALUE'})
28
+ end
29
+ it 'will raise and error if env is not a hash' do
30
+ command = create_command({:plugin => 'custom', :env => 2})
31
+ expect{command.env}.to raise_error Dopi::CommandParsingError
32
+ end
33
+ end
34
+
35
+ describe '#arguments' do
36
+ it 'should return an empty hash if nothing is specified' do
37
+ command = create_command({:plugin => 'custom'})
38
+ expect(command.arguments).to eq("")
39
+ end
40
+ it 'should return a correct string if arguments are specified as a String' do
41
+ command = create_command({:plugin => 'custom', :arguments => "my custom arguments"})
42
+ expect(command.arguments).to eq("my custom arguments")
43
+ end
44
+ it 'should return a correct string if arguments are specified as an Array' do
45
+ command = create_command({:plugin => 'custom', :arguments => ['my', 'custom', 'arguments']})
46
+ expect(command.arguments).to eq("my custom arguments")
47
+ end
48
+ it 'should return a correct string if arguments are specified as a Hash' do
49
+ command = create_command({:plugin => 'custom', :arguments => {'my' => 'custom', 'arguments' => ''}})
50
+ expect(command.arguments).to eq("my custom arguments ")
51
+ end
52
+ it 'will raise and error if arguments is not a String, Array or Hash' do
53
+ command = create_command({:plugin => 'custom', :arguments => 2})
54
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
55
+ end
56
+ end
57
+
58
+ end
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+ require 'mcollective'
3
+
4
+ describe Dopi::Command::Mco::Rpc do
5
+
6
+ describe '#agent' do
7
+ it 'should return the name of the agent if it is specified' do
8
+ command = create_command({:plugin => 'mco/rpc', :agent => 'rpcutil'})
9
+ expect(command.agent).to eq('rpcutil')
10
+ end
11
+ it 'will raise and error if agent is not specified and valid' do
12
+ command = create_command({:plugin => 'mco/rpc'})
13
+ expect{command.agent}.to raise_error Dopi::CommandParsingError
14
+ end
15
+ it 'will raise and error if agent is not a String' do
16
+ command = create_command({:plugin => 'mco/rpc', :agent => 2})
17
+ expect{command.agent}.to raise_error Dopi::CommandParsingError
18
+ end
19
+ it 'will raise and error if agent does not exists' do
20
+ command = create_command({:plugin => 'mco/rpc', :agent => 'nonexistingagent'})
21
+ expect{command.agent}.to raise_error Dopi::CommandParsingError
22
+ end
23
+ end
24
+
25
+ describe '#options' do
26
+ it 'should return the merged options hash if the hash is valid' do
27
+ command = create_command({:plugin => 'mco/rpc', :options => {:ttl => 300}})
28
+ expect(command.options[:ttl]).to eq(300)
29
+ end
30
+ it 'should return the default options hash if the hash is not defined' do
31
+ command = create_command({:plugin => 'mco/rpc'})
32
+ expect(command.options).to eq(command.send(:options_defaults))
33
+ end
34
+ it 'will raise and error if options is not a hash' do
35
+ command = create_command({:plugin => 'mco/rpc', :options => 2})
36
+ expect{command.options}.to raise_error Dopi::CommandParsingError
37
+ end
38
+ end
39
+
40
+ describe '#action' do
41
+ it 'should return the name of the action if it is specified and valid' do
42
+ command = create_command({
43
+ :plugin => 'mco/rpc',
44
+ :agent => 'rpcutil',
45
+ :action => 'inventory'
46
+ })
47
+ expect(command.action).to eq('inventory')
48
+ end
49
+ it 'will raise an error if action is not defined' do
50
+ command = create_command({
51
+ :plugin => 'mco/rpc',
52
+ :agent => 'nonexistingagent'
53
+ })
54
+ expect{command.action}.to raise_error Dopi::CommandParsingError
55
+ end
56
+ it 'will raise an error if agent is not valid' do
57
+ command = create_command({
58
+ :plugin => 'mco/rpc',
59
+ :agent => 'nonexistingagent',
60
+ :action => 'inventory'
61
+ })
62
+ expect{command.action}.to raise_error Dopi::CommandParsingError
63
+ end
64
+ it 'will raise an error if action is not valid' do
65
+ command = create_command({
66
+ :plugin => 'mco/rpc',
67
+ :agent => 'rpcutil',
68
+ :action => 'nonexixtingaction'
69
+ })
70
+ expect{command.action}.to raise_error Dopi::CommandParsingError
71
+ end
72
+ it 'will raise and error if action is not a String' do
73
+ command = create_command({
74
+ :plugin => 'mco/rpc',
75
+ :agent => 'rpcutil',
76
+ :action => 2
77
+ })
78
+ expect{command.action}.to raise_error Dopi::CommandParsingError
79
+ end
80
+ end
81
+
82
+ describe '#arguments' do
83
+ it 'should return the arguments hash if it is specified and valid' do
84
+ command = create_command({
85
+ :plugin => 'mco/rpc',
86
+ :agent => 'rpcutil',
87
+ :action => 'get_fact',
88
+ :arguments => { :fact => 'osfamily' }
89
+ })
90
+ expect(command.arguments).to eq({ :fact => 'osfamily' })
91
+ end
92
+ it 'should return an empty hash if "arguments" is not specified and all arguments are optional' do
93
+ command = create_command({
94
+ :plugin => 'mco/rpc',
95
+ :agent => 'rpcutil',
96
+ :action => 'inventory'
97
+ })
98
+ expect(command.arguments).to eq({})
99
+ end
100
+ it 'will raise an error if "arguments" is not specified and there are required arguments' do
101
+ command = create_command({
102
+ :plugin => 'mco/rpc',
103
+ :agent => 'rpcutil',
104
+ :action => 'get_fact'
105
+ })
106
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
107
+ end
108
+ it 'will raise an error if an argument key is not valid' do
109
+ command = create_command({
110
+ :plugin => 'mco/rpc',
111
+ :agent => 'rpcutil',
112
+ :action => 'get_fact',
113
+ :arguments => { :foo => 'osfamily' }
114
+ })
115
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
116
+ end
117
+ it 'will raise an error if an argument value is not valid' do
118
+ command = create_command({
119
+ :plugin => 'mco/rpc',
120
+ :agent => 'rpcutil',
121
+ :action => 'get_fact',
122
+ :arguments => { :fact => 'osfamily&&' }
123
+ })
124
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
125
+ end
126
+ it 'will raise an error if agent is not valid' do
127
+ command = create_command({
128
+ :plugin => 'mco/rpc',
129
+ :agent => 'nonexistingagent',
130
+ :action => 'get_fact'
131
+ })
132
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
133
+ end
134
+ it 'will raise an error if action is not valid' do
135
+ command = create_command({
136
+ :plugin => 'mco/rpc',
137
+ :agent => 'rpcutil',
138
+ :action => 'nonexistingaction'
139
+ })
140
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
141
+ end
142
+ it 'will raise and error if arguments is not a Hash' do
143
+ command = create_command({
144
+ :plugin => 'mco/rpc',
145
+ :agent => 'rpcutil',
146
+ :action => 'get_fact',
147
+ :arguments => 'foo'
148
+ })
149
+ expect{command.arguments}.to raise_error Dopi::CommandParsingError
150
+ end
151
+ end
152
+
153
+ describe '#run' do
154
+ pending
155
+ end
156
+
157
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dopi::Command::Ssh do
4
+
5
+ describe '#quiet' do
6
+ pending
7
+ end
8
+
9
+ describe '#port' do
10
+ it 'should return the default port if nothing is specified' do
11
+ command = create_command({:plugin => 'ssh/custom'})
12
+ expect(command.port).to eq('22')
13
+ end
14
+ it 'should return the correct port if specified correctly' do
15
+ command = create_command({:plugin => 'ssh/custom', :port => 42})
16
+ expect(command.port).to eq('42')
17
+ end
18
+ it 'will raise an error if port is not a number' do
19
+ command = create_command({:plugin => 'ssh/custom', :port => "2"})
20
+ expect{command.port}.to raise_error Dopi::CommandParsingError
21
+ end
22
+ it 'will raise an error if port is not in the valid range' do
23
+ command = create_command({:plugin => 'ssh/custom', :port => -1})
24
+ expect{command.port}.to raise_error Dopi::CommandParsingError
25
+ command = create_command({:plugin => 'ssh/custom', :port => 70000})
26
+ expect{command.port}.to raise_error Dopi::CommandParsingError
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dopi::Command::Ssh::FileDeploy do
4
+
5
+ describe '#file' do
6
+ it 'should return the file path if specified correctly' do
7
+ command = create_command({:plugin => 'ssh/file_deploy', :file => '/tmp/foo'})
8
+ expect(command.file).to eq('/tmp/foo')
9
+ end
10
+ it 'will raise an error if the file path is not pecified' do
11
+ command = create_command({:plugin => 'ssh/file_deploy'})
12
+ expect{command.file}.to raise_error Dopi::CommandParsingError
13
+ end
14
+ it 'will raise an error if file path is not a String' do
15
+ command = create_command({:plugin => 'ssh/file_deploy', :file => 2})
16
+ expect{command.file}.to raise_error Dopi::CommandParsingError
17
+ end
18
+ end
19
+
20
+ describe '#content' do
21
+ it 'should return an error if nothing is specified' do
22
+ command = create_command({:plugin => 'ssh/file_deploy'})
23
+ expect{command.content}.to raise_error Dopi::CommandParsingError
24
+ end
25
+ it 'should return the content if specified correctly as a string' do
26
+ command = create_command({:plugin => 'ssh/file_deploy', :content => 'hello world'})
27
+ expect(command.content).to eq('hello world')
28
+ end
29
+ it 'should return the content if specified correctly as a file' do
30
+ file = Tempfile.new('secret_file', ENV['HOME'])
31
+ file.write('hello world')
32
+ file.close
33
+ command = create_command({:plugin => 'ssh/file_deploy', :content => {'file' => file.path} })
34
+ expect(command.content).to eq('hello world')
35
+ file.delete
36
+ end
37
+ it 'will raise an error if content is not a string' do
38
+ command = create_command({:plugin => 'ssh/file_deploy', :content => 2})
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dopi::Command::Ssh::FileReplace do
4
+
5
+ describe '#replacement' do
6
+ it 'should return the replacement value if specified' do
7
+ command = create_command({:plugin => 'ssh/file_replace', :replacement => 'foo'})
8
+ expect(command.replacement).to eq('foo')
9
+ end
10
+ it 'will raise and error if replacement is not specified' do
11
+ command = create_command({:plugin => 'ssh/file_replace'})
12
+ expect{command.replacement}.to raise_error Dopi::CommandParsingError
13
+ end
14
+ it 'will raise and error if replacement is not a String' do
15
+ command = create_command({:plugin => 'ssh/file_replace', :replacement => 2})
16
+ expect{command.replacement}.to raise_error Dopi::CommandParsingError
17
+ end
18
+ end
19
+
20
+ describe '#global' do
21
+ it 'should return true if nothing is specified' do
22
+ command = create_command({:plugin => 'ssh/file_replace'})
23
+ expect(command.global).to be true
24
+ end
25
+ it 'should return the correct value if specified' do
26
+ command = create_command({:plugin => 'ssh/file_replace', :global => false})
27
+ expect(command.global).to be false
28
+ end
29
+ it 'will raise and error if global is not a boolean' do
30
+ command = create_command({:plugin => 'ssh/file_replace', :global => 2})
31
+ expect{command.global}.to raise_error Dopi::CommandParsingError
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ class CredentialsTestKlass
4
+ include Dopi::CommandParser::Credentials
5
+ attr_accessor :hash, :step
6
+ def supported_credential_types() [:username_password] end
7
+ end
8
+
9
+ describe Dopi::CommandParser::Credentials do
10
+
11
+ before :each do
12
+ @credentials = CredentialsTestKlass.new
13
+ @fake_credentials = instance_double('DopCommon::Credentials', :type => :username_password)
14
+ @fake_credentials4 = instance_double('DopCommon::Credentials', :type => :non_existing_type)
15
+ plan = instance_double('Dopi::Plan', :credentials => {
16
+ 'test_credentials_01' => @fake_credentials,
17
+ 'test_credentials_02' => @fake_credentials,
18
+ 'test_credentials_04' => @fake_credentials4
19
+ })
20
+ @credentials.step = instance_double('Dopi::Step', :plan => plan)
21
+ end
22
+
23
+ describe '#credentials' do
24
+ it 'returns an empty array if nothing is specified' do
25
+ @credentials.hash = {}
26
+ expect(@credentials.credentials).to eq([])
27
+ end
28
+ it 'returns an array with one credential if only one is specified' do
29
+ @credentials.hash = {:credentials => 'test_credentials_01'}
30
+ expect(@credentials.credentials.length).to eq(1)
31
+ expect(@credentials.credentials.first).to be @fake_credentials
32
+ end
33
+ it 'returns an array with two credentials if two are specified' do
34
+ @credentials.hash = {:credentials => ['test_credentials_01', 'test_credentials_02']}
35
+ expect(@credentials.credentials.length).to eq(2)
36
+ expect(@credentials.credentials.last).to be @fake_credentials
37
+ end
38
+ it 'raises an error if the credentials are not valid' do
39
+ @credentials.hash = {:credentials => ['test_credentials_01', 2]}
40
+ expect{@credentials.credentials}.to raise_error Dopi::CommandParsingError
41
+ end
42
+ it 'raises an error if the credentials do not exist' do
43
+ @credentials.hash = {:credentials => ['test_credentials_01', 'test_credentials_03']}
44
+ expect{@credentials.credentials}.to raise_error Dopi::CommandParsingError
45
+ end
46
+ it 'raises an error if one of the credential types is not supported' do
47
+ @credentials.hash = {:credentials => ['test_credentials_01', 'test_credentials_04']}
48
+ expect{@credentials.credentials}.to raise_error Dopi::CommandParsingError
49
+ end
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,63 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ class ExitCodeTestKlass
5
+ include Dopi::CommandParser::ExitCode
6
+ attr_accessor :hash
7
+ end
8
+
9
+ module ExitCodeDefaults
10
+ def expect_exit_codes_defaults
11
+ [1,2,3]
12
+ end
13
+ end
14
+
15
+ describe Dopi::CommandParser::ExitCode do
16
+
17
+ describe '#expect_exit_codes' do
18
+ subject do
19
+ exit_code_parser = ExitCodeTestKlass.new
20
+ exit_code_parser.hash = hash
21
+ exit_code_parser.expect_exit_codes
22
+ end
23
+
24
+ context 'Nothing is specified' do
25
+ let(:hash){nil}
26
+ it{ is_expected.to eq(0) }
27
+ end
28
+ context 'A number is specified' do
29
+ let(:hash){{:expect_exit_codes => 3}}
30
+ it{ is_expected.to eq(3) }
31
+ end
32
+ context 'An Array is specified' do
33
+ let(:hash){{:expect_exit_codes => [0, 1, 3]}}
34
+ it{ is_expected.to eq([0, 1, 3]) }
35
+ end
36
+ context 'The :all keyword is specified' do
37
+ let(:hash){{:expect_exit_codes => 'all'}}
38
+ it{ is_expected.to eq('all') }
39
+ end
40
+ context 'The value is an invalid string' do
41
+ let(:hash){{:expect_exit_codes => 'foo'}}
42
+ it{ expect{subject}.to raise_error Dopi::CommandParsingError }
43
+ end
44
+ context 'The Array contains a String' do
45
+ let(:hash){{:expect_exit_codes => [1, 2, 'foo']}}
46
+ it{ expect{subject}.to raise_error Dopi::CommandParsingError }
47
+ end
48
+ context 'A plugin defaults method is specified' do
49
+ subject do
50
+ exit_code_parser = ExitCodeTestKlass.new
51
+ exit_code_parser.extend(ExitCodeDefaults)
52
+ exit_code_parser.expect_exit_codes
53
+ end
54
+ it{ is_expected.to eq([1,2,3])}
55
+ end
56
+ end
57
+
58
+ describe 'check_exit_code' do
59
+ pending
60
+ end
61
+
62
+ end
63
+
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ class OutputTestKlass
4
+ include Dopi::CommandParser::Output
5
+ attr_accessor :hash
6
+ def log(s,m); end
7
+ end
8
+
9
+ describe Dopi::CommandParser::Output do
10
+
11
+ before :each do
12
+ @output_parser = OutputTestKlass.new
13
+ end
14
+
15
+ describe 'parse_output' do
16
+ it 'Returns an empty hash if nothing is defined' do
17
+ expect(@output_parser.parse_output).to eq({})
18
+ end
19
+ it 'Returns the correct hash if one is defined' do
20
+ @output_parser.hash = {:parse_output => {:error => [], :warning => []}}
21
+ expect(@output_parser.parse_output).to eq({:error => [], :warning => []})
22
+ end
23
+ it 'Raises an exeption if the value is not a hash' do
24
+ @output_parser.hash = {:parse_output => 2}
25
+ expect{@output_parser.parse_output}.to raise_error Dopi::CommandParsingError
26
+ end
27
+ end
28
+
29
+ describe 'error_patterns' do
30
+ it 'Returns an empty array if nothing is defined' do
31
+ expect(@output_parser.error_patterns).to eq([])
32
+ end
33
+ it 'Returns the correct array if it is specified' do
34
+ @output_parser.hash = {:parse_output => {:error => [ 'foo', '^bar$' ]}}
35
+ expect(@output_parser.error_patterns).to eq([ 'foo', '^bar$' ])
36
+ end
37
+ it 'Raises an exeption if the value is not an array' do
38
+ @output_parser.hash = {:parse_output => {:error => 2}}
39
+ expect{@output_parser.error_patterns}.to raise_error Dopi::CommandParsingError
40
+ end
41
+ it 'Raises an exception if the pattern is not a Regular Expression' do
42
+ @output_parser.hash = {:parse_output => {:error => ['][']}}
43
+ expect{@output_parser.error_patterns}.to raise_error Dopi::CommandParsingError
44
+ end
45
+ end
46
+
47
+ describe 'warning_patterns' do
48
+ it 'Returns an empty array if nothing is defined' do
49
+ expect(@output_parser.warning_patterns).to eq([])
50
+ end
51
+ it 'Returns the correct array if it is specified' do
52
+ @output_parser.hash = {:parse_output => {:warning => [ 'foo', '^bar$' ]}}
53
+ expect(@output_parser.warning_patterns).to eq([ 'foo', '^bar$' ])
54
+ end
55
+ it 'Raises an exeption if the value is not an array' do
56
+ @output_parser.hash = {:parse_output => {:warning => 2}}
57
+ expect{@output_parser.warning_patterns}.to raise_error Dopi::CommandParsingError
58
+ end
59
+ end
60
+
61
+ describe 'fail_on_warning' do
62
+ it 'Returns false if nothing is defined' do
63
+ expect(@output_parser.fail_on_warning).to be false
64
+ end
65
+ it 'Returns true if specified' do
66
+ @output_parser.hash = {:fail_on_warning => true}
67
+ expect(@output_parser.fail_on_warning).to be true
68
+ end
69
+ it 'Returns false if specified' do
70
+ @output_parser.hash = {:fail_on_warning => false}
71
+ expect(@output_parser.fail_on_warning).to be false
72
+ end
73
+ it 'Raises an exeption if the value is not a boolean' do
74
+ @output_parser.hash = {:fail_on_warning => 2}
75
+ expect{@output_parser.fail_on_warning}.to raise_error Dopi::CommandParsingError
76
+ end
77
+ end
78
+
79
+ describe 'check_output' do
80
+ it 'Returns true if no error is detected' do
81
+ raw_output = <<-OUTPUT
82
+ Foo
83
+ Bar
84
+ OUTPUT
85
+ @output_parser.hash = {:parse_output => {:error => [ 'Error:' ]}}
86
+ expect(@output_parser.check_output(raw_output)).to be true
87
+ end
88
+ it 'Returns false if an error is detected' do
89
+ raw_output = <<-OUTPUT
90
+ Foo
91
+ Error: this is a fake error
92
+ Bar
93
+ OUTPUT
94
+ @output_parser.hash = {:parse_output => {:error => [ 'Error:' ]}}
95
+ expect(@output_parser.check_output(raw_output)).to be false
96
+ end
97
+ it 'Returns true if no warning is detected' do
98
+ raw_output = <<-OUTPUT
99
+ Foo
100
+ Bar
101
+ OUTPUT
102
+ @output_parser.hash = {:parse_output => {:warning => [ 'Warning:' ]}}
103
+ expect(@output_parser.check_output(raw_output)).to be true
104
+ end
105
+ it 'Returns true if an warning is detected but fail_on_warning is not true' do
106
+ raw_output = <<-OUTPUT
107
+ Foo
108
+ Warning: this is a fake error
109
+ Bar
110
+ OUTPUT
111
+ @output_parser.hash = {:parse_output => {:warning => [ 'Warning:' ]}}
112
+ expect(@output_parser.check_output(raw_output)).to be true
113
+ end
114
+ it 'Returns true if an warning is detected but fail_on_warning is not true' do
115
+ raw_output = <<-OUTPUT
116
+ Foo
117
+ Warning: this is a fake error
118
+ Bar
119
+ OUTPUT
120
+ @output_parser.hash = {
121
+ :fail_on_warning => true,
122
+ :parse_output => {:warning => [ 'Warning:' ]}
123
+ }
124
+ expect(@output_parser.check_output(raw_output)).to be false
125
+ end
126
+ end
127
+
128
+ end
129
+