awspec 1.13.0 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: d6592ba53cb08813b9a65ac0f08b40f2a83a8963e6bbc15cb21251698e43fb0b
4
- data.tar.gz: e52fbceb662756bedb71815b620184dac9b5b0728b384fea5c82b99b1aa13884
2
+ SHA1:
3
+ metadata.gz: '02079c9922dca56746510acc4b39754b272ac5a4'
4
+ data.tar.gz: 74e3e1c789724abfafd496dbabbfb351d1cb2f42
5
5
  SHA512:
6
- metadata.gz: 668b292eccd60ebf47b57d3179271a051cec0351cf1f57203ee302a9d8543220cda7cf132e39fb8fa0ede6a06f3f71e038c7664fb1adada870e7b46ecd9d991f
7
- data.tar.gz: 7439bb05f1d7a5e0900b934e6a9d4f562e3bf2e96449e43cfe586cbed35636af05973133b26ed627315a4173b1f349862f6f32af7fbee2b3e16bf2b0bb408afb
6
+ metadata.gz: 3657fdcfd445899ba09db82190e34290e0263100358cb77ad3c520a339f425cda0ab6ff745bf7cf96405ce18a4586d89ab6ae339290e1fe8c744ff28868aff11
7
+ data.tar.gz: eb5233b347173d62d76b8a0d2492983f5b764ee7d970c612f4a49fea8234b61dd7cf50f006a2de05767b9cd387f7b084d273aed548d68c02610089c1176c282f
@@ -0,0 +1,61 @@
1
+ ### exist
2
+
3
+ ```ruby
4
+ describe redshift('my-redshift') do
5
+ it { should exist }
6
+ end
7
+ ```
8
+
9
+ ### be_available, be_cancelling_resize, be_creating, be_deleting, be_final_snapshot, be_hardware_failure, be_incompatible_hsm, be_incompatible_network, be_incompatible_parameters, be_incompatible_restore, be_modifying, be_rebooting, be_renaming, be_resizing, be_rotating_keys, be_storage_full, be_updating_hsm
10
+
11
+ ```ruby
12
+ describe redshift('my-redshift') do
13
+ it { should be_available }
14
+ end
15
+ ```
16
+
17
+ ### have_cluster_parameter_group
18
+
19
+ ```ruby
20
+ describe redshift('my-redshift') do
21
+ it { should have_cluster_parameter_group('my-pg') }
22
+ it do
23
+ should have_cluster_parameter_group('my-pg')\
24
+ .parameter_apply_status('in-sync')
25
+ end
26
+ end
27
+ ```
28
+
29
+ ### have_security_group
30
+
31
+ ```ruby
32
+ describe redshift('my-redshift') do
33
+ it { should have_security_group('sg-1a2b3c4d') }
34
+ it { should have_security_group('group-name-sg') }
35
+ end
36
+ ```
37
+
38
+ ### have_tag
39
+
40
+ ```ruby
41
+ describe redshift('my-redshift') do
42
+ it { should have_tag('Name').value('my-cluster') }
43
+ end
44
+ ```
45
+
46
+ ### belong_to_cluster_subnet_group
47
+
48
+ ```ruby
49
+ describe redshift('my-redshift') do
50
+ it { should belong_to_cluster_subnet_group('my-sg') }
51
+ end
52
+ ```
53
+
54
+ ### belong_to_vpc
55
+
56
+ ```ruby
57
+ describe redshift('my-redshift') do
58
+ it { should belong_to_vpc('vpc-ab123cde') }
59
+ it { should belong_to_vpc('my-vpc') }
60
+ end
61
+ ```
@@ -0,0 +1,17 @@
1
+ ### first
2
+
3
+ ```ruby
4
+ describe redshift_cluster_parameter_group('my-redshift-cluster-parameter-group') do
5
+ its(:datestyle) { should eq 'ISO, MDY' }
6
+ its(:query_group) { should eq 'default' }
7
+ its(:require_ssl) { should eq 'false' }
8
+ end
9
+ ```
10
+
11
+ ### exist
12
+
13
+ ```ruby
14
+ describe redshift_cluster_parameter_group('my-redshift-cluster-parameter-group') do
15
+ it { should exist }
16
+ end
17
+ ```
@@ -56,6 +56,8 @@
56
56
  | [rds](#rds)
57
57
  | [rds_db_cluster_parameter_group](#rds_db_cluster_parameter_group)
58
58
  | [rds_db_parameter_group](#rds_db_parameter_group)
59
+ | [redshift](#redshift)
60
+ | [redshift_cluster_parameter_group](#redshift_cluster_parameter_group)
59
61
  | [route53_hosted_zone](#route53_hosted_zone)
60
62
  | [route_table](#route_table)
61
63
  | [s3_bucket](#s3_bucket)
@@ -2578,6 +2580,101 @@ end
2578
2580
  ```
2579
2581
 
2580
2582
 
2583
+ ## <a name="redshift">redshift</a>
2584
+
2585
+ Redshift resource type.
2586
+
2587
+ ### exist
2588
+
2589
+ ```ruby
2590
+ describe redshift('my-redshift') do
2591
+ it { should exist }
2592
+ end
2593
+ ```
2594
+
2595
+
2596
+ ### be_available, be_cancelling_resize, be_creating, be_deleting, be_final_snapshot, be_hardware_failure, be_incompatible_hsm, be_incompatible_network, be_incompatible_parameters, be_incompatible_restore, be_modifying, be_rebooting, be_renaming, be_resizing, be_rotating_keys, be_storage_full, be_updating_hsm
2597
+
2598
+ ```ruby
2599
+ describe redshift('my-redshift') do
2600
+ it { should be_available }
2601
+ end
2602
+ ```
2603
+
2604
+
2605
+ ### have_cluster_parameter_group
2606
+
2607
+ ```ruby
2608
+ describe redshift('my-redshift') do
2609
+ it { should have_cluster_parameter_group('my-pg') }
2610
+ it do
2611
+ should have_cluster_parameter_group('my-pg')\
2612
+ .parameter_apply_status('in-sync')
2613
+ end
2614
+ end
2615
+ ```
2616
+
2617
+
2618
+ ### have_security_group
2619
+
2620
+ ```ruby
2621
+ describe redshift('my-redshift') do
2622
+ it { should have_security_group('sg-1a2b3c4d') }
2623
+ it { should have_security_group('group-name-sg') }
2624
+ end
2625
+ ```
2626
+
2627
+
2628
+ ### have_tag
2629
+
2630
+ ```ruby
2631
+ describe redshift('my-redshift') do
2632
+ it { should have_tag('Name').value('my-cluster') }
2633
+ end
2634
+ ```
2635
+
2636
+
2637
+ ### belong_to_cluster_subnet_group
2638
+
2639
+ ```ruby
2640
+ describe redshift('my-redshift') do
2641
+ it { should belong_to_cluster_subnet_group('my-sg') }
2642
+ end
2643
+ ```
2644
+
2645
+
2646
+ ### belong_to_vpc
2647
+
2648
+ ```ruby
2649
+ describe redshift('my-redshift') do
2650
+ it { should belong_to_vpc('vpc-ab123cde') }
2651
+ it { should belong_to_vpc('my-vpc') }
2652
+ end
2653
+ ```
2654
+
2655
+ ### its(:vpc_id), its(:cluster_identifier), its(:node_type), its(:cluster_status), its(:modify_status), its(:master_username), its(:db_name), its(:endpoint), its(:cluster_create_time), its(:automated_snapshot_retention_period), its(:manual_snapshot_retention_period), its(:cluster_security_groups), its(:cluster_subnet_group_name), its(:vpc_id), its(:availability_zone), its(:preferred_maintenance_window), its(:pending_modified_values), its(:cluster_version), its(:allow_version_upgrade), its(:number_of_nodes), its(:publicly_accessible), its(:encrypted), its(:restore_status), its(:data_transfer_progress), its(:hsm_status), its(:cluster_snapshot_copy_status), its(:cluster_public_key), its(:cluster_nodes), its(:elastic_ip_status), its(:cluster_revision_number), its(:kms_key_id), its(:enhanced_vpc_routing), its(:iam_roles), its(:pending_actions), its(:maintenance_track_name), its(:elastic_resize_number_of_node_options), its(:deferred_maintenance_windows), its(:snapshot_schedule_identifier), its(:snapshot_schedule_state), its(:resize_info)
2656
+ ## <a name="redshift_cluster_parameter_group">redshift_cluster_parameter_group</a>
2657
+
2658
+ RedshiftClusterParameterGroup resource type.
2659
+
2660
+ ```ruby
2661
+ describe redshift_cluster_parameter_group('my-redshift-cluster-parameter-group') do
2662
+ its(:datestyle) { should eq 'ISO, MDY' }
2663
+ its(:query_group) { should eq 'default' }
2664
+ its(:require_ssl) { should eq 'false' }
2665
+ end
2666
+ ```
2667
+
2668
+
2669
+ ### exist
2670
+
2671
+ ```ruby
2672
+ describe redshift_cluster_parameter_group('my-redshift-cluster-parameter-group') do
2673
+ it { should exist }
2674
+ end
2675
+ ```
2676
+
2677
+
2581
2678
  ## <a name="route53_hosted_zone">route53_hosted_zone</a>
2582
2679
 
2583
2680
  Route53HostedZone resource type.
@@ -9,7 +9,7 @@ module Awspec
9
9
 
10
10
  types = %w(
11
11
  vpc ec2 rds security_group elb network_acl route_table subnet nat_gateway network_interface alb nlb
12
- internet_gateway autoscaling_group alb_listener nlb_listener
12
+ internet_gateway autoscaling_group alb_listener nlb_listener redshift
13
13
  )
14
14
 
15
15
  types.each do |type|
@@ -37,7 +37,7 @@ module Awspec
37
37
  end
38
38
 
39
39
  types = %w(
40
- rds_db_parameter_group rds_db_cluster_parameter_group
40
+ rds_db_parameter_group rds_db_cluster_parameter_group redshift_cluster_parameter_group
41
41
  )
42
42
 
43
43
  types.each do |type|
@@ -3,4 +3,26 @@ module Awspec
3
3
  end
4
4
  class InvalidAccountError < StandardError
5
5
  end
6
+ ##
7
+ # The exception when sending message to a unavailable AWS resource.
8
+ #
9
+ # It should be raised everytime a resource is not available (or doesn't
10
+ # exist) before trying to invoke a method from it and raising instead
11
+ # NoMethodError exception.
12
+ class NoExistingResource < StandardError
13
+ ##
14
+ # Overrides the superclass initialize method to include more information
15
+ # and default error message.
16
+ # Expected parameters:
17
+ # - resource_type: the name of the resource type. Probably the class method return is the best option to be used.
18
+ # - id: the string used to search for the AWS resource. It will vary depending on the resource type, but probably
19
+ # will be an string.
20
+
21
+ def initialize(resource_type, id)
22
+ @resource_type = resource_type
23
+ @id = id
24
+ message = "The resource type #{resource_type} with id #{id} does not exist"
25
+ super message
26
+ end
27
+ end
6
28
  end
@@ -35,6 +35,8 @@ require 'awspec/generator/spec/codebuild'
35
35
  require 'awspec/generator/spec/autoscaling_group'
36
36
  require 'awspec/generator/spec/alb_listener'
37
37
  require 'awspec/generator/spec/nlb_listener'
38
+ require 'awspec/generator/spec/redshift'
39
+ require 'awspec/generator/spec/redshift_cluster_parameter_group'
38
40
 
39
41
  # Doc
40
42
  require 'awspec/generator/doc/type'
@@ -0,0 +1,21 @@
1
+ module Awspec::Generator
2
+ module Doc
3
+ module Type
4
+ class Redshift < Base
5
+ def initialize
6
+ super
7
+ @type_name = 'Redshift'
8
+ @type = Awspec::Type::Redshift.new('my-redshift')
9
+ @ret = @type.resource_via_client
10
+ @matchers = [
11
+ Awspec::Type::Redshift::STATES.map { |state| 'be_' + state.tr('-', '_') }.join(', '),
12
+ 'belong_to_vpc',
13
+ 'belong_to_cluster_subnet_group'
14
+ ]
15
+ @ignore_matchers = Awspec::Type::Redshift::STATES.map { |state| 'be_' + state.tr('-', '_') }
16
+ @describes = %w(vpc_id)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ module Awspec::Generator
2
+ module Doc
3
+ module Type
4
+ class RedshiftClusterParameterGroup < Base
5
+ def initialize
6
+ super
7
+ @type_name = 'RedshiftClusterParameterGroup'
8
+ @type = Awspec::Type::RedshiftClusterParameterGroup.new('my-redshift-cluster-parameter-group')
9
+ @ret = @type.resource_via_client
10
+ @matchers = []
11
+ @ignore_matchers = []
12
+ @describes = []
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -3,7 +3,7 @@ module Awspec::Generator
3
3
  class Kms
4
4
  include Awspec::Helper::Finder
5
5
  def generate_all
6
- aliases = select_all_kms_aliases
6
+ aliases = select_all_kms_aliases.select { |kms_alias| customer_managed_key?(kms_alias) }
7
7
  raise 'Not Found alias' if aliases.empty?
8
8
  ERB.new(keys_spec_template, nil, '-').result(binding).chomp
9
9
  end
@@ -14,13 +14,21 @@ module Awspec::Generator
14
14
  describe kms('<%= kms_alias.alias_name.split('/').last %>') do
15
15
  it { should exist }
16
16
  <% if find_kms_key(kms_alias.target_key_id).enabled -%>
17
- it { should be_enable }
17
+ it { should be_enabled }
18
18
  <% end -%>
19
19
  end
20
20
  <% end %>
21
21
  EOF
22
22
  template
23
23
  end
24
+
25
+ private
26
+
27
+ def customer_managed_key?(kms_alias)
28
+ # An aliase that has no target key id field is predefined by AWS.
29
+ # see: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/KMS/Client.html#list_aliases-instance_method
30
+ !kms_alias.target_key_id.nil?
31
+ end
24
32
  end
25
33
  end
26
34
  end
@@ -0,0 +1,65 @@
1
+ module Awspec::Generator
2
+ module Spec
3
+ class Redshift
4
+ include Awspec::Helper::Finder
5
+ def generate_by_vpc_id(vpc_id)
6
+ describes = %w(
7
+ node_type master_username db_name availability_zone
8
+ allow_version_upgrade number_of_nodes publicly_accessible encrypted
9
+ kms_key_id enhanced_vpc_routing pending_actions maintenance_track_name
10
+ elastic_resize_number_of_node_options
11
+ )
12
+
13
+ vpc = find_vpc(vpc_id)
14
+ raise 'Not Found VPC' unless vpc
15
+ @vpc_id = vpc[:vpc_id]
16
+ @vpc_tag_name = vpc.tag_name
17
+ clusters = select_redshift_by_vpc_id(@vpc_id)
18
+ specs = clusters.map do |cluster|
19
+ sg_group_names = cluster[:vpc_security_groups].map do |sg|
20
+ sg_id = sg.vpc_security_group_id
21
+ ret = find_security_group(sg_id)
22
+ ret[:group_name]
23
+ end
24
+ content = ERB.new(redshift_spec_template, nil, '-').result(binding).gsub(/^\n/, '')
25
+ end
26
+ specs.join("\n")
27
+ end
28
+
29
+ # rubocop:disable all
30
+ def redshift_spec_template
31
+ template = <<-'EOF'
32
+ describe redshift('<%= cluster.cluster_identifier %>') do
33
+ it { should exist }
34
+ it { should be_<%= cluster.cluster_status %> }
35
+ <% describes.each do |describe| %>
36
+ <%- if cluster.members.include?(describe.to_sym) && !cluster[describe.to_sym].nil? -%>
37
+ <%- if cluster[describe].is_a?(String) -%>
38
+ its(:<%= describe %>) { should eq '<%= cluster[describe] %>' }
39
+ <%- else -%>
40
+ its(:<%= describe %>) { should eq <%= cluster[describe] %> }
41
+ <%- end -%>
42
+ <%- end -%>
43
+ <% end %>
44
+ <% sg_group_names.each do |sg_group_name| %>
45
+ it { should have_security_group('<%= sg_group_name %>') }
46
+ <% end %>
47
+ <%- if @vpc_tag_name -%>
48
+ it { should belong_to_vpc('<%= @vpc_tag_name %>') }
49
+ <%- else -%>
50
+ it { should belong_to_vpc('<%= @vpc_id %>') }
51
+ <%- end -%>
52
+ it { should belong_to_cluster_subnet_group('<%= cluster.cluster_subnet_group_name %>') }
53
+ <% cluster.cluster_parameter_groups.each do |pg| %>
54
+ it { should have_cluster_parameter_group('<%= pg.parameter_group_name %>').parameter_apply_status('<%= pg.parameter_apply_status %>') }
55
+ <% end %>
56
+ <% cluster.tags.each do |tag| %>
57
+ it { should have_tag('<%= tag.key %>').value('<%= tag.value %>') }
58
+ <% end %>
59
+ end
60
+ EOF
61
+ template
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,23 @@
1
+ module Awspec::Generator
2
+ module Spec
3
+ class RedshiftClusterParameterGroup
4
+ include Awspec::Helper::Finder
5
+ def generate_by_parameter_group(parameter_group)
6
+ @parameter_group = parameter_group
7
+ res = select_all_redshift_cluster_parameters(@parameter_group)
8
+ ERB.new(redshift_cluster_parameters_spec_template, nil, '-').result(binding).gsub(/^\n/, '')
9
+ end
10
+
11
+ def redshift_cluster_parameters_spec_template
12
+ template = <<-'EOF'
13
+ describe redshift_cluster_parameter_group('<%= @parameter_group %>') do
14
+ <% res.each do |key, value| %>
15
+ its('<%= key %>') { should eq '<%= value %>' }
16
+ <% end %>
17
+ end
18
+ EOF
19
+ template
20
+ end
21
+ end
22
+ end
23
+ end
@@ -42,6 +42,7 @@ require 'awspec/helper/finder/batch'
42
42
  require 'awspec/helper/finder/eks'
43
43
  require 'awspec/helper/finder/sns_topic'
44
44
  require 'awspec/helper/finder/emr'
45
+ require 'awspec/helper/finder/redshift'
45
46
 
46
47
  require 'awspec/helper/finder/account_attributes'
47
48
 
@@ -93,6 +94,7 @@ module Awspec::Helper
93
94
  include Awspec::Helper::Finder::Eks
94
95
  include Awspec::Helper::Finder::SNSTopic
95
96
  include Awspec::Helper::Finder::Emr
97
+ include Awspec::Helper::Finder::Redshift
96
98
 
97
99
  CLIENTS = {
98
100
  ec2_client: Aws::EC2::Client,
@@ -132,7 +134,8 @@ module Awspec::Helper
132
134
  batch_client: Aws::Batch::Client,
133
135
  eks_client: Aws::EKS::Client,
134
136
  sns_client: Aws::SNS::Client,
135
- emr_client: Aws::EMR::Client
137
+ emr_client: Aws::EMR::Client,
138
+ redshift_client: Aws::Redshift::Client
136
139
  }
137
140
 
138
141
  CLIENT_OPTIONS = {
@@ -0,0 +1,33 @@
1
+ module Awspec::Helper
2
+ module Finder
3
+ module Redshift
4
+ def find_redshift_cluster_identifier(id)
5
+ res = redshift_client.describe_clusters(cluster_identifier: id)
6
+ res.clusters.single_resource(id)
7
+ rescue
8
+ nil
9
+ end
10
+
11
+ def select_redshift_by_vpc_id(vpc_id)
12
+ res = redshift_client.describe_clusters
13
+ res.clusters.select do |clusters|
14
+ clusters.vpc_id == vpc_id
15
+ end
16
+ end
17
+
18
+ def select_all_redshift_cluster_parameters(parameter_group)
19
+ parameters = {}
20
+ res = redshift_client.describe_cluster_parameters({
21
+ parameter_group_name: parameter_group
22
+ })
23
+ loop do
24
+ res.parameters.each do |param|
25
+ parameters[param.parameter_name] = param.parameter_value
26
+ end
27
+ (res.respond_to?(:next_page?) && res.next_page? && res = res.next_page) || break
28
+ end
29
+ parameters
30
+ end
31
+ end
32
+ end
33
+ end
@@ -18,7 +18,8 @@ module Awspec
18
18
  rds rds_db_cluster_parameter_group rds_db_parameter_group route53_hosted_zone
19
19
  route_table s3_bucket security_group ses_identity subnet vpc cloudfront_distribution
20
20
  elastictranscoder_pipeline waf_web_acl customer_gateway vpn_gateway vpn_connection internet_gateway acm
21
- cloudwatch_logs dynamodb_table eip sqs ssm_parameter cloudformation_stack codebuild sns_topic
21
+ cloudwatch_logs dynamodb_table eip sqs ssm_parameter cloudformation_stack codebuild sns_topic redshift
22
+ redshift_cluster_parameter_group
22
23
  )
23
24
 
24
25
  ACCOUNT_ATTRIBUTES = %w(
@@ -74,3 +74,7 @@ require 'awspec/matcher/have_vpc_peering_connection'
74
74
  # SNSTopic
75
75
  require 'awspec/matcher/include_subscribed'
76
76
  require 'awspec/matcher/have_subscription_attributes'
77
+
78
+ # Redshift
79
+ require 'awspec/matcher/belong_to_cluster_subnet_group'
80
+ require 'awspec/matcher/have_cluster_parameter_group'
@@ -0,0 +1,5 @@
1
+ RSpec::Matchers.define :belong_to_cluster_subnet_group do |cluster_subnet_group_name|
2
+ match do |type|
3
+ return true if type.resource_via_client[:cluster_subnet_group_name] == cluster_subnet_group_name
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers.define :have_cluster_parameter_group do |name|
2
+ match do |cluster_identifier|
3
+ cluster_identifier.has_cluster_parameter_group?(name, @parameter_apply_status)
4
+ end
5
+
6
+ chain :parameter_apply_status do |parameter_apply_status|
7
+ @parameter_apply_status = parameter_apply_status
8
+ end
9
+ end
@@ -46,6 +46,7 @@ module Awspec
46
46
  @resource_via_client = resource
47
47
  end
48
48
 
49
+ # TODO: this method is specific to DynamoDB and probably should be moved somewhere else
49
50
  def describe_time_to_live(*args)
50
51
  @resource_via_client.send('describe_time_to_live', *args)
51
52
  end
@@ -6,6 +6,10 @@ Aws.config[:kms] = {
6
6
  alias_arn: 'arn:aws:kms:us-east-1:1234567890:alias/my-kms-key',
7
7
  alias_name: 'alias/my-kms-key',
8
8
  target_key_id: 'b9989d41-eeaa-401f-8616-00546948aa92'
9
+ },
10
+ {
11
+ alias_arn: 'arn:aws:kms:us-east-1:1234567890:alias/aws/example',
12
+ alias_name: 'alias/aws/example'
9
13
  }
10
14
  ]
11
15
  },
@@ -0,0 +1,67 @@
1
+ Aws.config[:redshift] = {
2
+ stub_responses: {
3
+ describe_clusters: {
4
+ clusters: [
5
+ {
6
+ cluster_identifier: 'my-redshift',
7
+ node_type: 't2.medium',
8
+ cluster_status: 'available',
9
+ db_name: 'my-db',
10
+ vpc_security_groups: [
11
+ {
12
+ vpc_security_group_id: 'sg-1a2b3c4d',
13
+ status: 'active'
14
+ }
15
+ ],
16
+ cluster_parameter_groups: [
17
+ {
18
+ parameter_group_name: 'my-pg',
19
+ parameter_apply_status: 'in-sync'
20
+ }
21
+ ],
22
+ cluster_subnet_group_name: 'my-sg',
23
+ vpc_id: 'vpc-ab123cde',
24
+ availability_zone: 'ap-northeast-1a',
25
+ tags: [
26
+ {
27
+ key: 'Name',
28
+ value: 'my-cluster'
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ }
34
+ }
35
+ }
36
+
37
+ Aws.config[:ec2] = {
38
+ stub_responses: {
39
+ describe_vpcs: {
40
+ vpcs: [
41
+ {
42
+ vpc_id: 'vpc-ab123cde',
43
+ tags: [
44
+ {
45
+ key: 'Name',
46
+ value: 'my-vpc'
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ },
52
+ describe_security_groups: {
53
+ security_groups: [
54
+ {
55
+ group_id: 'sg-1a2b3c4d',
56
+ group_name: 'group-name-sg',
57
+ tags: [
58
+ {
59
+ key: 'Name',
60
+ value: 'my-db-sg'
61
+ }
62
+ ]
63
+ }
64
+ ]
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,20 @@
1
+ Aws.config[:redshift] = {
2
+ stub_responses: {
3
+ describe_cluster_parameters: {
4
+ parameters: [
5
+ {
6
+ parameter_name: 'datestyle',
7
+ parameter_value: 'ISO, MDY'
8
+ },
9
+ {
10
+ parameter_name: 'query_group',
11
+ parameter_value: 'default'
12
+ },
13
+ {
14
+ parameter_name: 'require_ssl',
15
+ parameter_value: 'false'
16
+ }
17
+ ]
18
+ }
19
+ }
20
+ }
@@ -1,6 +1,7 @@
1
1
  require 'aws-sdk'
2
2
  require 'awspec/resource_reader'
3
3
  require 'awspec/helper/finder'
4
+ require 'awspec/error'
4
5
 
5
6
  module Awspec::Type
6
7
  class Base
@@ -36,8 +37,11 @@ module Awspec::Type
36
37
  def method_missing(name)
37
38
  name_str = name.to_s if name.class == Symbol
38
39
  describe = name_str.tr('-', '_').to_sym
40
+
39
41
  if !resource_via_client.nil? && resource_via_client.members.include?(describe)
40
42
  resource_via_client[describe]
43
+ elsif resource_via_client.nil?
44
+ raise Awspec::NoExistingResource.new(self.class, @display_name)
41
45
  else
42
46
  super unless self.respond_to?(:resource)
43
47
  method_missing_via_black_list(name, delegate_to: resource)
@@ -1,3 +1,5 @@
1
+ require 'awspec/error'
2
+
1
3
  module Awspec::Type
2
4
  class IamPolicy < ResourceBase
3
5
  def resource_via_client
@@ -9,10 +11,12 @@ module Awspec::Type
9
11
  end
10
12
 
11
13
  def attachable?
14
+ check_existence
12
15
  resource_via_client.is_attachable
13
16
  end
14
17
 
15
18
  def attached_to_user?(user_id = nil)
19
+ check_existence
16
20
  users = select_attached_users(id)
17
21
  if user_id
18
22
  user = find_iam_user(user_id)
@@ -26,6 +30,7 @@ module Awspec::Type
26
30
  end
27
31
 
28
32
  def attached_to_group?(group_id = nil)
33
+ check_existence
29
34
  groups = select_attached_groups(@id)
30
35
  if group_id
31
36
  group = find_iam_group(group_id)
@@ -39,6 +44,7 @@ module Awspec::Type
39
44
  end
40
45
 
41
46
  def attached_to_role?(role_id = nil)
47
+ check_existence
42
48
  roles = select_attached_roles(@id)
43
49
  if role_id
44
50
  role = find_iam_role(role_id)
@@ -50,5 +56,11 @@ module Awspec::Type
50
56
  !roles.empty?
51
57
  end
52
58
  end
59
+
60
+ private
61
+
62
+ def check_existence
63
+ raise Awspec::NoExistingResource.new(self.class, @display_name) if resource_via_client.nil?
64
+ end
53
65
  end
54
66
  end
@@ -0,0 +1,88 @@
1
+ module Awspec::Type
2
+ class Redshift < ResourceBase
3
+ def resource_via_client
4
+ @resource_via_client ||= find_redshift_cluster_identifier(@display_name)
5
+ end
6
+
7
+ def id
8
+ @id ||= resource_via_client.cluster_identifier if resource_via_client
9
+ end
10
+
11
+ STATES = %w(
12
+ available cancelling-resize creating deleting
13
+ final-snapshot hardware-failure incompatible-hsm
14
+ incompatible-network incompatible-parameters incompatible-restore
15
+ modifying rebooting renaming resizing rotating-keys
16
+ storage-full updating-hsm
17
+ )
18
+
19
+ STATES.each do |state|
20
+ define_method state.tr('-', '_') + '?' do
21
+ resource_via_client.cluster_status == state
22
+ end
23
+ end
24
+
25
+ def has_security_group?(sg_id)
26
+ return true if has_vpc_security_group_id?(sg_id)
27
+ return true if has_vpc_security_group_name?(sg_id)
28
+ return true if has_vpc_security_group_tag_name?(sg_id)
29
+ return true if has_cluster_security_group_name?(sg_id)
30
+ end
31
+
32
+ def has_cluster_parameter_group?(name, parameter_apply_status = nil)
33
+ pgs = resource_via_client.cluster_parameter_groups
34
+ pgs.find do |pg|
35
+ if parameter_apply_status.nil?
36
+ pg.parameter_group_name == name
37
+ else
38
+ pg.parameter_group_name == name && \
39
+ pg.parameter_apply_status == parameter_apply_status
40
+ end
41
+ end
42
+ end
43
+
44
+ def has_tag?(tag_key, tag_value)
45
+ resource_via_client.tags do |tag|
46
+ tag.key == tag_key && tag.value == tag_value
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def has_vpc_security_group_id?(sg_id)
53
+ sgs = resource_via_client.vpc_security_groups
54
+ sgs.find do |sg|
55
+ sg.vpc_security_group_id == sg_id
56
+ end
57
+ end
58
+
59
+ def has_vpc_security_group_name?(sg_id)
60
+ sgs = resource_via_client.vpc_security_groups
61
+ res = ec2_client.describe_security_groups({
62
+ filters: [{ name: 'group-name', values: [sg_id] }]
63
+ })
64
+ return false unless res.security_groups.count == 1
65
+ sgs.find do |sg|
66
+ sg.vpc_security_group_id == res.security_groups.first.group_id
67
+ end
68
+ end
69
+
70
+ def has_vpc_security_group_tag_name?(sg_id)
71
+ sgs = resource_via_client.vpc_security_groups
72
+ res = ec2_client.describe_security_groups({
73
+ filters: [{ name: 'tag:Name', values: [sg_id] }]
74
+ })
75
+ return false unless res.security_groups.count == 1
76
+ sgs.find do |sg|
77
+ sg.vpc_security_group_id == res.security_groups.first.group_id
78
+ end
79
+ end
80
+
81
+ def has_cluster_security_group_name?(sg_id)
82
+ sgs = resource_via_client.cluster_security_groups
83
+ sgs.find do |sg|
84
+ sg.cluster_security_group_name == sg_id
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,20 @@
1
+ module Awspec::Type
2
+ class RedshiftClusterParameterGroup < ResourceBase
3
+ def resource_via_client
4
+ @resource_via_client ||= select_all_redshift_cluster_parameters(@display_name)
5
+ end
6
+
7
+ def id
8
+ @id ||= @display_name unless resource_via_client.empty?
9
+ end
10
+
11
+ def method_missing(name)
12
+ param_name = name.to_s
13
+ if resource_via_client.include?(param_name)
14
+ resource_via_client[param_name].to_s
15
+ else
16
+ super
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module Awspec
2
- VERSION = '1.13.0'
2
+ VERSION = '1.14.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.0
4
+ version: 1.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - k1LoW
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-28 00:00:00.000000000 Z
11
+ date: 2019-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -271,6 +271,8 @@ files:
271
271
  - doc/_resource_types/rds_account_attributes.md
272
272
  - doc/_resource_types/rds_db_cluster_parameter_group.md
273
273
  - doc/_resource_types/rds_db_parameter_group.md
274
+ - doc/_resource_types/redshift.md
275
+ - doc/_resource_types/redshift_cluster_parameter_group.md
274
276
  - doc/_resource_types/route53_hosted_zone.md
275
277
  - doc/_resource_types/route_table.md
276
278
  - doc/_resource_types/s3_bucket.md
@@ -362,6 +364,8 @@ files:
362
364
  - lib/awspec/generator/doc/type/rds_account_attributes.rb
363
365
  - lib/awspec/generator/doc/type/rds_db_cluster_parameter_group.rb
364
366
  - lib/awspec/generator/doc/type/rds_db_parameter_group.rb
367
+ - lib/awspec/generator/doc/type/redshift.rb
368
+ - lib/awspec/generator/doc/type/redshift_cluster_parameter_group.rb
365
369
  - lib/awspec/generator/doc/type/route53_hosted_zone.rb
366
370
  - lib/awspec/generator/doc/type/route_table.rb
367
371
  - lib/awspec/generator/doc/type/s3_bucket.rb
@@ -406,6 +410,8 @@ files:
406
410
  - lib/awspec/generator/spec/rds.rb
407
411
  - lib/awspec/generator/spec/rds_db_cluster_parameter_group.rb
408
412
  - lib/awspec/generator/spec/rds_db_parameter_group.rb
413
+ - lib/awspec/generator/spec/redshift.rb
414
+ - lib/awspec/generator/spec/redshift_cluster_parameter_group.rb
409
415
  - lib/awspec/generator/spec/route53_hosted_zone.rb
410
416
  - lib/awspec/generator/spec/route_table.rb
411
417
  - lib/awspec/generator/spec/s3_bucket.rb
@@ -451,6 +457,7 @@ files:
451
457
  - lib/awspec/helper/finder/lambda.rb
452
458
  - lib/awspec/helper/finder/nlb.rb
453
459
  - lib/awspec/helper/finder/rds.rb
460
+ - lib/awspec/helper/finder/redshift.rb
454
461
  - lib/awspec/helper/finder/route53.rb
455
462
  - lib/awspec/helper/finder/s3.rb
456
463
  - lib/awspec/helper/finder/security_group.rb
@@ -472,6 +479,7 @@ files:
472
479
  - lib/awspec/matcher/be_opened_only.rb
473
480
  - lib/awspec/matcher/belong_to_alb.rb
474
481
  - lib/awspec/matcher/belong_to_cache_subnet_group.rb
482
+ - lib/awspec/matcher/belong_to_cluster_subnet_group.rb
475
483
  - lib/awspec/matcher/belong_to_db_subnet_group.rb
476
484
  - lib/awspec/matcher/belong_to_domain.rb
477
485
  - lib/awspec/matcher/belong_to_iam_group.rb
@@ -481,6 +489,7 @@ files:
481
489
  - lib/awspec/matcher/belong_to_subnet.rb
482
490
  - lib/awspec/matcher/belong_to_vpc.rb
483
491
  - lib/awspec/matcher/have_attribute_definition.rb
492
+ - lib/awspec/matcher/have_cluster_parameter_group.rb
484
493
  - lib/awspec/matcher/have_custom_response_error_code.rb
485
494
  - lib/awspec/matcher/have_db_parameter_group.rb
486
495
  - lib/awspec/matcher/have_inline_policy.rb
@@ -562,6 +571,8 @@ files:
562
571
  - lib/awspec/stub/rds.rb
563
572
  - lib/awspec/stub/rds_db_cluster_parameter_group.rb
564
573
  - lib/awspec/stub/rds_db_parameter_group.rb
574
+ - lib/awspec/stub/redshift.rb
575
+ - lib/awspec/stub/redshift_cluster_parameter_group.rb
565
576
  - lib/awspec/stub/route53_hosted_zone.rb
566
577
  - lib/awspec/stub/route_table.rb
567
578
  - lib/awspec/stub/s3_bucket.rb
@@ -639,6 +650,8 @@ files:
639
650
  - lib/awspec/type/rds_account_attributes.rb
640
651
  - lib/awspec/type/rds_db_cluster_parameter_group.rb
641
652
  - lib/awspec/type/rds_db_parameter_group.rb
653
+ - lib/awspec/type/redshift.rb
654
+ - lib/awspec/type/redshift_cluster_parameter_group.rb
642
655
  - lib/awspec/type/resource_base.rb
643
656
  - lib/awspec/type/route53_hosted_zone.rb
644
657
  - lib/awspec/type/route_table.rb
@@ -675,7 +688,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
675
688
  version: '0'
676
689
  requirements: []
677
690
  rubyforge_project:
678
- rubygems_version: 2.7.6
691
+ rubygems_version: 2.6.14
679
692
  signing_key:
680
693
  specification_version: 4
681
694
  summary: RSpec tests for your AWS resources.