cumulus-aws 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
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,101 @@
1
+ require "common/models/Diff"
2
+ require "common/models/TagsDiff"
3
+ require "common/models/ListChange"
4
+ require "vpc/models/RouteDiff"
5
+ require "util/Colors"
6
+
7
+ module Cumulus
8
+ module VPC
9
+ # Public: The types of changes that can be made to a route table
10
+ module RouteTableChange
11
+ include Common::DiffChange
12
+
13
+ ROUTES = Common::DiffChange.next_change_id
14
+ VGWS = Common::DiffChange.next_change_id
15
+ TAGS = Common::DiffChange.next_change_id
16
+ end
17
+
18
+ # Public: Represents a single difference between local configuration and AWS configuration
19
+ class RouteTableDiff < Common::Diff
20
+ include RouteTableChange
21
+ include Common::TagsDiff
22
+
23
+ def self.routes(aws, local)
24
+ aws_cidr_routes = Hash[aws.map { |route| [route.destination_cidr_block, route] }]
25
+ local_cidr_routes = Hash[local.map { |route| [route.dest_cidr, route] }]
26
+
27
+ added = local_cidr_routes.reject { |k, v| aws_cidr_routes.has_key? k }
28
+ removed = aws_cidr_routes.reject { |k, v| local_cidr_routes.has_key? k }
29
+ modified = local_cidr_routes.select { |k, v| aws_cidr_routes.has_key? k }
30
+
31
+ added_diffs = Hash[added.map { |cidr, route| [cidr, RouteDiff.added(route)] }]
32
+ removed_diffs = Hash[removed.map { |cidr, route| [cidr, RouteDiff.unmanaged(route)] }]
33
+ modified_diffs = Hash[modified.map do |cidr, route|
34
+ aws_route = aws_cidr_routes[cidr]
35
+ route_diffs = route.diff(aws_route)
36
+ if !route_diffs.empty?
37
+ [cidr, RouteDiff.modified(aws_route, route, route_diffs)]
38
+ end
39
+ end.reject { |v| v.nil? }]
40
+
41
+ if !added_diffs.empty? or !removed_diffs.empty? or !modified_diffs.empty?
42
+ diff = RouteTableDiff.new(ROUTES, aws, local)
43
+ diff.changes = Common::ListChange.new(added_diffs, removed_diffs, modified_diffs)
44
+ diff
45
+ end
46
+ end
47
+
48
+ def self.propagate_vgws(aws, local)
49
+ changes = Common::ListChange.simple_list_diff(aws, local)
50
+ if changes
51
+ diff = RouteTableDiff.new(VGWS, aws, local)
52
+ diff.changes = changes
53
+ diff
54
+ end
55
+ end
56
+
57
+ def local_tags
58
+ @local
59
+ end
60
+
61
+ def aws_tags
62
+ @aws
63
+ end
64
+
65
+ def asset_type
66
+ "Route Table"
67
+ end
68
+
69
+ def aws_name
70
+ @aws.name
71
+ end
72
+
73
+ def diff_string
74
+ case @type
75
+ when ROUTES
76
+ [
77
+ "Routes:",
78
+ @changes.removed.map { |s, _| Colors.unmanaged("\t#{s} will be deleted") },
79
+ @changes.added.map { |s, _| Colors.added("\t#{s} will be created") },
80
+ @changes.modified.map do |cidr, diff|
81
+ [
82
+ "\t#{cidr}:",
83
+ diff.changes.map do |diff|
84
+ diff.to_s.lines.map { |l| "\t\t#{l}".chomp("\n") }
85
+ end
86
+ ]
87
+ end
88
+ ].flatten.join("\n")
89
+ when VGWS
90
+ [
91
+ "Propagate VGWs:",
92
+ @changes.removed.map { |s, _| Colors.unmanaged("\t#{s}") },
93
+ @changes.added.map { |s, _| Colors.added("\t#{s}") },
94
+ ].flatten.join("\n")
95
+ when TAGS
96
+ tags_diff_string
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,113 @@
1
+ require "conf/Configuration"
2
+ require "vpc/loader/Loader"
3
+ require "vpc/models/SubnetDiff"
4
+ require "ec2/EC2"
5
+
6
+ require "json"
7
+
8
+ module Cumulus
9
+ module VPC
10
+
11
+ # Public: An object representing configuration for a Subnet
12
+ class SubnetConfig
13
+ attr_reader :name
14
+ attr_reader :cidr_block
15
+ attr_reader :map_public_ip
16
+ attr_accessor :route_table
17
+ attr_accessor :network_acl
18
+ attr_reader :availability_zone
19
+ attr_reader :tags
20
+
21
+ # Public: Constructor
22
+ #
23
+ # json - a hash containing the JSON configuration for the subnet
24
+ def initialize(name, json = nil)
25
+ @name = name
26
+ if !json.nil?
27
+ @cidr_block = json["cidr-block"]
28
+ @map_public_ip = json["map-public-ip"] || false
29
+ @route_table = json["route-table"]
30
+ @network_acl = json["network-acl"]
31
+ @availability_zone = json["availability-zone"]
32
+ @tags = json["tags"] || {}
33
+ end
34
+ end
35
+
36
+ def to_hash
37
+ {
38
+ "cidr-block" => @cidr_block,
39
+ "map-public-ip" => @map_public_ip,
40
+ "route-table" => @route_table,
41
+ "network-acl" => @network_acl,
42
+ "availability-zone" => @availability_zone,
43
+ "tags" => @tags,
44
+ }
45
+ end
46
+
47
+ # Public: Populate a config object with AWS configuration
48
+ #
49
+ # aws - the AWS configuration for the subnet
50
+ # route_table_map - an optional mapping of route table ids to names
51
+ # network_acl_map - an optional mapping of network acl ids to names
52
+ def populate!(aws, route_table_map = {}, network_acl_map = {})
53
+ @cidr_block = aws.cidr_block
54
+ @map_public_ip = aws.map_public_ip_on_launch
55
+
56
+ subnet_rt = EC2::subnet_route_tables[aws.subnet_id]
57
+ @route_table = if subnet_rt then route_table_map[subnet_rt.route_table_id] || subnet_rt.route_table_id end
58
+
59
+ subnet_acl = EC2::subnet_network_acls[aws.subnet_id]
60
+ @network_acl = network_acl_map[subnet_acl.network_acl_id] || subnet_acl.network_acl_id
61
+
62
+ @availability_zone = aws.availability_zone
63
+ @tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
64
+
65
+ self
66
+ end
67
+
68
+ # Public: Produce an array of differences between this local configuration and the
69
+ # configuration in AWS
70
+ #
71
+ # aws - the AWS resource
72
+ #
73
+ # Returns an array of the SubnetDiffs that were found
74
+ def diff(aws)
75
+ diffs = []
76
+
77
+ if @cidr_block != aws.cidr_block
78
+ diffs << SubnetDiff.new(SubnetChange::CIDR, aws.cidr_block, @cidr_block)
79
+ end
80
+
81
+ if @map_public_ip != aws.map_public_ip_on_launch
82
+ diffs << SubnetDiff.new(SubnetChange::PUBLIC, aws.map_public_ip_on_launch, @map_public_ip)
83
+ end
84
+
85
+ # For route table try to get the AWS name or default to id
86
+ aws_subnet_rt = EC2::subnet_route_tables[aws.subnet_id]
87
+ aws_rt_name = if aws_subnet_rt then aws_subnet_rt.name || aws_subnet_rt.route_table_id end
88
+ if @route_table != aws_rt_name
89
+ diffs << SubnetDiff.new(SubnetChange::ROUTE_TABLE, aws_rt_name, @route_table)
90
+ end
91
+
92
+ # For network acl try to get the AWS name or default to its id
93
+ aws_subnet_net_acl = EC2::subnet_network_acls[aws.subnet_id]
94
+ aws_net_acl_name = aws_subnet_net_acl.name || aws_subnet_net_acl.network_acl_id
95
+ if @network_acl != aws_net_acl_name
96
+ diffs << SubnetDiff.new(SubnetChange::NETWORK_ACL, aws_net_acl_name, @network_acl)
97
+ end
98
+
99
+ if @availability_zone != aws.availability_zone
100
+ diffs << SubnetDiff.new(SubnetChange::AZ, aws.availability_zone, @availability_zone)
101
+ end
102
+
103
+ aws_tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
104
+ if @tags != aws_tags
105
+ diffs << SubnetDiff.new(SubnetChange::TAGS, aws_tags, @tags)
106
+ end
107
+
108
+ diffs
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,78 @@
1
+ require "common/models/Diff"
2
+ require "common/models/TagsDiff"
3
+ require "util/Colors"
4
+
5
+ module Cumulus
6
+ module VPC
7
+ # Public: The types of changes that can be made to a subnet
8
+ module SubnetChange
9
+ include Common::DiffChange
10
+
11
+ CIDR = Common::DiffChange.next_change_id
12
+ PUBLIC = Common::DiffChange.next_change_id
13
+ ROUTE_TABLE = Common::DiffChange.next_change_id
14
+ NETWORK_ACL = Common::DiffChange.next_change_id
15
+ AZ = Common::DiffChange.next_change_id
16
+ TAGS = Common::DiffChange.next_change_id
17
+ end
18
+
19
+ # Public: Represents a single difference between local configuration and AWS configuration
20
+ class SubnetDiff < Common::Diff
21
+ include SubnetChange
22
+ include Common::TagsDiff
23
+
24
+ def local_tags
25
+ @local
26
+ end
27
+
28
+ def aws_tags
29
+ @aws
30
+ end
31
+
32
+ def asset_type
33
+ "Subnet"
34
+ end
35
+
36
+ def aws_name
37
+ @aws.name
38
+ end
39
+
40
+ def diff_string
41
+ case @type
42
+ when CIDR
43
+ [
44
+ "CIDR Block:",
45
+ Colors.aws_changes("\tAWS - #{aws}"),
46
+ Colors.local_changes("\tLocal - #{local}"),
47
+ ].join("\n")
48
+ when PUBLIC
49
+ [
50
+ "Map Public Ip:",
51
+ Colors.aws_changes("\tAWS - #{aws}"),
52
+ Colors.local_changes("\tLocal - #{local}"),
53
+ ].join("\n")
54
+ when ROUTE_TABLE
55
+ [
56
+ "Route Table:",
57
+ Colors.aws_changes("\tAWS - #{aws}"),
58
+ Colors.local_changes("\tLocal - #{local}"),
59
+ ].join("\n")
60
+ when NETWORK_ACL
61
+ [
62
+ "Network ACL:",
63
+ Colors.aws_changes("\tAWS - #{aws}"),
64
+ Colors.local_changes("\tLocal - #{local}"),
65
+ ].join("\n")
66
+ when AZ
67
+ [
68
+ "Availability Zone:",
69
+ Colors.aws_changes("\tAWS - #{aws}"),
70
+ Colors.local_changes("\tLocal - #{local}"),
71
+ ].join("\n")
72
+ when TAGS
73
+ tags_diff_string
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,173 @@
1
+ require "conf/Configuration"
2
+ require "vpc/loader/Loader"
3
+ require "vpc/models/DhcpConfig"
4
+ require "vpc/models/RouteTableConfig"
5
+ require "vpc/models/EndpointConfig"
6
+ require "vpc/models/NetworkAclConfig"
7
+ require "vpc/models/VpcDiff"
8
+ require "ec2/EC2"
9
+
10
+ require "json"
11
+
12
+ module Cumulus
13
+ module VPC
14
+
15
+ # Public: An object representing configuration for a VPC
16
+ class VpcConfig
17
+ attr_reader :name
18
+ attr_reader :cidr_block
19
+ attr_reader :tenancy
20
+ attr_reader :subnets
21
+ attr_reader :dhcp
22
+ attr_reader :route_tables
23
+ attr_reader :endpoints
24
+ attr_reader :address_associations
25
+ attr_reader :network_acls
26
+ attr_reader :tags
27
+
28
+ # Public: Constructor
29
+ #
30
+ # json - a hash containing the JSON configuration for the VPC
31
+ def initialize(name, json = nil)
32
+ @name = name
33
+ if !json.nil?
34
+ @cidr_block = json["cidr-block"]
35
+ @tenancy = json["tenancy"]
36
+ @dhcp = if json["dhcp"] then DhcpConfig.new(json["dhcp"]) end
37
+ @route_tables = json["route-tables"] || []
38
+ @endpoints = (json["endpoints"] || []).map { |endpoint| EndpointConfig.new(endpoint) }
39
+ @address_associations = json["address-associations"] || {}
40
+ @network_acls = json["network-acls"] || []
41
+ @subnets = json["subnets"] || []
42
+ @tags = json["tags"] || {}
43
+ end
44
+ end
45
+
46
+ def to_hash
47
+ {
48
+ "cidr-block" => @cidr_block,
49
+ "tenancy" => @tenancy,
50
+ "dhcp" => if @dhcp then @dhcp.to_hash end,
51
+ "route-tables" => @route_tables,
52
+ "endpoints" => @endpoints.map(&:to_hash),
53
+ "address-associations" => @address_associations,
54
+ "network-acls" => @network_acls,
55
+ "subnets" => @subnets,
56
+ "tags" => @tags,
57
+ }
58
+ end
59
+
60
+ # Public: Populate a config object with AWS configuration
61
+ #
62
+ # aws - the AWS configuration for the subnet
63
+ # route_table_map - an optional mapping of route table ids to names
64
+ # subnet_map - an optional mapping of subnet ids to names
65
+ # network_acl_map - an optional mapping of network acl ids to names
66
+ def populate!(aws, route_table_map = {}, subnet_map = {}, network_acl_map = {})
67
+ @cidr_block = aws.cidr_block
68
+ @tenancy = aws.instance_tenancy
69
+
70
+ if aws.dhcp_options_id != "default"
71
+ aws_dhcp = EC2::id_dhcp_options[aws.dhcp_options_id]
72
+ @dhcp = DhcpConfig.new().populate!(aws_dhcp)
73
+ end
74
+
75
+ aws_rts = EC2::vpc_route_tables[aws.vpc_id]
76
+ rt_names = aws_rts.map { |rt| route_table_map[rt.route_table_id] || rt.route_table_id }
77
+ @route_tables = rt_names.sort
78
+
79
+ aws_endpoints = EC2::vpc_endpoints[aws.vpc_id]
80
+ @endpoints = aws_endpoints.map { |endpoint| EndpointConfig.new().populate!(endpoint, route_table_map) }
81
+
82
+ aws_addresses = EC2::vpc_addresses[aws.vpc_id]
83
+ @address_associations = Hash[aws_addresses.map do |addr|
84
+ network_interface = EC2::id_network_interfaces[addr.network_interface_id]
85
+ [addr.public_ip, network_interface.name || addr.network_interface_id]
86
+ end]
87
+
88
+ aws_network_acls = EC2::vpc_network_acls[aws.vpc_id]
89
+ cumulus_network_acls = aws_network_acls.map { |acl| network_acl_map[acl.network_acl_id] || acl.network_acl_id }
90
+ @network_acls = cumulus_network_acls.sort
91
+
92
+ aws_subnets = EC2::vpc_subnets[aws.vpc_id]
93
+ subnet_names = aws_subnets.map { |subnet| subnet_map[subnet.subnet_id] || subnet.subnet_id }
94
+ @subnets = subnet_names.sort
95
+
96
+ @tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
97
+
98
+ self
99
+ end
100
+
101
+ # Public: Produce an array of differences between this local configuration and the
102
+ # configuration in AWS
103
+ #
104
+ # aws - the AWS resource
105
+ #
106
+ # Returns an array of the VpcDiffs that were found
107
+ def diff(aws)
108
+ diffs = []
109
+
110
+ if @cidr_block != aws.cidr_block
111
+ diffs << VpcDiff.new(VpcChange::CIDR, aws.cidr_block, @cidr_block)
112
+ end
113
+
114
+ if @tenancy != aws.instance_tenancy
115
+ diffs << VpcDiff.new(VpcChange::TENANCY, aws.instance_tenancy, @tenancy)
116
+ end
117
+
118
+ # Get the actual DHCP Options from AWS from the id
119
+ aws_dhcp_options = EC2::id_dhcp_options[aws.dhcp_options_id]
120
+ dhcp_diff = VpcDiff.dhcp(aws_dhcp_options, @dhcp)
121
+ if dhcp_diff
122
+ diffs << dhcp_diff
123
+ end
124
+
125
+ # Load the actual route table configs to diff them
126
+ local_route_tables = @route_tables.map { |rt_name| Loader.route_table(rt_name) }
127
+ aws_route_tables = EC2::vpc_route_tables[aws.vpc_id]
128
+ route_table_diff = VpcDiff.route_tables(aws_route_tables, local_route_tables)
129
+ if route_table_diff
130
+ diffs << route_table_diff
131
+ end
132
+
133
+ # Load the vpc endpoints
134
+ aws_endpoints = EC2::vpc_endpoints[aws.vpc_id]
135
+ endpoints_diff = VpcDiff.endpoints(aws_endpoints, @endpoints)
136
+ if endpoints_diff
137
+ diffs << endpoints_diff
138
+ end
139
+
140
+ aws_associations = EC2::vpc_addresses[aws.vpc_id]
141
+ association_diff = VpcDiff.address_associations(aws_associations, @address_associations)
142
+ if association_diff
143
+ diffs << association_diff
144
+ end
145
+
146
+ # Inbound and outbound network acls
147
+ local_network_acls = @network_acls.map { |acl_name| Loader.network_acl(acl_name) }
148
+ aws_network_acls = EC2::vpc_network_acls[aws.vpc_id]
149
+ network_acl_diff = VpcDiff.network_acls(aws_network_acls, local_network_acls)
150
+ if network_acl_diff
151
+ diffs << network_acl_diff
152
+ end
153
+
154
+ # Load the local subnets from config, and the aws version of their subnets
155
+ local_subnets = @subnets.map { |subnet_name| Loader.subnet(subnet_name) }
156
+ aws_subnets = EC2::vpc_subnets[aws.vpc_id]
157
+ subnets_diff = VpcDiff.subnets(aws_subnets, local_subnets)
158
+ if subnets_diff
159
+ diffs << subnets_diff
160
+ end
161
+
162
+ # Tags
163
+ aws_tags = Hash[aws.tags.map { |tag| [tag.key, tag.value] }]
164
+ if @tags != aws_tags
165
+ diffs << VpcDiff.new(VpcChange::TAGS, aws_tags, @tags)
166
+ end
167
+
168
+ diffs
169
+ end
170
+
171
+ end
172
+ end
173
+ end