dopi 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
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
+