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,69 @@
1
+ require "common/models/Diff"
2
+ require "common/models/ListChange"
3
+ require "util/Colors"
4
+
5
+ require "json"
6
+
7
+ module Cumulus
8
+ module VPC
9
+ # Public: The types of changes that can be made to the endpoint
10
+ module EndpointChange
11
+ include Common::DiffChange
12
+
13
+ POLICY = Common::DiffChange.next_change_id
14
+ ROUTE_TABLES = Common::DiffChange.next_change_id
15
+ end
16
+
17
+ # Public: Represents a single difference between local configuration and AWS configuration
18
+ class EndpointDiff < Common::Diff
19
+ include EndpointChange
20
+
21
+ def self.route_tables(aws, local)
22
+ changes = Common::ListChange.simple_list_diff(aws, local)
23
+ if changes
24
+ diff = EndpointDiff.new(ROUTE_TABLES, aws, local)
25
+ diff.changes = changes
26
+ diff
27
+ end
28
+ end
29
+
30
+ def self.policy(aws, local)
31
+ if aws != local
32
+ diff = EndpointDiff.new(POLICY, aws, local)
33
+ diff
34
+ end
35
+ end
36
+
37
+ def asset_type
38
+ "Endpoint"
39
+ end
40
+
41
+ def aws_name
42
+ @aws.service_name
43
+ end
44
+
45
+ def diff_string
46
+ case @type
47
+ when POLICY
48
+ [
49
+ "Policy Statement:",
50
+ Colors.unmanaged([
51
+ "\tRemoving:",
52
+ JSON.pretty_generate(aws).lines.map { |l| "\t\t#{l}".chomp("\n") }
53
+ ].join("\n")),
54
+ Colors.added([
55
+ "\tAdding:",
56
+ JSON.pretty_generate(local).lines.map { |l| "\t\t#{l}".chomp("\n") }
57
+ ].join("\n"))
58
+ ].join("\n")
59
+ when ROUTE_TABLES
60
+ [
61
+ "Route Tables:",
62
+ @changes.removed.map { |d| Colors.unmanaged("\t#{d}") },
63
+ @changes.added.map { |d| Colors.added("\t#{d}") },
64
+ ].flatten.join("\n")
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,87 @@
1
+ require "conf/Configuration"
2
+ require "vpc/models/AclEntryConfig"
3
+ require "ec2/EC2"
4
+
5
+ require "json"
6
+
7
+ module Cumulus
8
+ module VPC
9
+
10
+ # Public: An object representing configuration for a VPC Network ACL
11
+ class NetworkAclConfig
12
+ attr_reader :inbound
13
+ attr_reader :outbound
14
+ attr_reader :tags
15
+ attr_reader :name
16
+
17
+ # Public: Constructor
18
+ #
19
+ # name - the name of the network acl config
20
+ # json - a hash containing the JSON configuration for the Network ACL
21
+ def initialize(name, json = nil)
22
+ @name = name
23
+ if !json.nil?
24
+ @inbound = (json["inbound"] || []).map { |entry| AclEntryConfig.new(entry) }
25
+ @outbound = (json["outbound"] || []).map { |entry| AclEntryConfig.new(entry) }
26
+ @tags = json["tags"] || {}
27
+ end
28
+ end
29
+
30
+ def to_hash
31
+ {
32
+ "inbound" => @inbound.map(&:to_hash),
33
+ "outbound" => @outbound.map(&:to_hash),
34
+ "tags" => @tags
35
+ }.reject { |k, v| v.nil? }
36
+ end
37
+
38
+ def populate!(aws)
39
+ @inbound = aws.diffable_entries.select { |entry| !entry.egress }
40
+ .map { |entry| AclEntryConfig.new().populate!(entry) }
41
+ .sort_by!(&:rule)
42
+ @outbound = aws.diffable_entries.select { |entry| entry.egress }
43
+ .map { |entry| AclEntryConfig.new().populate!(entry) }
44
+ .sort_by!(&:rule)
45
+ @tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
46
+
47
+ # If there is not a name then add a name tag using the given name
48
+ if !@tags["Name"]
49
+ puts "Network ACL #{aws.network_acl_id} does not have a Name defined. Cumulus will use #{name} as the name when migrated."
50
+ @tags["Name"] = @name
51
+ end
52
+
53
+ self
54
+ end
55
+
56
+ # Public: Produce an array of differences between this local configuration and the
57
+ # configuration in AWS
58
+ #
59
+ # aws - the AWS resource
60
+ #
61
+ # Returns an array of the NetworkAclDiffs that were found
62
+ def diff(aws)
63
+ diffs = []
64
+
65
+ aws_inbound = aws.diffable_entries.select { |entry| !entry.egress }
66
+ inbound_diff = NetworkAclDiff.entries(NetworkAclChange::INBOUND, aws_inbound, @inbound)
67
+ if inbound_diff
68
+ diffs << inbound_diff
69
+ end
70
+
71
+ aws_outbound = aws.diffable_entries.select { |entry| entry.egress }
72
+ outbound_diff = NetworkAclDiff.entries(NetworkAclChange::OUTBOUND, aws_outbound, @outbound)
73
+ if outbound_diff
74
+ diffs << outbound_diff
75
+ end
76
+
77
+ aws_tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
78
+ if @tags != aws_tags
79
+ diffs << NetworkAclDiff.new(NetworkAclChange::TAGS, aws_tags, @tags)
80
+ end
81
+
82
+ diffs
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,116 @@
1
+ require "common/models/Diff"
2
+ require "common/models/ListChange"
3
+ require "common/models/TagsDiff"
4
+ require "vpc/models/AclEntryDiff"
5
+ require "util/Colors"
6
+
7
+ require "json"
8
+
9
+ module Cumulus
10
+ module VPC
11
+ # Public: The types of changes that can be made to the network acl
12
+ module NetworkAclChange
13
+ include Common::DiffChange
14
+
15
+ INBOUND = Common::DiffChange.next_change_id
16
+ OUTBOUND = Common::DiffChange.next_change_id
17
+ TAGS = Common::DiffChange.next_change_id
18
+ end
19
+
20
+ # Public: Represents a single difference between local configuration and AWS configuration
21
+ class NetworkAclDiff < Common::Diff
22
+ include NetworkAclChange
23
+ include Common::TagsDiff
24
+
25
+ def self.entries(type, aws, local)
26
+ aws_rule_entries = Hash[aws.map do |entry|
27
+ aws_entry = AclEntryConfig.new
28
+ aws_entry.populate!(entry)
29
+ [entry.rule_number, aws_entry]
30
+ end]
31
+ local_rule_entries = Hash[local.map { |entry| [entry.rule, entry] }]
32
+
33
+ added_diffs = Hash[local_rule_entries.reject { |rule, entry| aws_rule_entries.has_key? rule }.map do |rule, local_entry|
34
+ [rule, AclEntryDiff.added(local_entry)]
35
+ end]
36
+ removed_diffs = Hash[aws_rule_entries.reject { |rule, entry| local_rule_entries.has_key? rule }.map do |rule, aws_entry|
37
+ [rule, AclEntryDiff.unmanaged(aws_entry)]
38
+ end]
39
+
40
+ modified_diffs = Hash[local_rule_entries.select { |rule, entry| aws_rule_entries.has_key? rule }.map do |rule, local_entry|
41
+ aws_entry = aws_rule_entries[rule]
42
+ entry_diffs = local_entry.diff(aws_entry)
43
+ if !entry_diffs.empty?
44
+ [rule, AclEntryDiff.modified(aws_entry, local_entry, entry_diffs)]
45
+ end
46
+ end.reject { |v| v.nil? }]
47
+
48
+ if !added_diffs.empty? or !removed_diffs.empty? or !modified_diffs.empty?
49
+ diff = NetworkAclDiff.new(type, aws, local)
50
+ diff.changes = Common::ListChange.new(added_diffs, removed_diffs, modified_diffs)
51
+ diff
52
+ end
53
+ end
54
+
55
+ def local_tags
56
+ @local
57
+ end
58
+
59
+ def aws_tags
60
+ @aws
61
+ end
62
+
63
+ def asset_type
64
+ "Network Acl"
65
+ end
66
+
67
+ def aws_name
68
+ @aws.name || @aws.network_acl_id
69
+ end
70
+
71
+ def diff_string
72
+ case @type
73
+ when INBOUND
74
+ [
75
+ "Inbound Rules:",
76
+ entries_diff_string
77
+ ].flatten.join("\n")
78
+ when OUTBOUND
79
+ [
80
+ "Outbound Rules:",
81
+ entries_diff_string
82
+ ].flatten.join("\n")
83
+ when TAGS
84
+ tags_diff_string
85
+ end
86
+ end
87
+
88
+ private
89
+
90
+ def entries_diff_string
91
+ [
92
+ [
93
+ "\tThese rules will be deleted:",
94
+ @changes.removed.map do |rule, removed_diff|
95
+ Colors.unmanaged(removed_diff.aws.pretty_string.lines.map { |l| "\t\t#{l}".chomp("\n") }.join("\n"))
96
+ end.flatten.join("\n\t\t\t---\n")
97
+ ].reject { @changes.removed.empty? },
98
+ [
99
+ "\tThese rules will be created:",
100
+ @changes.added.map do |rule, added_diff|
101
+ Colors.added(added_diff.local.pretty_string.lines.map { |l| "\t\t#{l}".chomp("\n") }.join("\n"))
102
+ end.flatten.join("\n\t\t\t---\n")
103
+ ].reject { @changes.added.empty? },
104
+ @changes.modified.map do |rule, modified_diff|
105
+ [
106
+ "\tRule #{rule} was modified:",
107
+ modified_diff.changes.map do |diff|
108
+ diff.to_s.lines.map { |l| "\t\t#{l}".chomp("\n") }
109
+ end
110
+ ]
111
+ end
112
+ ].flatten.join("\n")
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,82 @@
1
+ require "conf/Configuration"
2
+ require "vpc/loader/Loader"
3
+ require "ec2/EC2"
4
+
5
+ require "json"
6
+
7
+ module Cumulus
8
+ module VPC
9
+
10
+ # Public: An object representing configuration for a VPC route table route
11
+ class RouteConfig
12
+ attr_reader :dest_cidr
13
+ attr_reader :gateway_id
14
+ attr_reader :instance_id
15
+ attr_reader :network_interface_id
16
+ attr_reader :vpc_peering_connection_id
17
+ attr_reader :nat_gateway_id
18
+
19
+ # Public: Constructor
20
+ #
21
+ # json - a hash containing the JSON configuration for the route table route
22
+ def initialize(json = nil)
23
+ if !json.nil?
24
+ @dest_cidr = json["dest-cidr"]
25
+ @gateway_id = json["gateway-id"]
26
+ @network_interface_id = json["network-interface-id"]
27
+ @vpc_peering_connection_id = json["vpc-peering-connection-id"]
28
+ @nat_gateway_id = json["nat-gateway-id"]
29
+ end
30
+ end
31
+
32
+ def to_hash
33
+ {
34
+ "dest-cidr" => @dest_cidr,
35
+ "gateway-id" => @gateway_id,
36
+ "network-interface-id" => @network_interface_id,
37
+ "vpc-peering-connection-id" => @vpc_peering_connection_id,
38
+ "nat-gateway-id" => @nat_gateway_id,
39
+ }.reject { |k, v| v.nil? }
40
+ end
41
+
42
+ def populate!(aws)
43
+ @dest_cidr = aws.destination_cidr_block
44
+ @gateway_id = aws.gateway_id
45
+ @network_interface_id = aws.network_interface_id
46
+ @vpc_peering_connection_id = aws.vpc_peering_connection_id
47
+ @nat_gateway_id = aws.nat_gateway_id
48
+
49
+ self
50
+ end
51
+
52
+ # Public: Produce an array of differences between this local configuration and the
53
+ # configuration in AWS
54
+ #
55
+ # aws - the AWS resource
56
+ #
57
+ # Returns an array of the RouteDiffs that were found
58
+ def diff(aws)
59
+ diffs = []
60
+
61
+ if @gateway_id != aws.gateway_id
62
+ diffs << RouteDiff.new(RouteChange::GATEWAY, aws.gateway_id, @gateway_id)
63
+ end
64
+
65
+ if @network_interface_id != aws.network_interface_id
66
+ diffs << RouteDiff.new(RouteChange::NETWORK, aws.network_interface_id, @network_interface_id)
67
+ end
68
+
69
+ if @vpc_peering_connection_id != aws.vpc_peering_connection_id
70
+ diffs << RouteDiff.new(RouteChange::VPC_PEERING, aws.vpc_peering_connection_id, @vpc_peering_connection_id)
71
+ end
72
+
73
+ if @nat_gateway_id != aws.nat_gateway_id
74
+ diffs << RouteDiff.new(RouteChange::NAT_GATEWAY, aws.nat_gateway_id, @nat_gateway_id)
75
+ end
76
+
77
+ diffs
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,50 @@
1
+ require "common/models/Diff"
2
+ require "vpc/models/RouteDiff"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module VPC
7
+ # Public: The types of changes that can be made to a route
8
+ module RouteChange
9
+ include Common::DiffChange
10
+
11
+ GATEWAY = Common::DiffChange.next_change_id
12
+ NETWORK = Common::DiffChange.next_change_id
13
+ VPC_PEERING = Common::DiffChange.next_change_id
14
+ NAT_GATEWAY = Common::DiffChange.next_change_id
15
+ end
16
+
17
+ # Public: Represents a single difference between local configuration AWS configuration
18
+ class RouteDiff < Common::Diff
19
+ include RouteChange
20
+
21
+ def asset_type
22
+ "Route"
23
+ end
24
+
25
+ def aws_name
26
+ @aws.destination_cidr_block
27
+ end
28
+
29
+ def diff_string
30
+ resource = case @type
31
+ when GATEWAY
32
+ "Gateway"
33
+ when NETWORK
34
+ "Network Interface"
35
+ when VPC_PEERING
36
+ "VPC Peering Connection"
37
+ when NAT_GATEWAY
38
+ "NAT Gateway"
39
+ end
40
+
41
+ [
42
+ "#{resource}:",
43
+ Colors.aws_changes("\tAWS - #{aws}"),
44
+ Colors.local_changes("\tLocal - #{local}"),
45
+ ].join("\n")
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,92 @@
1
+ require "conf/Configuration"
2
+ require "vpc/loader/Loader"
3
+ require "vpc/models/RouteConfig"
4
+ require "ec2/EC2"
5
+
6
+ require "json"
7
+
8
+ module Cumulus
9
+ module VPC
10
+
11
+ # Public: An object representing configuration for a VPC route table
12
+ class RouteTableConfig
13
+ attr_reader :name
14
+ attr_reader :routes
15
+ attr_reader :propagate_vgws
16
+ attr_reader :tags
17
+
18
+ # Public: Constructor
19
+ #
20
+ # json - a hash containing the JSON configuration for the route table
21
+ def initialize(name, json = nil)
22
+ @name = name
23
+ @excludes = []
24
+ if !json.nil?
25
+ @routes = (json["routes"] || []).map { |route| RouteConfig.new(route) }
26
+ @propagate_vgws = json["propagate-vgws"] || []
27
+ @tags = json["tags"]
28
+ @excludes = json["exclude-cidr-blocks"] || []
29
+ end
30
+ end
31
+
32
+ def to_hash
33
+ {
34
+ "routes" => @routes.map(&:to_hash),
35
+ "propagate-vgws" => @propagate_vgws,
36
+ "tags" => @tags,
37
+ }.reject { |k, v| v.nil? }
38
+ end
39
+
40
+ def populate!(aws)
41
+ @routes = aws.diffable_routes.reject { |route| @excludes.include? route.destination_cidr_block }.map do |aws_route|
42
+ cumulus_route = RouteConfig.new
43
+ cumulus_route.populate!(aws_route)
44
+ cumulus_route
45
+ end
46
+
47
+ @propagate_vgws = aws.propagating_vgws.map(&:gateway_id)
48
+
49
+ @tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
50
+
51
+ self
52
+ end
53
+
54
+ # Public: Produce an array of differences between this local configuration and the
55
+ # configuration in AWS
56
+ #
57
+ # aws - the AWS resource
58
+ #
59
+ # Returns an array of the RouteTableDiffs that were found
60
+ def diff(aws)
61
+ diffs = []
62
+
63
+ aws_routes = aws.diffable_routes.reject { |route| @excludes.include? route.destination_cidr_block }
64
+ local_routes = @routes.reject { |route| @excludes.include? route.dest_cidr }
65
+
66
+ ignored_aws_routes = aws.diffable_routes.select { |route| @excludes.include? route.destination_cidr_block }.map(&:destination_cidr_block).join(", ")
67
+ ignored_local_routes = @routes.select { |route| @excludes.include? route.dest_cidr }.map(&:dest_cidr).join(", ")
68
+
69
+ puts "Ignoring local routes: #{ignored_local_routes}" if !ignored_local_routes.empty?
70
+ puts "Ignoring AWS routes: #{ignored_aws_routes}" if !ignored_aws_routes.empty?
71
+
72
+ routes_diff = RouteTableDiff.routes(aws_routes, local_routes)
73
+ if routes_diff
74
+ diffs << routes_diff
75
+ end
76
+
77
+ aws_vgw_ids = aws.propagating_vgws.map(&:gateway_id)
78
+ if @propagate_vgws.sort != aws_vgw_ids.sort
79
+ diffs << RouteTableDiff.propagate_vgws(aws_vgw_ids, @propagate_vgws)
80
+ end
81
+
82
+ aws_tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
83
+ if @tags != aws_tags
84
+ diffs << RouteTableDiff.new(RouteTableChange::TAGS, aws_tags, @tags)
85
+ end
86
+
87
+ diffs
88
+ end
89
+
90
+ end
91
+ end
92
+ end