interferon 0.1.0 → 0.1.3
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.
- checksums.yaml +7 -0
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +83 -0
- data/.travis.yml +4 -1
- data/bin/interferon +10 -9
- data/interferon.gemspec +18 -17
- data/lib/interferon/alert.rb +4 -10
- data/lib/interferon/alert_dsl.rb +12 -7
- data/lib/interferon/destinations/datadog.rb +103 -103
- data/lib/interferon/group_sources/filesystem.rb +5 -5
- data/lib/interferon/host_sources/aws_dynamo.rb +17 -19
- data/lib/interferon/host_sources/aws_elasticache.rb +20 -22
- data/lib/interferon/host_sources/aws_rds.rb +33 -33
- data/lib/interferon/host_sources/optica.rb +12 -10
- data/lib/interferon/host_sources/optica_services.rb +17 -15
- data/lib/interferon/host_sources/test_host_source.rb +1 -1
- data/lib/interferon/loaders.rb +4 -5
- data/lib/interferon/logging.rb +2 -3
- data/lib/interferon/version.rb +1 -1
- data/lib/interferon/work_hours_helper.rb +5 -5
- data/lib/interferon.rb +79 -80
- data/script/pre-commit +15 -20
- data/spec/fixtures/loaders/host_sources/test_host_source.rb +1 -1
- data/spec/fixtures/loaders/test_sources/order_test_source.rb +1 -1
- data/spec/fixtures/loaders/test_sources/test_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/order_test_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/secondary_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/test_source.rb +1 -2
- data/spec/helpers/logging_helper.rb +2 -2
- data/spec/helpers/mock_alert.rb +1 -1
- data/spec/helpers/optica_helper.rb +70 -70
- data/spec/lib/interferon/destinations/datadog_spec.rb +58 -59
- data/spec/lib/interferon/group_sources/filesystem_spec.rb +29 -24
- data/spec/lib/interferon/host_sources/optica_services_spec.rb +11 -9
- data/spec/lib/interferon/host_sources/optica_spec.rb +6 -3
- data/spec/lib/interferon/loaders_spec.rb +19 -15
- data/spec/lib/interferon_spec.rb +61 -59
- data/spec/lib/work_hours_helper_spec.rb +15 -15
- data/spec/spec_helper.rb +1 -1
- metadata +61 -65
@@ -1,93 +1,93 @@
|
|
1
1
|
class OpticaHelper
|
2
2
|
def self.example_node_1
|
3
3
|
{
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
4
|
+
'ip' => '10.1.1.1',
|
5
|
+
'environment' => 'production',
|
6
|
+
'role' => 'role1',
|
7
|
+
'hostname' => 'box1',
|
8
|
+
'uptime' => 37_335_310,
|
9
|
+
'az' => 'us-east-1a',
|
10
|
+
'security_groups' => ['internal'],
|
11
|
+
'instance_type' => 'm1.large',
|
12
|
+
'ami_id' => 'ami-d9d6a6b0',
|
13
|
+
'failed' => false,
|
14
|
+
'roles' => ['role1'],
|
15
|
+
'recipes' => ['airbnb-base', 'cookbook1'],
|
16
|
+
'synapse_services' => %w(service1 service2),
|
17
|
+
'nerve_services' => [],
|
18
|
+
'ownership' => {
|
19
|
+
'people' => ['test_user@example.com'],
|
20
|
+
'groups' => ['admins'],
|
21
21
|
},
|
22
|
-
|
22
|
+
'converger' => 'ben_hughes',
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.example_node_2
|
27
27
|
{
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
28
|
+
'ip' => '10.1.1.2',
|
29
|
+
'environment' => 'production',
|
30
|
+
'role' => 'role2',
|
31
|
+
'hostname' => 'box2',
|
32
|
+
'uptime' => 37_335_310,
|
33
|
+
'az' => 'us-east-1b',
|
34
|
+
'security_groups' => ['internal'],
|
35
|
+
'instance_type' => 'm1.large',
|
36
|
+
'ami_id' => 'ami-d9d6a6b0',
|
37
|
+
'failed' => false,
|
38
|
+
'roles' => ['role2'],
|
39
|
+
'recipes' => ['airbnb-base', 'cookbook2'],
|
40
|
+
'synapse_services' => [],
|
41
|
+
'nerve_services' => ['service1'],
|
42
|
+
'ownership' => {
|
43
|
+
'people' => ['test_user@example.com'],
|
44
|
+
'groups' => ['admins'],
|
45
45
|
},
|
46
|
-
|
46
|
+
'converger' => 'ben_hughes',
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
50
50
|
def self.example_node_3
|
51
51
|
{
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
52
|
+
'ip' => '10.1.1.3',
|
53
|
+
'environment' => 'production',
|
54
|
+
'role' => 'role3',
|
55
|
+
'hostname' => 'box3',
|
56
|
+
'uptime' => 37_335_310,
|
57
|
+
'az' => 'us-east-1b',
|
58
|
+
'security_groups' => ['internal'],
|
59
|
+
'instance_type' => 'm1.large',
|
60
|
+
'ami_id' => 'ami-d9d6a6b0',
|
61
|
+
'failed' => false,
|
62
|
+
'roles' => ['role3'],
|
63
|
+
'recipes' => ['airbnb-base', 'cookbook3'],
|
64
|
+
'synapse_services' => [],
|
65
|
+
'nerve_services' => ['service2'],
|
66
|
+
'converger' => 'ben_hughes',
|
67
67
|
}
|
68
68
|
end
|
69
69
|
|
70
70
|
def self.example_node_4
|
71
71
|
{
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
72
|
+
'ip' => '10.1.1.4',
|
73
|
+
'environment' => 'production',
|
74
|
+
'role' => 'role4',
|
75
|
+
'hostname' => 'box4',
|
76
|
+
'uptime' => 37_335_310,
|
77
|
+
'az' => 'us-east-1e',
|
78
|
+
'security_groups' => ['internal'],
|
79
|
+
'instance_type' => 'm1.large',
|
80
|
+
'ami_id' => 'ami-d9d6a6b0',
|
81
|
+
'failed' => false,
|
82
|
+
'roles' => ['role4'],
|
83
|
+
'recipes' => ['airbnb-base', 'cookbook4'],
|
84
|
+
'synapse_services' => [],
|
85
|
+
'nerve_services' => ['service1'],
|
86
|
+
'ownership' => {
|
87
|
+
'people' => ['test_user2@example.com'],
|
88
|
+
'groups' => ['engineers'],
|
89
89
|
},
|
90
|
-
|
90
|
+
'converger' => 'ben_hughes',
|
91
91
|
}
|
92
92
|
end
|
93
93
|
|
@@ -104,7 +104,7 @@ class OpticaHelper
|
|
104
104
|
{
|
105
105
|
'examined' => 3,
|
106
106
|
'returned' => 3,
|
107
|
-
'nodes' =>
|
107
|
+
'nodes' => example_nodes,
|
108
108
|
}
|
109
109
|
end
|
110
110
|
end
|
@@ -3,123 +3,122 @@ require 'interferon/destinations/datadog'
|
|
3
3
|
|
4
4
|
describe Interferon::Destinations::Datadog do
|
5
5
|
let(:retries) { 3 }
|
6
|
-
let(:datadog)
|
7
|
-
Interferon::Destinations::Datadog.new(
|
6
|
+
let(:datadog) do
|
7
|
+
Interferon::Destinations::Datadog.new(
|
8
8
|
'api_key' => 'TEST_API_KEY',
|
9
9
|
'app_key' => 'TEST_APP_KEY',
|
10
|
-
'retries' => retries
|
11
|
-
|
12
|
-
|
13
|
-
let(:datadog_dry_run)
|
14
|
-
Interferon::Destinations::Datadog.new(
|
10
|
+
'retries' => retries
|
11
|
+
)
|
12
|
+
end
|
13
|
+
let(:datadog_dry_run) do
|
14
|
+
Interferon::Destinations::Datadog.new(
|
15
15
|
'api_key' => 'TEST_API_KEY',
|
16
16
|
'app_key' => 'TEST_APP_KEY',
|
17
17
|
'retries' => retries,
|
18
|
-
'dry_run' => true
|
19
|
-
|
20
|
-
|
18
|
+
'dry_run' => true
|
19
|
+
)
|
20
|
+
end
|
21
21
|
let(:mock_alert_id) { 123 }
|
22
|
-
let(:mock_alert)
|
22
|
+
let(:mock_alert) do
|
23
23
|
{
|
24
24
|
'id' => [mock_alert_id],
|
25
25
|
'name' => 'Test Alert',
|
26
|
-
'message' =>
|
26
|
+
'message' => 'Test Message',
|
27
27
|
'metric' => { 'datadog_query' => 'avg:metric{*}' },
|
28
28
|
'silenced' => {},
|
29
29
|
'notify' => {},
|
30
30
|
}
|
31
|
-
|
32
|
-
let(:mock_people) {
|
33
|
-
let(:mock_response)
|
31
|
+
end
|
32
|
+
let(:mock_people) { %w(foo bar baz) }
|
33
|
+
let(:mock_response) do
|
34
34
|
{
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
'message' =>
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
}
|
43
|
-
}
|
35
|
+
'Test Alert' => {
|
36
|
+
'id' => 567,
|
37
|
+
'name' => 'Test Alert',
|
38
|
+
'message' => 'Test Message',
|
39
|
+
'query' => 'avg:metric{*}',
|
40
|
+
'options' => {
|
41
|
+
'silenced' => {},
|
42
|
+
},
|
43
|
+
},
|
44
44
|
}
|
45
|
-
|
45
|
+
end
|
46
46
|
|
47
|
-
describe
|
48
|
-
it
|
47
|
+
describe '.fetch_existing_alerts' do
|
48
|
+
it 'calls dogapi get_all_monitors' do
|
49
49
|
expect_any_instance_of(Dogapi::Client).to receive(:get_all_monitors).and_return([200, []])
|
50
|
-
datadog.
|
50
|
+
datadog.fetch_existing_alerts
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
describe
|
55
|
-
it
|
56
|
-
return_vals = [[400,
|
54
|
+
describe '.existing_alerts' do
|
55
|
+
it 'retries dogapi get_all_monitors' do
|
56
|
+
return_vals = [[400, '']] * (retries + 1)
|
57
57
|
expect_any_instance_of(Dogapi::Client).to receive(:get_all_monitors).and_return(*return_vals)
|
58
58
|
expect { datadog.existing_alerts }.to raise_error RuntimeError
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
describe
|
63
|
-
it
|
64
|
-
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200,
|
62
|
+
describe '.create_alert' do
|
63
|
+
it 'calls dogapi monitor' do
|
64
|
+
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200, ''])
|
65
65
|
expect(datadog).to receive(:existing_alerts).and_return({})
|
66
66
|
datadog.create_alert(mock_alert, mock_people)
|
67
67
|
end
|
68
68
|
|
69
|
-
it
|
70
|
-
expect_any_instance_of(Dogapi::Client).to receive(:update_monitor).and_return([200,
|
69
|
+
it 'calls dogapi update_monitor when alert name is found' do
|
70
|
+
expect_any_instance_of(Dogapi::Client).to receive(:update_monitor).and_return([200, ''])
|
71
71
|
expect(datadog).to receive(:existing_alerts).and_return(mock_response)
|
72
72
|
datadog.create_alert(mock_alert, mock_people)
|
73
73
|
end
|
74
74
|
|
75
|
-
it
|
76
|
-
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor).and_return([200,
|
77
|
-
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200,
|
78
|
-
mock_response[
|
75
|
+
it 'calls dogapi to delete and recreate when alert name is found' do
|
76
|
+
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor).and_return([200, ''])
|
77
|
+
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200, ''])
|
78
|
+
mock_response['Test Alert']['type'] = 'event_alert'
|
79
79
|
expect(datadog).to receive(:existing_alerts).and_return(mock_response)
|
80
80
|
datadog.create_alert(mock_alert, mock_people)
|
81
81
|
end
|
82
82
|
|
83
|
-
it
|
84
|
-
expect_any_instance_of(Dogapi::Client).to receive(:update_monitor).and_return([200,
|
85
|
-
expect_any_instance_of(Dogapi::Client).to receive(:unmute_monitor).and_return([200,
|
86
|
-
mock_response[
|
83
|
+
it 'calls dogapi to unmute when exiting alert is muted' do
|
84
|
+
expect_any_instance_of(Dogapi::Client).to receive(:update_monitor).and_return([200, ''])
|
85
|
+
expect_any_instance_of(Dogapi::Client).to receive(:unmute_monitor).and_return([200, ''])
|
86
|
+
mock_response['Test Alert']['options']['silenced'] = { '*' => nil }
|
87
87
|
expect(datadog).to receive(:existing_alerts).and_return(mock_response)
|
88
88
|
datadog.create_alert(mock_alert, mock_people)
|
89
89
|
end
|
90
90
|
|
91
|
-
it
|
92
|
-
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200,
|
91
|
+
it 'always calls monitor in dry-run' do
|
92
|
+
expect_any_instance_of(Dogapi::Client).to receive(:monitor).and_return([200, ''])
|
93
93
|
expect(datadog_dry_run).to receive(:existing_alerts).and_return(mock_response)
|
94
94
|
datadog_dry_run.create_alert(mock_alert, mock_people)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
describe
|
99
|
-
it
|
100
|
-
mock_alert[
|
101
|
-
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor)
|
102
|
-
with(mock_alert_id).and_return([200,
|
98
|
+
describe '.remove_alert' do
|
99
|
+
it 'calls dogapi delete_monitor with the correct alert id' do
|
100
|
+
mock_alert['message'] += Interferon::Destinations::Datadog::ALERT_KEY
|
101
|
+
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor)
|
102
|
+
.with(mock_alert_id).and_return([200, ''])
|
103
103
|
datadog.remove_alert(mock_alert)
|
104
104
|
end
|
105
105
|
|
106
|
-
it
|
107
|
-
mock_alert[
|
106
|
+
it 'does not call dogapi delete_monitor in dry_run' do
|
107
|
+
mock_alert['message'] += Interferon::Destinations::Datadog::ALERT_KEY
|
108
108
|
expect_any_instance_of(Dogapi::Client).to_not receive(:delete_monitor)
|
109
109
|
datadog_dry_run.remove_alert(mock_alert)
|
110
110
|
end
|
111
111
|
|
112
|
-
it
|
112
|
+
it 'does not call dogapi delete_monitor when ALERT_KEY is missing' do
|
113
113
|
expect_any_instance_of(Dogapi::Client).to_not receive(:delete_monitor)
|
114
114
|
datadog.remove_alert(mock_alert)
|
115
115
|
end
|
116
|
-
|
117
116
|
end
|
118
117
|
|
119
|
-
describe
|
120
|
-
it
|
121
|
-
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor)
|
122
|
-
with(mock_alert_id).and_return([200,
|
118
|
+
describe '.remove_alert_by_id' do
|
119
|
+
it 'calls dogapi delete_monitor' do
|
120
|
+
expect_any_instance_of(Dogapi::Client).to receive(:delete_monitor)
|
121
|
+
.with(mock_alert_id).and_return([200, ''])
|
123
122
|
datadog.remove_alert_by_id(mock_alert_id)
|
124
123
|
end
|
125
124
|
end
|
@@ -2,56 +2,61 @@ require 'spec_helper'
|
|
2
2
|
require 'interferon/group_sources/filesystem'
|
3
3
|
|
4
4
|
describe Interferon::GroupSources::Filesystem do
|
5
|
-
let
|
5
|
+
let(:fs_loader) { Interferon::GroupSources::Filesystem.new('paths' => ['/tmp']) }
|
6
6
|
|
7
7
|
describe 'list_groups' do
|
8
|
-
context
|
8
|
+
context 'with basic groups' do
|
9
9
|
before do
|
10
|
-
group_a = double
|
10
|
+
group_a = double
|
11
11
|
expect(File).to receive(:read).with('group_a.yaml').and_return('group_a_text')
|
12
12
|
expect(Psych).to receive(:parse).and_return(group_a)
|
13
|
-
expect(group_a).to receive(:to_ruby).and_return(
|
14
|
-
|
13
|
+
expect(group_a).to receive(:to_ruby).and_return('name' => 'group_a',
|
14
|
+
'people' => %w(Alice Bob))
|
15
15
|
|
16
|
-
group_b = double
|
16
|
+
group_b = double
|
17
17
|
expect(File).to receive(:read).with('group_b.yaml').and_return('group_b_text')
|
18
18
|
expect(Psych).to receive(:parse).and_return(group_b)
|
19
|
-
expect(group_b).to receive(:to_ruby).and_return(
|
20
|
-
|
19
|
+
expect(group_b).to receive(:to_ruby).and_return('name' => 'group_b',
|
20
|
+
'people' => %w(Carol Dave))
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'loads groups defined by YAML' do
|
24
24
|
expect(Dir).to receive(:glob).and_return(['group_a.yaml', 'group_b.yaml'].each)
|
25
25
|
|
26
|
-
groups = fs_loader.list_groups
|
27
|
-
expect(groups).to eq(
|
26
|
+
groups = fs_loader.list_groups
|
27
|
+
expect(groups).to eq('group_a' => %w(Alice Bob), 'group_b' => %w(Carol Dave))
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'allows groups to be aliased in YAML' do
|
31
|
-
expect(Dir).to receive(:glob).and_return(['group_a.yaml',
|
32
|
-
|
31
|
+
expect(Dir).to receive(:glob).and_return(['group_a.yaml',
|
32
|
+
'group_b.yaml',
|
33
|
+
'group_c.yaml',].each)
|
34
|
+
group_c = double
|
33
35
|
expect(File).to receive(:read).with('group_c.yaml').and_return('group_c_text')
|
34
36
|
expect(Psych).to receive(:parse).and_return(group_c)
|
35
|
-
expect(group_c).to receive(:to_ruby).and_return(
|
37
|
+
expect(group_c).to receive(:to_ruby).and_return('name' => 'group_c',
|
38
|
+
'alias_for' => 'group_b')
|
36
39
|
|
37
|
-
groups = fs_loader.list_groups
|
38
|
-
expect(groups).to eq(
|
39
|
-
|
40
|
-
|
40
|
+
groups = fs_loader.list_groups
|
41
|
+
expect(groups).to eq('group_a' => %w(Alice Bob),
|
42
|
+
'group_b' => %w(Carol Dave),
|
43
|
+
'group_c' => %w(Carol Dave))
|
41
44
|
end
|
42
45
|
|
43
46
|
it 'skips bad aliases in YAML' do
|
44
|
-
expect(Dir).to receive(:glob).and_return(['group_a.yaml',
|
45
|
-
|
47
|
+
expect(Dir).to receive(:glob).and_return(['group_a.yaml',
|
48
|
+
'group_b.yaml',
|
49
|
+
'group_c.yaml',].each)
|
50
|
+
group_c = double
|
46
51
|
expect(File).to receive(:read).with('group_c.yaml').and_return('group_c_text')
|
47
52
|
expect(Psych).to receive(:parse).and_return(group_c)
|
48
|
-
expect(group_c).to receive(:to_ruby).and_return(
|
53
|
+
expect(group_c).to receive(:to_ruby).and_return('name' => 'group_c',
|
54
|
+
'alias_for' => 'group_d')
|
49
55
|
|
50
|
-
groups = fs_loader.list_groups
|
51
|
-
expect(groups).to eq(
|
52
|
-
|
56
|
+
groups = fs_loader.list_groups
|
57
|
+
expect(groups).to eq('group_a' => %w(Alice Bob),
|
58
|
+
'group_b' => %w(Carol Dave))
|
53
59
|
end
|
54
60
|
end
|
55
61
|
end
|
56
|
-
|
57
62
|
end
|
@@ -3,7 +3,7 @@ require 'helpers/optica_helper'
|
|
3
3
|
require 'interferon/host_sources/optica_services'
|
4
4
|
|
5
5
|
describe Interferon::HostSources::OpticaServices do
|
6
|
-
let(:optica_services) { Interferon::HostSources::OpticaServices.new(
|
6
|
+
let(:optica_services) { Interferon::HostSources::OpticaServices.new('host' => '127.0.0.1') }
|
7
7
|
|
8
8
|
describe '.list_hosts' do
|
9
9
|
before do
|
@@ -11,8 +11,8 @@ describe Interferon::HostSources::OpticaServices do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:list) { optica_services.list_hosts }
|
14
|
-
let(:service1) { list.select{|s| s[:service] == 'service1'}[0] }
|
15
|
-
let(:service2) { list.select{|s| s[:service] == 'service2'}[0] }
|
14
|
+
let(:service1) { list.select { |s| s[:service] == 'service1' }[0] }
|
15
|
+
let(:service2) { list.select { |s| s[:service] == 'service2' }[0] }
|
16
16
|
|
17
17
|
it 'returns both of the services we know about' do
|
18
18
|
expect(list.length).to eq(2)
|
@@ -27,7 +27,7 @@ describe Interferon::HostSources::OpticaServices do
|
|
27
27
|
:owner_groups,
|
28
28
|
:consumer_roles,
|
29
29
|
:consumer_machine_count,
|
30
|
-
:provider_machine_count
|
30
|
+
:provider_machine_count
|
31
31
|
)
|
32
32
|
end
|
33
33
|
end
|
@@ -38,8 +38,11 @@ describe Interferon::HostSources::OpticaServices do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'knows that box1 is using both of the services' do
|
41
|
-
expect(list).to satisfy
|
42
|
-
|
41
|
+
expect(list).to satisfy do |l|
|
42
|
+
l.all? do |s|
|
43
|
+
s[:consumer_machine_count] == 1 && s[:consumer_roles] == ['role1']
|
44
|
+
end
|
45
|
+
end
|
43
46
|
end
|
44
47
|
|
45
48
|
it 'knows that service1 is provided by two machines' do
|
@@ -48,13 +51,12 @@ describe Interferon::HostSources::OpticaServices do
|
|
48
51
|
|
49
52
|
it 'merges the ownership for all machines that provide service1' do
|
50
53
|
all_owners = OpticaHelper.example_node_2['ownership']['people'] +
|
51
|
-
|
54
|
+
OpticaHelper.example_node_4['ownership']['people']
|
52
55
|
all_owner_groups = OpticaHelper.example_node_2['ownership']['groups'] +
|
53
|
-
|
56
|
+
OpticaHelper.example_node_4['ownership']['groups']
|
54
57
|
|
55
58
|
expect(service1[:owners]).to contain_exactly(*all_owners)
|
56
59
|
expect(service1[:owner_groups]).to contain_exactly(*all_owner_groups)
|
57
60
|
end
|
58
61
|
end
|
59
62
|
end
|
60
|
-
|
@@ -3,7 +3,7 @@ require 'helpers/optica_helper'
|
|
3
3
|
require 'interferon/host_sources/optica'
|
4
4
|
|
5
5
|
describe Interferon::HostSources::Optica do
|
6
|
-
let(:optica) { Interferon::HostSources::Optica.new(
|
6
|
+
let(:optica) { Interferon::HostSources::Optica.new('host' => '127.0.0.1') }
|
7
7
|
|
8
8
|
describe '.list_hosts' do
|
9
9
|
before do
|
@@ -23,8 +23,11 @@ describe Interferon::HostSources::Optica do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'does not barf if ownership info is missing' do
|
26
|
-
expect(list).to satisfy
|
26
|
+
expect(list).to satisfy do |l|
|
27
|
+
l.one? do |h|
|
28
|
+
h[:owners].empty? && h[:owner_groups].empty?
|
29
|
+
end
|
30
|
+
end
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end
|
30
|
-
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'helpers/loader_helper'
|
3
3
|
|
4
4
|
describe 'DynamicLoader' do
|
5
5
|
describe 'custom class retrieval' do
|
@@ -10,7 +10,7 @@ describe 'DynamicLoader' do
|
|
10
10
|
|
11
11
|
it 'throws an ArgumentError when the type cannot be found' do
|
12
12
|
test_loader = TestLoader.new(['./spec/fixtures/loaders'])
|
13
|
-
expect{test_loader.get_klass('unknown_source')}.to raise_error(ArgumentError)
|
13
|
+
expect { test_loader.get_klass('unknown_source') }.to raise_error(ArgumentError)
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'looks at custom paths in order' do
|
@@ -53,22 +53,25 @@ describe 'DynamicLoader' do
|
|
53
53
|
it 'returns an instance for each enabled source' do
|
54
54
|
instances = loader.get_all(
|
55
55
|
[
|
56
|
-
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
57
|
-
{'type' => 'secondary_source', 'enabled' => true, 'options' => {}},
|
58
|
-
]
|
56
|
+
{ 'type' => 'test_source', 'enabled' => true, 'options' => {} },
|
57
|
+
{ 'type' => 'secondary_source', 'enabled' => true, 'options' => {} },
|
58
|
+
]
|
59
|
+
)
|
59
60
|
|
60
61
|
expect(instances.count).to eq(2)
|
61
62
|
expect(instances).to contain_exactly(
|
62
63
|
an_instance_of(Interferon::TestSources::TestSource),
|
63
|
-
an_instance_of(Interferon::TestSources::SecondarySource)
|
64
|
+
an_instance_of(Interferon::TestSources::SecondarySource)
|
65
|
+
)
|
64
66
|
end
|
65
67
|
|
66
68
|
it 'ignores non-enabled sources' do
|
67
69
|
instances = loader.get_all(
|
68
70
|
[
|
69
|
-
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
70
|
-
{'type' => 'secondary_source', 'enabled' => false, 'options' => {}},
|
71
|
-
]
|
71
|
+
{ 'type' => 'test_source', 'enabled' => true, 'options' => {} },
|
72
|
+
{ 'type' => 'secondary_source', 'enabled' => false, 'options' => {} },
|
73
|
+
]
|
74
|
+
)
|
72
75
|
|
73
76
|
expect(instances.count).to eq(1)
|
74
77
|
expect(instances).to contain_exactly(an_instance_of(Interferon::TestSources::TestSource))
|
@@ -77,9 +80,10 @@ describe 'DynamicLoader' do
|
|
77
80
|
it 'ignores sources with no type set' do
|
78
81
|
instances = loader.get_all(
|
79
82
|
[
|
80
|
-
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
81
|
-
{'enabled' => true, 'options' => {}},
|
82
|
-
]
|
83
|
+
{ 'type' => 'test_source', 'enabled' => true, 'options' => {} },
|
84
|
+
{ 'enabled' => true, 'options' => {} },
|
85
|
+
]
|
86
|
+
)
|
83
87
|
|
84
88
|
expect(instances.count).to eq(1)
|
85
89
|
expect(instances).to contain_exactly(an_instance_of(Interferon::TestSources::TestSource))
|
@@ -87,10 +91,10 @@ describe 'DynamicLoader' do
|
|
87
91
|
|
88
92
|
it 'properly sets options on classes it instantiates' do
|
89
93
|
instances = loader.get_all(
|
90
|
-
[{'type' => 'test_source', 'enabled' => true, 'options' => {'testval' => 5}}]
|
94
|
+
[{ 'type' => 'test_source', 'enabled' => true, 'options' => { 'testval' => 5 } }]
|
95
|
+
)
|
91
96
|
|
92
97
|
expect(instances[0].testval).to eq(5)
|
93
98
|
end
|
94
99
|
end
|
95
|
-
|
96
100
|
end
|