ruby_aem_aws 0.9.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 39ea851d8557738c522f0f06fd811dee54378d83
4
+ data.tar.gz: 931e7372b825518b9e0ad3b23498b0013831c0bb
5
+ SHA512:
6
+ metadata.gz: da5c388b8803836046e97f8af7ce3308fbd419b230a7fa86483d54508c0f8f0bfdbeb149cc6a3c41dffb2577ddd8387c3a3443b09835f64a75221b86eb53c312
7
+ data.tar.gz: f66ff53f11b7f035fa337ce3524f5c9630c489b453e799887b09e6e56f6e7ec2237c90e9a7acc88a0332d6241b66a23ead413f9eaa94e2d30aa09c12bb229535
@@ -0,0 +1,74 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'ruby_aem_aws/consolidated_stack'
16
+ require_relative 'ruby_aem_aws/full_set_stack'
17
+
18
+ module RubyAemAws
19
+ # AemAws class represents the AWS stack for AEM.
20
+ class AemAws
21
+ # @param conf configuration hash of the following configuration values:
22
+ # - region: the AWS region (eg ap-southeast-2)
23
+ # @return new RubyAemAws::AemAws instance
24
+ def initialize(conf = {})
25
+ conf[:region] ||= Constants::REGION_DEFAULT
26
+
27
+ aws = AwsCreator.create_aws
28
+ @ec2_client = aws[:Ec2Client]
29
+ @ec2_resource = aws[:Ec2Resource]
30
+ @elb_client = aws[:ElbClient]
31
+ @auto_scaling_client = aws[:AutoScalingClient]
32
+ # The V2 API only supports Application ELBs, and we currently use Classic.
33
+ # @elb_client = Aws::ElasticLoadBalancingV2::Client.new(region: conf[:region])
34
+ @cloud_watch_client = aws[:CloudWatchClient]
35
+ end
36
+
37
+ def test_connection
38
+ result = []
39
+ @ec2_client.describe_regions.regions.each do |region|
40
+ result.push("Region #{region.region_name} (#{region.endpoint})")
41
+ end
42
+ !result.empty?
43
+ end
44
+
45
+ # Create a consolidated instance.
46
+ #
47
+ # @param stack_prefix AWS tag: StackPrefix
48
+ # @return new RubyAemAws::ConsolidatedStack instance
49
+ def consolidated(stack_prefix)
50
+ RubyAemAws::ConsolidatedStack.new(stack_prefix, @ec2_resource, @cloud_watch_client)
51
+ end
52
+
53
+ # Create a full set instance.
54
+ #
55
+ # @param stack_prefix AWS tag: StackPrefix
56
+ # @return new RubyAemAws::FullSetStack instance
57
+ def full_set(stack_prefix)
58
+ RubyAemAws::FullSetStack.new(stack_prefix, @ec2_resource, @elb_client, @auto_scaling_client, @cloud_watch_client)
59
+ end
60
+ end
61
+
62
+ # Encapsulate AWS class creation for mocking.
63
+ class AwsCreator
64
+ def self.create_aws(region = Constants::REGION_DEFAULT)
65
+ {
66
+ Ec2Client: Aws::EC2::Client.new(region: region),
67
+ Ec2Resource: Aws::EC2::Resource.new(region: region),
68
+ ElbClient: Aws::ElasticLoadBalancing::Client.new(region: region),
69
+ AutoScalingClient: Aws::AutoScaling::Client.new(region: region),
70
+ CloudWatchClient: Aws::CloudWatch::Client.new(region: region)
71
+ }
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'component_descriptor'
16
+ require_relative 'mixins/instance_describer'
17
+ require_relative '../error'
18
+
19
+ module RubyAemAws
20
+ # Add common methods to all Components.
21
+ module AbstractComponent
22
+ include Component
23
+ include InstanceDescriber
24
+
25
+ def to_s
26
+ "#{self.class.name.split('::').last}(#{@descriptor.stack_prefix unless @descriptor.nil?})"
27
+ end
28
+
29
+ private def filter_for_descriptor
30
+ {
31
+ filters: [
32
+ { name: 'tag:StackPrefix', values: [@descriptor.stack_prefix] },
33
+ { name: 'tag:Component', values: [@descriptor.ec2.component] },
34
+ { name: 'tag:Name', values: [@descriptor.ec2.name] }
35
+ ]
36
+ }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'aws-sdk'
16
+ require_relative 'abstract_component'
17
+
18
+ module RubyAemAws
19
+ # Add common methods to all Components.
20
+ module AbstractGroupedComponent
21
+ include AbstractComponent
22
+
23
+ def get_all_instances
24
+ ec2_resource.instances(filter_for_descriptor)
25
+ end
26
+
27
+ def get_instance_by_id(instance_id)
28
+ ec2_resource.instance(instance_id)
29
+ end
30
+
31
+ def get_num_of_instances
32
+ get_all_instances.entries.length
33
+ end
34
+
35
+ def get_random_instance
36
+ get_all_instances.entries.sample
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'aws-sdk'
16
+ require_relative 'abstract_component'
17
+
18
+ module RubyAemAws
19
+ # Add common methods to all Components.
20
+ module AbstractSingleComponent
21
+ include AbstractComponent
22
+
23
+ def get_instance
24
+ instances = ec2_resource.instances(filter_for_descriptor).select { |instance| InstanceState::ALL_ACTIVE.include?(instance.state.name) }
25
+ count = instances.count
26
+ raise RubyAemAws::ExpectedSingleInstanceError if count > 1
27
+ return nil if count.zero?
28
+ instances.first
29
+ end
30
+
31
+ def get_all_instances
32
+ [get_instance]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'author_primary'
16
+ require_relative 'author_standby'
17
+
18
+ module RubyAemAws
19
+ module Component
20
+ # Interface to the AWS instances running the Author components of a full-set AEM stack.
21
+ class Author
22
+ attr_reader :author_primary, :author_standby
23
+
24
+ # ELB_ID = 'AuthorLoadBalancer'.freeze
25
+ # ELB_NAME = 'AEM Author Load Balancer'.freeze
26
+
27
+ # @param stack_prefix AWS tag: StackPrefix
28
+ # @param ec2_resource AWS EC2 resource
29
+ # @return new RubyAemAws::FullSet::Author
30
+ def initialize(stack_prefix, ec2_resource, cloud_watch_client)
31
+ @author_primary = Component::AuthorPrimary.new(stack_prefix, ec2_resource, cloud_watch_client)
32
+ @author_standby = Component::AuthorStandby.new(stack_prefix, ec2_resource, cloud_watch_client)
33
+ end
34
+
35
+ # def terminate_primary_instance
36
+
37
+ # def terminate_standby_instance
38
+
39
+ # def wait_until_healthy
40
+ # - wait until both primary and standby are healthy
41
+ # end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,55 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_grouped_component'
16
+ require_relative 'mixins/healthy_count_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+ require_relative 'component_descriptor'
19
+
20
+ module RubyAemAws
21
+ module Component
22
+ # Interface to the AWS instances playing and supporting the AuthorDispatcher role in a full-set AEM stack.
23
+ class AuthorDispatcher
24
+ attr_reader :descriptor, :ec2_resource, :asg_client, :elb_client, :cloud_watch_client
25
+ include AbstractGroupedComponent
26
+ include HealthyCountVerifier
27
+ include MetricVerifier
28
+
29
+ EC2_COMPONENT = 'author-dispatcher'.freeze
30
+ EC2_NAME = 'AEM Author Dispatcher'.freeze
31
+ ELB_ID = 'AuthorDispatcherLoadBalancer'.freeze
32
+ ELB_NAME = 'AEM Author Dispatcher Load Balancer'.freeze
33
+
34
+ # @param stack_prefix AWS tag: StackPrefix
35
+ # @param ec2_resource AWS EC2 resource
36
+ # @param asg_client AWS AutoScalingGroup client
37
+ # @param elb_client AWS ElasticLoadBalancer client
38
+ # @param cloud_watch_client AWS CloudWatch client
39
+ # @return new RubyAemAws::FullSet::AuthorDispatcher
40
+ def initialize(stack_prefix, ec2_resource, asg_client, elb_client, cloud_watch_client)
41
+ @descriptor = ComponentDescriptor.new(stack_prefix,
42
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME),
43
+ ELBDescriptor.new(ELB_ID, ELB_NAME))
44
+ @ec2_resource = ec2_resource
45
+ @elb_client = elb_client
46
+ @asg_client = asg_client
47
+ @cloud_watch_client = cloud_watch_client
48
+ end
49
+
50
+ # def terminate_all_instances
51
+
52
+ # def terminate_random_instance
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,42 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_single_component'
16
+ require_relative 'mixins/healthy_state_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the Author-Primary component of a full-set AEM stack.
22
+ class AuthorPrimary
23
+ attr_reader :descriptor, :ec2_resource, :cloud_watch_client
24
+ include AbstractSingleComponent
25
+ include HealthyStateVerifier
26
+ include MetricVerifier
27
+
28
+ EC2_COMPONENT = 'author-primary'.freeze
29
+ EC2_NAME = 'AEM Author - Primary'.freeze
30
+
31
+ # @param stack_prefix AWS tag: StackPrefix
32
+ # @param ec2_resource AWS EC2 resource
33
+ # @return new RubyAemAws::FullSet::AuthorPrimary
34
+ def initialize(stack_prefix, ec2_resource, cloud_watch_client)
35
+ @descriptor = ComponentDescriptor.new(stack_prefix,
36
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
37
+ @ec2_resource = ec2_resource
38
+ @cloud_watch_client = cloud_watch_client
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'aws-sdk'
16
+ require_relative 'abstract_single_component'
17
+ require_relative 'mixins/healthy_state_verifier'
18
+ require_relative 'mixins/metric_verifier'
19
+ require_relative 'component_descriptor'
20
+
21
+ module RubyAemAws
22
+ module Component
23
+ # Interface to a single AWS instance running all three AEM components as a consolidated stack.
24
+ class AuthorPublishDispatcher
25
+ attr_reader :descriptor, :ec2_resource, :cloud_watch_client
26
+ include AbstractSingleComponent
27
+ include HealthyStateVerifier
28
+ include MetricVerifier
29
+
30
+ EC2_COMPONENT = 'author-publish-dispatcher'.freeze
31
+ EC2_NAME = 'AuthorPublishDispatcher'.freeze
32
+
33
+ # @param stack_prefix AWS tag: StackPrefix
34
+ # @param ec2_resource AWS EC2 resource
35
+ # @param cloud_watch_client AWS CloudWatch client
36
+ # @return new RubyAemAws::Consolidated::AuthorPublishDispatcher instance
37
+ def initialize(stack_prefix, ec2_resource, cloud_watch_client)
38
+ @descriptor = ComponentDescriptor.new(stack_prefix,
39
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
40
+ @ec2_resource = ec2_resource
41
+ @cloud_watch_client = cloud_watch_client
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_grouped_component'
16
+ require_relative 'mixins/healthy_state_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the Author-Standby component of a full-set AEM stack.
22
+ class AuthorStandby
23
+ attr_reader :descriptor, :ec2_resource, :cloud_watch_client
24
+ include AbstractGroupedComponent
25
+ # Can't verify state by count as there's no ASG.
26
+ include HealthyStateVerifier
27
+ include MetricVerifier
28
+
29
+ EC2_COMPONENT = 'author-standby'.freeze
30
+ EC2_NAME = 'AEM Author - Standby'.freeze
31
+
32
+ # @param stack_prefix AWS tag: StackPrefix
33
+ # @param ec2_resource AWS EC2 resource
34
+ # @param cloud_watch_client AWS CloudWatch client
35
+ # @return new RubyAemAws::FullSet::AuthorStandby
36
+ def initialize(stack_prefix, ec2_resource, cloud_watch_client)
37
+ @descriptor = ComponentDescriptor.new(stack_prefix,
38
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
39
+ @ec2_resource = ec2_resource
40
+ @cloud_watch_client = cloud_watch_client
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_single_component'
16
+ require_relative 'mixins/healthy_state_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the ChaosMonkey component of a full-set AEM stack.
22
+ class ChaosMonkey
23
+ attr_reader :descriptor, :ec2_resource, :asg_client, :cloud_watch_client
24
+ include AbstractSingleComponent
25
+ # Can't verify state by count as there's no ELB.
26
+ include HealthyStateVerifier
27
+ include MetricVerifier
28
+
29
+ EC2_COMPONENT = 'chaos-monkey'.freeze
30
+ EC2_NAME = 'AEM Chaos Monkey'.freeze
31
+
32
+ # @param stack_prefix AWS tag: StackPrefix
33
+ # @param ec2_resource AWS EC2 resource
34
+ # @param asg_client AWS AutoScalingGroup client
35
+ # @param cloud_watch_client AWS CloudWatch client
36
+ # @return new RubyAemAws::FullSet::ChaosMonkey
37
+ def initialize(stack_prefix, ec2_resource, asg_client, cloud_watch_client)
38
+ @descriptor = ComponentDescriptor.new(stack_prefix,
39
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
40
+ @ec2_resource = ec2_resource
41
+ @asg_client = asg_client
42
+ @cloud_watch_client = cloud_watch_client
43
+ end
44
+
45
+ # def terminate_all_instances
46
+
47
+ # def terminate_random_instance
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module RubyAemAws
16
+ module Component
17
+ ComponentDescriptor = Struct.new(:stack_prefix_in, :ec2, :elb) do
18
+ def stack_prefix
19
+ # Unwrap from {:stack_prefix = value} to the value if necessary.
20
+ return stack_prefix_in[:stack_prefix] if stack_prefix_in.is_a? Hash
21
+ stack_prefix_in
22
+ end
23
+ end
24
+ EC2Descriptor = Struct.new(:component, :name)
25
+ ELBDescriptor = Struct.new(:id, :name)
26
+ end
27
+ end
@@ -0,0 +1,135 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative '../../constants'
16
+
17
+ module RubyAemAws
18
+ # Mixin for checking health of a component via ELB 'healthy' count vs ASG desired_capacity.
19
+ # Add this to a component to make it capable of determining its own health.
20
+ module HealthyCountVerifier
21
+ # Aggregate health_states considered healthy.
22
+ # @return health_state is ready or scaling.
23
+ def healthy?
24
+ %i[ready scaling].include? health_state
25
+ end
26
+
27
+ # Provides detail of the state of the instances comprising the component.
28
+ # @return one of:
29
+ # - no_asg: AutoScalingGroup could not be located (by StackPrefix and Component tags).
30
+ # - no_elb: ElasticLoadBalancer could not be located (by StackPrefix and aws:cloudformation:logical-id tags).
31
+ # - misconfigured: AutoScalingGroup.desired_capacity is less than 1.
32
+ # - recovering: ELB running instance count is less than AutoScalingGroup.desired_capacity.
33
+ # - scaling: ELB running instance count is more than AutoScalingGroup.desired_capacity.
34
+ # - ready: ELB running instance count is equal to AutoScalingGroup.desired_capacity.
35
+ def health_state
36
+ asg = find_auto_scaling_group(asg_client)
37
+ return :no_asg if asg.nil?
38
+
39
+ # Debug:
40
+ # unless asg.nil?
41
+ # puts("ASG: #{asg} #{asg.auto_scaling_group_name} (#{asg.desired_capacity})")
42
+ # asg.instances.each do |i|
43
+ # puts(" Instance #{i.instance_id}: #{i.health_status}")
44
+ # end
45
+ # end
46
+
47
+ elb = find_elb(elb_client)
48
+ return :no_elb if elb.nil?
49
+
50
+ elb_running_instances = 0
51
+ # puts("ELB: #{elb.load_balancer_name} (#{elb.instances.length})")
52
+ get_instances_state_from_elb(elb).each do |i|
53
+ # puts(" Instance #{i[:id]}: #{i[:state]}")
54
+ elb_running_instances += 1 if i[:state] == RubyAemAws::Constants::INSTANCE_STATE_HEALTHY
55
+ end
56
+
57
+ desired_capacity = asg.desired_capacity
58
+ # puts("calc health_state: #{elb_running_instances} / #{desired_capacity}")
59
+ return :misconfigured if desired_capacity < 1
60
+
61
+ return :recovering if elb_running_instances < desired_capacity
62
+ return :scaling if elb_running_instances > desired_capacity
63
+ :ready
64
+ end
65
+
66
+ def wait_until_healthy
67
+ raise NotYetImplementedError
68
+ end
69
+
70
+ private
71
+
72
+ # @return AutoScalingGroup by StackPrefix and Component tags.
73
+ def find_auto_scaling_group(asg_client)
74
+ autoscaling_groups = asg_client.describe_auto_scaling_groups
75
+ autoscaling_groups.auto_scaling_groups.each do |autoscaling_group|
76
+ asg_matches_stack_prefix = false
77
+ asg_matches_component = false
78
+ tags = autoscaling_group.tags
79
+ tags.each do |tag|
80
+ if tag.key == 'StackPrefix' && tag.value == descriptor.stack_prefix
81
+ asg_matches_stack_prefix = true
82
+ break if asg_matches_component
83
+ next
84
+ end
85
+ if tag.key == 'Component' && tag.value == descriptor.ec2.component
86
+ asg_matches_component = true
87
+ break if asg_matches_stack_prefix
88
+ end
89
+ end
90
+ return autoscaling_group if asg_matches_stack_prefix && asg_matches_component
91
+ end
92
+ nil
93
+ end
94
+
95
+ # @return ElasticLoadBalancer by StackPrefix and logical-id tags.
96
+ def find_elb(elb_client)
97
+ elbs = elb_client.describe_load_balancers.load_balancer_descriptions
98
+ elbs.each do |elb|
99
+ elb_matches_stack_prefix = false
100
+ elb_matches_logical_id = false
101
+ tag_descriptions = elb_client.describe_tags(load_balancer_names: [elb.load_balancer_name]).tag_descriptions
102
+ next if tag_descriptions.empty?
103
+
104
+ tags = tag_descriptions[0].tags
105
+ tags.each do |tag|
106
+ if tag.key == 'StackPrefix' && tag.value == descriptor.stack_prefix
107
+ elb_matches_stack_prefix = true
108
+ break if elb_matches_logical_id
109
+ next
110
+ end
111
+ if tag.key == 'aws:cloudformation:logical-id' && tag.value == descriptor.elb.id
112
+ elb_matches_logical_id = true
113
+ break if elb_matches_stack_prefix
114
+ end
115
+ end
116
+ return elb if elb_matches_stack_prefix && elb_matches_logical_id
117
+ end
118
+ nil
119
+ end
120
+
121
+ def get_instances_state_from_elb(elb)
122
+ stack_prefix_instances = []
123
+ elb.instances.each do |i|
124
+ instance = get_instance_by_id(i.instance_id)
125
+ next if instance.nil?
126
+ instance.tags.each do |tag|
127
+ next if tag.key != 'StackPrefix'
128
+ break if tag.value != descriptor.stack_prefix
129
+ stack_prefix_instances.push(id: i.instance_id, state: instance.state.name)
130
+ end
131
+ end
132
+ stack_prefix_instances
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative '../../constants'
16
+
17
+ module RubyAemAws
18
+ # Mixin for checking health of a component via EC2 instance state.
19
+ # Add this to a component to make it capable of determining its own health.
20
+ module HealthyStateVerifier
21
+ # @return true if there are one or more instances matching the descriptor and they are all healthy.
22
+ def healthy?
23
+ has_instance = false
24
+ get_all_instances.each do |i|
25
+ next if i.nil?
26
+ has_instance = true
27
+ return false if i.state.name != Constants::INSTANCE_STATE_HEALTHY
28
+ end
29
+ has_instance
30
+ end
31
+
32
+ def wait_until_healthy
33
+ raise NotYetImplementedError
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module RubyAemAws
16
+ # Mixin for describing component EC2 instance state.
17
+ # Add this to a component to make it capable of describing its instances.
18
+ module InstanceDescriber
19
+ # @return a string containing instance descriptions.
20
+ def describe_instances
21
+ descriptions = []
22
+ get_all_instances.each do |i|
23
+ next if i.nil?
24
+ descriptions.push(describe_instance(i))
25
+ end
26
+ descriptions.join(', ')
27
+ end
28
+
29
+ def describe_instance(instance)
30
+ "#{instance.instance_id} (#{instance.state.name})"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module RubyAemAws
16
+ # Mixin for checking that an instance has associated CloudWatch metrics.
17
+ module MetricVerifier
18
+ # @param metric_name the name of the metric to check for.
19
+ # @return true if the instance has a metric with @metric_name.
20
+ def metric?(metric_name)
21
+ !metric_instances(metric_name).empty?
22
+ end
23
+
24
+ # @param metric_name the name of the metric to check for.
25
+ # @return an array of instance_ids that have a metric with @metric_name.
26
+ def metric_instances(metric_name)
27
+ instances_with_metric = []
28
+ instances = get_all_instances
29
+ instances.each do |instance|
30
+ next if instance.nil?
31
+ instance_id = instance.instance_id
32
+ metrics = @cloud_watch_client.list_metrics(namespace: 'AWS/EC2',
33
+ metric_name: metric_name,
34
+ dimensions: [
35
+ name: 'InstanceId',
36
+ value: instance_id
37
+ ]).metrics
38
+ instances_with_metric.push(instance_id) unless metrics.empty?
39
+ end
40
+ instances_with_metric
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_single_component'
16
+ require_relative 'mixins/healthy_state_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the Orchestrator component of a full-set AEM stack.
22
+ class Orchestrator
23
+ attr_reader :descriptor, :ec2_resource, :asg_client, :cloud_watch_client
24
+ include AbstractSingleComponent
25
+ # Can't verify state by count as there's no ELB.
26
+ include HealthyStateVerifier
27
+ include MetricVerifier
28
+
29
+ EC2_COMPONENT = 'orchestrator'.freeze
30
+ EC2_NAME = 'AEM Orchestrator'.freeze
31
+
32
+ # @param stack_prefix AWS tag: StackPrefix
33
+ # @param ec2_resource AWS EC2 resource
34
+ # @param asg_client AWS AutoScalingGroup client
35
+ # @param cloud_watch_client AWS CloudWatch client
36
+ # @return new RubyAemAws::FullSet::Orchestrator
37
+ def initialize(stack_prefix, ec2_resource, asg_client, cloud_watch_client)
38
+ @descriptor = ComponentDescriptor.new(stack_prefix,
39
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
40
+ @ec2_resource = ec2_resource
41
+ @asg_client = asg_client
42
+ @cloud_watch_client = cloud_watch_client
43
+ end
44
+
45
+ # def terminate_all_instances
46
+
47
+ # def terminate_random_instance
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_grouped_component'
16
+ require_relative 'mixins/healthy_state_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the Publish component of a full-set AEM stack.
22
+ class Publish
23
+ attr_reader :descriptor, :ec2_resource, :cloud_watch_client, :asg_client
24
+ include AbstractGroupedComponent
25
+ # Can't verify state by count as there's no ELB.
26
+ include HealthyStateVerifier
27
+ include MetricVerifier
28
+
29
+ EC2_COMPONENT = 'publish'.freeze
30
+ EC2_NAME = 'AEM Publish'.freeze
31
+
32
+ # @param stack_prefix AWS tag: StackPrefix
33
+ # @param ec2_resource AWS EC2 resource
34
+ # @param asg_client AWS AutoScalingGroup client
35
+ # @param cloud_watch_client AWS CloudWatch client
36
+ # @return new RubyAemAws::FullSet::AuthorPrimary
37
+ def initialize(stack_prefix, ec2_resource, asg_client, cloud_watch_client)
38
+ @descriptor = ComponentDescriptor.new(stack_prefix,
39
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME))
40
+ @ec2_resource = ec2_resource
41
+ @asg_client = asg_client
42
+ @cloud_watch_client = cloud_watch_client
43
+ end
44
+
45
+ # def terminate_all_instances
46
+
47
+ # def terminate_random_instance
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'abstract_grouped_component'
16
+ require_relative 'mixins/healthy_count_verifier'
17
+ require_relative 'mixins/metric_verifier'
18
+
19
+ module RubyAemAws
20
+ module Component
21
+ # Interface to the AWS instance running the PublishDispatcher component of a full-set AEM stack.
22
+ class PublishDispatcher
23
+ attr_reader :descriptor, :ec2_resource, :asg_client, :elb_client, :cloud_watch_client
24
+ include AbstractGroupedComponent
25
+ include HealthyCountVerifier
26
+ include MetricVerifier
27
+
28
+ EC2_COMPONENT = 'publish-dispatcher'.freeze
29
+ EC2_NAME = 'AEM Publish Dispatcher'.freeze
30
+ ELB_ID = 'PublishDispatcherLoadBalancer'.freeze
31
+ ELB_NAME = 'AEM Publish Dispatcher Load Balancer'.freeze
32
+
33
+ # @param stack_prefix AWS tag: StackPrefix
34
+ # @param ec2_resource AWS EC2 resource
35
+ # @param asg_client AWS AutoScalingGroup client
36
+ # @param cloud_watch_client AWS CloudWatch client
37
+ # @return new RubyAemAws::FullSet::PublishDispatcher
38
+ def initialize(stack_prefix, ec2_resource, asg_client, elb_client, cloud_watch_client)
39
+ @descriptor = ComponentDescriptor.new(stack_prefix,
40
+ EC2Descriptor.new(EC2_COMPONENT, EC2_NAME),
41
+ ELBDescriptor.new(ELB_ID, ELB_NAME))
42
+ @ec2_resource = ec2_resource
43
+ @asg_client = asg_client
44
+ @elb_client = elb_client
45
+ @cloud_watch_client = cloud_watch_client
46
+ end
47
+
48
+ # def terminate_all_instances
49
+
50
+ # def terminate_random_instance
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'component/author_publish_dispatcher'
16
+
17
+ module RubyAemAws
18
+ # Factory for the consolidated AEM stack component interface.
19
+ class ConsolidatedStack
20
+ # @param stack_prefix AWS tag: StackPrefix
21
+ # @param ec2_resource AWS EC2 client
22
+ # @param cloud_watch_client AWS CloudWatch client
23
+ # @return new RubyAemAws::ConsolidatedStack instance
24
+ def initialize(stack_prefix, ec2_resource, cloud_watch_client)
25
+ @stack_prefix = stack_prefix
26
+ @ec2_resource = ec2_resource
27
+ @cloud_watch_client = cloud_watch_client
28
+ end
29
+
30
+ # @return new RubyAemAws::Component::AuthorPublishDispatcher instance
31
+ def author_publish_dispatcher
32
+ RubyAemAws::Component::AuthorPublishDispatcher.new(@stack_prefix, @ec2_resource, @cloud_watch_client)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module RubyAemAws
16
+ class InstanceState
17
+ PENDING = 'pending'.freeze
18
+ RUNNING = 'running'.freeze
19
+ SHUTTING_DOWN = 'shutting_down'.freeze
20
+ TERMINATED = 'terminated'.freeze
21
+ STOPPING = 'stopping'.freeze
22
+ STOPPED = 'stopped'.freeze
23
+
24
+ ALL_ACTIVE = [PENDING, RUNNING, SHUTTING_DOWN, STOPPING, STOPPED].freeze
25
+ end
26
+
27
+ class Constants
28
+ REGION_DEFAULT = 'ap-southeast-2'.freeze
29
+
30
+ INSTANCE_STATE_HEALTHY = RubyAemAws::InstanceState::RUNNING.freeze
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module RubyAemAws
16
+ # Raise this when a method is not yet implemented.
17
+ class NotYetImplementedError < StandardError
18
+ def initialize(msg = 'Not yet implemented')
19
+ super
20
+ end
21
+ end
22
+
23
+ # Raise this when a component unexpectedly has more than one instance.
24
+ class ExpectedSingleInstanceError < StandardError
25
+ # def initialize(count, descriptor)
26
+ # message << 'Expected exactly one instance'
27
+ # message << " but got #{count}" unless count.nil?
28
+ # message << "for (#{descriptor.stack_prefix}, #{descriptor.ec2.component}, #{descriptor.ec2.name})" unless descriptor.nil?
29
+ # super(message)
30
+ # end
31
+
32
+ def initialize(msg = 'Expected exactly one instance')
33
+ super
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,69 @@
1
+ # Copyright 2018 Shine Solutions
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require_relative 'component/author_dispatcher'
16
+ require_relative 'component/author'
17
+ require_relative 'component/chaos_monkey'
18
+ require_relative 'component/orchestrator'
19
+ require_relative 'component/publish_dispatcher'
20
+ require_relative 'component/publish'
21
+
22
+ module RubyAemAws
23
+ # Factory for the full-set AEM stack component interfaces.
24
+ class FullSetStack
25
+ # @param stack_prefix AWS tag: StackPrefix
26
+ # @param ec2_resource AWS EC2 resource
27
+ # @param elb_client AWS ELB client
28
+ # @param auto_scaling_client AWS AutoScaling client
29
+ # @param cloud_watch_client AWS CloudWatch client
30
+ # @return new RubyAemAws::FullSetStack instance
31
+ def initialize(stack_prefix, ec2_resource, elb_client, auto_scaling_client, cloud_watch_client)
32
+ @stack_prefix = stack_prefix
33
+ @ec2_resource = ec2_resource
34
+ @elb_client = elb_client
35
+ @auto_scaling_client = auto_scaling_client
36
+ @cloud_watch_client = cloud_watch_client
37
+ end
38
+
39
+ # @return new RubyAemAws::Component::AuthorDispatcher instance
40
+ def author_dispatcher
41
+ RubyAemAws::Component::AuthorDispatcher.new(@stack_prefix, @ec2_resource, @auto_scaling_client, @elb_client, @cloud_watch_client)
42
+ end
43
+
44
+ # @return new RubyAemAws::Component::Author instance
45
+ def author
46
+ RubyAemAws::Component::Author.new(@stack_prefix, @ec2_resource, @cloud_watch_client)
47
+ end
48
+
49
+ # @return new RubyAemAws::Component::ChaosMonkey instance
50
+ def chaos_monkey
51
+ RubyAemAws::Component::ChaosMonkey.new(@stack_prefix, @ec2_resource, @auto_scaling_client, @cloud_watch_client)
52
+ end
53
+
54
+ # @return new RubyAemAws::Component::Orchestrator instance
55
+ def orchestrator
56
+ RubyAemAws::Component::Orchestrator.new(@stack_prefix, @ec2_resource, @auto_scaling_client, @cloud_watch_client)
57
+ end
58
+
59
+ # @return new RubyAemAws::Component::Publish instance
60
+ def publish
61
+ RubyAemAws::Component::Publish.new(@stack_prefix, @ec2_resource, @auto_scaling_client, @cloud_watch_client)
62
+ end
63
+
64
+ # @return new RubyAemAws::Component::PublishDispatcher instance
65
+ def publish_dispatcher
66
+ RubyAemAws::Component::PublishDispatcher.new(@stack_prefix, @ec2_resource, @auto_scaling_client, @elb_client, @cloud_watch_client)
67
+ end
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_aem_aws
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Shine Solutions
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: retries
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.4'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.5
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.5
69
+ description: ruby_aem_aws is a Ruby client for Shine Solutions Adobe Experience Manager
70
+ (AEM) Platform on AWS
71
+ email:
72
+ - opensource@shinesolutions.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - lib/ruby_aem_aws.rb
78
+ - lib/ruby_aem_aws/component/abstract_component.rb
79
+ - lib/ruby_aem_aws/component/abstract_grouped_component.rb
80
+ - lib/ruby_aem_aws/component/abstract_single_component.rb
81
+ - lib/ruby_aem_aws/component/author.rb
82
+ - lib/ruby_aem_aws/component/author_dispatcher.rb
83
+ - lib/ruby_aem_aws/component/author_primary.rb
84
+ - lib/ruby_aem_aws/component/author_publish_dispatcher.rb
85
+ - lib/ruby_aem_aws/component/author_standby.rb
86
+ - lib/ruby_aem_aws/component/chaos_monkey.rb
87
+ - lib/ruby_aem_aws/component/component_descriptor.rb
88
+ - lib/ruby_aem_aws/component/mixins/healthy_count_verifier.rb
89
+ - lib/ruby_aem_aws/component/mixins/healthy_state_verifier.rb
90
+ - lib/ruby_aem_aws/component/mixins/instance_describer.rb
91
+ - lib/ruby_aem_aws/component/mixins/metric_verifier.rb
92
+ - lib/ruby_aem_aws/component/orchestrator.rb
93
+ - lib/ruby_aem_aws/component/publish.rb
94
+ - lib/ruby_aem_aws/component/publish_dispatcher.rb
95
+ - lib/ruby_aem_aws/consolidated_stack.rb
96
+ - lib/ruby_aem_aws/constants.rb
97
+ - lib/ruby_aem_aws/error.rb
98
+ - lib/ruby_aem_aws/full_set_stack.rb
99
+ homepage: https://github.com/shinesolutions/ruby_aem_aws
100
+ licenses:
101
+ - Apache-2.0
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '2.1'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.6.14
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: AEM API Ruby client
123
+ test_files: []