cumulus-aws 0.11.1

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 (173) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +3 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +29 -0
  6. data/LICENSE +202 -0
  7. data/README.md +41 -0
  8. data/autocomplete +137 -0
  9. data/bin/cumulus +658 -0
  10. data/cumulus +2 -0
  11. data/cumulus-aws.gemspec +20 -0
  12. data/lib/autoscaling/AutoScaling.rb +40 -0
  13. data/lib/autoscaling/loader/Loader.rb +56 -0
  14. data/lib/autoscaling/manager/Manager.rb +360 -0
  15. data/lib/autoscaling/models/AlarmConfig.rb +165 -0
  16. data/lib/autoscaling/models/AlarmDiff.rb +172 -0
  17. data/lib/autoscaling/models/AutoScalingDiff.rb +178 -0
  18. data/lib/autoscaling/models/GroupConfig.rb +330 -0
  19. data/lib/autoscaling/models/PolicyConfig.rb +135 -0
  20. data/lib/autoscaling/models/PolicyDiff.rb +73 -0
  21. data/lib/autoscaling/models/ScheduledActionDiff.rb +53 -0
  22. data/lib/autoscaling/models/ScheduledConfig.rb +96 -0
  23. data/lib/aws_extensions/ec2/DhcpOptions.rb +41 -0
  24. data/lib/aws_extensions/ec2/Instance.rb +29 -0
  25. data/lib/aws_extensions/ec2/NetworkAcl.rb +25 -0
  26. data/lib/aws_extensions/ec2/NetworkInterface.rb +14 -0
  27. data/lib/aws_extensions/ec2/RouteTable.rb +26 -0
  28. data/lib/aws_extensions/ec2/SecurityGroup.rb +16 -0
  29. data/lib/aws_extensions/ec2/Subnet.rb +28 -0
  30. data/lib/aws_extensions/ec2/Volume.rb +24 -0
  31. data/lib/aws_extensions/ec2/Vpc.rb +14 -0
  32. data/lib/aws_extensions/ec2/VpcEndpoint.rb +11 -0
  33. data/lib/aws_extensions/elb/BackendServerDescription.rb +12 -0
  34. data/lib/aws_extensions/elb/PolicyDescription.rb +14 -0
  35. data/lib/aws_extensions/kinesis/StreamDescription.rb +12 -0
  36. data/lib/aws_extensions/route53/AliasTarget.rb +21 -0
  37. data/lib/aws_extensions/s3/Bucket.rb +33 -0
  38. data/lib/aws_extensions/s3/BucketAcl.rb +28 -0
  39. data/lib/aws_extensions/s3/BucketCors.rb +17 -0
  40. data/lib/aws_extensions/s3/BucketLifecycle.rb +21 -0
  41. data/lib/aws_extensions/s3/BucketLogging.rb +18 -0
  42. data/lib/aws_extensions/s3/BucketNotification.rb +23 -0
  43. data/lib/aws_extensions/s3/BucketPolicy.rb +18 -0
  44. data/lib/aws_extensions/s3/BucketTagging.rb +15 -0
  45. data/lib/aws_extensions/s3/BucketVersioning.rb +14 -0
  46. data/lib/aws_extensions/s3/BucketWebsite.rb +49 -0
  47. data/lib/aws_extensions/s3/CORSRule.rb +27 -0
  48. data/lib/aws_extensions/s3/ReplicationConfiguration.rb +22 -0
  49. data/lib/cloudfront/CloudFront.rb +83 -0
  50. data/lib/cloudfront/loader/Loader.rb +31 -0
  51. data/lib/cloudfront/manager/Manager.rb +183 -0
  52. data/lib/cloudfront/models/CacheBehaviorConfig.rb +237 -0
  53. data/lib/cloudfront/models/CacheBehaviorDiff.rb +211 -0
  54. data/lib/cloudfront/models/CustomOriginConfig.rb +51 -0
  55. data/lib/cloudfront/models/CustomOriginDiff.rb +74 -0
  56. data/lib/cloudfront/models/DistributionConfig.rb +183 -0
  57. data/lib/cloudfront/models/DistributionDiff.rb +131 -0
  58. data/lib/cloudfront/models/InvalidationConfig.rb +37 -0
  59. data/lib/cloudfront/models/OriginConfig.rb +144 -0
  60. data/lib/cloudfront/models/OriginDiff.rb +86 -0
  61. data/lib/cloudfront/models/OriginSslProtocols.rb +28 -0
  62. data/lib/cloudfront/models/OriginSslProtocolsDiff.rb +39 -0
  63. data/lib/common/BaseLoader.rb +80 -0
  64. data/lib/common/manager/Manager.rb +148 -0
  65. data/lib/common/models/Diff.rb +114 -0
  66. data/lib/common/models/ListChange.rb +21 -0
  67. data/lib/common/models/TagsDiff.rb +55 -0
  68. data/lib/common/models/UTCTimeSource.rb +17 -0
  69. data/lib/conf/Configuration.rb +365 -0
  70. data/lib/ec2/EC2.rb +503 -0
  71. data/lib/ec2/IPProtocolMapping.rb +165 -0
  72. data/lib/ec2/loaders/EbsLoader.rb +19 -0
  73. data/lib/ec2/loaders/InstanceLoader.rb +32 -0
  74. data/lib/ec2/managers/EbsManager.rb +176 -0
  75. data/lib/ec2/managers/InstanceManager.rb +509 -0
  76. data/lib/ec2/models/EbsGroupConfig.rb +133 -0
  77. data/lib/ec2/models/EbsGroupDiff.rb +48 -0
  78. data/lib/ec2/models/InstanceConfig.rb +202 -0
  79. data/lib/ec2/models/InstanceDiff.rb +95 -0
  80. data/lib/elb/ELB.rb +148 -0
  81. data/lib/elb/loader/Loader.rb +65 -0
  82. data/lib/elb/manager/Manager.rb +581 -0
  83. data/lib/elb/models/AccessLogConfig.rb +82 -0
  84. data/lib/elb/models/AccessLogDiff.rb +47 -0
  85. data/lib/elb/models/HealthCheckConfig.rb +91 -0
  86. data/lib/elb/models/HealthCheckDiff.rb +50 -0
  87. data/lib/elb/models/ListenerConfig.rb +99 -0
  88. data/lib/elb/models/ListenerDiff.rb +91 -0
  89. data/lib/elb/models/LoadBalancerConfig.rb +239 -0
  90. data/lib/elb/models/LoadBalancerDiff.rb +265 -0
  91. data/lib/iam/IAM.rb +36 -0
  92. data/lib/iam/loader/Loader.rb +117 -0
  93. data/lib/iam/manager/IamGroups.rb +98 -0
  94. data/lib/iam/manager/IamResource.rb +288 -0
  95. data/lib/iam/manager/IamRoles.rb +112 -0
  96. data/lib/iam/manager/IamUsers.rb +54 -0
  97. data/lib/iam/manager/Manager.rb +29 -0
  98. data/lib/iam/migration/AssumeRoleUnifier.rb +34 -0
  99. data/lib/iam/migration/PolicyUnifier.rb +90 -0
  100. data/lib/iam/models/GroupConfig.rb +40 -0
  101. data/lib/iam/models/IamDiff.rb +132 -0
  102. data/lib/iam/models/PolicyConfig.rb +67 -0
  103. data/lib/iam/models/ResourceWithPolicy.rb +208 -0
  104. data/lib/iam/models/RoleConfig.rb +53 -0
  105. data/lib/iam/models/StatementConfig.rb +35 -0
  106. data/lib/iam/models/UserConfig.rb +21 -0
  107. data/lib/kinesis/Kinesis.rb +94 -0
  108. data/lib/kinesis/loader/Loader.rb +19 -0
  109. data/lib/kinesis/manager/Manager.rb +206 -0
  110. data/lib/kinesis/models/StreamConfig.rb +75 -0
  111. data/lib/kinesis/models/StreamDiff.rb +58 -0
  112. data/lib/lambda/Lambda.rb +41 -0
  113. data/lib/route53/loader/Loader.rb +32 -0
  114. data/lib/route53/manager/Manager.rb +241 -0
  115. data/lib/route53/models/AliasTarget.rb +86 -0
  116. data/lib/route53/models/RecordConfig.rb +178 -0
  117. data/lib/route53/models/RecordDiff.rb +140 -0
  118. data/lib/route53/models/Vpc.rb +24 -0
  119. data/lib/route53/models/ZoneConfig.rb +156 -0
  120. data/lib/route53/models/ZoneDiff.rb +118 -0
  121. data/lib/s3/S3.rb +89 -0
  122. data/lib/s3/loader/Loader.rb +66 -0
  123. data/lib/s3/manager/Manager.rb +296 -0
  124. data/lib/s3/models/BucketConfig.rb +321 -0
  125. data/lib/s3/models/BucketDiff.rb +167 -0
  126. data/lib/s3/models/GrantConfig.rb +189 -0
  127. data/lib/s3/models/GrantDiff.rb +50 -0
  128. data/lib/s3/models/LifecycleConfig.rb +142 -0
  129. data/lib/s3/models/LifecycleDiff.rb +46 -0
  130. data/lib/s3/models/LoggingConfig.rb +81 -0
  131. data/lib/s3/models/NotificationConfig.rb +157 -0
  132. data/lib/s3/models/NotificationDiff.rb +62 -0
  133. data/lib/s3/models/ReplicationConfig.rb +133 -0
  134. data/lib/s3/models/ReplicationDiff.rb +60 -0
  135. data/lib/s3/models/WebsiteConfig.rb +107 -0
  136. data/lib/security/SecurityGroups.rb +39 -0
  137. data/lib/security/loader/Loader.rb +94 -0
  138. data/lib/security/manager/Manager.rb +246 -0
  139. data/lib/security/models/RuleConfig.rb +161 -0
  140. data/lib/security/models/RuleDiff.rb +72 -0
  141. data/lib/security/models/RuleMigration.rb +127 -0
  142. data/lib/security/models/SecurityGroupConfig.rb +172 -0
  143. data/lib/security/models/SecurityGroupDiff.rb +112 -0
  144. data/lib/sns/SNS.rb +40 -0
  145. data/lib/sqs/SQS.rb +62 -0
  146. data/lib/sqs/loader/Loader.rb +34 -0
  147. data/lib/sqs/manager/Manager.rb +128 -0
  148. data/lib/sqs/models/DeadLetterConfig.rb +70 -0
  149. data/lib/sqs/models/DeadLetterDiff.rb +35 -0
  150. data/lib/sqs/models/QueueConfig.rb +115 -0
  151. data/lib/sqs/models/QueueDiff.rb +89 -0
  152. data/lib/util/Colors.rb +111 -0
  153. data/lib/util/StatusCodes.rb +51 -0
  154. data/lib/vpc/loader/Loader.rb +73 -0
  155. data/lib/vpc/manager/Manager.rb +954 -0
  156. data/lib/vpc/models/AclEntryConfig.rb +150 -0
  157. data/lib/vpc/models/AclEntryDiff.rb +54 -0
  158. data/lib/vpc/models/DhcpConfig.rb +100 -0
  159. data/lib/vpc/models/DhcpDiff.rb +90 -0
  160. data/lib/vpc/models/EndpointConfig.rb +76 -0
  161. data/lib/vpc/models/EndpointDiff.rb +69 -0
  162. data/lib/vpc/models/NetworkAclConfig.rb +87 -0
  163. data/lib/vpc/models/NetworkAclDiff.rb +116 -0
  164. data/lib/vpc/models/RouteConfig.rb +82 -0
  165. data/lib/vpc/models/RouteDiff.rb +50 -0
  166. data/lib/vpc/models/RouteTableConfig.rb +92 -0
  167. data/lib/vpc/models/RouteTableDiff.rb +101 -0
  168. data/lib/vpc/models/SubnetConfig.rb +113 -0
  169. data/lib/vpc/models/SubnetDiff.rb +78 -0
  170. data/lib/vpc/models/VpcConfig.rb +173 -0
  171. data/lib/vpc/models/VpcDiff.rb +315 -0
  172. data/rakefile.rb +8 -0
  173. metadata +245 -0
@@ -0,0 +1,157 @@
1
+ require "lambda/Lambda"
2
+ require "s3/models/NotificationDiff"
3
+ require "sns/SNS"
4
+ require "sqs/SQS"
5
+
6
+ module Cumulus
7
+ module S3
8
+ class NotificationConfig
9
+ attr_reader :name
10
+ attr_reader :prefix
11
+ attr_reader :suffix
12
+ attr_reader :target
13
+ attr_reader :triggers
14
+ attr_reader :type
15
+
16
+ # Public: Constructor
17
+ #
18
+ # json - a hash representing the JSON configuration. Expects to be passed
19
+ # an object from the "notifications" array of S3 bucket configuration.
20
+ def initialize(json = nil)
21
+ if json
22
+ @name = json["name"]
23
+ @prefix = json["prefix"]
24
+ @suffix = json["suffix"]
25
+ @target = json["target"]
26
+ @triggers = (json["triggers"] || []).map { |t| "s3:#{t}" }
27
+ @type = json["type"]
28
+ end
29
+ end
30
+
31
+ # Public: Populate this NotificationConfig with the values in an AWS configuration
32
+ # of events.
33
+ #
34
+ # aws - the aws object to populate from
35
+ def populate!(aws)
36
+ @name = aws.id
37
+ @prefix = aws.filter.key.filter_rules.find { |r| r.name.downcase == "prefix" }.value rescue nil
38
+ @suffix = aws.filter.key.filter_rules.find { |r| r.name.downcase == "suffix" }.value rescue nil
39
+ @triggers = aws.events
40
+ if aws.respond_to? "queue_arn"
41
+ @type = "sqs"
42
+ @target = aws.queue_arn[(aws.queue_arn.rindex(":") + 1)..-1]
43
+ elsif aws.respond_to? "lambda_function_arn"
44
+ @type = "lambda"
45
+ @target = aws.lambda_function_arn[(aws.lambda_function_arn.rindex(":") + 1)..-1]
46
+ else
47
+ @type = "sns"
48
+ @target = aws.topic_arn[(aws.topic_arn.rindex(":") + 1)..-1]
49
+ end
50
+ end
51
+
52
+ # Public: Produce an AWS compatible hash for this NotificationConfig.
53
+ #
54
+ # Returns the hash.
55
+ def to_aws
56
+ if @type == "sns"
57
+ topic_arn = SNS.get_aws(@target)
58
+ elsif @type == "sqs"
59
+ queue_arn = SQS.get_arn(@target)
60
+ elsif @type == "lambda"
61
+ lambda_function_arn = Lambda.get_aws(@target).function_arn
62
+ end
63
+ {
64
+ id: @name,
65
+ events: @triggers,
66
+ topic_arn: topic_arn,
67
+ queue_arn: queue_arn,
68
+ lambda_function_arn: lambda_function_arn,
69
+ filter: {
70
+ key: {
71
+ filter_rules: [
72
+ if @prefix then {
73
+ name: "prefix",
74
+ value: @prefix
75
+ } end,
76
+ if @suffix then {
77
+ name: "suffix",
78
+ value: @suffix
79
+ } end
80
+ ].reject { |e| e.nil? }
81
+ }.reject { |k, v| v.nil? or v.empty? }
82
+ }.reject { |k, v| v.nil? or v.empty? }
83
+ }.reject { |k, v| v.nil? or v.empty? }
84
+ end
85
+
86
+ # Public: Produce an AWS compatible hash for this NotificationConfig.
87
+ #
88
+ # Returns the hash
89
+ def to_h
90
+ {
91
+ name: @name,
92
+ triggers: @triggers.map { |t| t[3..-1] }, # substring off the "s3:"
93
+ prefix: @prefix,
94
+ suffix: @suffix,
95
+ type: @type,
96
+ target: @target,
97
+ }.reject { |k, v| v.nil? }
98
+ end
99
+
100
+ # Public: Produce an array of differences between this local configuration
101
+ # and the configuration in AWS
102
+ #
103
+ # aws - the AWS resource
104
+ #
105
+ # Returns an array of the NotificationDiffs that were found
106
+ def diff(aws)
107
+ diffs = []
108
+
109
+ if @prefix != aws.prefix
110
+ diffs << NotificationDiff.new(NotificationChange::PREFIX, aws, self)
111
+ end
112
+ if @suffix != aws.suffix
113
+ diffs << NotificationDiff.new(NotificationChange::SUFFIX, aws, self)
114
+ end
115
+ if @triggers.sort != aws.triggers.sort
116
+ diffs << NotificationDiff.new(NotificationChange::TRIGGERS, aws, self)
117
+ end
118
+ if @type != aws.type
119
+ diffs << NotificationDiff.new(NotificationChange::TYPE, aws, self)
120
+ end
121
+ if @target != aws.target
122
+ diffs << NotificationDiff.new(NotificationChange::TARGET, aws, self)
123
+ end
124
+
125
+ diffs
126
+ end
127
+
128
+ # Public: Check NotificationConfig equality with other objects.
129
+ #
130
+ # other - the other object to check
131
+ #
132
+ # Returns whether this NotificationConfig is equal to `other`
133
+ def ==(other)
134
+ if !other.is_a? NotificationConfig or
135
+ @name != other.name or
136
+ @prefix != other.prefix or
137
+ @suffix != other.suffix or
138
+ @target != other.target or
139
+ @triggers.sort != other.triggers.sort or
140
+ @type != other.type
141
+ false
142
+ else
143
+ true
144
+ end
145
+ end
146
+
147
+ # Public: Check if this NotificationConfig is not equal to the other object
148
+ #
149
+ # other - the other object to check
150
+ #
151
+ # Returns whether this NotificationConfig is not equal to `other`
152
+ def !=(other)
153
+ !(self == other)
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,62 @@
1
+ require "common/models/Diff"
2
+ require "common/models/ListChange"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module S3
7
+ # Public: The types of changes that can be made to an S3 Notification
8
+ module NotificationChange
9
+ include Common::DiffChange
10
+
11
+ PREFIX = Common::DiffChange.next_change_id
12
+ SUFFIX = Common::DiffChange.next_change_id
13
+ TRIGGERS = Common::DiffChange.next_change_id
14
+ TYPE = Common::DiffChange.next_change_id
15
+ TARGET = Common::DiffChange.next_change_id
16
+ end
17
+
18
+ # Public: Represents a single difference between local configuration and AWS
19
+ # S3 Notification configuration
20
+ class NotificationDiff < Common::Diff
21
+ include NotificationChange
22
+
23
+ def initialize(type, aws = nil, local = nil)
24
+ super(type, aws, local)
25
+
26
+ if aws and local
27
+ @triggers = Common::ListChange.new(
28
+ local.triggers - aws.triggers,
29
+ aws.triggers - local.triggers
30
+ )
31
+ end
32
+ end
33
+
34
+ def asset_type
35
+ "Notification"
36
+ end
37
+
38
+ def aws_name
39
+ @aws.name
40
+ end
41
+
42
+ def diff_string
43
+ case @type
44
+ when PREFIX
45
+ "Prefix: AWS - #{Colors.aws_changes(@aws.prefix)}, Local - #{Colors.local_changes(@local.prefix)}"
46
+ when SUFFIX
47
+ "Suffix: AWS - #{Colors.aws_changes(@aws.suffix)}, Local - #{Colors.local_changes(@local.suffix)}"
48
+ when TRIGGERS
49
+ [
50
+ "Triggers:",
51
+ @triggers.removed.map { |t| Colors.removed("\t#{t}") },
52
+ @triggers.added.map { |t| Colors.added("\t#{t}") },
53
+ ].flatten.join("\n")
54
+ when TYPE
55
+ "Type: AWS - #{Colors.aws_changes(@aws.type)}, Local - #{Colors.local_changes(@local.type)}"
56
+ when TARGET
57
+ "Target: AWS - #{Colors.aws_changes(@aws.target)}, Local - #{Colors.local_changes(@local.target)}"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,133 @@
1
+ require "s3/models/ReplicationDiff"
2
+ require "iam/IAM"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module S3
7
+ class ReplicationConfig
8
+ attr_reader :destination
9
+ attr_reader :iam_role
10
+ attr_reader :prefixes
11
+
12
+ # Public: Constructor
13
+ #
14
+ # json - a hash representing the JSON configuration. Expects to be passed
15
+ # the "replication" node of S3 bucket configuration.
16
+ def initialize(json = nil)
17
+ if json
18
+ @destination = json["destination"]
19
+ @iam_role = json["iam-role"]
20
+ @prefixes = json["prefixes"] || []
21
+ end
22
+ end
23
+
24
+ # Public: Produce an AWS hash representing this ReplicationConfig
25
+ #
26
+ # Returns the hash
27
+ def to_aws
28
+ role_arn = IAM.get_role_arn(@iam_role)
29
+ if role_arn.nil?
30
+ puts Colors.red("No IAM role named #{name}")
31
+ exit
32
+ end
33
+
34
+ {
35
+ role: role_arn,
36
+ rules: if @prefixes.empty?
37
+ [{
38
+ prefix: "",
39
+ status: "Enabled",
40
+ destination: {
41
+ bucket: "arn:aws:s3:::#{@destination}"
42
+ }
43
+ }]
44
+ else
45
+ @prefixes.map do |prefix|
46
+ {
47
+ prefix: prefix,
48
+ status: "Enabled",
49
+ destination: {
50
+ bucket: "arn:aws:s3:::#{@destination}"
51
+ }
52
+ }
53
+ end
54
+ end
55
+ }
56
+ end
57
+
58
+ # Public: Converts this ReplicationConfig to a hash that matches Cumulus
59
+ # configuration.
60
+ #
61
+ # Returns the hash
62
+ def to_h
63
+ {
64
+ "iam-role" => @iam_role,
65
+ "prefixes" => if !@prefixes.empty? then @prefixes end,
66
+ "destination" => @destination,
67
+ }.reject { |k, v| v.nil? }
68
+ end
69
+
70
+ # Public: Produce an array of differences between this local configuration
71
+ # and the configuration in AWS
72
+ #
73
+ # aws - the AWS resource
74
+ #
75
+ # Returns an array of the ReplicationDiff that were found
76
+ def diff(aws)
77
+ diffs = []
78
+
79
+ if @destination != aws.destination
80
+ diffs << ReplicationDiff.new(ReplicationChange::DESTINATION, aws, self)
81
+ end
82
+ if @iam_role != aws.iam_role
83
+ diffs << ReplicationDiff.new(ReplicationChange::ROLE, aws, self)
84
+ end
85
+ if @prefixes.sort != aws.prefixes
86
+ diffs << ReplicationDiff.new(ReplicationChange::PREFIX, aws, self)
87
+ end
88
+
89
+ diffs
90
+ end
91
+
92
+ # Public: Populate this ReplicationConfig with the values in an AWS
93
+ # replication configuration.
94
+ #
95
+ # aws - the aws object to populate from
96
+ def populate!(aws)
97
+ @destination = aws.rules[0].destination.bucket
98
+ @destination = @destination[(@destination.rindex(":") + 1)..-1]
99
+ @iam_role = aws.role[(aws.role.rindex("/") + 1)..-1]
100
+ @prefixes = aws.rules.map(&:prefix)
101
+
102
+ if @prefixes.size == 1 and @prefixes[0] == ""
103
+ @prefixes = []
104
+ end
105
+ end
106
+
107
+ # Public: Check ReplicationConfig equality with other objects.
108
+ #
109
+ # other - the other object to check
110
+ #
111
+ # Returns whether this ReplicationConfig is equal to `other`
112
+ def ==(other)
113
+ if !other.is_a? ReplicationConfig or
114
+ @destination != other.destination or
115
+ @iam_role != other.iam_role or
116
+ @prefixes.sort != other.prefix.sort
117
+ false
118
+ else
119
+ true
120
+ end
121
+ end
122
+
123
+ # Public: Check if this ReplicationConfig is not equal to the other object
124
+ #
125
+ # other - the other object to check
126
+ #
127
+ # Returns whether this ReplicationConfig is not equal to `other`
128
+ def !=(other)
129
+ !(self == other)
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,60 @@
1
+ require "common/models/Diff"
2
+ require "common/models/ListChange"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module S3
7
+ # Public: The types of changes that can be made to S3 Replication
8
+ module ReplicationChange
9
+ include Common::DiffChange
10
+
11
+ DESTINATION = Common::DiffChange.next_change_id
12
+ PREFIX = Common::DiffChange.next_change_id
13
+ ROLE = Common::DiffChange.next_change_id
14
+ end
15
+
16
+ # Public: Represents a single difference between local configuration and AWS
17
+ # S3 Replication configuration.
18
+ class ReplicationDiff < Common::Diff
19
+ include ReplicationChange
20
+
21
+ def initialize(type, aws = nil, local = nil)
22
+ super(type, aws, local)
23
+
24
+ if aws and local
25
+ @prefixes = Common::ListChange.new(
26
+ local.prefixes - aws.prefixes,
27
+ aws.prefixes - local.prefixes
28
+ )
29
+ end
30
+ end
31
+
32
+ def asset_type
33
+ "S3 Replication"
34
+ end
35
+
36
+ def aws_name
37
+ "Configuration"
38
+ end
39
+
40
+ def local_name
41
+ "Configuration"
42
+ end
43
+
44
+ def diff_string
45
+ case @type
46
+ when DESTINATION
47
+ "Destination: AWS - #{Colors.aws_changes(@aws.destination)}, Local - #{Colors.local_changes(@local.destination)}"
48
+ when ROLE
49
+ "IAM Role: AWS - #{Colors.aws_changes(@aws.iam_role)}, Local - #{Colors.local_changes(@local.iam_role)}"
50
+ when PREFIX
51
+ [
52
+ "Prefixes:",
53
+ @prefixes.removed.map { |p| Colors.removed("\t#{p}") },
54
+ @prefixes.added.map { |p| Colors.added("\t#{p}") },
55
+ ].flatten.join("\n")
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,107 @@
1
+ module Cumulus
2
+ module S3
3
+ class WebsiteConfig
4
+ attr_reader :error
5
+ attr_reader :index
6
+ attr_reader :redirect
7
+
8
+ # Public: Constructor
9
+ #
10
+ # json - a hash representing the JSON configuration, expects to be handed
11
+ # the 'website' node of S3 configuration.
12
+ def initialize(json = nil)
13
+ if json
14
+ @redirect = json["redirect"]
15
+ @index = json["index"]
16
+ @error = json["error"]
17
+ end
18
+ end
19
+
20
+ # Public: Populate this WebsiteConfig with the values in an AWS WebsiteConfiguration
21
+ # object.
22
+ #
23
+ # aws - the aws object to populate from
24
+ def populate!(aws)
25
+ @index = aws.safe_index
26
+ @error = aws.safe_error
27
+ @redirect = aws.safe_redirection
28
+ end
29
+
30
+ # Public: Produce a hash that is compatible with AWS website configuration.
31
+ #
32
+ # Returns the website configuration in AWS format
33
+ def to_aws
34
+ if @index
35
+ {
36
+ error_document: {
37
+ key: @error
38
+ },
39
+ index_document: {
40
+ suffix: @index
41
+ },
42
+ }
43
+ else
44
+ {
45
+ redirect_all_requests_to: {
46
+ host_name: if @redirect and @redirect.include?("://")
47
+ @redirect.split("://")[1]
48
+ else
49
+ @redirect
50
+ end,
51
+ protocol: if @redirect and @redirect.include?("://") then @redirect.split("://")[0] end
52
+ }
53
+ }
54
+ end
55
+ end
56
+
57
+ # Public: Converts this WebsiteConfig to a hash that matches Cumulus
58
+ # configuration.
59
+ #
60
+ # Returns the hash
61
+ def to_h
62
+ {
63
+ error: @error,
64
+ index: @index,
65
+ redirect: @redirect,
66
+ }.reject { |k, v| v.nil? }
67
+ end
68
+
69
+ # Public: Check WebsiteConfig equality with other objects
70
+ #
71
+ # other - the other object to check
72
+ #
73
+ # Returns whether this WebsiteConfig is equal to `other`
74
+ def ==(other)
75
+ if !other.is_a? WebsiteConfig or
76
+ @redirect != other.redirect or
77
+ @index != other.index or
78
+ @error != other.error
79
+ false
80
+ else
81
+ true
82
+ end
83
+ end
84
+
85
+ # Public: Check if this WebsiteConfig is not equal to the other object
86
+ #
87
+ # other - the other object to check
88
+ #
89
+ # Returns whether this WebsiteConfig is not equal to `other`
90
+ def !=(other)
91
+ !(self == other)
92
+ end
93
+
94
+ def to_s
95
+ if @redirect
96
+ "Redirect all traffic to #{@redirect}"
97
+ elsif @index
98
+ if @error
99
+ "Index document: #{@index}, Error document: #{@error}"
100
+ else
101
+ "Index document: #{@index}"
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end