j-enc 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/bin/j-enc +12 -0
- data/j-enc.gemspec +28 -0
- data/j-enc.iml +24 -0
- data/lib/enc/builder.rb +28 -0
- data/lib/enc/cache/exceptions.rb +6 -0
- data/lib/enc/cache/node_cache.rb +57 -0
- data/lib/enc/cache.rb +2 -0
- data/lib/enc/collins_helper/api.rb +43 -0
- data/lib/enc/collins_helper/connection.rb +26 -0
- data/lib/enc/collins_helper/node/exceptions.rb +9 -0
- data/lib/enc/collins_helper/node/node_asset.rb +135 -0
- data/lib/enc/collins_helper/node.rb +2 -0
- data/lib/enc/collins_helper.rb +3 -0
- data/lib/enc/config.rb +63 -0
- data/lib/enc/runner.rb +58 -0
- data/lib/enc/utils/logging.rb +68 -0
- data/lib/enc/utils.rb +1 -0
- data/lib/enc/version.rb +3 -0
- data/lib/enc.rb +38 -0
- data/spec/api_spec.rb +42 -0
- data/spec/builder_spec.rb +43 -0
- data/spec/cli_helper.rb +22 -0
- data/spec/config_spec.rb +15 -0
- data/spec/connection_spec.rb +9 -0
- data/spec/enc_spec.rb +25 -0
- data/spec/factories/api.rb +60 -0
- data/spec/factories/builder.rb +27 -0
- data/spec/factories/cache.rb +9 -0
- data/spec/factories/config.rb +21 -0
- data/spec/factories/connection.rb +11 -0
- data/spec/factories/node_asset.rb +20 -0
- data/spec/factories/response.rb +49 -0
- data/spec/factories/runner.rb +19 -0
- data/spec/factories.rb +21 -0
- data/spec/features/external_request_spec.rb +9 -0
- data/spec/node_asset_spec.rb +54 -0
- data/spec/node_cache_spec.rb +25 -0
- data/spec/runner_spec.rb +41 -0
- data/spec/spec_helper.rb +52 -0
- data/spec/support/factory_girl.rb +8 -0
- data/spec/support/utils.rb +37 -0
- metadata +197 -0
data/lib/enc.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'enc/version'
|
2
|
+
require 'enc/utils'
|
3
|
+
require 'enc/cache'
|
4
|
+
require 'enc/config'
|
5
|
+
require 'enc/collins_helper'
|
6
|
+
require 'enc/runner'
|
7
|
+
require 'enc/builder'
|
8
|
+
|
9
|
+
module Enc
|
10
|
+
class << self
|
11
|
+
HELP_FLAGS = %w(-h --help)
|
12
|
+
|
13
|
+
include Enc::Utils::Logging
|
14
|
+
|
15
|
+
def run(args)
|
16
|
+
node = args[0]
|
17
|
+
config_file = args[1]
|
18
|
+
if not node
|
19
|
+
logger.fatal('ENC called with no arguments!')
|
20
|
+
usage
|
21
|
+
elsif HELP_FLAGS.include?(node)
|
22
|
+
usage
|
23
|
+
else
|
24
|
+
logger.info("Starting external node classifier for node #{node}")
|
25
|
+
runner = Runner.new(Enc::Config.new(config_file))
|
26
|
+
node_builder = runner.build(node)
|
27
|
+
puts node_builder.to_yaml
|
28
|
+
logger.info("Completed external node classifier for node #{node}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def usage
|
35
|
+
puts 'Usage: j-enc <fqdn> [config_file]'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/spec/api_spec.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'collins_client'
|
3
|
+
|
4
|
+
describe 'Collins API' do
|
5
|
+
it 'gets an asset' do
|
6
|
+
api = FactoryGirl.build(:api)
|
7
|
+
asset = api.safe_find(:hostname => FactoryDefaults::MOCK_ASSET_HOSTNAME,
|
8
|
+
:details => true)
|
9
|
+
expect(asset).to be_an_instance_of(Enc::CollinsHelper::Node::NodeAsset)
|
10
|
+
expect(asset.get_attribute('HOSTNAME')).to eq(FactoryDefaults::MOCK_ASSET_HOSTNAME)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'searches for missing asset' do
|
14
|
+
api = FactoryGirl.build(:api)
|
15
|
+
expect{api.safe_find(:hostname => 'missing', :details => true)}.
|
16
|
+
to raise_exception(Enc::CollinsHelper::Api::NoAssets, 'No assets found')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'seaches asset using invalid collins host' do
|
20
|
+
api = FactoryGirl.build(:api_timeout)
|
21
|
+
expect{api.safe_find(:hostname => FactoryDefaults::MOCK_ASSET_HOSTNAME, :details => true)}.
|
22
|
+
to raise_exception(Enc::CollinsHelper::Api::CannotConnect)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'seaches asset using invalid credentials' do
|
26
|
+
api = FactoryGirl.build(:api_unauthorized)
|
27
|
+
expect{api.safe_find(:hostname => FactoryDefaults::MOCK_ASSET_HOSTNAME, :details => true)}.
|
28
|
+
to raise_exception(Collins::AuthenticationError)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'seaches asset using invalid role' do
|
32
|
+
api = FactoryGirl.build(:api_forbidden)
|
33
|
+
expect{api.safe_find(:hostname => FactoryDefaults::MOCK_ASSET_HOSTNAME, :details => true)}.
|
34
|
+
to raise_exception(Collins::RequestError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'seaches asset and gets an unknown error' do
|
38
|
+
api = FactoryGirl.build(:api_error)
|
39
|
+
expect{api.safe_find(:hostname => FactoryDefaults::MOCK_ASSET_HOSTNAME, :details => true)}.
|
40
|
+
to raise_exception(Collins::RequestError)
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
describe 'ENC Builder' do
|
5
|
+
it 'builds the asset in yaml' do
|
6
|
+
node = FactoryGirl.build(:node_asset)
|
7
|
+
builder = FactoryGirl.build(:builder)
|
8
|
+
expect(builder.to_yaml).to be_an_instance_of(String)
|
9
|
+
expect(YAML.load(builder.to_yaml)).to be_an_instance_of(Hash)
|
10
|
+
expect(YAML.load(builder.to_yaml)['parameters']['deployment_environment']).to eq(node.get_deployment_environment)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'loads the asset from yaml' do
|
14
|
+
node = FactoryGirl.build(:node_asset)
|
15
|
+
builder = FactoryGirl.build(:builder)
|
16
|
+
expect(YAML.load(builder.to_yaml)).to be_an_instance_of(Hash)
|
17
|
+
expect(YAML.load(builder.to_yaml)['parameters']['deployment_environment']).to eq(node.get_deployment_environment)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'builds the required enc output when the enc is enabled' do
|
21
|
+
node = FactoryGirl.build(:node_asset)
|
22
|
+
builder = FactoryGirl.build(:builder)
|
23
|
+
expect(YAML.load(builder.to_yaml)).to be_an_instance_of(Hash)
|
24
|
+
expect(YAML.load(builder.to_yaml)['parameters']['deployment_environment']).to eq(node.get_deployment_environment)
|
25
|
+
expect(YAML.load(builder.to_yaml)['parameters']['datacenter']).to eq(node.get_datacenter)
|
26
|
+
expect(YAML.load(builder.to_yaml)['parameters']['roles']).to eq(node.get_roles)
|
27
|
+
expect(YAML.load(builder.to_yaml)['parameters']['role1']).to eq(node.get_roles_by_index[0])
|
28
|
+
expect(YAML.load(builder.to_yaml)['parameters']['role2']).to eq(node.get_roles_by_index[1])
|
29
|
+
expect(YAML.load(builder.to_yaml)['parameters']['role3']).to eq(node.get_roles_by_index[2])
|
30
|
+
expect(YAML.load(builder.to_yaml)['parameters']['collins']).to eq(node.get_flattened_attributes)
|
31
|
+
expect(YAML.load(builder.to_yaml)['parameters']['collins']['HOSTNAME']).to eq(node.get_hostname)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'builds the required enc output when the enc is not enabled' do
|
35
|
+
builder = FactoryGirl.build(:builder_enc_disabled)
|
36
|
+
expect(builder.to_yaml).to eq("--- ''\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'builds the required enc output when the asset does not exist' do
|
40
|
+
builder = FactoryGirl.build(:builder_blank_asset)
|
41
|
+
expect(builder.to_yaml).to eq("--- ''\n")
|
42
|
+
end
|
43
|
+
end
|
data/spec/cli_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.before do
|
3
|
+
ARGV.replace []
|
4
|
+
end
|
5
|
+
|
6
|
+
config.expect_with :rspec do |c|
|
7
|
+
c.syntax = :expect
|
8
|
+
end
|
9
|
+
|
10
|
+
def capture(stream)
|
11
|
+
begin
|
12
|
+
stream = stream.to_s
|
13
|
+
eval "$#{stream} = StringIO.new"
|
14
|
+
yield
|
15
|
+
result = eval("$#{stream}").string
|
16
|
+
ensure
|
17
|
+
eval("$#{stream} = #{stream.upcase}")
|
18
|
+
end
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'ENC Config' do
|
4
|
+
before :all do
|
5
|
+
@config = FactoryGirl.build(:config)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'sets a valid configuration' do
|
9
|
+
expect(@config.get('host')).to eq(FactoryDefaults::MOCK_COLLINS_URL)
|
10
|
+
expect(@config.get('username')).to eq(FactoryDefaults::MOCK_COLLINS_USERNAME)
|
11
|
+
expect(@config.get('password')).to eq(FactoryDefaults::MOCK_COLLINS_PASSWORD)
|
12
|
+
expect(@config.get('timeout')).to eq(FactoryDefaults::MOCK_COLLINS_TIMEOUT)
|
13
|
+
expect(@config.get('jive_enc_cache_dir')).to eq(FactoryDefaults::MOCK_ENC_CACHE_DIR)
|
14
|
+
end
|
15
|
+
end
|
data/spec/enc_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'cli_helper'
|
4
|
+
|
5
|
+
describe 'CLI' do
|
6
|
+
it 'runs with no arguments' do
|
7
|
+
expect(capture(:stdout) { Enc.run([]) }).to match("Usage: j-enc <fqdn> [config_file]\n")
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'runs with -h argument' do
|
11
|
+
expect(capture(:stdout) { Enc.run(['-h']) }).to match("Usage: j-enc <fqdn> [config_file]\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'runs with --help argument' do
|
15
|
+
expect(capture(:stdout) { Enc.run(['--help']) }).to eq("Usage: j-enc <fqdn> [config_file]\n")
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'runs with a valid argument' do
|
19
|
+
config = FactoryGirl.build(:config)
|
20
|
+
config.create!
|
21
|
+
expect(YAML.load((capture(:stdout) { Enc.run([FactoryDefaults::MOCK_ASSET_HOSTNAME,
|
22
|
+
config.config_file]) }))).to be_an_instance_of(Hash)
|
23
|
+
config.delete!
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'factories/config'
|
2
|
+
|
3
|
+
FactoryGirl.define do
|
4
|
+
factory :api, class: Enc::CollinsHelper::Api do
|
5
|
+
skip_create
|
6
|
+
|
7
|
+
config FactoryGirl.build(:config)
|
8
|
+
|
9
|
+
initialize_with { new(:host => config.get('host'),
|
10
|
+
:username => config.get('username'),
|
11
|
+
:password => config.get('password'),
|
12
|
+
:timeout => config.get('timeout'),
|
13
|
+
:strict => true) }
|
14
|
+
end
|
15
|
+
|
16
|
+
factory :api_timeout, class: Enc::CollinsHelper::Api do
|
17
|
+
skip_create
|
18
|
+
|
19
|
+
config FactoryGirl.build(:config, host: 'http://shouldneverexist99.jivehostedblah.com')
|
20
|
+
|
21
|
+
initialize_with { new(:host => config.get('host'),
|
22
|
+
:username => config.get('username'),
|
23
|
+
:password => config.get('password'),
|
24
|
+
:timeout => config.get('timeout'),
|
25
|
+
:strict => true) }
|
26
|
+
end
|
27
|
+
factory :api_unauthorized, class: Enc::CollinsHelper::Api do
|
28
|
+
skip_create
|
29
|
+
|
30
|
+
config FactoryGirl.build(:config, host: 'http://willreturn401.jivehostedblah.com')
|
31
|
+
|
32
|
+
initialize_with { new(:host => config.get('host'),
|
33
|
+
:username => config.get('username'),
|
34
|
+
:password => config.get('password'),
|
35
|
+
:timeout => config.get('timeout'),
|
36
|
+
:strict => true) }
|
37
|
+
end
|
38
|
+
factory :api_forbidden, class: Enc::CollinsHelper::Api do
|
39
|
+
skip_create
|
40
|
+
|
41
|
+
config FactoryGirl.build(:config, host: 'http://willreturn403.jivehostedblah.com')
|
42
|
+
|
43
|
+
initialize_with { new(:host => config.get('host'),
|
44
|
+
:username => config.get('username'),
|
45
|
+
:password => config.get('password'),
|
46
|
+
:timeout => config.get('timeout'),
|
47
|
+
:strict => true) }
|
48
|
+
end
|
49
|
+
factory :api_error, class: Enc::CollinsHelper::Api do
|
50
|
+
skip_create
|
51
|
+
|
52
|
+
config FactoryGirl.build(:config, host: 'http://willreturn500.jivehostedblah.com')
|
53
|
+
|
54
|
+
initialize_with { new(:host => config.get('host'),
|
55
|
+
:username => config.get('username'),
|
56
|
+
:password => config.get('password'),
|
57
|
+
:timeout => config.get('timeout'),
|
58
|
+
:strict => true) }
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'factories/node_asset'
|
2
|
+
|
3
|
+
FactoryGirl.define do
|
4
|
+
factory :builder, class: Enc::Builder do
|
5
|
+
skip_create
|
6
|
+
|
7
|
+
node_asset FactoryGirl.build(:node_asset)
|
8
|
+
|
9
|
+
initialize_with { new(node_asset) }
|
10
|
+
end
|
11
|
+
|
12
|
+
factory :builder_enc_disabled, class: Enc::Builder do
|
13
|
+
skip_create
|
14
|
+
|
15
|
+
node_asset FactoryGirl.build(:node_asset, puppet_enc: false)
|
16
|
+
|
17
|
+
initialize_with { new(node_asset) }
|
18
|
+
end
|
19
|
+
|
20
|
+
factory :builder_blank_asset, class: Enc::Builder do
|
21
|
+
skip_create
|
22
|
+
|
23
|
+
node_asset FactoryGirl.build(:node_asset_blank)
|
24
|
+
|
25
|
+
initialize_with { new(node_asset) }
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :config, class: Enc::Config do
|
3
|
+
skip_create
|
4
|
+
|
5
|
+
config_file FactoryDefaults::MOCK_ENC_CONF_DIR + '/collins.yaml'
|
6
|
+
host FactoryDefaults::MOCK_COLLINS_URL
|
7
|
+
username FactoryDefaults::MOCK_COLLINS_USERNAME
|
8
|
+
password FactoryDefaults::MOCK_COLLINS_PASSWORD
|
9
|
+
log_file FactoryDefaults::MOCK_ENC_LOG_DIR + '/enc.log'
|
10
|
+
log_level 'debug'
|
11
|
+
cache_dir FactoryDefaults::MOCK_ENC_CACHE_DIR
|
12
|
+
|
13
|
+
initialize_with { new(config_file, {:host => host,
|
14
|
+
:username => username,
|
15
|
+
:password => password,
|
16
|
+
:jive_enc_log_file => log_file,
|
17
|
+
:jive_enc_log_level => log_level,
|
18
|
+
:jive_enc_cache_dir => cache_dir}, false) }
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
factory :node_asset, class: Enc::CollinsHelper::Node::NodeAsset do
|
3
|
+
skip_create
|
4
|
+
|
5
|
+
tag FactoryDefaults::MOCK_ASSET_TAG
|
6
|
+
hostname FactoryDefaults::MOCK_ASSET_HOSTNAME
|
7
|
+
datacenter FactoryDefaults::MOCK_ASSET_DATACENTER
|
8
|
+
environment FactoryDefaults::MOCK_ASSET_ENVIRONMENT
|
9
|
+
puppet_environment FactoryDefaults::MOCK_ASSET_ENVIRONMENT
|
10
|
+
puppet_enc true
|
11
|
+
|
12
|
+
initialize_with { new.class.from_json(Utils.get_asset_data(tag, hostname, datacenter, environment,
|
13
|
+
puppet_environment, puppet_enc)
|
14
|
+
) }
|
15
|
+
end
|
16
|
+
|
17
|
+
factory :node_asset_blank, class: Enc::CollinsHelper::Node::NodeAsset do
|
18
|
+
skip_create
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'factories/node_asset'
|
2
|
+
|
3
|
+
FactoryGirl.define do
|
4
|
+
factory :collins_response, class: Hash do
|
5
|
+
skip_create
|
6
|
+
|
7
|
+
tag FactoryDefaults::MOCK_ASSET_TAG
|
8
|
+
hostname FactoryDefaults::MOCK_ASSET_HOSTNAME
|
9
|
+
datacenter FactoryDefaults::MOCK_ASSET_DATACENTER
|
10
|
+
environment FactoryDefaults::MOCK_ASSET_ENVIRONMENT
|
11
|
+
puppet_environment FactoryDefaults::MOCK_ASSET_ENVIRONMENT
|
12
|
+
puppet_enc true
|
13
|
+
|
14
|
+
initialize_with { ({ 'status' => 'success:ok',
|
15
|
+
'data' => { 'Pagination' => { 'PreviousPage' => 0,
|
16
|
+
'CurrentPage' => 0,
|
17
|
+
'NextPage' => 0,
|
18
|
+
'TotalResults' => 1},
|
19
|
+
'Data' => [Utils.get_asset_data(tag, hostname, datacenter, environment,
|
20
|
+
puppet_environment, puppet_enc)]}}
|
21
|
+
) }
|
22
|
+
end
|
23
|
+
|
24
|
+
factory :collins_response_headers, class: Hash do
|
25
|
+
skip_create
|
26
|
+
|
27
|
+
x_pagination_nextpage '0'
|
28
|
+
content_language 'en'
|
29
|
+
x_pagination_totalresults '1'
|
30
|
+
x_pagination_currentpage '0'
|
31
|
+
content_type 'application/json; charset=utf-8'
|
32
|
+
x_pagination_previouspage '0'
|
33
|
+
content_length '883'
|
34
|
+
via '1.1 collins.dev.jivehosted.com'
|
35
|
+
connection 'close'
|
36
|
+
|
37
|
+
initialize_with { ({
|
38
|
+
'x-pagination-nextpage' => [x_pagination_nextpage],
|
39
|
+
'content-language' => [content_language],
|
40
|
+
'x-pagination-totalresults' => [x_pagination_totalresults],
|
41
|
+
'x-pagination-currentpage' => [x_pagination_currentpage],
|
42
|
+
'content-type' => [content_type],
|
43
|
+
'x-pagination-previouspage' => [x_pagination_previouspage],
|
44
|
+
'content-length' => [content_length],
|
45
|
+
'via' => [via],
|
46
|
+
'connection' => [connection]}
|
47
|
+
) }
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'factories/config'
|
2
|
+
|
3
|
+
FactoryGirl.define do
|
4
|
+
factory :runner, class: Enc::Runner do
|
5
|
+
skip_create
|
6
|
+
|
7
|
+
config FactoryGirl.build(:config)
|
8
|
+
|
9
|
+
initialize_with { new(config) }
|
10
|
+
end
|
11
|
+
|
12
|
+
factory :runner_fallback, class: Enc::Runner do
|
13
|
+
skip_create
|
14
|
+
|
15
|
+
config FactoryGirl.build(:config, host: 'http://shouldneverexist99.jivehostedblah.com')
|
16
|
+
|
17
|
+
initialize_with { new(config) }
|
18
|
+
end
|
19
|
+
end
|
data/spec/factories.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'factory_girl'
|
2
|
+
require 'support/factory_girl'
|
3
|
+
|
4
|
+
module FactoryDefaults
|
5
|
+
MOCK_ASSET_TAG = 'jive-00001460'.freeze
|
6
|
+
MOCK_ASSET_HOSTNAME = 'cfgmgmt1.test1.jivehosted.com'.freeze
|
7
|
+
MOCK_ASSET_DATACENTER = 'jcadev'.freeze
|
8
|
+
MOCK_ASSET_ENVIRONMENT = 'dev'.freeze
|
9
|
+
MOCK_ASSET_PUPPET_ENVIRONMENT = 'production'.freeze
|
10
|
+
MOCK_COLLINS_HOST = 'collins.dev.jivehosted.com'.freeze
|
11
|
+
MOCK_COLLINS_URL = "http://#{MOCK_COLLINS_HOST}".freeze
|
12
|
+
MOCK_COLLINS_USERNAME = 'admin'.freeze
|
13
|
+
MOCK_COLLINS_PASSWORD = 'admin'.freeze
|
14
|
+
MOCK_COLLINS_TIMEOUT = 30.freeze
|
15
|
+
ROOT_SUPPORT_DIR = File.expand_path(File.dirname(__FILE__)).freeze
|
16
|
+
MOCK_ENC_CACHE_DIR = ROOT_SUPPORT_DIR + '/support/cache'.freeze
|
17
|
+
MOCK_ENC_CONF_DIR = ROOT_SUPPORT_DIR + '/support/conf'.freeze
|
18
|
+
MOCK_ENC_LOG_DIR = ROOT_SUPPORT_DIR + '/support/log'.freeze
|
19
|
+
end
|
20
|
+
|
21
|
+
Dir[File.dirname(__FILE__) + '/factories/*.rb'].each {|file| require file }
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Collins Node Asset' do
|
4
|
+
it 'should have hostname set' do
|
5
|
+
node = FactoryGirl.build(:node_asset)
|
6
|
+
expect(node.get_hostname).to eq(FactoryDefaults::MOCK_ASSET_HOSTNAME)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should have a datacenter set' do
|
10
|
+
node = FactoryGirl.build(:node_asset)
|
11
|
+
expect(node.get_datacenter).to eq('jcadev')
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should have a deployment_environmnet' do
|
15
|
+
node = FactoryGirl.build(:node_asset)
|
16
|
+
expect(node.get_deployment_environment).to eq('dev')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have a default puppet environment' do
|
20
|
+
node = FactoryGirl.build(:node_asset, puppet_environment: nil)
|
21
|
+
expect(node.get_puppet_environment).to eq('production')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should have a variable puppet environment' do
|
25
|
+
node = FactoryGirl.build(:node_asset, puppet_environment: 'fake_env')
|
26
|
+
expect(node.get_puppet_environment).to eq('fake_env')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'is a valid asset' do
|
30
|
+
node = FactoryGirl.build(:node_asset)
|
31
|
+
expect(node.is_valid?).to eq(true)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'is not a valid asset due to missing datacenter' do
|
35
|
+
node = FactoryGirl.build(:node_asset, datacenter: nil)
|
36
|
+
expect(node.is_valid?).to eq(false)
|
37
|
+
expect{node.get_datacenter}.to raise_exception(Enc::CollinsHelper::Node::NoDatacenter,
|
38
|
+
'The node does not have a data_center tag set')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'is not a valid asset due to missing deployment environment' do
|
42
|
+
node = FactoryGirl.build(:node_asset, environment: nil)
|
43
|
+
expect(node.is_valid?).to eq(false)
|
44
|
+
expect{node.get_deployment_environment}.to raise_exception(Enc::CollinsHelper::Node::NoDeploymentEnvironment,
|
45
|
+
'The node does not have an environment tag set')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'is not a valid asset due to missing hostname' do
|
49
|
+
node = FactoryGirl.build(:node_asset, hostname: nil)
|
50
|
+
expect(node.is_valid?).to eq(false)
|
51
|
+
expect{node.get_hostname}.to raise_exception(Enc::CollinsHelper::Node::NoHostname,
|
52
|
+
'The node does not have a hostname tag set')
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Node Asset Cache' do
|
4
|
+
before :all do
|
5
|
+
@cache = FactoryGirl.build(:node_cache)
|
6
|
+
@node = FactoryGirl.build(:node_asset)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'write cache' do
|
10
|
+
@cache.write(@node.get_hostname, @node)
|
11
|
+
expect(@cache.exists?(@node.get_hostname)).to eq(true)
|
12
|
+
@cache.delete!(@node.get_hostname)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'reads cache' do
|
16
|
+
@cache.write(@node.get_hostname, @node)
|
17
|
+
expect(@cache.read(@node.get_hostname).attributes).to eq(@node.attributes)
|
18
|
+
@cache.delete!(@node.get_hostname)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'delete cache' do
|
22
|
+
@cache.delete!(@node.get_hostname)
|
23
|
+
expect(@cache.exists?(@node.get_hostname)).to eq(false)
|
24
|
+
end
|
25
|
+
end
|
data/spec/runner_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'ENC Runner' do
|
4
|
+
before :all do
|
5
|
+
@config = FactoryGirl.build(:config)
|
6
|
+
@cache = FactoryGirl.build(:node_cache)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'gets an instance of the builder' do
|
10
|
+
node = FactoryGirl.build(:node_asset)
|
11
|
+
runner = FactoryGirl.build(:runner)
|
12
|
+
expect(runner.build(node.get_hostname)).to be_an_instance_of(Enc::Builder)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'gets an instance of the builder even if the asset does not have the puppet_enc tag set' do
|
16
|
+
runner = FactoryGirl.build(:runner)
|
17
|
+
node = FactoryGirl.build(:node_asset, puppet_enc: false)
|
18
|
+
expect(runner.build(node.get_hostname)).to be_an_instance_of(Enc::Builder)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'falls back to use cache when collins is unavailable' do
|
22
|
+
node = FactoryGirl.build(:node_asset)
|
23
|
+
runner = FactoryGirl.build(:runner_fallback)
|
24
|
+
@cache.write(node.get_hostname, node)
|
25
|
+
expect(@cache.exists?(node.get_hostname)).to eq(true)
|
26
|
+
expect(runner.build(node.get_hostname)).to be_an_instance_of(Enc::Builder)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'falls back to use cache when the asset does not exist' do
|
30
|
+
runner = FactoryGirl.build(:runner)
|
31
|
+
expect(runner.build('missing')).to be_an_instance_of(Enc::Builder)
|
32
|
+
expect(@cache.exists?('missing')).to eq(true)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'exits when neither collins nor the local cache is available' do
|
36
|
+
node = FactoryGirl.build(:node_asset)
|
37
|
+
runner = FactoryGirl.build(:runner_fallback)
|
38
|
+
expect{runner.build(node.get_hostname)}.to raise_exception(SystemExit)
|
39
|
+
expect(@cache.exists?(node.get_hostname)).to eq(false)
|
40
|
+
end
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'webmock/rspec'
|
2
|
+
require 'enc'
|
3
|
+
require 'json'
|
4
|
+
require 'factories'
|
5
|
+
|
6
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
good_response = FactoryGirl.build(:collins_response)
|
10
|
+
missing_asset_response = FactoryGirl.build(:collins_response, hostname: 'missing')
|
11
|
+
good_response_headers = FactoryGirl.build(:collins_response_headers)
|
12
|
+
|
13
|
+
config.before(:each) do
|
14
|
+
stub_request(:get, "#{FactoryDefaults::MOCK_COLLINS_USERNAME}:#{FactoryDefaults::MOCK_COLLINS_PASSWORD}@
|
15
|
+
#{FactoryDefaults::MOCK_COLLINS_HOST}
|
16
|
+
/api/assets?attribute=hostname%3B#{FactoryDefaults::MOCK_ASSET_HOSTNAME}&details=true").
|
17
|
+
to_return(status: 200,
|
18
|
+
body: good_response.to_json,
|
19
|
+
headers: good_response_headers
|
20
|
+
)
|
21
|
+
stub_request(:get, "#{FactoryDefaults::MOCK_COLLINS_USERNAME}:#{FactoryDefaults::MOCK_COLLINS_PASSWORD}@
|
22
|
+
#{FactoryDefaults::MOCK_COLLINS_HOST}
|
23
|
+
/api/assets?attribute=hostname%3Bmissing&details=true").
|
24
|
+
to_return(status: 200,
|
25
|
+
body: missing_asset_response.to_json,
|
26
|
+
headers: good_response_headers
|
27
|
+
)
|
28
|
+
stub_request(:get, FactoryDefaults::MOCK_COLLINS_URL).
|
29
|
+
to_return(status: 200,
|
30
|
+
body: 'response body',
|
31
|
+
headers: {}
|
32
|
+
)
|
33
|
+
stub_request(:any, /shouldneverexist99.jivehostedblah.com/).to_timeout
|
34
|
+
stub_request(:get, /willreturn401.jivehostedblah.com/).
|
35
|
+
to_return(status: 401)
|
36
|
+
stub_request(:get, /willreturn403.jivehostedblah.com/).
|
37
|
+
to_return(status: 403)
|
38
|
+
stub_request(:get, /willreturn500.jivehostedblah.com/).
|
39
|
+
to_return(status: 500)
|
40
|
+
|
41
|
+
FileUtils::mkdir_p(FactoryDefaults::MOCK_ENC_CACHE_DIR)
|
42
|
+
FileUtils::mkdir_p(FactoryDefaults::MOCK_ENC_CONF_DIR)
|
43
|
+
FileUtils::mkdir_p(FactoryDefaults::MOCK_ENC_LOG_DIR)
|
44
|
+
end
|
45
|
+
|
46
|
+
config.after(:each) do
|
47
|
+
FileUtils.rm_rf(FactoryDefaults::MOCK_ENC_CACHE_DIR)
|
48
|
+
FileUtils.rm_rf(FactoryDefaults::MOCK_ENC_CONF_DIR)
|
49
|
+
FileUtils.rm_rf(FactoryDefaults::MOCK_ENC_LOG_DIR)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|