dop_common 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +176 -0
  6. data/Gemfile +11 -0
  7. data/LICENSE.txt +177 -0
  8. data/README.md +48 -0
  9. data/Rakefile +49 -0
  10. data/Vagrantfile +25 -0
  11. data/bin/dop-puppet-autosign +56 -0
  12. data/doc/examples/example_deploment_plan_v0.0.1.yaml +302 -0
  13. data/doc/plan_format_v0.0.1.md +919 -0
  14. data/doc/plan_format_v0.0.2_snippets.md +56 -0
  15. data/dop_common.gemspec +44 -0
  16. data/lib/dop_common/affinity_group.rb +57 -0
  17. data/lib/dop_common/cli/global_options.rb +37 -0
  18. data/lib/dop_common/cli/log.rb +51 -0
  19. data/lib/dop_common/cli/node_selection.rb +62 -0
  20. data/lib/dop_common/command.rb +125 -0
  21. data/lib/dop_common/config/helper.rb +39 -0
  22. data/lib/dop_common/config.rb +66 -0
  23. data/lib/dop_common/configuration.rb +37 -0
  24. data/lib/dop_common/credential.rb +152 -0
  25. data/lib/dop_common/data_disk.rb +62 -0
  26. data/lib/dop_common/dns.rb +55 -0
  27. data/lib/dop_common/hash_parser.rb +241 -0
  28. data/lib/dop_common/hooks.rb +81 -0
  29. data/lib/dop_common/infrastructure.rb +160 -0
  30. data/lib/dop_common/infrastructure_properties.rb +185 -0
  31. data/lib/dop_common/interface.rb +113 -0
  32. data/lib/dop_common/log.rb +78 -0
  33. data/lib/dop_common/network.rb +85 -0
  34. data/lib/dop_common/node/config.rb +159 -0
  35. data/lib/dop_common/node.rb +442 -0
  36. data/lib/dop_common/node_filter.rb +74 -0
  37. data/lib/dop_common/plan.rb +188 -0
  38. data/lib/dop_common/plan_cache.rb +83 -0
  39. data/lib/dop_common/plan_store.rb +263 -0
  40. data/lib/dop_common/pre_processor.rb +73 -0
  41. data/lib/dop_common/run_options.rb +56 -0
  42. data/lib/dop_common/signal_handler.rb +58 -0
  43. data/lib/dop_common/state_store.rb +95 -0
  44. data/lib/dop_common/step.rb +200 -0
  45. data/lib/dop_common/step_set.rb +41 -0
  46. data/lib/dop_common/thread_context_logger.rb +77 -0
  47. data/lib/dop_common/utils.rb +106 -0
  48. data/lib/dop_common/validator.rb +53 -0
  49. data/lib/dop_common/version.rb +3 -0
  50. data/lib/dop_common.rb +32 -0
  51. data/lib/hiera/backend/dop_backend.rb +94 -0
  52. data/lib/hiera/dop_logger.rb +20 -0
  53. data/spec/data/fake_hook_file_invalid +1 -0
  54. data/spec/data/fake_hook_file_valid +5 -0
  55. data/spec/data/fake_keyfile +1 -0
  56. data/spec/dop-puppet-autosign_spec_disable.rb +33 -0
  57. data/spec/dop_common/affinity_group_spec.rb +41 -0
  58. data/spec/dop_common/command_spec.rb +83 -0
  59. data/spec/dop_common/credential_spec.rb +73 -0
  60. data/spec/dop_common/data_disk_spec.rb +165 -0
  61. data/spec/dop_common/dns_spec.rb +33 -0
  62. data/spec/dop_common/hash_parser_spec.rb +181 -0
  63. data/spec/dop_common/hooks_spec.rb +33 -0
  64. data/spec/dop_common/infrastructure_properties_spec.rb +224 -0
  65. data/spec/dop_common/infrastructure_spec.rb +77 -0
  66. data/spec/dop_common/interface_spec.rb +192 -0
  67. data/spec/dop_common/network_spec.rb +92 -0
  68. data/spec/dop_common/node_filter_spec.rb +70 -0
  69. data/spec/dop_common/node_spec.rb +623 -0
  70. data/spec/dop_common/plan_cache_spec.rb +46 -0
  71. data/spec/dop_common/plan_spec.rb +136 -0
  72. data/spec/dop_common/plan_store_spec.rb +194 -0
  73. data/spec/dop_common/pre_processor_spec.rb +27 -0
  74. data/spec/dop_common/run_options_spec.rb +65 -0
  75. data/spec/dop_common/signal_handler_spec.rb +31 -0
  76. data/spec/dop_common/step_set_spec.rb +21 -0
  77. data/spec/dop_common/step_spec.rb +175 -0
  78. data/spec/dop_common/utils_spec.rb +27 -0
  79. data/spec/dop_common/validator_spec.rb +47 -0
  80. data/spec/example_plans_spec.rb +16 -0
  81. data/spec/fixtures/example_ssh_key +27 -0
  82. data/spec/fixtures/example_ssh_key.pub +1 -0
  83. data/spec/fixtures/incl/root_part.yaml +1 -0
  84. data/spec/fixtures/incl/some_list.yaml +2 -0
  85. data/spec/fixtures/other_plan_same_nodes.yaml +19 -0
  86. data/spec/fixtures/simple_include.yaml +6 -0
  87. data/spec/fixtures/simple_include_with_errors.yaml +4 -0
  88. data/spec/fixtures/simple_plan.yaml +19 -0
  89. data/spec/fixtures/simple_plan_invalid.yaml +18 -0
  90. data/spec/fixtures/simple_plan_modified.yaml +21 -0
  91. data/spec/spec_helper.rb +106 -0
  92. metadata +381 -0
@@ -0,0 +1,94 @@
1
+ #
2
+ # DOP Plan Hiera Backend
3
+ #
4
+
5
+ class Hiera
6
+ module Backend
7
+
8
+ class Dop_backend
9
+
10
+ def initialize
11
+ Hiera.debug('Hiera DOP backend starting')
12
+ begin
13
+ require 'dop_common'
14
+ rescue
15
+ require 'rubygems'
16
+ require 'dop_common'
17
+ end
18
+
19
+ if Config[:dop].kind_of?(Hash)
20
+ @plan_store_dir ||= Config[:dop][:plan_store_dir]
21
+ end
22
+ @plan_store_dir ||= '/var/lib/dop/plans'
23
+
24
+ @plan_store = DopCommon::PlanStore.new(@plan_store_dir)
25
+ @plan_cache = DopCommon::PlanCache.new(@plan_store)
26
+ Hiera.debug('DOP Plan Cache Loaded')
27
+ end
28
+
29
+ def lookup(key, scope, order_override, resolution_type, context)
30
+ node_name = scope['::clientcert']
31
+ plan = @plan_cache.plan_by_node(node_name)
32
+
33
+ if plan.nil?
34
+ Hiera.debug("Node #{node_name} not found in any plan")
35
+ throw(:no_such_key)
36
+ else
37
+ Hiera.debug("Node #{node_name} found in plan #{plan.name}")
38
+ plan_lookup(plan, key, scope, order_override, resolution_type, context)
39
+ end
40
+ end
41
+
42
+ def plan_lookup(plan, key, scope, order_override, resolution_type, context)
43
+ answer = nil
44
+ found = false
45
+ extra_data = {}
46
+ context[:order_override] = order_override
47
+ Hiera::Backend.datasources(scope, order_override) do |source|
48
+ Hiera.debug("Looking for data source #{source}")
49
+ begin
50
+ data = plan.configuration.lookup(source, key, scope)
51
+ new_answer = Hiera::Backend.parse_answer(data, scope, extra_data, context)
52
+ found = true
53
+
54
+ case resolution_type.is_a?(Hash) ? :hash : resolution_type
55
+ when :array then answer = merge_array(answer, new_answer)
56
+ when :hash then answer = merge_hash(answer, new_answer, resolution_type)
57
+ else
58
+ answer = new_answer
59
+ break
60
+ end
61
+
62
+ rescue DopCommon::ConfigurationValueNotFound
63
+ next
64
+ end
65
+ end
66
+ throw(:no_such_key) unless found
67
+ return answer
68
+ end
69
+
70
+ private
71
+
72
+ def merge_array(answer, new_answer)
73
+ answer ||= []
74
+ case new_answer
75
+ when Array then answer += new_answer
76
+ when String then answer << new_answer
77
+ else
78
+ raise "Hiera type mismatch: expected Array or String and got #{new_answer.class}"
79
+ end
80
+ return answer
81
+ end
82
+
83
+ def merge_hash(answer, new_answer, resolution_type)
84
+ answer ||= {}
85
+ answer = Hiera::Backend.merge_answer(new_answer, answer, resolution_type)
86
+ unless new_answer.kind_of?(Hash)
87
+ raise "Hiera type mismatch: expected Hash and got #{new_answer.class}"
88
+ end
89
+ return answer
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,20 @@
1
+ #
2
+ # Route Hiera Log entries to DOPi Logger
3
+ #
4
+ require 'dop_common'
5
+
6
+ class Hiera
7
+ module Dop_logger
8
+ class << self
9
+
10
+ def warn(msg)
11
+ DopCommon.log.warn('Hiera: ' +msg)
12
+ end
13
+
14
+ def debug(msg)
15
+ DopCommon.log.debug('Hiera: ' + msg)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ # A fake hook file that is invalid, i.e. without executable permissions.
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ # A fake hook file that is , i.e. with executable permissions.
4
+
5
+ uname -a
@@ -0,0 +1 @@
1
+ # this is a fake keyfile for tests.
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ #
4
+ # This test does not run on ruby 1.8.7 because of the mixlib-shellout gem
5
+ # and is therefor deactivated for now.
6
+ #
7
+
8
+ describe 'dop-puppet-autosign' do
9
+
10
+ before :each do
11
+ @tmpdir = '/tmp/dop-puppet-autosign-test'
12
+ @plan_store = DopCommon::PlanStore.new(@tmpdir)
13
+ end
14
+
15
+ after :each do
16
+ FileUtils.remove_entry_secure(@tmpdir)
17
+ end
18
+
19
+ let(:plan) { 'spec/fixtures/simple_plan.yaml' }
20
+
21
+ context 'There is no plan with the node in the plan store' do
22
+ command 'dop-puppet-autosign --plan_cache /tmp/dop-puppet-autosign-test linux01.example.com', :allow_error => true
23
+ its(:exitstatus) { is_expected.to_not eq 0 }
24
+ end
25
+ context 'The node is in one of the plans in the plan store' do
26
+ before do
27
+ @plan_store.add(plan)
28
+ end
29
+ command 'dop-puppet-autosign --plan_cache /tmp/dop-puppet-autosign-test linux01.example.com'
30
+ its(:exitstatus) { is_expected.to eq 0 }
31
+ end
32
+ end
33
+
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe DopCommon::AffinityGroup do
4
+
5
+ describe '#positive' do
6
+ it "will return 'true' if the affinity group is positive and 'false' if it is not" do
7
+ affinity_group = DopCommon::AffinityGroup.new('ag', {'positive' => true, 'enforce' => true, 'cluster' => 'cl'})
8
+ expect(affinity_group.positive).to eq(true)
9
+ affinity_group = DopCommon::AffinityGroup.new('ag', {'positive' => false, 'enforce' => true, 'cluster' => 'cl'})
10
+ expect(affinity_group.positive).to eq(false)
11
+ end
12
+ it 'will raise an error if the flag is not specified correctly' do
13
+ affinity_group = DopCommon::AffinityGroup.new('ag', {})
14
+ expect { affinity_group.positive }.to raise_error DopCommon::PlanParsingError
15
+ end
16
+ end
17
+
18
+ describe '#enforce' do
19
+ it "will return 'true' if the affinity group should be enforced and 'false' if it shouldn't" do
20
+ affinity_group = DopCommon::AffinityGroup.new('ag', {'positive' => true, 'enforce' => true, 'cluster' => 'cl'})
21
+ expect(affinity_group.enforce).to eq(true)
22
+ affinity_group = DopCommon::AffinityGroup.new('ag', {'positive' => false, 'enforce' => false, 'cluster' => 'cl'})
23
+ expect(affinity_group.enforce).to eq(false)
24
+ end
25
+ it 'will raise an error if the flag is not specified correctly' do
26
+ affinity_group = DopCommon::AffinityGroup.new('ag', {})
27
+ expect { affinity_group.enforce }.to raise_error DopCommon::PlanParsingError
28
+ end
29
+ end
30
+
31
+ describe '#cluster' do
32
+ it 'will return the cluster name of the affinity group' do
33
+ affinity_group = DopCommon::AffinityGroup.new('ag', {'positive' => true, 'enforce' => true, 'cluster' => 'cl'})
34
+ expect(affinity_group.cluster).to eq('cl')
35
+ end
36
+ it 'will raise an error in case of invalid cluster specification' do
37
+ affinity_group = DopCommon::AffinityGroup.new('ag', {})
38
+ expect { affinity_group.cluster }.to raise_error DopCommon::PlanParsingError
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe DopCommon::Command do
4
+
5
+ describe '#plugin' do
6
+ it 'returns the name of the plugin' do
7
+ command = DopCommon::Command.new({:plugin => 'dummy'})
8
+ expect(command.plugin).to eq 'dummy'
9
+ command = DopCommon::Command.new('dummy')
10
+ expect(command.plugin).to eq 'dummy'
11
+ end
12
+ it 'throws an exception if the the plugin name is not correctly specified' do
13
+ command = DopCommon::Command.new(1)
14
+ expect{command.plugin}.to raise_error DopCommon::PlanParsingError
15
+ command = DopCommon::Command.new('')
16
+ expect{command.plugin}.to raise_error DopCommon::PlanParsingError
17
+ command = DopCommon::Command.new({})
18
+ expect{command.plugin}.to raise_error DopCommon::PlanParsingError
19
+ command = DopCommon::Command.new({:plugin => 1})
20
+ expect{command.plugin}.to raise_error DopCommon::PlanParsingError
21
+ end
22
+ end
23
+
24
+ describe '#plugin_timeout' do
25
+ it 'returns the plugin timeout if specified' do
26
+ command = DopCommon::Command.new({:plugin_timeout => 200})
27
+ expect(command.plugin_timeout).to eq 200
28
+ end
29
+ it 'returns the default timeout if nothing is specified' do
30
+ command = DopCommon::Command.new({})
31
+ expect(command.plugin_timeout).to eq 300
32
+ end
33
+ it 'throws an exception if the value is not correctly specified' do
34
+ command = DopCommon::Command.new({:plugin_timeout => 'foo'})
35
+ expect{command.plugin_timeout}.to raise_error DopCommon::PlanParsingError
36
+ end
37
+ end
38
+
39
+ describe '#verify_command' do
40
+ it 'returns an array of command instances if specified right' do
41
+ command = DopCommon::Command.new({:verify_commands => 'dummy'})
42
+ expect(command.verify_commands).to be_an_instance_of Array
43
+ expect(command.verify_commands.length).to be 1
44
+ expect(command.verify_commands.all?{|x| x.class == DopCommon::Command}).to be true
45
+ command = DopCommon::Command.new({:verify_commands => {:plugin => 'dummy'}})
46
+ expect(command.verify_commands).to be_an_instance_of Array
47
+ expect(command.verify_commands.length).to be 1
48
+ expect(command.verify_commands.all?{|x| x.class == DopCommon::Command}).to be true
49
+ command = DopCommon::Command.new({:verify_commands => ['dummy', {:plugin => 'dummy'}]})
50
+ expect(command.verify_commands).to be_an_instance_of Array
51
+ expect(command.verify_commands.length).to be 2
52
+ expect(command.verify_commands.all?{|x| x.class == DopCommon::Command}).to be true
53
+ end
54
+ it 'returns an empty array if nothing is specified' do
55
+ command = DopCommon::Command.new({})
56
+ expect(command.verify_commands).to be_an_instance_of Array
57
+ expect(command.verify_commands.length).to be 0
58
+ end
59
+ it 'throws an exception if the value is not correctly specified' do
60
+ command = DopCommon::Command.new({:verify_commands => 1})
61
+ expect{command.verify_commands}.to raise_error DopCommon::PlanParsingError
62
+ end
63
+ end
64
+
65
+ describe '#verify_after_run' do
66
+ it 'returns false if verify_after_run is not defined' do
67
+ command = DopCommon::Command.new({})
68
+ expect(command.verify_after_run).to be false
69
+ end
70
+ it 'returns the correct value if set correctly' do
71
+ command = DopCommon::Command.new({:verify_after_run => true})
72
+ expect(command.verify_after_run).to be true
73
+ command = DopCommon::Command.new({:verify_after_run => false})
74
+ expect(command.verify_after_run).to be false
75
+ end
76
+ it 'raises an exeption if the value is not valid' do
77
+ command = DopCommon::Command.new({:verify_after_run => 2})
78
+ expect{command.verify_after_run}.to raise_error DopCommon::PlanParsingError
79
+ end
80
+ end
81
+
82
+ end
83
+
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'securerandom'
3
+ require 'tempfile'
4
+
5
+ describe DopCommon::Credential do
6
+
7
+ describe '#type' do
8
+ it 'returns the type if specified correctly (username_password)' do
9
+ credential = DopCommon::Credential.new('test', {:type => :username_password, :username => 'a', :password => 'b'})
10
+ expect(credential.type).to eq :username_password
11
+ end
12
+ it 'returns the type if specified correctly (kerberos)' do
13
+ credential = DopCommon::Credential.new('test', {:type => :kerberos, :realm => 'a',})
14
+ expect(credential.type).to eq :kerberos
15
+ end
16
+ it 'returns the type if specified correctly (ssh_key)' do
17
+ credential = DopCommon::Credential.new('test', {:type => :ssh_key, :username => 'a', :private_key => 'spec/data/fake_keyfile'})
18
+ expect(credential.type).to eq :ssh_key
19
+ end
20
+ it 'will raise an exception if the type is missing' do
21
+ credential = DopCommon::Credential.new('test', {})
22
+ expect{credential.type}.to raise_error DopCommon::PlanParsingError
23
+ end
24
+ it 'will raise an exception if the type is not valid' do
25
+ credential = DopCommon::Credential.new('test', {:type => :non_existing_type})
26
+ expect{credential.type}.to raise_error DopCommon::PlanParsingError
27
+ end
28
+ end
29
+
30
+ [:username, :realm, :service].each do |key|
31
+ describe '#' + key.to_s do
32
+ it "returns a #{key} if one is correctly specified" do
33
+ credential = DopCommon::Credential.new('test', {key => 'a'})
34
+ expect(credential.send(key)).to eq 'a'
35
+ end
36
+ it "returns nil if #{key} is not specified" do
37
+ credential = DopCommon::Credential.new('test', {})
38
+ expect(credential.send(key)).to be nil
39
+ end
40
+ it "raises an exception if #{key} is not a string" do
41
+ credential = DopCommon::Credential.new('test', {key => []})
42
+ expect{credential.send(key)}.to raise_error DopCommon::PlanParsingError
43
+ end
44
+ end
45
+ end
46
+
47
+ [:password, :keytab, :public_key, :private_key].each do |key|
48
+ describe '#' + key.to_s do
49
+ it "returns the content if correctly specified as a string" do
50
+ credential = DopCommon::Credential.new('test', {key => 'my secret'})
51
+ expect(credential.send(key)).to eq 'my secret'
52
+ end
53
+ it 'returns the content if correctly specified as a file' do
54
+ key_file = Tempfile.new('secret_file', ENV['HOME'])
55
+ key_file.write("my secret")
56
+ key_file.close
57
+ credential = DopCommon::Credential.new('test', {key => {'file' => key_file.path}})
58
+ expect(credential.send(key)).to eq 'my secret'
59
+ key_file.delete
60
+ end
61
+ it "returns nil if #{key} is not specified" do
62
+ credential = DopCommon::Credential.new('test', {})
63
+ expect(credential.send(key)).to be nil
64
+ end
65
+ it "raises an exception if the file does not exist" do
66
+ credential = DopCommon::Credential.new('test', {key => {'file' => 'spec/data/nonexisting_keyfile'}})
67
+ expect{credential.send(key)}.to raise_error DopCommon::PlanParsingError
68
+ end
69
+ end
70
+ end
71
+
72
+ end
73
+
@@ -0,0 +1,165 @@
1
+ require 'spec_helper'
2
+
3
+ describe DopCommon::DataDisk do
4
+ before(:all) do
5
+ @infrastructures = {
6
+ 'rhev' => DopCommon::Infrastructure.new('rhev', {
7
+ 'type' => 'rhev'
8
+ }),
9
+ 'rhos' => DopCommon::Infrastructure.new('rhos', {
10
+ 'type' => 'rhos'
11
+ }),
12
+ 'baremetal' => DopCommon::Infrastructure.new('baremetal', {
13
+ 'type' => 'baremetal'
14
+ }),
15
+ 'vsphere' => DopCommon::Infrastructure.new('vsphere', {
16
+ 'type' => 'vsphere'
17
+ }),
18
+ }
19
+ end
20
+
21
+ describe '#pool' do
22
+ %w(rhev vsphere rhos baremetal).each do |provider|
23
+ properties = case provider
24
+ when 'rhos'; { 'tenant' => 'foo' }
25
+ when 'baremetal'; {}
26
+ else { 'datacenter' => 'foo', 'cluster' => 'bar' }
27
+ end
28
+ it "will return pool's name if specified properly for provider #{provider}" do
29
+ data_disk = DopCommon::DataDisk.new('foo',
30
+ { 'pool' => 'foo' },
31
+ {
32
+ :parsed_infrastructure => @infrastructures[provider],
33
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
34
+ properties,
35
+ @infrastructures[provider]
36
+ )
37
+ }
38
+ )
39
+ expect(data_disk.pool).to eq 'foo'
40
+ end
41
+ it "will return default pool's if specified properly for provider #{provider} " do
42
+ data_disk = DopCommon::DataDisk.new('foo', {},
43
+ {
44
+ :parsed_infrastructure => @infrastructures[provider],
45
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
46
+ properties.merge('default_pool' => 'bar'),
47
+ @infrastructures[provider]
48
+ )
49
+ }
50
+ )
51
+ expect(data_disk.pool).to eq 'bar'
52
+ end
53
+ it %w(rhos baremetal).include?(provider) ?
54
+ "will return nil if unspecified because it is optional for provider #{provider}" :
55
+ "will raise an error if unspecified because it is required for provider #{provider}" do
56
+ data_disk = DopCommon::DataDisk.new('foo', {},
57
+ {
58
+ :parsed_infrastructure => @infrastructures[provider],
59
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
60
+ properties,
61
+ @infrastructures[provider]
62
+ )
63
+ }
64
+ )
65
+ %w(rhos baremetal).include?(provider) ?
66
+ (expect(data_disk.pool).to eq nil) :
67
+ (expect{data_disk.pool}.to raise_error DopCommon::PlanParsingError)
68
+ end
69
+ [[], {}, :invalid, 2].each do |pool_val|
70
+ it "will raise an error if not specified properly" do
71
+ data_disk = DopCommon::DataDisk.new('foo',
72
+ { 'pool' => pool_val},
73
+ {
74
+ :parsed_infrastructure => @infrastructures[provider],
75
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
76
+ properties,
77
+ @infrastructures[provider]
78
+ )
79
+ }
80
+ )
81
+ expect{data_disk.pool}.to raise_error DopCommon::PlanParsingError
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#size' do
88
+ ['1000K', '1000M', '10G', '1000KB', '1000MB', '1000GB'].each do |size|
89
+ it 'will return DopCommon::Utils::DataSize object if specified properly' do
90
+ data_disk = DopCommon::DataDisk.new('foo',
91
+ { 'size' => size },
92
+ {
93
+ :parsed_infrastructure => @infrastructures['baremetal'],
94
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
95
+ {},
96
+ @infrastructures['baremetal']
97
+ )
98
+ }
99
+ )
100
+ expect(data_disk.size).to be_an_instance_of(DopCommon::Utils::DataSize)
101
+ end
102
+ end
103
+ [nil, [], {}].each do |size|
104
+ it 'will raise an exception if not specified properly' do
105
+ data_disk = DopCommon::DataDisk.new('foo',
106
+ { 'size' => size },
107
+ {
108
+ :parsed_infrastructure => @infrastructures['baremetal'],
109
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
110
+ {},
111
+ @infrastructures['baremetal']
112
+ )
113
+ }
114
+ )
115
+ expect{data_disk.size}.to raise_error DopCommon::PlanParsingError
116
+ end
117
+ end
118
+ end
119
+
120
+ describe '#thin?' do
121
+ it 'will return true if not explicitly defined' do
122
+ data_disk = DopCommon::DataDisk.new('foo',
123
+ {},
124
+ {
125
+ :parsed_infrastructure => @infrastructures['baremetal'],
126
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
127
+ {},
128
+ @infrastructures['baremetal']
129
+ )
130
+ }
131
+ )
132
+ expect(data_disk.thin?).to be true
133
+ end
134
+ [true, false].each do |thin_val|
135
+ it 'will return true or false if specified properly' do
136
+ data_disk = DopCommon::DataDisk.new('foo',
137
+ { 'thin' => thin_val },
138
+ {
139
+ :parsed_infrastructure => @infrastructures['baremetal'],
140
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
141
+ {},
142
+ @infrastructures['baremetal']
143
+ )
144
+ }
145
+ )
146
+ expect(data_disk.thin?).to be thin_val
147
+ end
148
+ end
149
+ end
150
+ ['true', 'false', nil, [], {}, :true, :false].each do |thin_val|
151
+ it "will raise an error if isn't specified properly" do
152
+ data_disk = DopCommon::DataDisk.new('foo',
153
+ { 'thin' => thin_val },
154
+ {
155
+ :parsed_infrastructure => @infrastructures['baremetal'],
156
+ :parsed_infrastructure_properties => DopCommon::InfrastructureProperties.new(
157
+ {},
158
+ @infrastructures['baremetal']
159
+ )
160
+ }
161
+ )
162
+ expect{data_disk.thin?}.to raise_error DopCommon::PlanParsingError
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe DopCommon::DNS do
4
+ describe '#name_servers' do
5
+ it "will return list of name servers' IP addresses if specified correctly" do
6
+ dns = DopCommon::DNS.new(nil)
7
+ expect(dns.name_servers).to eq([])
8
+ dns = DopCommon::DNS.new({'name_servers' => ['10.0.1.1', '172.16.2.1']})
9
+ expect(dns.name_servers).to eq(['10.0.1.1', '172.16.2.1'])
10
+ end
11
+ it 'will raise an exception of not specified properly' do
12
+ [nil, {}, [], 'aaa.bbb.ccc', '1.2.3.300'].each do |val|
13
+ dns = DopCommon::DNS.new({'name_servers' => val})
14
+ expect { dns.name_servers }.to raise_error DopCommon::PlanParsingError
15
+ end
16
+ end
17
+ end
18
+
19
+ describe '#search_domains' do
20
+ it "will return list of search domains if specified correctly" do
21
+ dns = DopCommon::DNS.new(nil)
22
+ expect(dns.search_domains).to eq([])
23
+ dns = DopCommon::DNS.new({'search_domains' => ['foo', 'foo.bar']})
24
+ expect(dns.search_domains).to eq(['foo', 'foo.bar'])
25
+ end
26
+ it 'will raise an exception of not specified properly' do
27
+ [nil, [], {}, '-foo.bar.baz', 'foo.b.c', 'f', 1].each do |val|
28
+ dns = DopCommon::DNS.new({'search_domains' => val})
29
+ expect { dns.search_domains }.to raise_error DopCommon::PlanParsingError
30
+ end
31
+ end
32
+ end
33
+ end