sparkle_formation 0.1.4 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,23 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sparkle_formation (0.1.0)
5
- attribute_struct (~> 0.1.6)
6
-
7
- PATH
8
- remote: /home/spox/Projects/chrisroberts/attribute_struct
9
- specs:
10
- attribute_struct (0.1.7)
11
- hashie (>= 2.0.0)
4
+ sparkle_formation (0.2.0)
5
+ attribute_struct (~> 0.2.2)
6
+ multi_json
12
7
 
13
8
  GEM
14
9
  remote: https://rubygems.org/
15
10
  specs:
16
- hashie (2.0.5)
11
+ attribute_struct (0.2.2)
12
+ hashie (>= 2.0.0)
13
+ hashie (2.1.1)
14
+ multi_json (1.10.1)
17
15
 
18
16
  PLATFORMS
19
17
  ruby
20
18
 
21
19
  DEPENDENCIES
22
- attribute_struct!
23
20
  sparkle_formation!
data/bin/aws_resources ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'json'
4
+ require 'nokogiri'
5
+ require 'fileutils'
6
+
7
+ STORE = '/tmp/aws-cfn-docs'
8
+
9
+ unless(File.directory?(STORE))
10
+ FileUtils.mkdir_p(STORE)
11
+ Dir.chdir(STORE) do
12
+ unless(system('wget -q -r -l 1 -A "aws-*" "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"'))
13
+ puts "FAILED: Documentation fetching failed!"
14
+ exit -1
15
+ end
16
+ end
17
+ end
18
+
19
+ aws_resources = {}
20
+
21
+ Dir.glob(File.join(STORE, '**/*.html')).each do |path|
22
+ resource = nil
23
+ begin
24
+ file = Nokogiri::HTML(File.open(path, 'r'))
25
+ type = file.css('h1.topictitle').text
26
+ if(type.include?(' '))
27
+ next
28
+ end
29
+ resource = file.css('div.variablelist').first
30
+ if(resource)
31
+ aws_resources[type] = {:properties => resource.css('span.term').map(&:text).map(&:strip)}
32
+ else
33
+ resource = file.css('div.informaltable')
34
+ if(resource)
35
+ aws_resources[type] = {
36
+ :properties => resource.css('tr').map{|tr|
37
+ item = tr.css('td').first
38
+ item ? item.text.strip : nil
39
+ }.compact
40
+ }
41
+ else
42
+ next
43
+ end
44
+ end
45
+ aws_resources[type][:path] = File.basename(path)
46
+ end
47
+ end
48
+
49
+ require 'pp'
50
+
51
+ pp aws_resources
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'json'
4
+ require 'nokogiri'
5
+ require 'fileutils'
6
+
7
+ STORE = '/tmp/openstack-heat-docs'
8
+
9
+ unless(File.directory?(STORE))
10
+ FileUtils.mkdir_p(STORE)
11
+ Dir.chdir(STORE) do
12
+ unless(system('wget -q "http://docs.openstack.org/developer/heat/template_guide/openstack.html"'))
13
+ puts "FAILED: Documentation fetching failed!"
14
+ exit -1
15
+ end
16
+ end
17
+ end
18
+
19
+ file = Nokogiri::HTML(File.open(File.join(STORE, 'openstack.html'), 'r'))
20
+
21
+ resources = Hash[
22
+ file.css('div.section[id*="json"]').css('pre.literal-block').map do |node|
23
+ [
24
+ node.text.scan(/Type":.*"(.+?)"/).flatten.first,
25
+ node.text.scan(/Properties.*?\{(.+)$/m).flatten.first.
26
+ strip.split("\n").map{|z| z.split(' ')}.flatten.find_all{|z| !z.scan(/^[A-Za-z0-9_"]+:$/).empty?}.map{|z| z.tr('":', '')}
27
+ ]
28
+ end
29
+ ]
30
+
31
+ require 'pp'
32
+
33
+ pp resources
@@ -16,5 +16,15 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'sparkle_formation/version'
19
+ require 'attribute_struct'
20
+
21
+ class SparkleFormation
22
+ autoload :Aws, 'sparkle_formation/aws'
23
+ autoload :SparkleAttribute, 'sparkle_formation/sparkle_attribute'
24
+ autoload :SparkleStruct, 'sparkle_formation/sparkle_struct'
25
+ autoload :Utils, 'sparkle_formation/utils'
26
+ autoload :Translation, 'sparkle_formation/translation'
27
+ autoload :Version, 'sparkle_formation/version'
28
+ end
29
+
20
30
  require 'sparkle_formation/sparkle_formation'
@@ -0,0 +1,89 @@
1
+ require 'sparkle_formation'
2
+
3
+ class SparkleFormation
4
+ class Aws
5
+ class << self
6
+
7
+ include SparkleFormation::Utils::AnimalStrings
8
+
9
+ # type:: AWS CFN resource type
10
+ # hash:: Hash of information
11
+ # Register an AWS resource
12
+ def register(type, hash)
13
+ unless(class_variable_defined?(:@@registry))
14
+ @@registry = AttributeStruct.hashish.new
15
+ end
16
+ @@registry[type] = hash
17
+ end
18
+
19
+ # identifier:: resource identifier
20
+ # key:: key of value to return from information hash
21
+ # Return the associated aws resource information
22
+ def resource(identifier, key=nil)
23
+ res = lookup(identifier)
24
+ if(key && res)
25
+ res[key.to_sym]
26
+ else
27
+ res
28
+ end
29
+ end
30
+
31
+ # json_path_or_hash:: Path to JSON file or Hash instance of resources
32
+ # Register all discovered resources
33
+ def load(json_path_or_hash)
34
+ if(json_path_or_hash.is_a?(String))
35
+ require 'json'
36
+ content = AttributeStruct.hashish.new(JSON.load(File.read(json)))
37
+ else
38
+ content = json_path_or_hash
39
+ end
40
+ content.each do |type, hash|
41
+ register(type, hash)
42
+ end
43
+ true
44
+ end
45
+
46
+ # Load the builtin AWS resources
47
+ def load!
48
+ require File.join(File.dirname(__FILE__), 'aws', 'cfn_resources.rb')
49
+ load(AWS_RESOURCES)
50
+ end
51
+
52
+ # key:: string or symbol
53
+ # Return matching registry key. Uses snaked resource type for
54
+ # matching and will attempt all parts for match
55
+ def registry_key(key)
56
+ key = key.to_s
57
+ @@registry.keys.detect do |ref|
58
+ ref = ref.tr('::', '_')
59
+ snake_ref = snake(ref).to_s.gsub('__', '_')
60
+ snake_parts = snake_ref.split('_')
61
+ until(snake_parts.empty?)
62
+ break if snake_parts.join('_') == key
63
+ snake_parts.shift
64
+ end
65
+ !snake_parts.empty?
66
+ end
67
+ end
68
+
69
+ # key:: string or symbol
70
+ # Returns resource information of type discovered via matching
71
+ # using #registry_key
72
+ def lookup(key)
73
+ @@registry[registry_key(key)]
74
+ end
75
+
76
+ # Return the currently loaded AWS registry
77
+ def registry
78
+ if(class_variable_defined?(:@@registry))
79
+ @@registry
80
+ else
81
+ {}
82
+ end
83
+ end
84
+
85
+ end
86
+ end
87
+ end
88
+
89
+ SfnAws = SparkleFormation::Aws
@@ -0,0 +1,461 @@
1
+ AWS_RESOURCES = {"AWS::IAM::InstanceProfile"=>
2
+ {:properties=>["Path", "Roles"],
3
+ :path=>"aws-resource-iam-instanceprofile.html"},
4
+ "AWS::EC2::EIP"=>
5
+ {:properties=>["InstanceId", "Domain"],
6
+ :path=>"aws-properties-ec2-eip.html"},
7
+ "AWS::IAM::Group"=>
8
+ {:properties=>["Path", "Policies"], :path=>"aws-properties-iam-group.html"},
9
+ "AWS::EC2::NetworkInterface"=>
10
+ {:properties=>
11
+ ["Description",
12
+ "GroupSet",
13
+ "PrivateIpAddress",
14
+ "PrivateIpAddresses",
15
+ "SecondaryPrivateIpAddressCount",
16
+ "SourceDestCheck",
17
+ "SubnetId",
18
+ "Tags"],
19
+ :path=>"aws-resource-ec2-network-interface.html"},
20
+ "AWS::CloudFormation::Stack"=>
21
+ {:properties=>["TemplateURL", "TimeoutInMinutes", "Parameters"],
22
+ :path=>"aws-properties-stack.html"},
23
+ "AWS::SDB::Domain"=>{:properties=>[], :path=>"aws-properties-simpledb.html"},
24
+ "AWS::IAM::AccessKey"=>
25
+ {:properties=>["Serial", "Status", "UserName"],
26
+ :path=>"aws-properties-iam-accesskey.html"},
27
+ "AWS::EC2::DHCPOptions"=>
28
+ {:properties=>
29
+ ["DomainName",
30
+ "DomainNameServers",
31
+ "NetbiosNameServers",
32
+ "NetbiosNodeType",
33
+ "NtpServers",
34
+ "Tags"],
35
+ :path=>"aws-resource-ec2-dhcp-options.html"},
36
+ "AWS::EC2::SubnetRouteTableAssociation"=>
37
+ {:properties=>["RouteTableId", "SubnetId"],
38
+ :path=>"aws-resource-ec2-subnet-route-table-assoc.html"},
39
+ "AWS::IAM::Policy"=>
40
+ {:properties=>["Groups", "PolicyDocument", "PolicyName", "Roles", "Users"],
41
+ :path=>"aws-properties-iam-policy.html"},
42
+ "AWS::CloudFront::Distribution"=>
43
+ {:properties=>["DistributionConfig"],
44
+ :path=>"aws-properties-cloudfront-distribution.html"},
45
+ "AWS::RDS::DBSubnetGroup"=>
46
+ {:properties=>["DBSubnetGroupDescription", "SubnetIds", "Tags"],
47
+ :path=>"aws-resource-rds-dbsubnet-group.html"},
48
+ "AWS::EC2::CustomerGateway"=>
49
+ {:properties=>["BgpAsn", "IpAddress", "Tags", "Type"],
50
+ :path=>"aws-resource-ec2-customer-gateway.html"},
51
+ "AWS::EC2::NetworkInterfaceAttachment"=>
52
+ {:properties=>
53
+ ["DeleteOnTermination", "DeviceIndex", "InstanceId", "NetworkInterfaceId"],
54
+ :path=>"aws-resource-ec2-network-interface-attachment.html"},
55
+ "AWS::S3::Bucket"=>
56
+ {:properties=>
57
+ ["AccessControl", "BucketName", "Tags", "WebsiteConfiguration"],
58
+ :path=>"aws-properties-s3-bucket.html"},
59
+ "AWS::Route53::RecordSet"=>
60
+ {:properties=>
61
+ ["AliasTarget",
62
+ "Comment",
63
+ "HostedZoneId",
64
+ "HostedZoneName",
65
+ "Name",
66
+ "Region",
67
+ "ResourceRecords",
68
+ "SetIdentifier",
69
+ "TTL",
70
+ "Type",
71
+ "Weight"],
72
+ :path=>"aws-properties-route53-recordset.html"},
73
+ "AWS::CloudFormation::WaitCondition"=>
74
+ {:properties=>["Count", "Handle", "Timeout"],
75
+ :path=>"aws-properties-waitcondition.html"},
76
+ "AWS::EC2::Volume"=>
77
+ {:properties=>
78
+ ["AvailabilityZone", "Iops", "Size", "SnapshotId", "Tags", "VolumeType"],
79
+ :path=>"aws-properties-ec2-ebs-volume.html"},
80
+ "AWS::IAM::User"=>
81
+ {:properties=>["Path", "Groups", "LoginProfile", "Policies"],
82
+ :path=>"aws-properties-iam-user.html"},
83
+ "AWS::ElastiCache::SecurityGroupIngress"=>
84
+ {:properties=>
85
+ ["CacheSecurityGroupName",
86
+ "EC2SecurityGroupName",
87
+ "EC2SecurityGroupOwnerId"],
88
+ :path=>"aws-properties-elasticache-security-group-ingress.html"},
89
+ "AWS::EC2::SecurityGroup"=>
90
+ {:properties=>
91
+ ["GroupDescription",
92
+ "SecurityGroupEgress",
93
+ "SecurityGroupIngress",
94
+ "Tags",
95
+ "VpcId"],
96
+ :path=>"aws-properties-ec2-security-group.html"},
97
+ "AWS::Route53::RecordSetGroup"=>
98
+ {:properties=>["HostedZoneId", "HostedZoneName", "RecordSets", "Comment"],
99
+ :path=>"aws-properties-route53-recordsetgroup.html"},
100
+ "AWS::RDS::DBParameterGroup"=>
101
+ {:properties=>["Description", "Family", "Parameters", "Tags"],
102
+ :path=>"aws-properties-rds-dbparametergroup.html"},
103
+ "AWS::DynamoDB::Table"=>
104
+ {:properties=>["KeySchema", "ProvisionedThroughput", "TableName"],
105
+ :path=>"aws-resource-dynamodb-table.html"},
106
+ "AWS::EC2::VolumeAttachment"=>
107
+ {:properties=>["Device", "InstanceId", "VolumeId"],
108
+ :path=>"aws-properties-ec2-ebs-volumeattachment.html"},
109
+ "AWS::EC2::NetworkAcl"=>
110
+ {:properties=>["Tags", "VpcId"], :path=>"aws-resource-ec2-network-acl.html"},
111
+ "AWS::ElastiCache::ParameterGroup"=>
112
+ {:properties=>["CacheParameterGroupFamily", "Description", "Properties"],
113
+ :path=>"aws-properties-elasticache-parameter-group.html"},
114
+ "AWS::EC2::SubnetNetworkAclAssociation"=>
115
+ {:properties=>["SubnetId", "NetworkAclId"],
116
+ :path=>"aws-resource-ec2-subnet-network-acl-assoc.html"},
117
+ "AWS::ElastiCache::SecurityGroup"=>
118
+ {:properties=>["Description"],
119
+ :path=>"aws-properties-elasticache-security-group.html"},
120
+ "AWS::EC2::VPCDHCPOptionsAssociation"=>
121
+ {:properties=>["DhcpOptionsId", "VpcId"],
122
+ :path=>"aws-resource-ec2-vpc-dhcp-options-assoc.html"},
123
+ "AWS::EC2::VPNGateway"=>
124
+ {:properties=>["Type", "Tags"], :path=>"aws-resource-ec2-vpn-gateway.html"},
125
+ "AWS::RDS::DBSecurityGroup"=>
126
+ {:properties=>
127
+ ["EC2VpcId", "DBSecurityGroupIngress", "GroupDescription", "Tags"],
128
+ :path=>"aws-properties-rds-security-group.html"},
129
+ "AWS::EC2::VPCGatewayAttachment"=>
130
+ {:properties=>["InternetGatewayId", "VpcId", "VpnGatewayId"],
131
+ :path=>"aws-resource-ec2-vpc-gateway-attachment.html"},
132
+ "AWS::EC2::VPNConnectionRoute"=>
133
+ {:properties=>["DestinationCidrBlock", "VpnConnectionId"],
134
+ :path=>"aws-resource-ec2-vpn-connection-route.html"},
135
+ "AWS::CloudFormation::CustomResource"=>
136
+ {:properties=>["ServiceToken"],
137
+ :path=>"aws-resource-cfn-customresource.html"},
138
+ "AWS::CloudFormation::Init"=>
139
+ {:properties=>
140
+ ["command",
141
+ "env",
142
+ "cwd",
143
+ "test",
144
+ "ignoreErrors",
145
+ "waitAfterCompletion",
146
+ "content",
147
+ "source",
148
+ "encoding",
149
+ "group",
150
+ "owner",
151
+ "mode",
152
+ "authentication",
153
+ "context",
154
+ "gid",
155
+ "ensureRunning",
156
+ "enabled",
157
+ "files",
158
+ "sources",
159
+ "packages",
160
+ "commands",
161
+ "uid",
162
+ "groups",
163
+ "homeDir"],
164
+ :path=>"aws-resource-init.html"},
165
+ "AWS::EC2::Instance"=>
166
+ {:properties=>
167
+ ["AvailabilityZone",
168
+ "BlockDeviceMappings",
169
+ "DisableApiTermination",
170
+ "EbsOptimized",
171
+ "IamInstanceProfile",
172
+ "ImageId",
173
+ "InstanceType",
174
+ "KernelId",
175
+ "KeyName",
176
+ "Monitoring",
177
+ "NetworkInterfaces",
178
+ "PlacementGroupName",
179
+ "PrivateIpAddress",
180
+ "RamdiskId",
181
+ "SecurityGroupIds",
182
+ "SecurityGroups",
183
+ "SourceDestCheck",
184
+ "SubnetId",
185
+ "Tags",
186
+ "Tenancy",
187
+ "UserData",
188
+ "Volumes"],
189
+ :path=>"aws-properties-ec2-instance.html"},
190
+ "AWS::S3::BucketPolicy"=>
191
+ {:properties=>["PolicyDocument", "Bucket"],
192
+ :path=>"aws-properties-s3-policy.html"},
193
+ "AWS::CloudWatch::Alarm"=>
194
+ {:properties=>
195
+ ["ActionsEnabled",
196
+ "AlarmActions",
197
+ "AlarmDescription",
198
+ "AlarmName",
199
+ "ComparisonOperator",
200
+ "Dimensions",
201
+ "EvaluationPeriods",
202
+ "InsufficientDataActions",
203
+ "MetricName",
204
+ "Namespace",
205
+ "OKActions",
206
+ "Period",
207
+ "Statistic",
208
+ "Threshold",
209
+ "Unit",
210
+ "Ref"],
211
+ :path=>"aws-properties-cw-alarm.html"},
212
+ "AWS::EC2::SecurityGroupEgress"=>
213
+ {:properties=>
214
+ ["CidrIp",
215
+ "DestinationSecurityGroupId",
216
+ "FromPort",
217
+ "GroupId",
218
+ "IpProtocol",
219
+ "ToPort"],
220
+ :path=>"aws-resource-ec2-security-group-egress.html"},
221
+ "AWS::ElasticBeanstalk::Environment"=>
222
+ {:properties=>
223
+ ["ApplicationName",
224
+ "CNAMEPrefix",
225
+ "Description",
226
+ "EnvironmentName",
227
+ "OptionSettings",
228
+ "OptionsToRemove",
229
+ "SolutionStackName",
230
+ "TemplateName",
231
+ "Tier",
232
+ "VersionLabel"],
233
+ :path=>"aws-properties-beanstalk-environment.html"},
234
+ "AWS::ElasticLoadBalancing::LoadBalancer"=>
235
+ {:properties=>
236
+ ["AppCookieStickinessPolicy",
237
+ "AvailabilityZones",
238
+ "CrossZone",
239
+ "HealthCheck",
240
+ "Instances",
241
+ "LBCookieStickinessPolicy",
242
+ "LoadBalancerName",
243
+ "Listeners",
244
+ "Policies",
245
+ "Scheme",
246
+ "SecurityGroups",
247
+ "Subnets"],
248
+ :path=>"aws-properties-ec2-elb.html"},
249
+ "AWS::EC2::Route"=>
250
+ {:properties=>
251
+ ["DestinationCidrBlock",
252
+ "GatewayId",
253
+ "InstanceId",
254
+ "NetworkInterfaceId",
255
+ "RouteTableId"],
256
+ :path=>"aws-resource-ec2-route.html"},
257
+ "AWS::EC2::EIPAssociation"=>
258
+ {:properties=>
259
+ ["AllocationId",
260
+ "EIP",
261
+ "InstanceId",
262
+ "NetworkInterfaceId",
263
+ "PrivateIpAddress"],
264
+ :path=>"aws-properties-ec2-eip-association.html"},
265
+ "AWS::SQS::QueuePolicy"=>
266
+ {:properties=>["PolicyDocument", "Queues"],
267
+ :path=>"aws-properties-sqs-policy.html"},
268
+ "AWS::EC2::NetworkAclEntry"=>
269
+ {:properties=>
270
+ ["CidrBlock",
271
+ "Egress",
272
+ "Icmp",
273
+ "NetworkAclId",
274
+ "PortRange",
275
+ "Protocol",
276
+ "RuleAction",
277
+ "RuleNumber"],
278
+ :path=>"aws-resource-ec2-network-acl-entry.html"},
279
+ "AWS::ElastiCache::CacheCluster"=>
280
+ {:properties=>
281
+ ["AutoMinorVersionUpgrade",
282
+ "CacheNodeType",
283
+ "CacheParameterGroupName",
284
+ "CacheSecurityGroupNames",
285
+ "CacheSubnetGroupName",
286
+ "ClusterName",
287
+ "Engine",
288
+ "EngineVersion",
289
+ "NotificationTopicArn",
290
+ "NumCacheNodes",
291
+ "Port",
292
+ "PreferredAvailabilityZone",
293
+ "PreferredMaintenanceWindow",
294
+ "SnapshotArns",
295
+ " VpcSecurityGroupIds "],
296
+ :path=>"aws-properties-elasticache-cache-cluster.html"},
297
+ "AWS::CloudFormation::WaitConditionHandle"=>
298
+ {:properties=>[], :path=>"aws-properties-waitconditionhandle.html"},
299
+ "AWS::EC2::VPC"=>
300
+ {:properties=>
301
+ ["CidrBlock",
302
+ "EnableDnsSupport",
303
+ "EnableDnsHostnames",
304
+ "InstanceTenancy",
305
+ "Tags"],
306
+ :path=>"aws-resource-ec2-vpc.html"},
307
+ "AWS::EC2::VPNConnection"=>
308
+ {:properties=>
309
+ ["Type", "CustomerGatewayId", "StaticRoutesOnly", "Tags", "VpnGatewayId"],
310
+ :path=>"aws-resource-ec2-vpn-connection.html"},
311
+ "AWS::ElasticBeanstalk::Application"=>
312
+ {:properties=>
313
+ ["ApplicationName",
314
+ "ApplicationVersions",
315
+ "ConfigurationTemplates",
316
+ "Description"],
317
+ :path=>"aws-properties-beanstalk.html"},
318
+ "AWS::SNS::TopicPolicy"=>
319
+ {:properties=>["PolicyDocument", "Topics"],
320
+ :path=>"aws-properties-sns-policy.html"},
321
+ "AWS::EC2::Subnet"=>
322
+ {:properties=>["AvailabilityZone", "CidrBlock", "Tags", "VpcId"],
323
+ :path=>"aws-resource-ec2-subnet.html"},
324
+ "AWS::AutoScaling::ScalingPolicy"=>
325
+ {:properties=>
326
+ ["AdjustmentType",
327
+ "AutoScalingGroupName",
328
+ "Cooldown",
329
+ "ScalingAdjustment"],
330
+ :path=>"aws-properties-as-policy.html"},
331
+ "AWS::SQS::Queue"=>
332
+ {:properties=>
333
+ ["DelaySeconds",
334
+ "MaximumMessageSize",
335
+ "MessageRetentionPeriod",
336
+ "QueueName",
337
+ "ReceiveMessageWaitTimeSeconds",
338
+ "VisibilityTimeout"],
339
+ :path=>"aws-properties-sqs-queues.html"},
340
+ "AWS::AutoScaling::Trigger"=>
341
+ {:properties=>
342
+ ["AutoScalingGroupName",
343
+ "BreachDuration",
344
+ "Dimensions",
345
+ "LowerBreachScaleIncrement",
346
+ "LowerThreshold",
347
+ "MetricName",
348
+ "Namespace",
349
+ "Period",
350
+ "Statistic",
351
+ "Unit",
352
+ "UpperBreachScaleIncrement",
353
+ "UpperThreshold"],
354
+ :path=>"aws-properties-as-trigger.html"},
355
+ "AWS::IAM::UserToGroupAddition"=>
356
+ {:properties=>["GroupName", "Users"],
357
+ :path=>"aws-properties-iam-addusertogroup.html"},
358
+ "AWS::EC2::SecurityGroupIngress"=>
359
+ {:properties=>
360
+ ["GroupName",
361
+ "GroupId",
362
+ "IpProtocol",
363
+ "CidrIp",
364
+ "SourceSecurityGroupName",
365
+ "SourceSecurityGroupId",
366
+ "SourceSecurityGroupOwnerId",
367
+ "FromPort",
368
+ "ToPort"],
369
+ :path=>"aws-properties-ec2-security-group-ingress.html"},
370
+ "AWS::IAM::Role"=>
371
+ {:properties=>["AssumeRolePolicyDocument", "Path", "Policies"],
372
+ :path=>"aws-resource-iam-role.html"},
373
+ "AWS::EC2::VPNGatewayRoutePropagation"=>
374
+ {:properties=>["RouteTableIds", "VpnGatewayId"],
375
+ :path=>"aws-resource-ec2-vpn-gatewayrouteprop.html"},
376
+ "AWS::AutoScaling::AutoScalingGroup"=>
377
+ {:properties=>
378
+ ["AvailabilityZones",
379
+ "Cooldown",
380
+ "DesiredCapacity",
381
+ "HealthCheckGracePeriod",
382
+ "HealthCheckType",
383
+ "LaunchConfigurationName",
384
+ "LoadBalancerNames",
385
+ "MaxSize",
386
+ "MinSize",
387
+ "NotificationConfiguration",
388
+ "Tags",
389
+ "TerminationPolicies",
390
+ "VPCZoneIdentifier"],
391
+ :path=>"aws-properties-as-group.html"},
392
+ "AWS::RDS::DBSecurityGroupIngress"=>
393
+ {:properties=>
394
+ ["CIDRIP",
395
+ "DBSecurityGroupName",
396
+ "EC2SecurityGroupId",
397
+ "EC2SecurityGroupName",
398
+ "EC2SecurityGroupOwnerId"],
399
+ :path=>"aws-resource-rds-security-group-ingress.html"},
400
+ "AWS::RDS::DBInstance"=>
401
+ {:properties=>
402
+ ["AllocatedStorage",
403
+ "AllowMajorVersionUpgrade",
404
+ "AutoMinorVersionUpgrade",
405
+ "AvailabilityZone",
406
+ "BackupRetentionPeriod",
407
+ "DBInstanceClass",
408
+ "DBInstanceIdentifier",
409
+ "DBName",
410
+ "DBParameterGroupName",
411
+ "DBSecurityGroups",
412
+ "DBSnapshotIdentifier",
413
+ "DBSubnetGroupName",
414
+ "Engine",
415
+ "EngineVersion",
416
+ "Iops",
417
+ "LicenseModel",
418
+ "MasterUsername",
419
+ "MasterUserPassword",
420
+ "MultiAZ",
421
+ "Port",
422
+ "PreferredBackupWindow",
423
+ "PreferredMaintenanceWindow",
424
+ "SourceDBInstanceIdentifier",
425
+ "Tags",
426
+ "VPCSecurityGroups"],
427
+ :path=>"aws-properties-rds-database-instance.html"},
428
+ "AWS::EC2::InternetGateway"=>
429
+ {:properties=>["Tags"], :path=>"aws-resource-ec2-internet-gateway.html"},
430
+ "AWS::EC2::RouteTable"=>
431
+ {:properties=>["VpcId", "Tags"], :path=>"aws-resource-ec2-route-table.html"},
432
+ "AWS::AutoScaling::LaunchConfiguration"=>
433
+ {:properties=>
434
+ ["AssociatePublicIpAddress",
435
+ "BlockDeviceMappings",
436
+ "EbsOptimized",
437
+ "IamInstanceProfile",
438
+ "ImageId",
439
+ "InstanceMonitoring",
440
+ "InstanceType",
441
+ "KernelId",
442
+ "KeyName",
443
+ "RamDiskId",
444
+ "SecurityGroups",
445
+ "SpotPrice",
446
+ "UserData"],
447
+ :path=>"aws-properties-as-launchconfig.html"},
448
+ "AWS::SNS::Topic"=>
449
+ {:properties=>["DisplayName", "Subscription", "TopicName"],
450
+ :path=>"aws-properties-sns-topic.html"},
451
+ "AWS::CloudFormation::Authentication"=>
452
+ {:properties=>
453
+ ["accessKeyId",
454
+ "buckets",
455
+ "password",
456
+ "secretKey",
457
+ "type",
458
+ "uris",
459
+ "username",
460
+ "roleName"],
461
+ :path=>"aws-resource-authentication.html"}}