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,211 @@
1
+ require "common/models/Diff"
2
+ require "common/models/ListChange"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module CloudFront
7
+
8
+ # Public: The types of changes that can be made to cache behaviors
9
+ module CacheBehaviorChange
10
+ include Common::DiffChange
11
+
12
+ PATH = Common::DiffChange::next_change_id
13
+ TARGET = Common::DiffChange::next_change_id
14
+ QUERY = Common::DiffChange::next_change_id
15
+ COOKIES = Common::DiffChange::next_change_id
16
+ COOKIES_WHITELIST = Common::DiffChange::next_change_id
17
+ HEADERS = Common::DiffChange::next_change_id
18
+ SIGNERS = Common::DiffChange::next_change_id
19
+ VIEWER_PROTOCOL = Common::DiffChange::next_change_id
20
+ MINTTL = Common::DiffChange::next_change_id
21
+ MAXTTL = Common::DiffChange::next_change_id
22
+ DEFTTL = Common::DiffChange::next_change_id
23
+ STREAMING = Common::DiffChange::next_change_id
24
+ METHODS_ALLOWED = Common::DiffChange::next_change_id
25
+ METHODS_CACHED = Common::DiffChange::next_change_id
26
+ COMPRESS = Common::DiffChange::next_change_id
27
+ end
28
+
29
+ # Public: Represents a single difference between local configuration and AWS
30
+ # configuration of zones.
31
+ class CacheBehaviorDiff < Common::Diff
32
+ include CacheBehaviorChange
33
+
34
+ attr_accessor :cookies
35
+ attr_accessor :headers
36
+ attr_accessor :signers
37
+ attr_accessor :allowed_methods
38
+ attr_accessor :cached_methods
39
+
40
+ # Public: Static method that produces a diff representing changes in CacheBehavior cookies whitelist
41
+ #
42
+ # added_cookies - the cookies that were added
43
+ # removed_cookies - the cookies that were removed
44
+ # local - the local configuration for the zone
45
+ #
46
+ # Returns the diff
47
+ def self.cookies_whitelist(added_cookies, removed_cookies, local)
48
+ diff = CacheBehaviorDiff.new(COOKIES_WHITELIST, nil, local)
49
+ diff.cookies = Common::ListChange.new(added_cookies, removed_cookies)
50
+ diff
51
+ end
52
+
53
+ # Public: Static method that produces a diff representing changes in CacheBehavior headers
54
+ #
55
+ # added_headers - the headers that were added
56
+ # removed_headers - the headers that were removed
57
+ # local - the local configuration for the zone
58
+ #
59
+ # Returns the diff
60
+ def self.headers(added_headers, removed_headers, local)
61
+ diff = CacheBehaviorDiff.new(HEADERS, nil, local)
62
+ diff.headers = Common::ListChange.new(added_headers, removed_headers)
63
+ diff
64
+ end
65
+
66
+ # Public: Static method that produces a diff representing changes in CacheBehavior trusted signers
67
+ #
68
+ # added_signers - the trusted signers that were added
69
+ # removed_signers - the trusted signers that were removed
70
+ # local - the local configuration for the zone
71
+ #
72
+ # Returns the diff
73
+ def self.signers(added_signers, removed_signers, local)
74
+ diff = CacheBehaviorDiff.new(SIGNERS, nil, local)
75
+ diff.signers = Common::ListChange.new(added_signers, removed_signers)
76
+ diff
77
+ end
78
+
79
+ # Public: Static method that produces a diff representing changes in CacheBehavior allowed methods
80
+ #
81
+ # added_allowed_methods - the allowed methods that were added
82
+ # removed_allowed_methods - the allowed methods that were removed
83
+ # local - the local configuration for the zone
84
+ #
85
+ # Returns the diff
86
+ def self.allowed_methods(added_allowed_methods, removed_allowed_methods, local)
87
+ diff = CacheBehaviorDiff.new(METHODS_ALLOWED, nil, local)
88
+ diff.allowed_methods = Common::ListChange.new(added_allowed_methods, removed_allowed_methods)
89
+ diff
90
+ end
91
+
92
+ # Public: Static method that produces a diff representing changes in CacheBehavior cached methods
93
+ #
94
+ # added_cached_methods - the cached methods that were added
95
+ # removed_cached_methods - the cached methods that were removed
96
+ # local - the local configuration for the zone
97
+ #
98
+ # Returns the diff
99
+ def self.cached_methods(added_cached_methods, removed_cached_methods, local)
100
+ diff = CacheBehaviorDiff.new(METHODS_CACHED, nil, local)
101
+ diff.cached_methods = Common::ListChange.new(added_cached_methods, removed_cached_methods)
102
+ diff
103
+ end
104
+
105
+ def diff_string
106
+ case @type
107
+ when PATH
108
+ [
109
+ "path:",
110
+ Colors.aws_changes("\tAWS - #{@aws.path_pattern}"),
111
+ Colors.local_changes("\tLocal - #{@local.path_pattern}"),
112
+ ].join("\n")
113
+ when TARGET
114
+ [
115
+ "target origin id:",
116
+ Colors.aws_changes("\tAWS - #{@aws.target_origin_id}"),
117
+ Colors.local_changes("\tLocal - #{@local.target_origin_id}"),
118
+ ].join("\n")
119
+ when QUERY
120
+ [
121
+ "forward query strings:",
122
+ Colors.aws_changes("\tAWS - #{@aws.forwarded_values.query_string}"),
123
+ Colors.local_changes("\tLocal - #{@local.forward_query_strings}"),
124
+ ].join("\n")
125
+ when COOKIES
126
+ [
127
+ "forwarded cookies:",
128
+ Colors.aws_changes("\tAWS - #{@aws.forwarded_values.cookies.forward}"),
129
+ Colors.local_changes("\tLocal - #{@local.forwarded_cookies}"),
130
+ ].join("\n")
131
+ when COOKIES_WHITELIST
132
+ [
133
+ "whitelisted forwarded cookies:",
134
+ cookies.removed.map{ |removed| Colors.removed("\t#{removed}")},
135
+ cookies.added.map{ |added| Colors.added("\t#{added}")},
136
+ ].flatten.join("\n")
137
+ when HEADERS
138
+ [
139
+ "forwarded headers:",
140
+ headers.removed.map{ |removed| Colors.removed("\t#{removed}")},
141
+ headers.added.map{ |added| Colors.added("\t#{added}")},
142
+ ].flatten.join("\n")
143
+ when SIGNERS
144
+ [
145
+ "trusted signers:",
146
+ signers.removed.map{ |removed| Colors.removed("\t#{removed}")},
147
+ signers.added.map{ |added| Colors.added("\t#{added}")},
148
+ ].flatten.join("\n")
149
+ when VIEWER_PROTOCOL
150
+ [
151
+ "viewer protocol policy:",
152
+ Colors.aws_changes("\tAWS - #{@aws.viewer_protocol_policy}"),
153
+ Colors.local_changes("\tLocal - #{@local.viewer_protocol_policy}"),
154
+ ].join("\n")
155
+ when MINTTL
156
+ [
157
+ "min ttl:",
158
+ Colors.aws_changes("\tAWS - #{@aws.min_ttl}"),
159
+ Colors.local_changes("\tLocal - #{@local.min_ttl}"),
160
+ ].join("\n")
161
+ when MAXTTL
162
+ [
163
+ "max ttl:",
164
+ Colors.aws_changes("\tAWS - #{@aws.max_ttl}"),
165
+ Colors.local_changes("\tLocal - #{@local.max_ttl}"),
166
+ ].join("\n")
167
+ when DEFTTL
168
+ [
169
+ "default ttl:",
170
+ Colors.aws_changes("\tAWS - #{@aws.default_ttl}"),
171
+ Colors.local_changes("\tLocal - #{@local.default_ttl}"),
172
+ ].join("\n")
173
+ when STREAMING
174
+ [
175
+ "smooth streaming:",
176
+ Colors.aws_changes("\tAWS - #{@aws.smooth_streaming}"),
177
+ Colors.local_changes("\tLocal - #{@local.smooth_streaming}"),
178
+ ].join("\n")
179
+ when METHODS_ALLOWED
180
+ [
181
+ "allowed methods:",
182
+ allowed_methods.removed.map{ |removed| Colors.removed("\t#{removed}")},
183
+ allowed_methods.added.map{ |added| Colors.added("\t#{added}")},
184
+ ].flatten.join("\n")
185
+ when METHODS_CACHED
186
+ [
187
+ "cached methods:",
188
+ cached_methods.removed.map{ |removed| Colors.removed("\t#{removed}")},
189
+ cached_methods.added.map{ |added| Colors.added("\t#{added}")},
190
+ ].flatten.join("\n")
191
+ when COMPRESS
192
+ [
193
+ "compress:",
194
+ Colors.aws_changes("\tAWS - #{@aws.compress}"),
195
+ Colors.local_changes("\tLocal - #{@local.compress}"),
196
+ ].join("\n")
197
+ end
198
+ end
199
+
200
+ def asset_type
201
+ "Cache Behavior"
202
+ end
203
+
204
+ def aws_name
205
+ "#{@aws.target_origin_id}/#{@aws.path_pattern}"
206
+ end
207
+
208
+ end
209
+
210
+ end
211
+ end
@@ -0,0 +1,51 @@
1
+ require "cloudfront/models/CustomOriginDiff"
2
+
3
+ module Cumulus
4
+ module CloudFront
5
+ CustomOriginConfig = Struct.new(:http_port, :https_port, :protocol_policy, :origin_ssl_protocols) do
6
+
7
+ def diff(aws)
8
+ diffs = []
9
+
10
+ aws_http_port = aws && aws.http_port
11
+ if self.http_port != aws_http_port
12
+ diffs << CustomOriginDiff.new(CustomOriginChange::HTTP, aws_http_port, self.http_port)
13
+ end
14
+
15
+ aws_https_port = aws && aws.https_port
16
+ if self.https_port != aws_https_port
17
+ diffs << CustomOriginDiff.new(CustomOriginChange::HTTPS, aws_https_port, self.https_port)
18
+ end
19
+
20
+ aws_protocol = aws && aws.origin_protocol_policy
21
+ if self.protocol_policy != aws_protocol
22
+ diffs << CustomOriginDiff.new(CustomOriginChange::POLICY, aws_protocol, self.protocol_policy)
23
+ end
24
+
25
+ if self.origin_ssl_protocols
26
+ ssl_protocol_diffs = self.origin_ssl_protocols.diff(aws.origin_ssl_protocols)
27
+ else
28
+ if aws.origin_ssl_protocols && aws.origin_protocol_policy != "http-only"
29
+ ssl_protocol_diffs = OriginSslProtocols.new([]).diff(aws.origin_ssl_protocols)
30
+ end
31
+ end
32
+ if ssl_protocol_diffs && ssl_protocol_diffs.length > 0
33
+ diffs << CustomOriginDiff.ssl_protocols(ssl_protocol_diffs, aws, self)
34
+ end
35
+
36
+ diffs
37
+ end
38
+
39
+ def to_local
40
+ {
41
+ "http-port" => self.http_port,
42
+ "https-port" => self.https_port,
43
+ "protocol-policy" => self.protocol_policy,
44
+ "origin-ssl-protocols" => if self.origin_ssl_protocols
45
+ self.origin_ssl_protocols.to_local
46
+ end
47
+ }.reject { |k, v| v.nil? }
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,74 @@
1
+ require "common/models/Diff"
2
+ require "util/Colors"
3
+
4
+ module Cumulus
5
+ module CloudFront
6
+
7
+ # Public: The types of changes that can be made to zones
8
+ module CustomOriginChange
9
+ include Common::DiffChange
10
+
11
+ HTTP = Common::DiffChange::next_change_id
12
+ HTTPS = Common::DiffChange::next_change_id
13
+ POLICY = Common::DiffChange::next_change_id
14
+ SSL_PROTOCOLS = Common::DiffChange::next_change_id
15
+ end
16
+
17
+ # Public: Represents a single difference between local configuration and AWS
18
+ # configuration of zones.
19
+ class CustomOriginDiff < Common::Diff
20
+ include CustomOriginChange
21
+
22
+ attr_accessor :ssl_protocol_changes
23
+
24
+ # Public: Static method that produces a diff representing changes in ssl protocols
25
+ #
26
+ # changes - the OriginSslProtocolsDiffs
27
+ # aws - the aws configuration for the custom origin
28
+ # local - the local configuration for the custom origin
29
+ #
30
+ # Returns the diff containing those changes
31
+ def self.ssl_protocols(changes, aws, local)
32
+ diff = CustomOriginDiff.new(SSL_PROTOCOLS, aws, local)
33
+ diff.ssl_protocol_changes = changes
34
+ diff
35
+ end
36
+
37
+ def diff_string
38
+ case @type
39
+ when HTTP
40
+ [
41
+ "http port:",
42
+ Colors.aws_changes("\tAWS - #{@aws}"),
43
+ Colors.local_changes("\tLocal - #{@local}"),
44
+ ].join("\n")
45
+ when HTTPS
46
+ [
47
+ "https port:",
48
+ Colors.aws_changes("\tAWS - #{@aws}"),
49
+ Colors.local_changes("\tLocal - #{@local}"),
50
+ ].join("\n")
51
+ when POLICY
52
+ [
53
+ "protocol policy:",
54
+ Colors.aws_changes("\tAWS - #{@aws}"),
55
+ Colors.local_changes("\tLocal - #{@local}"),
56
+ ].join("\n")
57
+ when SSL_PROTOCOLS
58
+ [
59
+ "origin ssl protocols:",
60
+ (@ssl_protocol_changes.flat_map do |c|
61
+ c.to_s.lines.map { |l| "\t#{l.chomp}" }
62
+ end).join("\n"),
63
+ ].join("\n")
64
+ end
65
+ end
66
+
67
+ def aws_name
68
+ @aws.id
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,183 @@
1
+ require "conf/Configuration"
2
+ require "cloudfront/models/DistributionDiff"
3
+ require "cloudfront/models/OriginConfig"
4
+ require "cloudfront/models/CacheBehaviorConfig"
5
+
6
+ require "json"
7
+
8
+ module Cumulus
9
+ module CloudFront
10
+ # Public: An object representing configuration for a distribution
11
+ class DistributionConfig
12
+ attr_accessor :id
13
+ attr_reader :name
14
+ attr_reader :aliases
15
+ attr_reader :origins
16
+ attr_reader :default_cache_behavior
17
+ attr_reader :cache_behaviors
18
+ attr_reader :comment
19
+ attr_reader :enabled
20
+
21
+ # Public: Constructor
22
+ #
23
+ # json - a hash containing the JSON configuration for the distribution
24
+ def initialize(name, json = nil)
25
+ @name = name
26
+ if !json.nil?
27
+ @id = json["id"]
28
+ @aliases = json["aliases"] || []
29
+ @origins = json["origins"].map { |o| OriginConfig.new(o) }
30
+ @default_cache_behavior = CacheBehaviorConfig.new(json["default-cache-behavior"], true)
31
+ @cache_behaviors = (json["cache-behaviors"] || []).map { |cb| CacheBehaviorConfig.new(cb) }
32
+ @comment = json["comment"]
33
+ @enabled = json["enabled"]
34
+ end
35
+ end
36
+
37
+ def populate!(id, aws)
38
+ @id = id
39
+ @name = id
40
+ @aliases = aws.aliases.items
41
+ @origins = aws.origins.items.map do |origin|
42
+ config = OriginConfig.new()
43
+ config.populate!(origin)
44
+ config
45
+ end
46
+ @default_cache_behavior = CacheBehaviorConfig.new()
47
+ @default_cache_behavior.populate!(aws.default_cache_behavior, true)
48
+ @cache_behaviors = aws.cache_behaviors.items.map do |cache_behavior|
49
+ config = CacheBehaviorConfig.new()
50
+ config.populate!(cache_behavior)
51
+ config
52
+ end
53
+ @comment = aws.comment
54
+ @enabled = aws.enabled
55
+ end
56
+
57
+ # Public: Get the config as a prettified JSON string.
58
+ #
59
+ # Returns the JSON string
60
+ def pretty_json
61
+ JSON.pretty_generate({
62
+ "id" => @id,
63
+ "aliases" => @aliases,
64
+ "origins" => @origins.map(&:to_local),
65
+ "default-cache-behavior" => @default_cache_behavior.to_local,
66
+ "cache-behaviors" => @cache_behaviors.map(&:to_local),
67
+ "comment" => @comment,
68
+ "enabled" => @enabled,
69
+ })
70
+ end
71
+
72
+ # Public: Produce an array of differences between this local configuration and the
73
+ # configuration in AWS
74
+ #
75
+ # aws - the AWS resource
76
+ #
77
+ # Returns an array of the DistributionDiffs that were found
78
+ def diff(aws)
79
+ diffs = []
80
+
81
+ added_aliases = (@aliases - aws.aliases.items)
82
+ removed_aliases = aws.aliases.items - @aliases
83
+ if !added_aliases.empty? or !removed_aliases.empty?
84
+ diffs << DistributionDiff.aliases(added_aliases, removed_aliases, self)
85
+ end
86
+
87
+ origin_diffs = diff_origins(aws.origins.items)
88
+ if !origin_diffs.empty?
89
+ diffs << DistributionDiff.origins(origin_diffs, self)
90
+ end
91
+
92
+ default_cache_diffs = @default_cache_behavior.diff(aws.default_cache_behavior)
93
+ if !default_cache_diffs.empty?
94
+ diffs << DistributionDiff.default_cache(default_cache_diffs, self)
95
+ end
96
+
97
+ diffs << diff_caches(aws)
98
+
99
+ if @comment != aws.comment
100
+ diffs << DistributionDiff.new(DistributionChange::COMMENT, aws, self)
101
+ end
102
+
103
+ if @enabled != aws.enabled
104
+ diffs << DistributionDiff.new(DistributionChange::ENABLED, aws, self)
105
+ end
106
+
107
+ diffs.flatten
108
+ end
109
+
110
+ private
111
+
112
+ # Internal: Produce an array of differences between the local origins and the aws origins
113
+ #
114
+ # aws_origins - the AWS origins from a cloudfront config
115
+ #
116
+ # Returns an array of OriginDiffs that were found
117
+ def diff_origins(aws_origins)
118
+ diffs = []
119
+
120
+ # map the origins to their keys
121
+ aws = Hash[aws_origins.map { |o| [o.id, o] }]
122
+ local = Hash[@origins.map { |o| [o.id, o] }]
123
+
124
+ # find origins that are not configured locally
125
+ aws.each do |origin_id, origin|
126
+ if !local.include?(origin_id)
127
+ diffs << OriginDiff.unmanaged(origin)
128
+ end
129
+ end
130
+
131
+ local.each do |origin_id, origin|
132
+ if !aws.include?(origin_id)
133
+ diffs << OriginDiff.added(origin)
134
+ else
135
+ diffs << origin.diff(aws[origin_id])
136
+ end
137
+ end
138
+
139
+ diffs.flatten
140
+ end
141
+
142
+ # Internal: Produce an array of differences between local cache behaviors and aws cache behaviors
143
+ #
144
+ # aws - the AWS config
145
+ #
146
+ # Returns an array of CacheBehaviorDiff
147
+ def diff_caches(aws)
148
+ removed = []
149
+ added = []
150
+ changed = Hash.new
151
+
152
+ aws_cache_behaviors = if aws.cache_behaviors.nil? then [] else aws.cache_behaviors.items end
153
+
154
+ aws = Hash[aws_cache_behaviors.map { |c| ["#{c.target_origin_id}/#{c.path_pattern}", c]}]
155
+ local = Hash[@cache_behaviors.map { |c| ["#{c.target_origin_id}/#{c.path_pattern}", c]}]
156
+
157
+ # find cache behaviors that are not configured locally
158
+ aws.each do |cache_id, cache|
159
+ if !local.include?(cache_id)
160
+ removed << CacheBehaviorDiff.unmanaged(cache)
161
+ end
162
+ end
163
+
164
+ local.each do |cache_id, cache|
165
+ if !aws.include?(cache_id)
166
+ added << CacheBehaviorDiff.added(cache)
167
+ else
168
+ diffs = cache.diff(aws[cache_id])
169
+ changed[cache_id] = diffs if !diffs.empty?
170
+ end
171
+ end
172
+
173
+ if !removed.empty? or !added.empty? or !changed.empty?
174
+ DistributionDiff.caches(removed, added, changed, self)
175
+ else
176
+ []
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+ end
183
+ end