outliers 0.3.3 → 0.5.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/README.md +21 -17
  4. data/lib/outliers/{credentials.rb → account.rb} +4 -4
  5. data/lib/outliers/cli/process.rb +53 -15
  6. data/lib/outliers/cli.rb +1 -1
  7. data/lib/outliers/collection.rb +24 -18
  8. data/lib/outliers/evaluation.rb +60 -32
  9. data/lib/outliers/exceptions.rb +10 -1
  10. data/lib/outliers/filters/aws/ec2/tags.rb +2 -2
  11. data/lib/outliers/handlers/json.rb +36 -0
  12. data/lib/outliers/handlers/outliers_api.rb +62 -0
  13. data/lib/outliers/handlers.rb +1 -0
  14. data/lib/outliers/provider.rb +7 -7
  15. data/lib/outliers/resources/aws/ec2/instance.rb +1 -1
  16. data/lib/outliers/resources/aws/elb/load_balancer.rb +1 -1
  17. data/lib/outliers/resources/aws/rds/db_instance.rb +1 -1
  18. data/lib/outliers/resources/aws/s3/bucket_collection.rb +1 -1
  19. data/lib/outliers/result.rb +32 -8
  20. data/lib/outliers/run.rb +9 -3
  21. data/lib/outliers/verifications/shared.rb +2 -2
  22. data/lib/outliers/version.rb +1 -1
  23. data/lib/outliers.rb +2 -1
  24. data/outliers.gemspec +1 -1
  25. data/reference.yaml +10 -10
  26. data/shared.yaml +1 -1
  27. data/spec/{credentials_spec.rb → account_spec.rb} +7 -7
  28. data/spec/collection_spec.rb +48 -7
  29. data/spec/evaluation_spec.rb +109 -47
  30. data/spec/fixtures/{credentials1.yml → account1.yml} +1 -1
  31. data/spec/fixtures/{credentials2.yml → account2.yml} +1 -1
  32. data/spec/handlers/outliers_api_spec.rb +61 -0
  33. data/spec/info_spec.rb +2 -2
  34. data/spec/provider_spec.rb +9 -9
  35. data/spec/results_spec.rb +65 -16
  36. data/spec/run_spec.rb +4 -4
  37. data/spec/spec_helper.rb +3 -3
  38. data/spec/verifications/shared_spec.rb +3 -3
  39. metadata +18 -13
@@ -1,11 +1,11 @@
1
1
  module Outliers
2
2
  class Provider
3
3
 
4
- attr_reader :credentials
4
+ attr_reader :account
5
5
 
6
- def self.connect_to(credentials)
7
- provider = credentials.fetch 'provider'
8
- Outliers::Providers.name_map.fetch(provider).new credentials
6
+ def self.connect_to(account)
7
+ provider = account.fetch 'provider'
8
+ Outliers::Providers.name_map.fetch(provider).new account
9
9
  rescue KeyError
10
10
  raise Outliers::Exceptions::UnknownProvider.new "Unkown provider '#{provider.join('_').downcase}'."
11
11
  end
@@ -14,10 +14,10 @@ module Outliers
14
14
  (self.to_s.split('::') - ['Outliers', 'Providers']).map { |p| p.underscore }.join('_').downcase
15
15
  end
16
16
 
17
- def initialize(credentials)
18
- @credentials = credentials
17
+ def initialize(account)
18
+ @account = account
19
19
  @logger = Outliers.logger
20
- settings credentials.keys_to_sym
20
+ settings account.keys_to_sym
21
21
  end
22
22
 
23
23
  def logger
@@ -25,7 +25,7 @@ module Outliers
25
25
  end
26
26
 
27
27
  def valid_image_id?(args)
28
- image_ids = Array(args[:image_ids])
28
+ image_ids = Array(args)
29
29
 
30
30
  logger.debug "Verifying Image ID '#{image_id}' is one of '#{image_ids.join(', ')}'."
31
31
  image_ids.include? image_id
@@ -5,7 +5,7 @@ module Outliers
5
5
  class LoadBalancer < Resource
6
6
 
7
7
  def ssl_certificates_valid?(args)
8
- days = args[:days]
8
+ days = args
9
9
  pass = true
10
10
 
11
11
  logger.debug "Load Balancer '#{id}' has no certificates." unless certificates.any?
@@ -8,7 +8,7 @@ module Outliers
8
8
  end
9
9
 
10
10
  def backup_retention_period?(args)
11
- days = args[:days]
11
+ days = args
12
12
 
13
13
  current = source.backup_retention_period
14
14
  logger.debug "Verifying '#{id}' retention period of '#{current}' equals '#{days}' days."
@@ -5,7 +5,7 @@ module Outliers
5
5
  class BucketCollection < Collection
6
6
 
7
7
  def load_all
8
- unless provider.credentials['region'] == 'us-east-1'
8
+ unless provider.account['region'] == 'us-east-1'
9
9
  raise Exceptions::UnsupportedRegion.new "Bucket verifications must target region us-east-1."
10
10
  end
11
11
  connect.buckets.map {|r| resource_class.new r}
@@ -1,18 +1,34 @@
1
+ require 'json'
2
+
1
3
  module Outliers
2
4
  class Result
3
5
 
4
- attr_reader :evaluation, :failing_resources, :passing_resources, :resource, :verification
6
+ attr_reader :account_name, :arguments, :failing_resources, :name, :passing_resources,
7
+ :provider_name, :resource_name, :verification_name
8
+
9
+ def to_json
10
+ to_hash.to_json
11
+ end
12
+
13
+ def to_hash
14
+ { 'account_name' => account_name,
15
+ 'arguments' => arguments,
16
+ 'name' => name,
17
+ 'provider_name' => provider_name,
18
+ 'resource_name' => resource_name,
19
+ 'verification_name' => verification_name,
20
+ 'resources' => resources }
21
+ end
5
22
 
6
23
  def initialize(args)
7
- @evaluation = args[:evaluation]
24
+ @account_name = args[:account_name]
25
+ @arguments = args[:arguments]
8
26
  @failing_resources = args[:failing_resources]
27
+ @name = args[:name] || 'unspecified'
9
28
  @passing_resources = args[:passing_resources]
10
- @resource = args[:resource]
11
- @verification = args[:verification]
12
- end
13
-
14
- def to_s
15
- passed? ? 'passed' : 'failed'
29
+ @provider_name = args[:provider_name]
30
+ @resource_name = args[:resource_name]
31
+ @verification_name = args[:verification_name]
16
32
  end
17
33
 
18
34
  def passed?
@@ -23,5 +39,13 @@ module Outliers
23
39
  @failing_resources.any?
24
40
  end
25
41
 
42
+ private
43
+
44
+ def resources
45
+ r = passing_resources.map{|r| { 'id' => r.id, 'passing' => 1 } }
46
+ r += failing_resources.map{|r| { 'id' => r.id, 'passing' => 0 } }
47
+ r
48
+ end
49
+
26
50
  end
27
51
  end
data/lib/outliers/run.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Outliers
2
2
  class Run
3
- attr_accessor :credentials, :results, :threads, :threaded, :thread_count
3
+ attr_accessor :account, :results, :threads, :threaded, :thread_count
4
4
 
5
5
  def initialize(options={})
6
6
  @results = []
@@ -29,14 +29,20 @@ module Outliers
29
29
 
30
30
  evaluation = Proc.new { Evaluation.new(:name => name, :run => self).instance_eval &block }
31
31
 
32
+ if name
33
+ logger.info "Loading evaluation '#{name}'."
34
+ else
35
+ logger.info "Loading unnamed evaluation."
36
+ end
37
+
32
38
  threaded ? threads << Thread.new { evaluation.call } : evaluation.call
33
39
  end
34
40
 
35
- def passed
41
+ def passing_results
36
42
  @results.select {|r| r.passed?}
37
43
  end
38
44
 
39
- def failed
45
+ def failing_results
40
46
  @results.reject {|r| r.passed?}
41
47
  end
42
48
 
@@ -7,8 +7,8 @@ module Outliers
7
7
  end
8
8
 
9
9
  def equals?(args)
10
- keys = Array(args[:keys])
11
- logger.debug "Verifying '#{list.join(',')}' equals '#{list.empty? ? 'no resources' : list_by_key.join(',')}'."
10
+ keys = Array(args)
11
+ logger.debug "Verifying '#{keys.join(',')}' equals '#{list.empty? ? 'no resources' : list_by_key.join(',')}'."
12
12
  list.reject {|r| keys.include? r.id}
13
13
  end
14
14
 
@@ -1,3 +1,3 @@
1
1
  module Outliers
2
- VERSION = "0.3.3"
2
+ VERSION = "0.5.0.beta1"
3
3
  end
data/lib/outliers.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  require "outliers/mixins.rb"
2
2
  require "outliers/verifications"
3
3
 
4
+ require "outliers/account"
4
5
  require "outliers/collection"
5
- require "outliers/credentials"
6
6
  require "outliers/info"
7
7
  require "outliers/exceptions"
8
8
  require "outliers/evaluation"
9
9
  require "outliers/filters"
10
+ require "outliers/handlers"
10
11
  require "outliers/provider"
11
12
  require "outliers/providers"
12
13
  require "outliers/resource"
data/outliers.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["brett@weav.net"]
11
11
  spec.description = %q{Configuraiton verification framework.}
12
12
  spec.summary = %q{Configuration verification framework.}
13
- spec.homepage = "https://github.com/brettweavnet/outliers"
13
+ spec.homepage = "http://www.getoutliers.com/documentation"
14
14
  spec.license = "Apache2"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
data/reference.yaml CHANGED
@@ -1,5 +1,5 @@
1
1
  aws_cloud_formation:
2
- credentials:
2
+ account:
3
3
  access_key_id: AWS Account Access Key
4
4
  secret_access_key: AWS Account Secret Key
5
5
  region: AWS Region
@@ -10,7 +10,7 @@ aws_cloud_formation:
10
10
  verifications: {}
11
11
 
12
12
  aws_ec2:
13
- credentials:
13
+ account:
14
14
  access_key_id: AWS Account Access Key
15
15
  secret_access_key: AWS Account Secret Key
16
16
  region: AWS Region
@@ -30,7 +30,7 @@ aws_ec2:
30
30
  description: Instance status is running.
31
31
  valid_image_id:
32
32
  description: ami_ids=ami_id1,ami_id2 - Instances Image ID (AMI) is in given list.
33
- args: 'image_ids: [IMAGE_ID1, IMAGEID2]'
33
+ args: '[IMAGE_ID1, IMAGEID2]'
34
34
  vpc:
35
35
  description: Instance is in a VPC.
36
36
  security_group:
@@ -45,7 +45,7 @@ aws_ec2:
45
45
  verifications: {}
46
46
 
47
47
  aws_elb:
48
- credentials:
48
+ account:
49
49
  access_key_id: AWS Account Access Key
50
50
  secret_access_key: AWS Account Secret Key
51
51
  region: AWS Region
@@ -56,10 +56,10 @@ aws_elb:
56
56
  verifications:
57
57
  ssl_certificates_valid:
58
58
  description: Validates all SSL certificates associated with an ELB are valid for given number of days.
59
- args: 'days: DAYS'
59
+ args: 'DAYS'
60
60
 
61
61
  aws_iam:
62
- credentials:
62
+ account:
63
63
  access_key_id: AWS Account Access Key
64
64
  secret_access_key: AWS Account Secret Key
65
65
  region: AWS Region
@@ -76,7 +76,7 @@ aws_iam:
76
76
  description: Verify password not set for user.
77
77
 
78
78
  aws_rds:
79
- credentials:
79
+ account:
80
80
  access_key_id: AWS Account Access Key
81
81
  secret_access_key: AWS Account Secret Key
82
82
  region: AWS Region
@@ -87,7 +87,7 @@ aws_rds:
87
87
  verifications:
88
88
  backup_retention_period:
89
89
  description: Validate the backup retention period equals given days for the db_instance.
90
- args: 'days: DAYS'
90
+ args: 'DAYS'
91
91
  multi_az:
92
92
  description: RDS Multi AZ set to yes.
93
93
  db_snapshot:
@@ -96,7 +96,7 @@ aws_rds:
96
96
  verifications: {}
97
97
 
98
98
  aws_s3:
99
- credentials:
99
+ account:
100
100
  access_key_id: AWS Account Access Key
101
101
  secret_access_key: AWS Account Secret Key
102
102
  region: AWS Region
@@ -115,7 +115,7 @@ aws_s3:
115
115
  description: Bucket is not configured as a website.
116
116
 
117
117
  aws_sqs:
118
- credentials:
118
+ account:
119
119
  access_key_id: AWS Account Access Key
120
120
  secret_access_key: AWS Account Secret Key
121
121
  region: AWS Region
data/shared.yaml CHANGED
@@ -3,4 +3,4 @@ verifications:
3
3
  description: No resources exist.
4
4
  equals:
5
5
  description: Verify the list of resource mataches the given list of keys.
6
- args: 'keys: [RESOURCE_ID1, RESOURCE_ID2]'
6
+ args: '[RESOURCE_ID1, RESOURCE_ID2]'
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Outliers::Credentials do
4
- subject { Outliers::Credentials }
5
- let(:credentials1) { fixture_file 'credentials1.yml' }
6
- let(:credentials2) { fixture_file 'credentials2.yml' }
3
+ describe Outliers::Account do
4
+ subject { Outliers::Account }
5
+ let(:account1) { fixture_file 'account1.yml' }
6
+ let(:account2) { fixture_file 'account2.yml' }
7
7
 
8
8
  context "#load_from_file" do
9
- it "should load the credentials from the given yaml file" do
10
- File.should_receive(:read).with('/home/user/outliers.yml').and_return credentials1
11
- results = { "test_credentials_1" =>
9
+ it "should load the account from the given yaml file" do
10
+ File.should_receive(:read).with('/home/user/outliers.yml').and_return account1
11
+ results = { "test_account_1" =>
12
12
  { "region" => "us-west-1",
13
13
  "provider" => "aws_ec2",
14
14
  "access_key_id" => "01234567890123456789",
@@ -4,6 +4,7 @@ describe Outliers::Collection do
4
4
  let(:provider) { mock 'provider' }
5
5
  let(:resource1) { mock 'resource1' }
6
6
  let(:resource2) { mock 'resource2' }
7
+ let(:resource3) { mock 'resource3' }
7
8
 
8
9
  subject { Outliers::Collection.new provider }
9
10
 
@@ -12,7 +13,7 @@ describe Outliers::Collection do
12
13
  resource1.stub name: 'resource1', key: 'name', id: 'resource1'
13
14
  resource2.stub name: 'resource2', key: 'name', id: 'resource2'
14
15
  subject.stub :load_all => [resource1, resource2],
15
- :class => Outliers::Resources::Aws::Ec2::SecurityGroupCollection
16
+ :class => Outliers::Resources::Aws::Ec2::SecurityGroupCollection
16
17
  end
17
18
 
18
19
  context "#to_human" do
@@ -36,16 +37,56 @@ describe Outliers::Collection do
36
37
  end
37
38
 
38
39
  context "#filter" do
39
- it "should apply the given filter to resources" do
40
+ before do
41
+ subject.instance_variable_set(:@list, [resource1, resource2, resource3])
42
+ end
43
+
44
+ it "should include resources matched by include filter" do
40
45
  subject.should_receive('filter_tag').with('Name:test123').and_return [resource1]
41
- subject.filter 'tag' => 'Name:test123'
46
+ subject.filter 'include', tag: 'Name:test123'
42
47
  expect(subject.list).to eq([resource1])
43
48
  end
44
49
 
50
+ it "should exclude resources matched by exclude filter" do
51
+ subject.should_receive('filter_tag').with('Name:test123').and_return [resource1]
52
+ subject.filter 'exclude', tag: 'Name:test123'
53
+ expect(subject.list).to eq([resource2, resource3])
54
+ end
55
+
56
+ it "should apply multiple exclude filters" do
57
+ subject.should_receive('filter_tag').with('Name:test123').and_return [resource1]
58
+ subject.should_receive('filter_tag').with('Name:test321').and_return [resource2]
59
+ subject.filter 'exclude', tag: 'Name:test123'
60
+ subject.filter 'exclude', tag: 'Name:test321'
61
+ expect(subject.list).to eq([resource3])
62
+ end
63
+
64
+ it "should apply multiple include filters and only return the union" do
65
+ subject.should_receive('filter_tag').with('Name:test123').and_return [resource1, resource3]
66
+ subject.should_receive('filter_tag').with('Name:test321').and_return [resource2, resource3]
67
+ subject.filter 'include', tag: 'Name:test123'
68
+ subject.filter 'include', tag: 'Name:test321'
69
+ expect(subject.list).to eq([resource3])
70
+ end
71
+
72
+ it "should apply exclude and include filters and only return the union" do
73
+ subject.should_receive('filter_tag').with('Name:test123').and_return [resource1, resource3]
74
+ subject.should_receive('filter_tag').with('Name:test321').and_return [resource1, resource2]
75
+ subject.filter 'include', tag: 'Name:test123'
76
+ subject.filter 'exclude', tag: 'Name:test321'
77
+ expect(subject.list).to eq([resource3])
78
+ end
79
+
45
80
  it "should raise an exception if the filter does not exist" do
46
- expect { subject.filter('bogus' => 'Name:test123') }.
81
+ expect { subject.filter('include', 'bogus' => 'Name:test123') }.
47
82
  to raise_error Outliers::Exceptions::UnknownFilter
48
83
  end
84
+
85
+ it "should raise an exception if the filter action does not exist" do
86
+ subject.should_receive('filter_tag').with('Name:test123').and_return [resource1]
87
+ expect { subject.filter('bad_action', 'tag' => 'Name:test123') }.
88
+ to raise_error Outliers::Exceptions::UnknownFilterAction
89
+ end
49
90
  end
50
91
 
51
92
  context "#key" do
@@ -72,16 +113,16 @@ describe Outliers::Collection do
72
113
  end
73
114
 
74
115
  it "should verify the given verification against the colection" do
75
- expect(subject.verify 'none_exist?', {}).
116
+ expect(subject.verify 'none_exist?').
76
117
  to eq( { failing_resources: [resource1, resource2], passing_resources: [] } )
77
118
  end
78
119
 
79
120
  it "should raise unkown verification if the verification does not exist" do
80
- expect { subject.verify 'none', {} }.to raise_error Outliers::Exceptions::UnknownVerification
121
+ expect { subject.verify 'none' }.to raise_error Outliers::Exceptions::UnknownVerification
81
122
  end
82
123
 
83
124
  it "should verify the given verification against the colection with options" do
84
- expect(subject.verify 'equals?', :keys => ['resource1', 'resource2']).
125
+ expect(subject.verify 'equals?', ['resource1', 'resource2']).
85
126
  to eq( { failing_resources: [], passing_resources: [resource1, resource2] } )
86
127
  end
87
128
 
@@ -2,13 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe Outliers::Evaluation do
4
4
  let(:run) { mock 'run' }
5
- let(:connect) { subject.connect('test_credentials_1') }
5
+ let(:connect) { subject.connect('test_account_1') }
6
6
  let(:resources) { subject.resources('security_group') }
7
7
  subject { Outliers::Evaluation.new :run => run, :name => 'test' }
8
8
 
9
9
  before do
10
10
  stub_logger
11
- run.stub :credentials => credentials
11
+ run.stub :account => account
12
12
  end
13
13
 
14
14
  context "#connect" do
@@ -18,20 +18,21 @@ describe Outliers::Evaluation do
18
18
  end
19
19
 
20
20
  it "should connect to the provider specified as an option" do
21
- subject.connect('test_credentials_1', { 'provider' => 'aws_rds' })
21
+ subject.connect('test_account_1', { 'provider' => 'aws_rds' })
22
22
  expect(subject.provider_name_array).to eq(['Aws', 'Rds'])
23
23
  end
24
24
 
25
25
  it "should throw an error if the provider if the provider class is unkown" do
26
- expect { subject.connect('test_credentials_1', { 'provider' => 'bad_provider' }) }.
26
+ expect { subject.connect('test_account_1', { 'provider' => 'bad_provider' }) }.
27
27
  to raise_error(Outliers::Exceptions::UnknownProvider)
28
28
  end
29
29
 
30
30
  it "should override a valid provider with one provided" do
31
- subject.connect('test_credentials_1', { 'provider' => 'aws_ec2' })
31
+ subject.connect('test_account_1', { 'provider' => 'aws_ec2' })
32
32
  expect(subject.provider_name_array).to eq(['Aws', 'Ec2'])
33
33
  end
34
34
  end
35
+
35
36
 
36
37
  context "with connection and resources" do
37
38
  before do
@@ -41,9 +42,9 @@ describe Outliers::Evaluation do
41
42
 
42
43
  context "#resources" do
43
44
  it "should assign the collection_object" do
44
- expect(subject.collection.class).
45
+ expect(subject.resource_collection.class).
45
46
  to eq(Outliers::Resources::Aws::Ec2::SecurityGroupCollection)
46
- expect(subject.collection.provider.class).
47
+ expect(subject.resource_collection.provider.class).
47
48
  to eq(Outliers::Providers::Aws::Ec2)
48
49
  end
49
50
 
@@ -53,40 +54,71 @@ describe Outliers::Evaluation do
53
54
  end
54
55
 
55
56
  it "should test that over ride options are applied when selecting colleciton" do
56
- subject.connect('test_credentials_1', :provider => 'aws_rds')
57
+ subject.connect('test_account_1', :provider => 'aws_rds')
57
58
  subject.resources('db_instance')
58
- expect(subject.collection.provider.class).
59
+ expect(subject.resource_collection.provider.class).
59
60
  to eq(Outliers::Providers::Aws::Rds)
60
61
  end
61
62
 
62
- it "should set the collection targets if specified" do
63
- subject.connect('test_credentials_1', :provider => 'aws_rds')
64
- expect(subject.resources('db_instance', 'instance-123').targets).to eq ['instance-123']
65
- end
66
- end
67
-
68
- context "#exclude" do
69
- it "should convert input to array and send call exclude_by_key with value" do
70
- resources.should_receive(:exclude_by_key).with(['test'])
71
- subject.exclude 'test'
63
+ context "testing resource assignment" do
64
+ before do
65
+ subject.connect('test_account_1', :provider => 'aws_rds')
66
+ end
67
+
68
+ it "should set the collection targets if specified" do
69
+ subject.resources('db_instance', include: 'instance-123')
70
+ expect(subject.resource_collection.targets).to eq ['instance-123']
71
+ end
72
+
73
+ it "should send call exclude_by_key with given array" do
74
+ Outliers::Resources::Aws::Rds::DbInstanceCollection.
75
+ any_instance.should_receive(:exclude_by_key).with(['instance-123', 'instance-321'])
76
+ subject.resources('db_instance', exclude: ['instance-123', 'instance-321'])
77
+ end
78
+
79
+ it "should convert input to array and send call exclude_by_key with value" do
80
+ Outliers::Resources::Aws::Rds::DbInstanceCollection.
81
+ any_instance.should_receive(:exclude_by_key).with(['instance-123'])
82
+ subject.resources('db_instance', exclude: 'instance-123')
83
+ end
84
+
85
+ it "should include the given string as array" do
86
+ subject.resources('db_instance', include: 'instance-123')
87
+ expect(subject.resource_collection.targets).to eq ['instance-123']
88
+ end
89
+
90
+ it "should include the array from the include key" do
91
+ subject.resources('db_instance', include: ['instance-123', 'instance-321'])
92
+ expect(subject.resource_collection.targets).to eq ['instance-123', 'instance-321']
93
+ end
94
+
95
+ it "should include the array" do
96
+ subject.resources('db_instance', ['instance-123', 'instance-321'])
97
+ expect(subject.resource_collection.targets).to eq ['instance-123', 'instance-321']
98
+ end
99
+
100
+ it "should include the string" do
101
+ subject.resources('db_instance', 'instance-123')
102
+ expect(subject.resource_collection.targets).to eq ['instance-123']
103
+ end
72
104
  end
73
105
  end
74
106
 
75
107
  context "#filter" do
76
108
  it "should apply the given filter to the collection" do
77
- resources.should_receive(:filter).with('tag' => 'Name:test123')
78
- subject.filter 'tag' => 'Name:test123'
109
+ resources.should_receive(:filter).with('include', 'tag' => 'Name:test123')
110
+ subject.filter 'include', 'tag' => 'Name:test123'
79
111
  end
80
112
 
81
113
  it "should convert keys in the args hash to strings" do
82
- resources.should_receive(:filter).with('tag' => 'Name:test123')
83
- subject.filter tag: 'Name:test123'
114
+ resources.should_receive(:filter).with('include', 'tag' => 'Name:test123')
115
+ subject.filter 'include', tag: 'Name:test123'
84
116
  end
85
117
  end
86
118
 
87
119
  context "#verify" do
88
- let(:result1) { mock 'result1' }
89
- let(:result2) { mock 'result2' }
120
+ let(:result1) { stub 'result1', :passed? => true }
121
+ let(:result2) { stub 'result2', :passed? => true }
90
122
  let(:verification_response) { ( { passing_resources: ['1', '2'], failing_resources: ['3', '4'] } ) }
91
123
 
92
124
  before do
@@ -95,40 +127,70 @@ describe Outliers::Evaluation do
95
127
  end
96
128
 
97
129
  it "should verify the given method" do
98
- resources.should_receive(:verify).with('test_verification?', {}).and_return verification_response
99
- Outliers::Result.should_receive(:new).with(evaluation: 'test',
100
- passing_resources: ['1','2'],
130
+ resources.should_receive(:verify).with('test_verification?', nil).and_return verification_response
131
+ Outliers::Result.should_receive(:new).with(account_name: 'test_account_1',
132
+ arguments: [],
101
133
  failing_resources: ['3','4'],
102
- resource: resources,
103
- verification: 'test_verification?').and_return result1
104
- expect(subject.verify('test_verification?', {})).to eq([result1])
134
+ name: 'test',
135
+ passing_resources: ['1','2'],
136
+ provider_name: 'aws_ec2',
137
+ resource_name: 'security_group',
138
+ verification_name: 'test_verification?').and_return result1
139
+ expect(subject.verify('test_verification?')).to eq([result1])
105
140
  end
106
141
 
107
142
  it "should convert all options to symbols" do
108
- resources.should_receive(:verify).with('test_verification?', :test => false).and_return verification_response
109
- Outliers::Result.should_receive(:new).with(evaluation: 'test',
143
+ resources.should_receive(:verify).with('test_verification?', ['test123']).and_return verification_response
144
+ Outliers::Result.should_receive(:new).with(account_name: 'test_account_1',
145
+ arguments: ['test123'],
146
+ failing_resources: ['3','4'],
147
+ name: 'test',
110
148
  passing_resources: ['1','2'],
149
+ provider_name: 'aws_ec2',
150
+ resource_name: 'security_group',
151
+ verification_name: 'test_verification?').and_return result1
152
+ expect(subject.verify('test_verification?', ['test123'] )).to eq([result1])
153
+ end
154
+
155
+ it "should convert arguments string to array in results" do
156
+ resources.should_receive(:verify).with('test_verification?', ['arg']).and_return verification_response
157
+ Outliers::Result.should_receive(:new).with(account_name: 'test_account_1',
158
+ arguments: ['arg'],
111
159
  failing_resources: ['3','4'],
112
- resource: resources,
113
- verification: 'test_verification?').and_return result1
114
- expect(subject.verify('test_verification?', { 'test' => false } )).to eq([result1])
160
+ name: 'test',
161
+ passing_resources: ['1','2'],
162
+ provider_name: 'aws_ec2',
163
+ resource_name: 'security_group',
164
+ verification_name: 'test_verification?').and_return result1
165
+ expect(subject.verify('test_verification?', 'arg' )).to eq([result1])
166
+ end
167
+
168
+ it "should raise and error if the arguments are not nil, string or array" do
169
+ expect { subject.verify('test_verification?', arg: 'bad_arg' ) }.
170
+ to raise_error(Outliers::Exceptions::InvalidArguments)
115
171
  end
116
172
 
117
173
  it "should run verify multiple times in given evaluation" do
118
- resources.should_receive(:verify).with('test_verification1?', :test => false).and_return verification_response
119
- resources.should_receive(:verify).with('test_verification2?', :test => true).and_return verification_response
120
- Outliers::Result.should_receive(:new).with(evaluation: 'test',
121
- passing_resources: ['1','2'],
174
+ resources.should_receive(:verify).with('test_verification1?', ['arg1']).and_return verification_response
175
+ resources.should_receive(:verify).with('test_verification2?', ['arg2']).and_return verification_response
176
+ Outliers::Result.should_receive(:new).with(account_name: 'test_account_1',
177
+ arguments: ['arg1'],
122
178
  failing_resources: ['3','4'],
123
- resource: resources,
124
- verification: 'test_verification1?').and_return result1
125
- Outliers::Result.should_receive(:new).with(evaluation: 'test',
179
+ name: 'test',
126
180
  passing_resources: ['1','2'],
181
+ provider_name: 'aws_ec2',
182
+ resource_name: 'security_group',
183
+ verification_name: 'test_verification1?').and_return result1
184
+ Outliers::Result.should_receive(:new).with(account_name: 'test_account_1',
185
+ arguments: ['arg2'],
127
186
  failing_resources: ['3','4'],
128
- resource: resources,
129
- verification: 'test_verification2?').and_return result2
130
- expect(subject.verify('test_verification1?', { 'test' => false })).to eq [result1]
131
- expect(subject.verify('test_verification2?', { 'test' => true })).to eq [result1, result2]
187
+ name: 'test',
188
+ passing_resources: ['1','2'],
189
+ provider_name: 'aws_ec2',
190
+ resource_name: 'security_group',
191
+ verification_name: 'test_verification2?').and_return result2
192
+ expect(subject.verify('test_verification1?', ['arg1'])).to eq [result1]
193
+ expect(subject.verify('test_verification2?', ['arg2'])).to eq [result1, result2]
132
194
  end
133
195
  end
134
196
 
@@ -1,4 +1,4 @@
1
- test_credentials_1:
1
+ test_account_1:
2
2
  region: us-west-1
3
3
  provider: aws_ec2
4
4
  access_key_id: 01234567890123456789