convection 1.0.0.pre.beta.7 → 1.0.0.pre.beta.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4500414b1ee23d5ad537b09f1705e68ed6c6a0f
4
- data.tar.gz: 368287f0ccb09692a0d76dafaeeacccf1938f273
3
+ metadata.gz: 2b7875ecff60334cc075ced555536add48611bdc
4
+ data.tar.gz: d68e3d9ddf2eba5b8de1aaa64865a505858b1c5c
5
5
  SHA512:
6
- metadata.gz: 4410d91a421d50ca510d9109c08acc719172a314e87847bb746ed76ca98b76510a0baac61037d69df62510528f8869dea0aba4f1b06235ebe47a7355f7ee7039
7
- data.tar.gz: 50a9a849752e4ab8c91b99b18697585b4a7f4d13d57f197d1abb16053f5daa9ad3d74aa7df1ff41f5ca472b0900adf17d7774c5df4c41ab8e01742e314ecdbbc
6
+ metadata.gz: 7f58400f4d15d98e6e02f727f18dade740f0f59a686d907e059adffd4cc0ecb57f6752b81b16e0923656544ad99696f140361930550ad52675865b95192faeb2
7
+ data.tar.gz: 21b9910869a9c12155a1f44d91a1a1f186b0f5ac43ac6a7b7f70ac0cc1d48c33bdced4f5dbf31281ad69bf121057b7e23b2123e4cf6999e14e7f46b97d8559a5
@@ -1,4 +1,5 @@
1
1
  require_relative './mixin/colorize'
2
+ require_relative './replace_properties'
2
3
 
3
4
  module Convection
4
5
  module Model
@@ -12,16 +13,24 @@ module Convection
12
13
  attr_reader :action
13
14
  attr_reader :ours
14
15
  attr_reader :theirs
15
- colorize :action, :green => [:create], :yellow => [:update], :red => [:delete]
16
+ colorize :action, :green => [:create], :yellow => [:update], :red => [:delete, :replace]
16
17
 
17
18
  def initialize(key, ours, theirs)
18
19
  @key = key
19
20
  @ours = ours
20
21
  @theirs = theirs
21
22
 
22
- @action = if ours && theirs then :update
23
- elsif ours then :create
24
- else :delete
23
+ @action = if ours && theirs
24
+ property_name = key[/AWS::[A-Za-z0-9:]+\.[A-Za-z0-9]+/]
25
+ if REPLACE_PROPERTIES.include?(property_name)
26
+ :replace
27
+ else
28
+ :update
29
+ end
30
+ elsif ours
31
+ :create
32
+ else
33
+ :delete
25
34
  end
26
35
  end
27
36
 
@@ -29,6 +38,7 @@ module Convection
29
38
  message = case action
30
39
  when :create then "#{ key }: #{ ours }"
31
40
  when :update then "#{ key }: #{ theirs } => #{ ours }"
41
+ when :replace then "#{ key }: #{ theirs } => #{ ours }"
32
42
  when :delete then key
33
43
  end
34
44
 
@@ -9,7 +9,7 @@ module Convection
9
9
  when *options.fetch(:cyan, [:debug, :trace]) then :cyan
10
10
  when *options.fetch(:green, [:info, :success, :create]) then :green
11
11
  when *options.fetch(:yellow, [:warn, :update]) then :yellow
12
- when *options.fetch(:red, [:error, :fail, :delete]) then :red
12
+ when *options.fetch(:red, [:error, :fail, :delete, :replace]) then :red
13
13
  else options.fetch(:default, :green)
14
14
  end
15
15
  end
@@ -0,0 +1,399 @@
1
+ module Convection
2
+ module Model
3
+ # Unfortunately, there are a lot of resources to include in this array,
4
+ # and rather than parsing out only the ones that we need right now
5
+ # and potentially missing it in the future, just disable rubocop whining
6
+ # about that particular error:
7
+ # rubocop:disable ClassLength
8
+ class Diff
9
+ # Properties for which a change requires a replacement
10
+ # (as opposed to an in-place update)
11
+ # Create/update this list with tmp/process_html.sh
12
+ REPLACE_PROPERTIES = [
13
+ 'AWS::ApiGateway::ApiKey.Name',
14
+ 'AWS::ApiGateway::Authorizer.RestApiId',
15
+ 'AWS::ApiGateway::Deployment.RestApiId',
16
+ 'AWS::ApiGateway::Model.ContentType',
17
+ 'AWS::ApiGateway::Model.Name',
18
+ 'AWS::ApiGateway::Model.RestApiId',
19
+ 'AWS::ApiGateway::Resource.ParentId',
20
+ 'AWS::ApiGateway::Resource.PathPart',
21
+ 'AWS::ApiGateway::Resource.RestApiId',
22
+ 'AWS::ApiGateway::Stage.RestApiId',
23
+ 'AWS::ApiGateway::Stage.StageName',
24
+ 'AWS::ApplicationAutoScaling::ScalableTarget.ResourceId',
25
+ 'AWS::ApplicationAutoScaling::ScalableTarget.ScalableDimension',
26
+ 'AWS::ApplicationAutoScaling::ScalableTarget.ServiceNamespace',
27
+ 'AWS::ApplicationAutoScaling::ScalingPolicy.PolicyName',
28
+ 'AWS::ApplicationAutoScaling::ScalingPolicy.ResourceId',
29
+ 'AWS::ApplicationAutoScaling::ScalingPolicy.ScalableDimension',
30
+ 'AWS::ApplicationAutoScaling::ScalingPolicy.ServiceNamespace',
31
+ 'AWS::ApplicationAutoScaling::ScalingPolicy.ScalingTargetId',
32
+ 'AWS::AutoScaling::AutoScalingGroup.InstanceId',
33
+ 'AWS::AutoScaling::AutoScalingGroup.LoadBalancerNames',
34
+ 'AWS::AutoScaling::LaunchConfiguration.AssociatePublicIpAddress',
35
+ 'AWS::AutoScaling::LaunchConfiguration.BlockDeviceMappings',
36
+ 'AWS::AutoScaling::LaunchConfiguration.ClassicLinkVPCId',
37
+ 'AWS::AutoScaling::LaunchConfiguration.ClassicLinkVPCSecurityGroups',
38
+ 'AWS::AutoScaling::LaunchConfiguration.EbsOptimized',
39
+ 'AWS::AutoScaling::LaunchConfiguration.IamInstanceProfile',
40
+ 'AWS::AutoScaling::LaunchConfiguration.ImageId',
41
+ 'AWS::AutoScaling::LaunchConfiguration.InstanceId',
42
+ 'AWS::AutoScaling::LaunchConfiguration.InstanceMonitoring',
43
+ 'AWS::AutoScaling::LaunchConfiguration.InstanceType',
44
+ 'AWS::AutoScaling::LaunchConfiguration.KernelId',
45
+ 'AWS::AutoScaling::LaunchConfiguration.KeyName',
46
+ 'AWS::AutoScaling::LaunchConfiguration.PlacementTenancy',
47
+ 'AWS::AutoScaling::LaunchConfiguration.RamDiskId',
48
+ 'AWS::AutoScaling::LaunchConfiguration.SecurityGroups',
49
+ 'AWS::AutoScaling::LaunchConfiguration.SpotPrice',
50
+ 'AWS::AutoScaling::LaunchConfiguration.UserData',
51
+ 'AWS::AutoScaling::LifecycleHook.AutoScalingGroupName',
52
+ 'AWS::AutoScaling::ScheduledAction.AutoScalingGroupName',
53
+ 'AWS::CertificateManager::Certificate.DomainName',
54
+ 'AWS::CertificateManager::Certificate.DomainValidationOptions',
55
+ 'AWS::CertificateManager::Certificate.SubjectAlternativeNames',
56
+ 'AWS::CloudWatch::Alarm.AlarmName',
57
+ 'AWS::CodeDeploy::DeploymentConfig.DeploymentConfigName',
58
+ 'AWS::CodeDeploy::DeploymentConfig.MinimumHealthyHosts',
59
+ 'AWS::CodeDeploy::DeploymentGroup.ApplicationName',
60
+ 'AWS::CodeDeploy::DeploymentGroup.DeploymentGroupName',
61
+ 'AWS::CodePipeline::CustomActionType.Category',
62
+ 'AWS::CodePipeline::CustomActionType.ConfigurationProperties',
63
+ 'AWS::CodePipeline::CustomActionType.InputArtifactDetails',
64
+ 'AWS::CodePipeline::CustomActionType.OutputArtifactDetails',
65
+ 'AWS::CodePipeline::CustomActionType.Provider',
66
+ 'AWS::CodePipeline::CustomActionType.Settings',
67
+ 'AWS::CodePipeline::CustomActionType.Version',
68
+ 'AWS::Config::ConfigRule.ConfigRuleName',
69
+ 'AWS::DataPipeline::Pipeline.Description',
70
+ 'AWS::DataPipeline::Pipeline.Name',
71
+ 'AWS::DirectoryService::MicrosoftAD.CreateAlias',
72
+ 'AWS::DirectoryService::MicrosoftAD.Name',
73
+ 'AWS::DirectoryService::MicrosoftAD.Password',
74
+ 'AWS::DirectoryService::MicrosoftAD.ShortName',
75
+ 'AWS::DirectoryService::MicrosoftAD.VpcSettings',
76
+ 'AWS::DirectoryService::SimpleAD.CreateAlias',
77
+ 'AWS::DirectoryService::SimpleAD.Description',
78
+ 'AWS::DirectoryService::SimpleAD.Name',
79
+ 'AWS::DirectoryService::SimpleAD.Password',
80
+ 'AWS::DirectoryService::SimpleAD.ShortName',
81
+ 'AWS::DirectoryService::SimpleAD.Size',
82
+ 'AWS::DirectoryService::SimpleAD.VpcSettings',
83
+ 'AWS::DynamoDB::Table.AttributeDefinitions',
84
+ 'AWS::DynamoDB::Table.KeySchema',
85
+ 'AWS::DynamoDB::Table.LocalSecondaryIndexes',
86
+ 'AWS::DynamoDB::Table.TableName',
87
+ 'AWS::EC2::CustomerGateway.BgpAsn',
88
+ 'AWS::EC2::CustomerGateway.IpAddress',
89
+ 'AWS::EC2::CustomerGateway.Type',
90
+ 'AWS::EC2::DHCPOptions.DomainName',
91
+ 'AWS::EC2::DHCPOptions.DomainNameServers',
92
+ 'AWS::EC2::DHCPOptions.NetbiosNameServers',
93
+ 'AWS::EC2::DHCPOptions.NetbiosNodeType',
94
+ 'AWS::EC2::DHCPOptions.NtpServers',
95
+ 'AWS::EC2::EIP.Domain',
96
+ 'AWS::EC2::EIPAssociation.AllocationId',
97
+ 'AWS::EC2::EIPAssociation.EIP',
98
+ 'AWS::EC2::EIPAssociation.InstanceId',
99
+ 'AWS::EC2::EIPAssociation.NetworkInterfaceId',
100
+ 'AWS::EC2::FlowLog.DeliverLogsPermissionArn',
101
+ 'AWS::EC2::FlowLog.LogGroupName',
102
+ 'AWS::EC2::FlowLog.ResourceId',
103
+ 'AWS::EC2::FlowLog.ResourceType',
104
+ 'AWS::EC2::FlowLog.TrafficType',
105
+ 'AWS::EC2::Host.AvailabilityZone',
106
+ 'AWS::EC2::Host.InstanceType',
107
+ 'AWS::EC2::Instance.AvailabilityZone',
108
+ 'AWS::EC2::Instance.BlockDeviceMappings',
109
+ 'AWS::EC2::Instance.EbsOptimized',
110
+ 'AWS::EC2::Instance.IamInstanceProfile',
111
+ 'AWS::EC2::Instance.ImageId',
112
+ 'AWS::EC2::Instance.InstanceType',
113
+ 'AWS::EC2::Instance.KernelId',
114
+ 'AWS::EC2::Instance.KeyName',
115
+ 'AWS::EC2::Instance.NetworkInterfaces',
116
+ 'AWS::EC2::Instance.PlacementGroupName',
117
+ 'AWS::EC2::Instance.PrivateIpAddress',
118
+ 'AWS::EC2::Instance.RamdiskId',
119
+ 'AWS::EC2::Instance.SecurityGroupIds',
120
+ 'AWS::EC2::Instance.SecurityGroups',
121
+ 'AWS::EC2::Instance.SubnetId',
122
+ 'AWS::EC2::Instance.Tenancy',
123
+ 'AWS::EC2::Instance.UserData',
124
+ 'AWS::EC2::Instance.AdditionalInfo',
125
+ 'AWS::EC2::NatGateway.AllocationId',
126
+ 'AWS::EC2::NatGateway.SubnetId',
127
+ 'AWS::EC2::NetworkAcl.VpcId',
128
+ 'AWS::EC2::NetworkAclEntry.Egress',
129
+ 'AWS::EC2::NetworkAclEntry.NetworkAclId',
130
+ 'AWS::EC2::NetworkAclEntry.RuleNumber',
131
+ 'AWS::EC2::NetworkInterface.PrivateIpAddress',
132
+ 'AWS::EC2::NetworkInterface.PrivateIpAddresses',
133
+ 'AWS::EC2::NetworkInterface.SubnetId',
134
+ 'AWS::EC2::PlacementGroup.Strategy',
135
+ 'AWS::EC2::Route.DestinationCidrBlock',
136
+ 'AWS::EC2::Route.RouteTableId',
137
+ 'AWS::EC2::RouteTable.VpcId',
138
+ 'AWS::EC2::SecurityGroup.GroupDescription',
139
+ 'AWS::EC2::SecurityGroup.VpcId',
140
+ 'AWS::EC2::SecurityGroupEgress.CidrIp',
141
+ 'AWS::EC2::SecurityGroupEgress.DestinationPrefixListId',
142
+ 'AWS::EC2::SecurityGroupEgress.DestinationSecurityGroupId',
143
+ 'AWS::EC2::SecurityGroupEgress.FromPort',
144
+ 'AWS::EC2::SecurityGroupEgress.GroupId',
145
+ 'AWS::EC2::SecurityGroupEgress.IpProtocol',
146
+ 'AWS::EC2::SecurityGroupEgress.ToPort',
147
+ 'AWS::EC2::SecurityGroupIngress.CidrIp',
148
+ 'AWS::EC2::SecurityGroupIngress.FromPort',
149
+ 'AWS::EC2::SecurityGroupIngress.GroupId',
150
+ 'AWS::EC2::SecurityGroupIngress.GroupName',
151
+ 'AWS::EC2::SecurityGroupIngress.IpProtocol',
152
+ 'AWS::EC2::SecurityGroupIngress.SourceSecurityGroupId',
153
+ 'AWS::EC2::SecurityGroupIngress.SourceSecurityGroupName',
154
+ 'AWS::EC2::SecurityGroupIngress.SourceSecurityGroupOwnerId',
155
+ 'AWS::EC2::SecurityGroupIngress.ToPort',
156
+ 'AWS::EC2::SpotFleet.SpotFleetRequestConfigData',
157
+ 'AWS::EC2::Subnet.AvailabilityZone',
158
+ 'AWS::EC2::Subnet.CidrBlock',
159
+ 'AWS::EC2::Subnet.VpcId',
160
+ 'AWS::EC2::SubnetNetworkAclAssociation.SubnetId',
161
+ 'AWS::EC2::SubnetNetworkAclAssociation.NetworkAclId',
162
+ 'AWS::EC2::SubnetRouteTableAssociation.SubnetId',
163
+ 'AWS::EC2::VPC.CidrBlock',
164
+ 'AWS::EC2::VPC.InstanceTenancy',
165
+ 'AWS::EC2::VPCDHCPOptionsAssociation.VpcId',
166
+ 'AWS::EC2::VPCEndpoint.ServiceName',
167
+ 'AWS::EC2::VPCEndpoint.VpcId',
168
+ 'AWS::EC2::VPCPeeringConnection.PeerVpcId',
169
+ 'AWS::EC2::VPCPeeringConnection.VpcId',
170
+ 'AWS::EC2::VPNConnection.Type',
171
+ 'AWS::EC2::VPNConnection.CustomerGatewayId',
172
+ 'AWS::EC2::VPNConnection.StaticRoutesOnly',
173
+ 'AWS::EC2::VPNConnection.VpnGatewayId',
174
+ 'AWS::EC2::VPNConnectionRoute.DestinationCidrBlock',
175
+ 'AWS::EC2::VPNConnectionRoute.VpnConnectionId',
176
+ 'AWS::EC2::VPNGateway.Type',
177
+ 'AWS::ECR::Repository.RepositoryName',
178
+ 'AWS::ECS::Cluster.ClusterName',
179
+ 'AWS::ECS::Service.Cluster',
180
+ 'AWS::ECS::Service.LoadBalancers',
181
+ 'AWS::ECS::Service.Role',
182
+ 'AWS::ECS::TaskDefinition.ContainerDefinitions',
183
+ 'AWS::ECS::TaskDefinition.Family',
184
+ 'AWS::ECS::TaskDefinition.TaskRoleArn',
185
+ 'AWS::ECS::TaskDefinition.Volumes',
186
+ 'AWS::EFS::FileSystem.PerformanceMode',
187
+ 'AWS::EFS::MountTarget.FileSystemId',
188
+ 'AWS::EFS::MountTarget.IpAddress',
189
+ 'AWS::EFS::MountTarget.SubnetId',
190
+ 'AWS::ElastiCache::CacheCluster.CacheSubnetGroupName',
191
+ 'AWS::ElastiCache::CacheCluster.ClusterName',
192
+ 'AWS::ElastiCache::CacheCluster.Engine',
193
+ 'AWS::ElastiCache::CacheCluster.Port',
194
+ 'AWS::ElastiCache::CacheCluster.PreferredAvailabilityZone',
195
+ 'AWS::ElastiCache::CacheCluster.SnapshotArns',
196
+ 'AWS::ElastiCache::CacheCluster.SnapshotName',
197
+ 'AWS::ElastiCache::ReplicationGroup.CacheSubnetGroupName',
198
+ 'AWS::ElastiCache::ReplicationGroup.NodeGroupConfiguration',
199
+ 'AWS::ElastiCache::ReplicationGroup.NumNodeGroups',
200
+ 'AWS::ElastiCache::ReplicationGroup.Port',
201
+ 'AWS::ElastiCache::ReplicationGroup.PreferredCacheClusterAZs',
202
+ 'AWS::ElastiCache::ReplicationGroup.ReplicasPerNodeGroup',
203
+ 'AWS::ElastiCache::ReplicationGroup.ReplicationGroupId',
204
+ 'AWS::ElastiCache::ReplicationGroup.SnapshotArns',
205
+ 'AWS::ElastiCache::ReplicationGroup.SnapshotName',
206
+ 'AWS::ElastiCache::SubnetGroup.CacheSubnetGroupName',
207
+ 'AWS::ElasticBeanstalk::Application.ApplicationName',
208
+ 'AWS::ElasticBeanstalk::ApplicationVersion.ApplicationName',
209
+ 'AWS::ElasticBeanstalk::ApplicationVersion.SourceBundle',
210
+ 'AWS::ElasticBeanstalk::ConfigurationTemplate.ApplicationName',
211
+ 'AWS::ElasticBeanstalk::ConfigurationTemplate.EnvironmentId',
212
+ 'AWS::ElasticBeanstalk::ConfigurationTemplate.SolutionStackName',
213
+ 'AWS::ElasticBeanstalk::ConfigurationTemplate.SourceConfiguration',
214
+ 'AWS::ElasticBeanstalk::Environment.ApplicationName',
215
+ 'AWS::ElasticBeanstalk::Environment.CNAMEPrefix',
216
+ 'AWS::ElasticBeanstalk::Environment.EnvironmentName',
217
+ 'AWS::ElasticBeanstalk::Environment.SolutionStackName',
218
+ 'AWS::ElasticLoadBalancing::LoadBalancer.AvailabilityZones',
219
+ 'AWS::ElasticLoadBalancing::LoadBalancer.HealthCheck',
220
+ 'AWS::ElasticLoadBalancing::LoadBalancer.LoadBalancerName',
221
+ 'AWS::ElasticLoadBalancing::LoadBalancer.Scheme',
222
+ 'AWS::ElasticLoadBalancing::LoadBalancer.Subnets',
223
+ 'AWS::ElasticLoadBalancingV2::Listener.LoadBalancerArn',
224
+ 'AWS::ElasticLoadBalancingV2::ListenerRule.ListenerArn',
225
+ 'AWS::ElasticLoadBalancingV2::LoadBalancer.Name',
226
+ 'AWS::ElasticLoadBalancingV2::LoadBalancer.Scheme',
227
+ 'AWS::ElasticLoadBalancingV2::TargetGroup.Name',
228
+ 'AWS::ElasticLoadBalancingV2::TargetGroup.Port',
229
+ 'AWS::ElasticLoadBalancingV2::TargetGroup.Protocol',
230
+ 'AWS::ElasticLoadBalancingV2::TargetGroup.VpcId',
231
+ 'AWS::Elasticsearch::Domain.AdvancedOptions',
232
+ 'AWS::Elasticsearch::Domain.DomainName',
233
+ 'AWS::Elasticsearch::Domain.ElasticsearchVersion',
234
+ 'AWS::EMR::Cluster.AdditionalInfo',
235
+ 'AWS::EMR::Cluster.Applications',
236
+ 'AWS::EMR::Cluster.BootstrapActions',
237
+ 'AWS::EMR::Cluster.Configurations',
238
+ 'AWS::EMR::Cluster.Instances',
239
+ 'AWS::EMR::Cluster.JobFlowRole',
240
+ 'AWS::EMR::Cluster.LogUri',
241
+ 'AWS::EMR::Cluster.Name',
242
+ 'AWS::EMR::Cluster.ReleaseLabel',
243
+ 'AWS::EMR::Cluster.ServiceRole',
244
+ 'AWS::EMR::InstanceGroupConfig.BidPrice',
245
+ 'AWS::EMR::InstanceGroupConfig.Configurations',
246
+ 'AWS::EMR::InstanceGroupConfig.EbsConfiguration',
247
+ 'AWS::EMR::InstanceGroupConfig.InstanceRole',
248
+ 'AWS::EMR::InstanceGroupConfig.InstanceType',
249
+ 'AWS::EMR::InstanceGroupConfig.JobFlowId',
250
+ 'AWS::EMR::InstanceGroupConfig.Market',
251
+ 'AWS::EMR::InstanceGroupConfig.Name',
252
+ 'AWS::EMR::Step.ActionOnFailure',
253
+ 'AWS::EMR::Step.HadoopJarStep',
254
+ 'AWS::EMR::Step.JobFlowId',
255
+ 'AWS::EMR::Step.Name',
256
+ 'AWS::Events::Rule.Name',
257
+ 'AWS::GameLift::Build.StorageLocation',
258
+ 'AWS::GameLift::Fleet.BuildId',
259
+ 'AWS::GameLift::Fleet.EC2InstanceType',
260
+ 'AWS::GameLift::Fleet.LogPaths',
261
+ 'AWS::GameLift::Fleet.ServerLaunchParameters',
262
+ 'AWS::GameLift::Fleet.ServerLaunchPath',
263
+ 'AWS::IAM::AccessKey.Serial',
264
+ 'AWS::IAM::AccessKey.UserName',
265
+ 'AWS::IAM::Group.GroupName',
266
+ 'AWS::IAM::InstanceProfile.Path',
267
+ 'AWS::IAM::ManagedPolicy.Description',
268
+ 'AWS::IAM::ManagedPolicy.Path',
269
+ 'AWS::IAM::Role.Path',
270
+ 'AWS::IAM::Role.RoleName',
271
+ 'AWS::IAM::User.UserName',
272
+ 'AWS::IoT::Certificate.CertificateSigningRequest',
273
+ 'AWS::IoT::Policy.PolicyDocument',
274
+ 'AWS::IoT::Policy.PolicyName',
275
+ 'AWS::IoT::PolicyPrincipalAttachment.PolicyName',
276
+ 'AWS::IoT::PolicyPrincipalAttachment.Principal',
277
+ 'AWS::IoT::Thing.ThingName',
278
+ 'AWS::IoT::ThingPrincipalAttachment.Principal',
279
+ 'AWS::IoT::ThingPrincipalAttachment.ThingName',
280
+ 'AWS::IoT::TopicRule.RuleName',
281
+ 'AWS::Kinesis::Stream.Name',
282
+ 'AWS::Kinesis::Stream.ShardCount',
283
+ 'AWS::KinesisFirehose::DeliveryStream.DeliveryStreamName',
284
+ 'AWS::KMS::Alias.AliasName',
285
+ 'AWS::Lambda::EventSourceMapping.EventSourceArn',
286
+ 'AWS::Lambda::EventSourceMapping.StartingPosition',
287
+ 'AWS::Lambda::Alias.FunctionName',
288
+ 'AWS::Lambda::Alias.Name',
289
+ 'AWS::Lambda::Function.FunctionName',
290
+ 'AWS::Lambda::Function.Runtime',
291
+ 'AWS::Lambda::Permission.Action',
292
+ 'AWS::Lambda::Permission.FunctionName',
293
+ 'AWS::Lambda::Permission.Principal',
294
+ 'AWS::Lambda::Permission.SourceAccount',
295
+ 'AWS::Lambda::Permission.SourceArn',
296
+ 'AWS::Lambda::Version.FunctionName',
297
+ 'AWS::Logs::Destination.DestinationName',
298
+ 'AWS::Logs::LogGroup.LogGroupName',
299
+ 'AWS::Logs::LogStream.LogGroupName',
300
+ 'AWS::Logs::LogStream.LogStreamName',
301
+ 'AWS::Logs::MetricFilter.LogGroupName',
302
+ 'AWS::Logs::SubscriptionFilter.DestinationArn',
303
+ 'AWS::Logs::SubscriptionFilter.FilterPattern',
304
+ 'AWS::Logs::SubscriptionFilter.LogGroupName',
305
+ 'AWS::Logs::SubscriptionFilter.RoleArn',
306
+ 'AWS::OpsWorks::App.Shortname',
307
+ 'AWS::OpsWorks::App.StackId',
308
+ 'AWS::OpsWorks::Instance.AutoScalingType',
309
+ 'AWS::OpsWorks::Instance.AvailabilityZone',
310
+ 'AWS::OpsWorks::Instance.EbsOptimized',
311
+ 'AWS::OpsWorks::Instance.Os',
312
+ 'AWS::OpsWorks::Instance.RootDeviceType',
313
+ 'AWS::OpsWorks::Instance.StackId',
314
+ 'AWS::OpsWorks::Instance.SubnetId',
315
+ 'AWS::OpsWorks::Instance.TimeBasedAutoScaling',
316
+ 'AWS::OpsWorks::Layer.StackId',
317
+ 'AWS::OpsWorks::Layer.Type',
318
+ 'AWS::OpsWorks::Layer.VolumeConfigurations',
319
+ 'AWS::OpsWorks::Stack.ServiceRoleArn',
320
+ 'AWS::OpsWorks::Stack.VpcId',
321
+ 'AWS::RDS::DBCluster.AvailabilityZones',
322
+ 'AWS::RDS::DBCluster.DatabaseName',
323
+ 'AWS::RDS::DBCluster.DBSubnetGroupName',
324
+ 'AWS::RDS::DBCluster.Engine',
325
+ 'AWS::RDS::DBCluster.EngineVersion',
326
+ 'AWS::RDS::DBCluster.KmsKeyId',
327
+ 'AWS::RDS::DBCluster.MasterUsername',
328
+ 'AWS::RDS::DBCluster.SnapshotIdentifier',
329
+ 'AWS::RDS::DBCluster.StorageEncrypted',
330
+ 'AWS::RDS::DBClusterParameterGroup.Description',
331
+ 'AWS::RDS::DBClusterParameterGroup.Family',
332
+ 'AWS::RDS::DBInstance.AvailabilityZone',
333
+ 'AWS::RDS::DBInstance.CharacterSetName',
334
+ 'AWS::RDS::DBInstance.DBClusterIdentifier',
335
+ 'AWS::RDS::DBInstance.DBInstanceIdentifier',
336
+ 'AWS::RDS::DBInstance.DBName',
337
+ 'AWS::RDS::DBInstance.DBSnapshotIdentifier',
338
+ 'AWS::RDS::DBInstance.DBSubnetGroupName',
339
+ 'AWS::RDS::DBInstance.Engine',
340
+ 'AWS::RDS::DBInstance.KmsKeyId',
341
+ 'AWS::RDS::DBInstance.LicenseModel',
342
+ 'AWS::RDS::DBInstance.MasterUsername',
343
+ 'AWS::RDS::DBInstance.Port',
344
+ 'AWS::RDS::DBInstance.PubliclyAccessible',
345
+ 'AWS::RDS::DBInstance.SourceDBInstanceIdentifier',
346
+ 'AWS::RDS::DBInstance.StorageEncrypted',
347
+ 'AWS::RDS::DBInstance.VPCSecurityGroups',
348
+ 'AWS::RDS::DBSecurityGroup.EC2VpcId',
349
+ 'AWS::RDS::DBSecurityGroup.GroupDescription',
350
+ 'AWS::RDS::EventSubscription.SnsTopicArn',
351
+ 'AWS::RDS::EventSubscription.SourceType',
352
+ 'AWS::RDS::OptionGroup.EngineName',
353
+ 'AWS::RDS::OptionGroup.MajorEngineVersion',
354
+ 'AWS::RDS::OptionGroup.OptionGroupDescription',
355
+ 'AWS::RDS::OptionGroup.OptionConfigurations',
356
+ 'AWS::Redshift::Cluster.AvailabilityZone',
357
+ 'AWS::Redshift::Cluster.ClusterSubnetGroupName',
358
+ 'AWS::Redshift::Cluster.DBName',
359
+ 'AWS::Redshift::Cluster.ElasticIp',
360
+ 'AWS::Redshift::Cluster.Encrypted',
361
+ 'AWS::Redshift::Cluster.KmsKeyId',
362
+ 'AWS::Redshift::Cluster.MasterUsername',
363
+ 'AWS::Redshift::Cluster.OwnerAccount',
364
+ 'AWS::Redshift::Cluster.Port',
365
+ 'AWS::Redshift::Cluster.PubliclyAccessible',
366
+ 'AWS::Redshift::Cluster.SnapshotClusterIdentifier',
367
+ 'AWS::Redshift::Cluster.SnapshotIdentifier',
368
+ 'AWS::Redshift::ClusterParameterGroup.Description',
369
+ 'AWS::Redshift::ClusterParameterGroup.ParameterGroupFamily',
370
+ 'AWS::Redshift::ClusterSecurityGroup.Description',
371
+ 'AWS::Redshift::ClusterSecurityGroupIngress.ClusterSecurityGroupName',
372
+ 'AWS::Redshift::ClusterSecurityGroupIngress.CIDRIP',
373
+ 'AWS::Redshift::ClusterSecurityGroupIngress.EC2SecurityGroupName',
374
+ 'AWS::Redshift::ClusterSecurityGroupIngress.EC2SecurityGroupOwnerId',
375
+ 'AWS::Route53::HostedZone.Name',
376
+ 'AWS::Route53::RecordSet.HostedZoneId',
377
+ 'AWS::Route53::RecordSet.HostedZoneName',
378
+ 'AWS::Route53::RecordSet.Name',
379
+ 'AWS::Route53::RecordSetGroup.HostedZoneId',
380
+ 'AWS::Route53::RecordSetGroup.HostedZoneName',
381
+ 'AWS::S3::Bucket.BucketName',
382
+ 'AWS::SNS::Topic.TopicName',
383
+ 'AWS::SQS::Queue.QueueName',
384
+ 'AWS::SSM::Document.Content',
385
+ 'AWS::WAF::ByteMatchSet.Name',
386
+ 'AWS::WAF::IPSet.Name',
387
+ 'AWS::WAF::Rule.MetricName',
388
+ 'AWS::WAF::Rule.Name',
389
+ 'AWS::WAF::SizeConstraintSet.Name',
390
+ 'AWS::WAF::SqlInjectionMatchSet.Name',
391
+ 'AWS::WAF::WebACL.MetricName',
392
+ 'AWS::WAF::WebACL.Name',
393
+ 'AWS::WAF::XssMatchSet.Name',
394
+ 'AWS::WorkSpaces::Workspace.DirectoryId',
395
+ 'AWS::WorkSpaces::Workspace.UserName'
396
+ ].freeze
397
+ end
398
+ end
399
+ end
@@ -184,7 +184,10 @@ module Convection
184
184
  def properties(memo = {}, path = '')
185
185
  keys.each do |key|
186
186
  if self[key].is_a?(Hash) || self[key].is_a?(Array)
187
- self[key].properties(memo, "#{path}.#{key}")
187
+ new_path = "#{path}#{path.empty? ? '' : '.'}#{key}"
188
+ resource_type = self['Type']
189
+ new_path = "#{new_path}.#{resource_type}" if resource_type
190
+ self[key].properties(memo, new_path)
188
191
  else
189
192
  memo["#{path}.#{key}"] = self[key]
190
193
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: convection
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.beta.7
4
+ version: 1.0.0.pre.beta.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Manero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-08 00:00:00.000000000 Z
11
+ date: 2016-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -129,6 +129,7 @@ files:
129
129
  - lib/convection/model/mixin/policy.rb
130
130
  - lib/convection/model/mixin/protocol.rb
131
131
  - lib/convection/model/mixin/taggable.rb
132
+ - lib/convection/model/replace_properties.rb
132
133
  - lib/convection/model/template.rb
133
134
  - lib/convection/model/template/condition.rb
134
135
  - lib/convection/model/template/mapping.rb
@@ -294,6 +295,7 @@ files:
294
295
  - spec/convection/model/template/validate_resources_spec.rb
295
296
  - spec/ec2_client_context.rb
296
297
  - spec/spec_helper.rb
298
+ - tmp/process_html.sh
297
299
  - yard_extensions.rb
298
300
  - yard_extensions/properties_handler.rb
299
301
  - yard_extensions/type_handler.rb