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,52 @@
1
+ # This site.pp is the entry point for puppet in the testenv
2
+ # It contains some workarounds to help with problems in the
3
+ # used modules
4
+
5
+ $role = hiera('role')
6
+
7
+ class base {
8
+ hiera_include('classes')
9
+
10
+ file{'/usr/libexec/mcollective/': ensure => directory}
11
+ file{'/usr/libexec/mcollective/mcollective': ensure => directory}
12
+ }
13
+
14
+ node default {
15
+ include base
16
+ }
17
+
18
+ node 'puppetmaster.example.com' {
19
+ include base
20
+
21
+ file{'/etc/puppet/autosign.conf':
22
+ content => "*.example.com\n",
23
+ mode => '0664',
24
+ }
25
+
26
+ #file{'/etc/puppet/environments/production/manifests/': ensure => directory }
27
+ file{'/etc/puppet/environments/production/manifests/site.pp':
28
+ ensure => symlink,
29
+ target => '/etc/puppet/manifests/site.pp',
30
+ }
31
+
32
+ }
33
+
34
+ # This are some fixes because there is not realy a working
35
+ # mcollective module for centos at the moment
36
+ node 'broker.example.com' {
37
+ include base
38
+
39
+ # FIX for activemq module
40
+ file{'/etc/activemq/': ensure => directory }
41
+ file{'/etc/activemq/instances-available': ensure => directory }
42
+ file{'/etc/activemq/instances-enabled': ensure => directory }
43
+
44
+ # This is probably needed because we use an debian module or something
45
+ file{'/etc/activemq/activemq.xml':
46
+ source => 'file:///etc/activemq/instances-available/mcollective/activemq.xml',
47
+ require => File['/etc/activemq/instances-available/mcollective/activemq.xml'],
48
+ notify => Service['activemq'],
49
+ }
50
+
51
+ Class['java'] -> Class['activemq']
52
+ }
@@ -0,0 +1,54 @@
1
+ configuration:
2
+ nodes:
3
+ 'puppetmaster.example.com':
4
+ role: 'puppetmaster'
5
+ 'broker.example.com':
6
+ role: 'mcollective_broker'
7
+ 'windows01.example.com':
8
+ os: 'windows'
9
+ roles:
10
+ 'puppetmaster':
11
+ classes:
12
+ - 'foreman'
13
+ - 'puppet'
14
+ foreman::foreman_url: "%{hiera('::fqdn')}"
15
+ foreman::unattended: 'false'
16
+ foreman::authentication: 'false'
17
+ puppet::server: true
18
+ puppet::autosign: '/usr/local/bin/dop-puppet-autosign'
19
+ puppet::autosign_mode: 'script'
20
+ puppet::server_foreman: true
21
+ puppet::server_rttendedeports: 'store'
22
+ puppet::server_external_nodes: ''
23
+ 'mcollective_broker':
24
+ classes:
25
+ - 'java'
26
+ - 'activemq'
27
+ java::distribution: 'jdk'
28
+ java::version: 'latest'
29
+ activemq::instances:
30
+ 'mcollective':
31
+ stomp_nio_port: "%{hiera('mcollective::broker_port')}"
32
+ user_name: "%{hiera('mcollective::broker_user')}"
33
+ user_password: "%{hiera('mcollective::broker_password')}"
34
+ defaults:
35
+ classes:
36
+ - 'firewall'
37
+ - 'puppet'
38
+ - 'mcollective'
39
+ role: 'base'
40
+ os: 'linux'
41
+ firewall::ensure: 'stopped'
42
+ puppet::puppetmaster: 'puppetmaster.example.com'
43
+ puppet::runmode: 'none'
44
+ mcollective::use_node: true
45
+ mcollective::connector: 'activemq'
46
+ mcollective::broker_host: 'broker.example.com'
47
+ mcollective::broker_port: 61614
48
+ mcollective::broker_ssl: 'false'
49
+ mcollective::broker_user: 'mcollective'
50
+ mcollective::broker_password: 'vagrant'
51
+ mcollective::security_provider: 'psk'
52
+ mcollective::security_secret: 'vagrant'
53
+
54
+
@@ -0,0 +1,11 @@
1
+ credentials:
2
+ 'linux_login':
3
+ type: 'username_password'
4
+ username: 'root'
5
+ password: 'puppet'
6
+ 'windows_login':
7
+ type: 'username_password'
8
+ username: 'administrator'
9
+ password: 'vagrant'
10
+
11
+
@@ -0,0 +1,5 @@
1
+ This is some multiline file
2
+ Deployed from a file
3
+ Which contains the sentence
4
+ hello world
5
+ and some other stuff
@@ -0,0 +1,12 @@
1
+ infrastructures:
2
+ 'vagrant':
3
+ type: 'baremetal'
4
+ networks:
5
+ 'vboxnet0':
6
+ ip_pool:
7
+ from: 192.168.56.101
8
+ to: 192.168.56.254
9
+ ip_netmask: 255.255.255.0
10
+ ip_defgw: 192.168.56.1
11
+
12
+
@@ -0,0 +1,45 @@
1
+ nodes:
2
+ 'puppetmaster.example.com':
3
+ infrastructure: 'vagrant'
4
+ image: 'puppetlabs/centos-7.0-64-nocm'
5
+ interfaces:
6
+ 'eth0':
7
+ network: 'vboxnet0'
8
+ ip: '192.168.56.101'
9
+ 'broker.example.com':
10
+ infrastructure: 'vagrant'
11
+ image: 'puppetlabs/centos-7.0-64-nocm'
12
+ interfaces:
13
+ 'eth0':
14
+ network: 'vboxnet0'
15
+ ip: '192.168.56.102'
16
+ 'linux01.example.com':
17
+ infrastructure: 'vagrant'
18
+ image: 'puppetlabs/centos-7.0-64-nocm'
19
+ interfaces:
20
+ 'eth0':
21
+ network: 'vboxnet0'
22
+ ip: '192.168.56.103'
23
+ 'linux02.example.com':
24
+ infrastructure: 'vagrant'
25
+ image: 'puppetlabs/centos-7.0-64-nocm'
26
+ interfaces:
27
+ 'eth0':
28
+ network: 'vboxnet0'
29
+ ip: '192.168.56.104'
30
+ 'linux03.example.com':
31
+ infrastructure: 'vagrant'
32
+ image: 'puppetlabs/centos-7.0-64-nocm'
33
+ interfaces:
34
+ 'eth0':
35
+ network: 'vboxnet0'
36
+ ip: '192.168.56.105'
37
+ 'windows01.example.com':
38
+ infrastructure: 'vagrant'
39
+ image: 'opentable/win-2012r2-standard-amd64-nocm'
40
+ interfaces:
41
+ 'eth0':
42
+ network: 'vboxnet0'
43
+ ip: '192.168.56.106'
44
+
45
+
@@ -0,0 +1,159 @@
1
+ # This dop plan will setup the test environment for DOPi
2
+ #
3
+ # For now we will just use a bermetal type and vagrant
4
+ # this should one day be replaced with dopv and some
5
+ # local endpoint to create the machines.
6
+ #
7
+
8
+ name: 'build_dop_test_environment'
9
+ max_in_flight: -1
10
+
11
+ include: 'test_infrastructure.yaml'
12
+ include: 'test_nodes.yaml'
13
+ include: 'test_credentials.yaml'
14
+ include: 'test_configuration.yaml'
15
+
16
+ steps:
17
+ - name: 'Configure ssh credentials and wait until all the linux machines are online'
18
+ nodes_by_config: {os: 'linux'}
19
+ set_plugin_defaults: [{plugins: '/^ssh/', credentials: 'linux_login'}]
20
+ command: 'ssh/wait_for_login'
21
+
22
+ - name: 'Configure winrm credentials and wait until all the windows machines are online'
23
+ nodes_by_config: {os: 'windows'}
24
+ set_plugin_defaults: [{plugins: '/^winrm/', credentials: 'windows_login'}]
25
+ command: 'winrm/wait_for_login'
26
+
27
+ - name: 'install the puppetlabs repository'
28
+ nodes_by_config: {os: 'linux'}
29
+ command:
30
+ verify_commands:
31
+ - plugin: 'ssh/file_exists'
32
+ file: '/etc/yum.repos.d/puppetlabs.repo'
33
+ plugin: 'ssh/custom'
34
+ exec: 'rpm'
35
+ arguments: '-ivh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm'
36
+
37
+ - name: 'install puppet on all the nodes'
38
+ nodes_by_config: {os: 'linux'}
39
+ command:
40
+ verify_commands:
41
+ - plugin: 'ssh/file_exists'
42
+ file: '/usr/bin/puppet'
43
+ plugin: 'ssh/custom'
44
+ exec: 'yum'
45
+ arguments: 'install -y puppet'
46
+
47
+ - name: 'copy the puppet configuration to the right place'
48
+ roles: 'puppetmaster'
49
+ command:
50
+ plugin: 'ssh/custom'
51
+ exec: 'cp'
52
+ arguments: '-r /vagrant/spec/fixtures/puppet/* /etc/puppet/'
53
+
54
+ - name: 'Install all the needed packages on the puppetmaster'
55
+ roles: 'puppetmaster'
56
+ command:
57
+ verify_commands:
58
+ - plugin: 'ssh/file_exists'
59
+ file: '/usr/bin/rake'
60
+ - plugin: 'ssh/file_exists'
61
+ file: '/usr/bin/bundle'
62
+ - plugin: 'ssh/file_exists'
63
+ file: '/usr/bin/git'
64
+ - plugin: 'ssh/file_exists'
65
+ file: '/usr/include/ruby.h'
66
+ plugin: 'ssh/custom'
67
+ exec: 'yum'
68
+ arguments: 'install -y rubygem-rake rubygem-bundler git ruby-devel'
69
+
70
+ - name: 'Install librarian-puppet'
71
+ roles: 'puppetmaster'
72
+ command:
73
+ verify_commands:
74
+ - plugin: 'ssh/file_exists'
75
+ file: '/usr/local/bin/librarian-puppet'
76
+ plugin: 'ssh/custom'
77
+ exec: 'gem'
78
+ arguments: 'install librarian-puppet'
79
+
80
+ - name: 'Install all the puppet modules'
81
+ roles: 'puppetmaster'
82
+ command:
83
+ verify_commands:
84
+ - plugin: 'ssh/file_exists'
85
+ file: '/etc/puppet/.librarian/puppet/config'
86
+ plugin: 'ssh/custom'
87
+ exec: 'librarian-puppet'
88
+ arguments: 'install'
89
+ env: {LIBRARIAN_PUPPET_PUPPETFILE: '/etc/puppet/Puppetfile'}
90
+
91
+ - name: 'Install dop_common for the puppetmaster'
92
+ roles: 'puppetmaster'
93
+ command:
94
+ verify_commands:
95
+ - plugin: 'ssh/custom'
96
+ exec: 'gem list | grep dop_common'
97
+ plugin: 'ssh/custom'
98
+ exec: 'cd /vagrant/vendor/cache/dop_common-*/ && gem build dop_common.gemspec && gem install dop_common*.gem'
99
+
100
+ - name: 'Install DOPi so we can add the plan'
101
+ roles: 'puppetmaster'
102
+ command:
103
+ verify_commands:
104
+ - plugin: 'ssh/file_exists'
105
+ file: '/vagrant/.bundle/config'
106
+ plugin: 'ssh/custom'
107
+ exec: 'bundle'
108
+ arguments: 'install --local'
109
+ env: {BUNDLE_GEMFILE: '/vagrant/Gemfile'}
110
+
111
+ - name: 'Add deployment plan with hiera data to the plan cache'
112
+ roles: 'puppetmaster'
113
+ command:
114
+ verify_commands:
115
+ - plugin: 'ssh/file_exists'
116
+ file: '/var/lib/dop/plans/build_dop_test_environment.yaml'
117
+ plugin: 'ssh/custom'
118
+ exec: 'bundle'
119
+ arguments: 'exec dopi add /vagrant/spec/fixtures/testenv_plan.yaml'
120
+ env: {BUNDLE_GEMFILE: '/vagrant/Gemfile'}
121
+
122
+ - name: 'Run puppet on puppetmaster'
123
+ roles: 'puppetmaster'
124
+ command:
125
+ verify_commands:
126
+ - plugin: 'ssh/file_exists'
127
+ file: '/etc/httpd/conf.d/25-puppet.conf'
128
+ plugin: 'ssh/custom'
129
+ exec: 'puppet'
130
+ arguments: 'apply /etc/puppet/manifests/site.pp'
131
+
132
+ - name: 'Add puppetmaster to all hosts files'
133
+ nodes_by_config: {os: 'linux'}
134
+ command:
135
+ verify_commands:
136
+ - plugin: 'ssh/file_contains'
137
+ file: '/etc/hosts'
138
+ pattern: 'puppetmaster.example.com'
139
+ plugin: 'ssh/custom'
140
+ exec: "echo"
141
+ arguments: '"192.168.56.101 puppetmaster.example.com puppetmaster" >> /etc/hosts'
142
+
143
+ - name: 'Add broker to all hosts files'
144
+ nodes_by_config: {os: 'linux'}
145
+ command:
146
+ verify_commands:
147
+ - plugin: 'ssh/file_contains'
148
+ file: '/etc/hosts'
149
+ pattern: 'broker.example.com'
150
+ plugin: 'ssh/custom'
151
+ exec: "echo"
152
+ arguments: '"192.168.56.102 broker.example.com broker" >> /etc/hosts'
153
+
154
+ - name: 'Run puppet on the rest of the linux nodes'
155
+ nodes_by_config: {os: 'linux'}
156
+ exclude_roles: 'puppetmaster'
157
+ command:
158
+ plugin: 'ssh/puppet_agent_run'
159
+ arguments: '--server puppetmaster.example.com'
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ # Try running the plan when it is added (persisted to disk) and loaded again
4
+ # before running.
5
+
6
+ DopCommon.config.mco_config = 'spec/fixtures/mco_client.cfg'
7
+ DopCommon.config.hiera_yaml = 'spec/fixtures/puppet/hiera.yaml'
8
+
9
+ plan_file = "spec/integration/dopi/plans/dummy.yaml"
10
+ plan_name = nil
11
+ plan = nil
12
+
13
+ describe 'running an added plan' do
14
+ context 'in temp directory' do
15
+ Dir.mktmpdir do |tmp|
16
+ DopCommon.config.plan_store_dir = tmp
17
+ it 'add plan to store' do
18
+ plan_name = Dopi.add(plan_file)
19
+ end
20
+ it 'load plan from store' do
21
+ plan = Dopi.show(plan_name)
22
+ end
23
+ it 'run loaded plan' do
24
+ Dopi.run(plan_name)
25
+ end
26
+ it 'remove plan from store' do
27
+ Dopi.remove(plan_name)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'command_run' do
4
+ fixture_file 'puppet'
5
+ fixture_file 'plans'
6
+
7
+ describe 'run exit code' do
8
+ before :each do
9
+ Dopi.add("spec/fixtures/plans/#{plan_name}.yaml")
10
+ end
11
+ after :each do
12
+ Dopi.remove(plan_name, true)
13
+ end
14
+
15
+ context 'plan run will be successful' do
16
+ let(:plan_name) { 'hello_world' }
17
+ command 'dopi --verbosity INFO run hello_world'
18
+ its(:exitstatus) { is_expected.to eq 0 }
19
+ end
20
+ context 'plan will fail on command timeout' do
21
+ let(:plan_name) { 'fail_on_timeout' }
22
+ command 'dopi --verbosity INFO run fail_on_timeout', :allow_error => true
23
+ its(:exitstatus) { is_expected.to_not eq 0 }
24
+ end
25
+ end
26
+
27
+ describe 'oneshot exit code' do
28
+ context 'plan run will be successful' do
29
+ command "dopi --verbosity INFO oneshot hello_world.yaml"
30
+ its(:exitstatus) { is_expected.to eq 0 }
31
+ end
32
+ context 'plan will fail on command timeout' do
33
+ command "dopi --verbosity INFO oneshot fail_on_timeout.yaml", :allow_error => true
34
+ its(:exitstatus) { is_expected.to_not eq 0 }
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,128 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'global cli options' do
4
+ fixture_file 'puppet'
5
+ fixture_file 'plans'
6
+
7
+ describe 'connection_check_timeout' do
8
+ pending
9
+ end
10
+
11
+ describe 'facts_dir' do
12
+ pending # This option should be removed
13
+ end
14
+
15
+ describe 'hiera_yaml' do
16
+ context 'Invalid hiera.yaml' do
17
+ command 'dopi --hiera_yaml ./nothiera.yaml oneshot test_role_variable.yaml', :allow_error => true
18
+ its(:stdout) {is_expected.to include 'hiera.yaml not found! Using empty config'}
19
+ end
20
+ context 'Valid hiera.yaml' do
21
+ command 'dopi --hiera_yaml ./hiera.yaml oneshot test_role_variable.yaml', :allow_error => true
22
+ its(:stdout) {is_expected.not_to include 'hiera.yaml not found! Using empty config'}
23
+ end
24
+ end
25
+
26
+ describe 'load_facts' do
27
+ pending # This option should be removed
28
+ end
29
+
30
+ describe '--log_dir' do
31
+ before :each do
32
+ command "dopi --log_dir ./mylog oneshot hello_world.yaml"
33
+ end
34
+ it 'should create the directory' do
35
+ expect(Dir.entries(temp_path)).to include 'mylog'
36
+ end
37
+ it 'should write to the log file in the directory' do
38
+ log_file = File.join(temp_path, 'mylog', 'dopi.log')
39
+ expect(File.read(log_file)).to include
40
+ "Step 'write hello world' successfully finished."
41
+ end
42
+ end
43
+
44
+ describe 'log_level' do
45
+ context 'INFO' do
46
+ it 'should not contain debug output in the log file' do
47
+ command "dopi --log_dir ./mylog --log_level INFO oneshot hello_world.yaml"
48
+ log_file = File.join(temp_path, 'mylog', 'dopi.log')
49
+ expect(File.read(log_file)).not_to include
50
+ 'Executing echo "hello world"'
51
+ end
52
+ end
53
+ context 'DEBUG' do
54
+ it 'should contain debug output in the log file' do
55
+ command "dopi --log_dir ./mylog --log_level DEBUG oneshot hello_world.yaml"
56
+ log_file = File.join(temp_path, 'mylog', 'dopi.log')
57
+ expect(File.read(log_file)).to include
58
+ 'Executing echo "hello world"'
59
+ end
60
+ end
61
+ end
62
+
63
+ describe 'mco_config' do
64
+ pending
65
+ end
66
+
67
+ describe 'mco_dopi_logger' do
68
+ pending
69
+ end
70
+
71
+ describe 'plan_store_dir' do
72
+ before :each do
73
+ command "dopi --plan_store_dir ./plan_store add hello_world.yaml"
74
+ end
75
+ it 'should create the directory' do
76
+ expect(Dir.entries(temp_path)).to include 'plan_store'
77
+ end
78
+ it 'should add the plan to the plan_store' do
79
+ stored_plan = File.join(temp_path, 'plan_store', 'hello_world')
80
+ expect(File.exists?(stored_plan)).to be true
81
+ end
82
+ end
83
+
84
+ describe 'role_default' do
85
+ context 'role_default is not set' do
86
+ command 'dopi oneshot test_role_variable.yaml', :allow_error => true
87
+ its(:stdout) {is_expected.to include 'No role found for linux01.example.com'}
88
+ end
89
+ context 'role_default is set' do
90
+ command 'dopi --role_default testnode oneshot test_role_variable.yaml'
91
+ its(:stdout) {is_expected.to include "Step 'write hello world' successfully finished."}
92
+ end
93
+ end
94
+
95
+ describe 'role_variable' do
96
+ context 'role_variable is not set' do
97
+ command 'dopi --hiera_yaml hiera.yaml oneshot test_role_variable.yaml', :allow_error => true
98
+ its(:stdout) {is_expected.to include 'No role found for linux01.example.com'}
99
+ end
100
+ context 'role_default is set' do
101
+ command 'dopi --hiera_yaml hiera.yaml --role_variable test_role oneshot test_role_variable.yaml'
102
+ its(:stdout) {is_expected.to include "Step 'write hello world' successfully finished."}
103
+ end
104
+ end
105
+
106
+ describe 'use_hiera' do
107
+ context 'default behaviour' do
108
+ command 'dopi --hiera_yaml ./nothiera.yaml oneshot test_role_variable.yaml', :allow_error => true
109
+ its(:stdout) {is_expected.to include 'hiera.yaml not found! Using empty config'}
110
+ end
111
+ context 'Disable hiera' do
112
+ command 'dopi --no-use_hiera oneshot test_role_variable.yaml', :allow_error => true
113
+ its(:stdout) {is_expected.not_to include 'hiera.yaml not found! Using empty config'}
114
+ end
115
+ end
116
+
117
+ describe '--verbosity' do
118
+ context 'INFO' do
119
+ command "dopi --verbosity INFO oneshot hello_world.yaml"
120
+ its(:stdout) {is_expected.not_to include 'Executing echo "hello world"'}
121
+ end
122
+ context 'DEBUG' do
123
+ command "dopi --verbosity DEBUG oneshot hello_world.yaml"
124
+ its(:stdout) {is_expected.to include 'Executing echo "hello world"'}
125
+ end
126
+ end
127
+
128
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ DopCommon.config.mco_config = 'spec/fixtures/mco_client.cfg'
4
+ DopCommon.config.hiera_yaml = 'spec/fixtures/puppet/hiera.yaml'
5
+
6
+ describe 'Basic integration test built from plan files' do
7
+
8
+ # Create plugin tests from plugin test yaml files
9
+ # and check if they run successfully
10
+ Dir['spec/integration/dopi/plans/**/*.yaml'].each do |plan_file|
11
+ describe plan_file do
12
+ plan_parser = DopCommon::Plan.new(YAML.load_file(plan_file))
13
+ plan = Dopi::Plan.new(plan_parser)
14
+ node_names = plan.nodes.map{|n| n.name}
15
+ plan.instance_variable_set(:@context_logger, DopCommon::ThreadContextLogger.new('/tmp/dopi_test', node_names))
16
+ it "is a valid plan file" do
17
+ expect(plan.valid?).to be true
18
+ end
19
+ plan.step_sets.each do |step_set|
20
+ step_set.steps.each do |step|
21
+ it "successfully runs the step: '#{step.name}'" do
22
+ step.run({:run_for_nodes => :all, :noop => false})
23
+ expect(step.state).to be :done
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # Create plugin tests from plugin test yaml files
31
+ # and check if they fail
32
+ Dir['spec/integration/dopi/fail_check_plans/**/*.yaml'].each do |plan_file|
33
+ describe plan_file do
34
+ plan_parser = DopCommon::Plan.new(YAML.load_file(plan_file))
35
+ plan = Dopi::Plan.new(plan_parser)
36
+ node_names = plan.nodes.map{|n| n.name}
37
+ plan.instance_variable_set(:@context_logger, DopCommon::ThreadContextLogger.new('/tmp/dopi_test', node_names))
38
+ it "is a valid plan file" do
39
+ expect(plan.valid?).to be true
40
+ end
41
+ plan.step_sets.each do |step_set|
42
+ step_set.steps.each do |step|
43
+ it "successfully runs the step: '#{step.name}'" do
44
+ step.run({:run_for_nodes => :all, :noop => false})
45
+ expect(step.state).to be :failed
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ # Create plugin tests from plugin test yaml files
53
+ # and check if they are not valid
54
+ Dir['spec/integration/dopi/invalid_plans/**/*.yaml'].each do |plan_file|
55
+ describe plan_file do
56
+ plan_parser = DopCommon::Plan.new(YAML.load_file(plan_file))
57
+ plan = Dopi::Plan.new(plan_parser)
58
+ node_names = plan.nodes.map{|n| n.name}
59
+ plan.instance_variable_set(:@context_logger, DopCommon::ThreadContextLogger.new('/tmp/dopi_test', node_names))
60
+ it "is not a valid plan file" do
61
+ expect(plan.valid?).to be false
62
+ end
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,38 @@
1
+ name: 'test_powershell_exitcode_handling'
2
+ max_in_flight: 1
3
+
4
+ infrastructures:
5
+ 'test':
6
+ type: 'baremetal'
7
+
8
+ nodes:
9
+ 'windows01.example.com':
10
+ infrastructure: 'test'
11
+ 'linux01.example.com':
12
+ infrastructure: 'test'
13
+
14
+ credentials:
15
+ 'windows_login':
16
+ type: 'username_password'
17
+ username: 'administrator'
18
+ password: 'vagrant'
19
+ 'linux_login':
20
+ type: 'username_password'
21
+ username: 'root'
22
+ password: 'puppet'
23
+
24
+ steps:
25
+
26
+ - name: 'Check if the plugin fails for the windows command'
27
+ nodes: 'windows01.example.com'
28
+ command:
29
+ plugin: 'winrm/file_exists'
30
+ credentials: 'windows_login'
31
+ file: 'C:\nonexistingfile.txt'
32
+
33
+ - name: 'Check if the plugin fails for the linux command'
34
+ nodes: 'linux01.example.com'
35
+ command:
36
+ plugin: 'ssh/file_exists'
37
+ credentials: 'linux_login'
38
+ file: '/nonexistingfile.txt'
@@ -0,0 +1,39 @@
1
+ name: 'fail_test_for_ouptut_parser'
2
+
3
+ infrastructures:
4
+ 'test':
5
+ type: 'baremetal'
6
+
7
+ nodes:
8
+ 'linux01.example.com':
9
+ infrastructure: 'test'
10
+
11
+ steps:
12
+
13
+ #
14
+ # Check if the parser is working as intended
15
+ #
16
+
17
+ - name: 'Check if the output parser can catch an error'
18
+ nodes: 'all'
19
+ command:
20
+ plugin: 'custom'
21
+ exec: 'echo'
22
+ arguments: '"Error: this is a simulated error"'
23
+ parse_output:
24
+ error:
25
+ - '^Error:'
26
+
27
+ - name: 'Check if the output parser can catch a warning'
28
+ nodes: 'all'
29
+ command:
30
+ plugin: 'custom'
31
+ exec: 'echo'
32
+ arguments: '"Warning: This is a simulated warning"'
33
+ fail_on_warning: true
34
+ parse_output:
35
+ warning:
36
+ - '^Warning:'
37
+
38
+
39
+