kumogata-template 0.0.3 → 0.0.4

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: 5847d3069a5760206ce6ed27a3e9a9a27346be30
4
- data.tar.gz: 926e9616a61038c9e9e06e34381bf5e30a4f2acc
3
+ metadata.gz: 1522206975c39c028a0365c00c79cfc420ca51ca
4
+ data.tar.gz: b7667dc8232129044d0c49ae110fafe77cd87fcc
5
5
  SHA512:
6
- metadata.gz: ab2d6adcc316341eab02451f3df6d6d1548f61cf6ca243bd7f8d31a2d1b6a1530ee4357a6acd76308fe678d7bb17223a8f3f8313ac10009770aaa2693fc8b5e5
7
- data.tar.gz: e9d0fd9037cfdce7bcbf0f6fc7b902623bae96e0fb2351a9e4bcbc3f91810746321e61bffa92315acbd9ea69b951cdf0279fe66c1e3635bc0d63054fad41d4e8
6
+ metadata.gz: 41a3062c2066bc965e6a3d0e16e7f573a966dadf62dcf021f5b4a44148df8eeb90f2ba744b633206acd8fc7121b740f88ee2cba9ff040774931893d556c55653
7
+ data.tar.gz: 71eb8ee86ad0648e6f5be552d5861d9b3a10b6372c68ff2c48d32320dfb1ddd3a24827b543296f0507d8987d97af152870cfff7ad8a7704395a9a8cb265ee8ad
@@ -3,6 +3,46 @@
3
3
  #
4
4
  require 'kumogata/template/helper'
5
5
 
6
+ def _autoscaling_to_adjustment(value)
7
+ return value if value.nil?
8
+ case value.downcase
9
+ when "change"
10
+ "ChangeInCapacity"
11
+ when "exact"
12
+ "ExactCapacity"
13
+ when "percent"
14
+ "PercentChangeInCapacity"
15
+ else
16
+ value
17
+ end
18
+ end
19
+
20
+ def _autoscaling_to_metric(value)
21
+ return value if value.nil?
22
+ case value.downcase
23
+ when "min"
24
+ "Minimum"
25
+ when "max"
26
+ "Maximum"
27
+ when "avg"
28
+ "Average"
29
+ else
30
+ value
31
+ end
32
+ end
33
+
34
+ def _autoscaling_to_policy(value)
35
+ return value if value.nil?
36
+ case value.downcase
37
+ when "simple"
38
+ "SimpleScaling"
39
+ when "step"
40
+ "StepScaling"
41
+ else
42
+ value
43
+ end
44
+ end
45
+
6
46
  def _autoscaling_metrics
7
47
  _{
8
48
  Granularity "1Minute"
@@ -42,8 +82,8 @@ def _autoscaling_step(args)
42
82
  scaling = args[:scaling] || 1
43
83
 
44
84
  _{
45
- MetricIntervalLowerBound lower unless lower.empty?
46
- MetricIntervalUpperBound upper unless upper.empty?
85
+ MetricIntervalLowerBound lower unless lower.to_s.empty?
86
+ MetricIntervalUpperBound upper unless upper.to_s.empty?
47
87
  ScalingAdjustment scaling
48
88
  }
49
89
  end
@@ -75,3 +115,26 @@ def _autoscaling_tags(args)
75
115
  end
76
116
  tags
77
117
  end
118
+
119
+ def _autoscaling_terminations(args)
120
+ terminations = args[:terminations]
121
+ return [] if terminations.nil?
122
+
123
+ array = []
124
+ terminations.each do |termination|
125
+ array <<
126
+ case termination.downcase
127
+ when "old instance"
128
+ "OldestInstance"
129
+ when "new instance"
130
+ "NewestInstance"
131
+ when "old launch"
132
+ "OldestLaunchConfiguration"
133
+ when "close"
134
+ "ClosestToNextInstanceHour"
135
+ else
136
+ "Default"
137
+ end
138
+ end
139
+ array
140
+ end
@@ -2,6 +2,24 @@
2
2
  # Helper - CloudWatch
3
3
  #
4
4
 
5
+ def _cloudwatch_to_statistic(value)
6
+ return value if value.nil?
7
+ case value.downcase
8
+ when "sample"
9
+ "SampleCount"
10
+ when "avg"
11
+ "Average"
12
+ when "Sum"
13
+ "Sum"
14
+ when "min"
15
+ "Minimum"
16
+ when "max"
17
+ "Maximum"
18
+ else
19
+ value
20
+ end
21
+ end
22
+
5
23
  def _cloudwatch_convert_operator(operator)
6
24
  case operator
7
25
  when ">="
@@ -9,13 +27,13 @@ def _cloudwatch_convert_operator(operator)
9
27
  when ">"
10
28
  "GreaterThanThreshold"
11
29
  when "<="
12
- "LessThanThreshold"
13
- when "<"
14
30
  "LessThanOrEqualToThreshold"
31
+ when "<"
32
+ "LessThanThreshold"
15
33
  else
16
34
  _valid_values(operator,
17
35
  %w( GreaterThanOrEqualToThreshold GreaterThanThreshold
18
- LessThanThreshold LessThanOrEqualToThreshold ),
36
+ LessThanOrEqualToThreshold LessThanThreshold ),
19
37
  "GreaterThanThreshold")
20
38
  end
21
39
  end
@@ -13,6 +13,7 @@ AWS_REGION = {
13
13
  sydney: "ap-southeast-2",
14
14
  seoul: "ap-northeast-2",
15
15
  saopaulo: "sa-east-1",
16
+ mumbai: "ap-south-1",
16
17
  }
17
18
 
18
19
  PORT = {
@@ -83,6 +84,10 @@ EC2_INSTANCE_TYPES =
83
84
  # i2.4xlarge 16 122 4 x 800
84
85
  # i2.8xlarge 32 244 8 x 800
85
86
  "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge",
87
+
88
+ # Model vCPU Mem (GiB) SSD Storage (GB) network Bandwidth
89
+ # x1.32xlargee 128 1,952 2 x 1,902 SSD 10 Gbps 10 Gbps
90
+ "x1.32xlarge",
86
91
  ]
87
92
  EC2_DEFAULT_INSTANCE_TYPE = "t2.medium"
88
93
 
@@ -173,3 +178,16 @@ EMR_DEFAULT_INSTANCE_TYPE = "c4.large"
173
178
 
174
179
  # http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-whatsnew.html
175
180
  EMR_DEFAULT_RELEASE = "emr-4.6.0"
181
+
182
+ ELB_ACCESS_LOG_ACCOUNT_ID = {
183
+ "us-east-1": "127311923021",
184
+ "us-west-2": "797873946194",
185
+ "us-west-1": "027434742980",
186
+ "eu-west-1": "156460612806",
187
+ "eu-central-1": "054676820928",
188
+ "ap-southeast-1": "114774131450",
189
+ "ap-northeast-1": "582318560864",
190
+ "ap-southeast-2": "783225319266",
191
+ "ap-northeast-2": "600734575887",
192
+ "sa-east-1": "507241528517",
193
+ }
@@ -34,7 +34,7 @@ def _ec2_security_group_egress(args)
34
34
  destination = _ref_string("destination", args, "security group")
35
35
  from = _ref_string("from", args)
36
36
  group = _ref_string("group", args, "security group")
37
- ip = args[:ip_protocol] || "tcp"
37
+ ip = args[:ip] || "tcp"
38
38
  to = _ref_string("to", args)
39
39
  from = to if from.empty?
40
40
 
@@ -63,12 +63,13 @@ def _ec2_security_group_ingress(args)
63
63
  from = _ref_string("from", args)
64
64
  group_id = _ref_string("group", args, "security group")
65
65
  group_name = args[:group_name] || ""
66
- ip = args[:ip_protocol] || "tcp"
66
+ ip = args[:ip] || "tcp"
67
67
  source_group_name = _ref_string("source_group_name", args, "security group")
68
68
  source_group_id = _ref_string("source_group_id", args, "security group")
69
69
  source_group_owner_id = _ref_string("source_group_owner_id", args, "account id")
70
70
  to = _ref_string("to", args)
71
71
  to = from if to.empty?
72
+ ip = -1 and from = 0 and to = 65535 if ip == "all"
72
73
 
73
74
  _{
74
75
  CidrIp cidr if source_group_name.empty? and source_group_id.empty?
@@ -109,12 +110,13 @@ def _ec2_block_device(args)
109
110
  }
110
111
  end
111
112
 
112
- def _ec2_network_interface(args)
113
+ def _ec2_network_interface(args, is_spot = false)
113
114
  associate_public = _bool("associate_public", args, true)
114
115
  delete = _bool("delete", args, true)
115
116
  description = args[:description] || ""
116
117
  device = args[:device] || 0
117
118
  group_set = _ref_array("group_set", args, "security group")
119
+ groups = _ref_array("groups", args, "security group")
118
120
  network_interface = _ref_string("network", args)
119
121
  private_ip = args[:private_ip] || ""
120
122
  private_ips = args[:private_ips] || ""
@@ -126,9 +128,13 @@ def _ec2_network_interface(args)
126
128
  DeleteOnTermination delete
127
129
  Description description unless description.empty?
128
130
  DeviceIndex device
129
- GroupSet group_set unless group_set.empty?
131
+ if is_spot
132
+ Groups groups unless groups.empty?
133
+ else
134
+ GroupSet group_set unless group_set.empty?
135
+ end
130
136
  NetworkInterfaceId network_interface unless network_interface.empty?
131
- PrivateIpAddress private_ip unless private_ip.empty?
137
+ PrivateIpAddress private_ip if is_spot and !private_ip.empty?
132
138
  PrivateIpAddresses private_ips unless private_ips.empty?
133
139
  SecondaryPrivateIpAddressCount secondary_private_ip unless secondary_private_ip.empty?
134
140
  SubnetId subnet
@@ -163,3 +169,81 @@ def _ec2_protocol_number(protocol)
163
169
  -1
164
170
  end
165
171
  end
172
+
173
+ def _ec2_spot_fleet_request(args)
174
+ allocation = _valid_values(args[:allocation], %w( lowestPrice diversified), "lowestPrice")
175
+ express = _valid_values(args[:express], %w( noTermination default), "")
176
+ iam = args[:iam] # IAM Role "aws-ec2-spot-fleet-role" auto generated
177
+ launches = args[:launches].collect{|v| _ec2_spot_fleet_launches(v) }
178
+ price = args[:price] || 0.00
179
+ target = _ref_string("target", args, "")
180
+ target = 1 if target.empty?
181
+ terminate = _bool("terminate", args, false)
182
+ valid_from = (args.key? :valid_from) ? _timestamp_utc(args[:valid_from]) : ''
183
+ valid_until =
184
+ if args.key? :valid_until
185
+ _timestamp_utc(args[:valid_until])
186
+ elsif args.key? :valid_from
187
+ _timestamp_utc(args[:valid_from] + (60 * 60 * 24 * 365))
188
+ else
189
+ ''
190
+ end
191
+
192
+ _{
193
+ AllocationStrategy allocation
194
+ ExcessCapacityTerminationPolicy express unless express.empty?
195
+ IamFleetRole iam
196
+ LaunchSpecifications launches
197
+ SpotPrice price
198
+ TargetCapacity target
199
+ TerminateInstancesWithExpiration terminate
200
+ ValidFrom valid_from if args.key? :valid_from
201
+ ValidUntil valid_until if args.key? :valid_from or args.key? :valid_until
202
+ }
203
+ end
204
+
205
+ def _ec2_spot_fleet_launches(args)
206
+ block_devices = (args[:block_devices] || []).collect{|v| _ec2_block_device(v) }
207
+ ebs = _bool("ebs", args, false)
208
+ iam = _ref_string("iam", args, "iam instance profile")
209
+ iam = _ref_attr_string("iam", "Arn", args, "iam instance profile") if iam.empty?
210
+ instance_type = _ref_string("instance_type", args, "instance type")
211
+ image =_ec2_image(instance_type, args)
212
+ kernel = args[:kernel] || ""
213
+ key_name = _ref_string("key_name", args, "key name")
214
+ monitoring = _bool("monitoring", args, false)
215
+ network_interfaces = (args[:network_interfaces] || []).collect{|v| _ec2_network_interface(v, true) }
216
+ placement = _ref_string("placement", args)
217
+ ram_disk = args[:ram_disk] || ""
218
+ security_groups = _ref_array("security_groups", args, "security group")
219
+ subnet = _ref_string("subnet", args, "subnet")
220
+ user_data = _ref_string("user_data", args, "user data")
221
+ weighted = args[:weighted] || ""
222
+
223
+ _{
224
+ BlockDeviceMappings block_devices unless block_devices.empty?
225
+ EbsOptimized ebs
226
+ IamInstanceProfile do
227
+ Arn iam
228
+ end unless iam.empty?
229
+ ImageId image
230
+ InstanceType instance_type
231
+ KernelId kernel unless kernel.empty?
232
+ KeyName key_name unless key_name.empty?
233
+ Monitoring do
234
+ Enabled monitoring
235
+ end
236
+ NetworkInterfaces network_interfaces unless network_interfaces.empty?
237
+ Placement placement unless placement.empty?
238
+ RamdiskId ram_disk unless ram_disk.empty?
239
+ SecurityGroups security_groups unless security_groups.empty?
240
+ SubnetId subnet unless subnet.empty?
241
+ UserData do
242
+ Fn__Base64 (<<-EOS).undent
243
+ #!/bin/bash
244
+ #{user_data}
245
+ EOS
246
+ end unless user_data.empty?
247
+ WeightedCapacity weighted if args.key? :weighted
248
+ }
249
+ end
@@ -42,11 +42,28 @@ def _emr_configurations(args)
42
42
  array = []
43
43
  configurations.each do |configuration|
44
44
  classification = configuration[:classification] || ""
45
- properties = configuration[:properties] || []
45
+ properties = configuration[:properties] || {}
46
+ configuring = _emr_configuring(configuration)
46
47
  array << _{
47
48
  Classification classification unless classification.empty?
48
- ConfigurationProperties properties unless properties.empty?
49
- #Configurations
49
+ ConfigurationProperties properties
50
+ Configurations configuring
51
+ }
52
+ end
53
+ array
54
+ end
55
+
56
+ def _emr_configuring(args)
57
+ configurations = args[:configurations] || []
58
+
59
+ array = []
60
+ configurations.each do |configuration|
61
+ classification = configuration[:classification] || ""
62
+ properties = configuration[:properties] || {}
63
+ array << _{
64
+ Classification classification unless classification.empty?
65
+ ConfigurationProperties properties
66
+ Configurations []
50
67
  }
51
68
  end
52
69
  array
@@ -100,4 +100,72 @@ class Kumogata::Client
100
100
  template_path = File.join(template_path, "#{file}.rb") unless file.nil?
101
101
  template_path
102
102
  end
103
+
104
+ def evaluate_template(template, path_or_url)
105
+ key_converter = proc do |key|
106
+ key = key.to_s
107
+ unless @options.skip_replace_underscore?
108
+ key.gsub!('_', ':')
109
+ key.gsub!('__', '::')
110
+ end
111
+ key
112
+ end
113
+
114
+ value_converter = proc do |v|
115
+ case v
116
+ when Hash, Array
117
+ v
118
+ else
119
+ v.to_s
120
+ end
121
+ end
122
+
123
+ template = Dslh.eval(template.read, {
124
+ :key_conv => key_converter,
125
+ :value_conv => value_converter,
126
+ :scope_hook => proc {|scope|
127
+ define_template_func(scope, path_or_url)
128
+ },
129
+ :filename => path_or_url,
130
+ })
131
+
132
+ @outputs_filter.fetch!(template)
133
+ @post_processing.fetch!(template)
134
+
135
+ return template
136
+ end
137
+
138
+ def devaluate_template(template)
139
+ exclude_key = proc do |k|
140
+ k = k.to_s.gsub('::', '__')
141
+ k !~ /\A[_a-z]\w+\Z/i and k !~ %r|\A/\S*\Z|
142
+ end
143
+
144
+ key_conv = proc do |k|
145
+ k = k.to_s
146
+
147
+ if k =~ %r|\A/\S*\Z|
148
+ proc do |v, nested|
149
+ if nested
150
+ "_path(#{k.inspect}) #{v}"
151
+ else
152
+ "_path #{k.inspect}, #{v}"
153
+ end
154
+ end
155
+ else
156
+ k.gsub(':', '_')
157
+ k.gsub('::', '__')
158
+ end
159
+ end
160
+
161
+ value_conv = proc do |v|
162
+ if v.kind_of?(String) and v =~ /\A(?:0|[1-9]\d*)\Z/
163
+ v.to_i
164
+ else
165
+ v
166
+ end
167
+ end
168
+
169
+ Dslh.deval(template, :key_conv => key_conv, :value_conv => value_conv, :exclude_key => exclude_key)
170
+ end
103
171
  end
@@ -164,19 +164,12 @@ def _availability_zones(args, use_subnet = true)
164
164
  end
165
165
  end
166
166
 
167
- def _timestamp_utc(year = nil, month = nil, day = nil, hour = 0, min = 0)
168
- time =
169
- if year.nil?
170
- Time.now
171
- else
172
- Time.local(year, month, day, hour, min)
173
- end
174
- time.utc.strftime("%Y-%m-%dT%H:%M:00Z")
167
+ def _timestamp_utc(time = Time.now)
168
+ time.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
175
169
  end
176
170
 
177
171
  def _timestamp_utc_from_string(time)
178
- time = Time.strptime(time, "%Y-%m-%d %H:%M")
179
- _timestamp_utc(time.year, time.month, time.day, time.hour, time.min)
172
+ _timestamp_utc(Time.strptime(time, "%Y-%m-%d %H:%M"))
180
173
  end
181
174
 
182
175
  def _maintenance_window(service, start_time)
@@ -3,6 +3,19 @@
3
3
  #
4
4
  require 'kumogata/template/helper'
5
5
 
6
+ def _iam_to_policy(value)
7
+ case value
8
+ when 'admin'
9
+ 'AdministratorAccess'
10
+ when 'power'
11
+ 'PowerUserAccess'
12
+ when 'readonly'
13
+ 'ReadOnlyAccess'
14
+ else
15
+ value
16
+ end
17
+ end
18
+
6
19
  def _iam_policies(name, args)
7
20
  array = []
8
21
  policies = args["#{name}".to_sym] || []
@@ -45,12 +58,35 @@ def _iam_policy_document(name, args)
45
58
  array
46
59
  end
47
60
 
48
- def _iam_assume_role_policy_document(service)
61
+ def _iam_assume_role_policy_document(args)
62
+ aws =
63
+ if args.key? :aws
64
+ _iam_arn("iam", args[:aws])
65
+ else
66
+ ""
67
+ end
68
+ service = args[:service] || ""
69
+ condition =
70
+ if args.key? :external_id
71
+ true
72
+ else
73
+ false
74
+ end
75
+ external_id = args[:external_id] || ""
76
+
49
77
  [
50
78
  _{
51
79
  Effect "Allow"
52
- Principal _{ Service [ "#{service}.amazonaws.com" ] }
80
+ Principal _{
81
+ AWS aws unless aws.empty?
82
+ Service [ "#{service}.amazonaws.com" ] unless service.empty?
83
+ }
53
84
  Action [ "sts:AssumeRole" ]
85
+ Condition _{
86
+ StringEquals _{
87
+ sts_ExternalId external_id unless external_id.empty?
88
+ }
89
+ } if condition
54
90
  }
55
91
  ]
56
92
  end
@@ -85,12 +121,55 @@ def _iam_arn(service, resource)
85
121
 
86
122
  when "iam"
87
123
  if resource.key? :sts
88
- "arn:aws:sts::#{account_id}:#{resource[:type]}/#{resource[:user]}"
124
+ "arn:aws:sts::#{resource[:account_id]}:#{resource[:type]}/#{resource[:user]}"
125
+ elsif resource.key? :policy
126
+ "arn:aws:iam::aws:policy/#{_iam_to_policy(resource[:policy])}"
127
+ elsif resource.key? :root
128
+ "#{arn_prefix}::#{resource[:account_id]}:root"
89
129
  else
90
- "#{arn_prefix}::#{account_id}:#{resource[:type]}/#{resource[:user]}"
130
+ "#{arn_prefix}::#{resource[:account_id]}:#{resource[:type]}/#{resource[:user]}"
91
131
  end
92
132
 
93
133
  when "elasticloadbalancing"
94
134
  "#{arn_prefix}:*:*:loadbalancer/#{resource}"
135
+
136
+ when "logs"
137
+ "#{arn_prefix}:*:*:*"
138
+ end
139
+ end
140
+
141
+ def _iam_s3_bucket_policy(region, bucket, prefix, aws_account_id)
142
+ account_id = ELB_ACCESS_LOG_ACCOUNT_ID[region.to_sym]
143
+ prefix = [ prefix ] if prefix.is_a? String
144
+ resource = prefix.collect{|v| "#{bucket}/#{v}/AWSLogs/#{aws_account_id}/*" }
145
+ [
146
+ {
147
+ service: "s3",
148
+ action: [ "PutObject" ],
149
+ principal: {
150
+ "AWS": [ account_id ],
151
+ },
152
+ resource: resource,
153
+ },
154
+ ]
155
+ end
156
+
157
+ def _iam_login_profile(args)
158
+ password = args[:password] || ""
159
+ reset_required = _bool("reset_required", args, true)
160
+
161
+ _{
162
+ Password password
163
+ PasswordResetRequired reset_required
164
+ }
165
+ end
166
+
167
+ def _iam_managed_policies(args)
168
+ arns = args[:managed_policies]
169
+
170
+ array = []
171
+ arns.each do |v|
172
+ array << _iam_arn("iam", { policy: v })
95
173
  end
174
+ array
96
175
  end
@@ -3,6 +3,31 @@
3
3
  #
4
4
  require 'kumogata/template/helper'
5
5
 
6
+ def _s3_to_access(value)
7
+ return "Private" if value.nil?
8
+
9
+ case value
10
+ when "auth"
11
+ "AuthenticatedRead"
12
+ when "aws_exec"
13
+ "AwsExecRead"
14
+ when "owner"
15
+ "BucketOwnerRead"
16
+ when "owner_full"
17
+ "BucketOwnerFullControl"
18
+ when "log_delivery_w"
19
+ "LogDeliveryWrite"
20
+ when "private"
21
+ "Private"
22
+ when "public_r"
23
+ "PublicRead"
24
+ when "public_rw"
25
+ "PublicReadWrite"
26
+ else
27
+ value
28
+ end
29
+ end
30
+
6
31
  def _s3_cors(args)
7
32
  rules = args[:cors] || []
8
33
 
@@ -1 +1 @@
1
- KUMOGATA_TEMPLATE_VERSION = '0.0.3'
1
+ KUMOGATA_TEMPLATE_VERSION = '0.0.4'
@@ -21,7 +21,7 @@ max = min if max < min
21
21
  notifications = (args[:notifications] || []).collect{|v| _autoscaling_notification(v) }
22
22
  placement = args[:placement] || ""
23
23
  tags = _autoscaling_tags(args)
24
- termination = args[:termination] || []
24
+ terminations = _autoscaling_terminations(args)
25
25
  vpc_zones = _ref_array("vpc_zones", args, "subnet")
26
26
 
27
27
  _(name) do
@@ -41,7 +41,7 @@ _(name) do
41
41
  NotificationConfigurations notifications
42
42
  PlacementGroup placement unless placement.empty?
43
43
  Tags tags
44
- TerminationPolicies termination unless termination.empty?
44
+ TerminationPolicies terminations unless terminations.empty?
45
45
  VPCZoneIdentifier vpc_zones unless vpc_zones.empty?
46
46
  end
47
47
  end
@@ -3,31 +3,32 @@
3
3
  # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html
4
4
  #
5
5
  require 'kumogata/template/helper'
6
+ require 'kumogata/template/autoscaling'
6
7
 
7
8
  name = _resource_name(args[:name], "autoscaling scaling policy")
8
- adjustment = _valid_values(args[:adjustment],
9
+ adjustment = _valid_values(_autoscaling_to_adjustment(args[:adjustment]),
9
10
  %w( ChangeInCapacity ExactCapacity PercentChangeInCapacity ),
10
11
  "ChangeInCapacity")
11
12
  autoscaling = _ref_string("autoscaling", args, "autoscaling group")
12
- cooldown = args[:cooldown] || -1
13
+ cooldown = args[:cooldown] || "60"
13
14
  estimated = args[:estimated] || ""
14
- metric = _valid_values(args[:metric], %w( Minimum Maximum Average ), "Average")
15
+ metric = _valid_values(_autoscaling_to_metric(args[:metric]), %w( Minimum Maximum Average ), "Average")
15
16
  min = args[:min] || ""
16
- policy = _valid_values(args[:policy], %w( SimpleScaling StepScaling ), "SimpleScaling")
17
+ policy = _valid_values(_autoscaling_to_policy(args[:policy]), %w( SimpleScaling StepScaling ), "SimpleScaling")
17
18
  scaling = args[:scaling] || 1
18
- step = args[:step] || [].collect{|v| _autoscaling_step(v) }
19
+ steps = (args[:steps] || []).collect{|v| _autoscaling_step(v) }
19
20
 
20
21
  _(name) do
21
22
  Type "AWS::AutoScaling::ScalingPolicy"
22
23
  Properties do
23
24
  AdjustmentType adjustment
24
25
  AutoScalingGroupName autoscaling
25
- Cooldown cooldown unless cooldown == -1
26
+ Cooldown cooldown unless policy == "StepScaling"
26
27
  EstimatedInstanceWarmup estimated unless estimated.empty?
27
28
  MetricAggregationType metric unless policy == "SimpleScaling"
28
- MinAdjustmentMagnitude min unless min.empty?
29
+ MinAdjustmentMagnitude min if policy == "PercentChangeInCapacity"
29
30
  PolicyType policy
30
- ScalingAdjustment scaling
31
- StepAdjustments step unless step.empty?
31
+ ScalingAdjustment scaling if policy == "SimpleScaling"
32
+ StepAdjustments steps unless steps.empty?
32
33
  end
33
34
  end
@@ -18,7 +18,7 @@ metric = args[:metric]
18
18
  namespace = args[:namespace]
19
19
  ok_actions = args[:ok_actions] || []
20
20
  period = args[:period] || 60
21
- statistic = _valid_values(args[:statistic],
21
+ statistic = _valid_values(_cloudwatch_to_statistic(args[:statistic]),
22
22
  %w(SampleCount Average Sum Minimum Maximum), "Average")
23
23
  threshold = args[:threshold] || 60
24
24
  unit = _valid_values(args[:unit], %w(Seconds Microseconds Milliseconds Bytes Kilobytes Megabytes Gigabytes Terabytes Bits Kilobits Megabits Gigabits Terabits Percent Count Bytes/Second Kilobytes/Second Megabytes/Second Gigabytes/Second Terabytes/Second Bits/Second Kilobits/Second Megabits/Second Gigabits/Second Terabits/Second Count/Second None), "")
@@ -21,7 +21,10 @@ _(name) do
21
21
  Properties do
22
22
  CidrBlock cidr
23
23
  Egress egress
24
- Icmp icmp if protocol == 1
24
+ Icmp _{
25
+ Code -1
26
+ Type -1
27
+ } if protocol == 1
25
28
  NetworkAclId network_acl
26
29
  PortRange port_range if protocol == -1 or protocol == 6 or protocol == 17
27
30
  Protocol protocol
@@ -11,7 +11,7 @@ app_cookie = _elb_app_cookie_stickiness_policy(args)
11
11
  azs = _availability_zones(args, false)
12
12
  connection_draining = _elb_connection_draining_policy(args)
13
13
  connection_setting = _elb_connection_settings(args)
14
- cross = _bool("cross", args, false)
14
+ cross = _bool("cross", args, true)
15
15
  health = _elb_health_check(args)
16
16
  instances = _ref_array("instances", args, "instance")
17
17
  cookie = _elb_cookie_stickiness_policy(args)
@@ -6,14 +6,19 @@ require 'kumogata/template/helper'
6
6
  require 'kumogata/template/iam'
7
7
 
8
8
  name = _resource_name(args[:name], "group")
9
- manaegd_policy_arns = args[:managed_policy_arns] || []
9
+ managed_policies =
10
+ if args.key? :managed_policies
11
+ _iam_managed_policies(args)
12
+ else
13
+ []
14
+ end
10
15
  path = args[:path] || "/"
11
16
  policies = _iam_policies("policies", args)
12
17
 
13
18
  _(name) do
14
19
  Type "AWS::IAM::Group"
15
20
  Properties do
16
- ManagedPolicyArns manaegd_policy_arns unless manaegd_policy_arns.empty?
21
+ ManagedPolicyArns managed_policies unless managed_policies.empty?
17
22
  Path path
18
23
  Policies policies unless policies.empty?
19
24
  end
@@ -6,7 +6,7 @@ require 'kumogata/template/helper'
6
6
  require 'kumogata/template/iam'
7
7
 
8
8
  name = _resource_name(args[:name], "role")
9
- service = args[:service] || "ec2"
9
+ policy = _iam_assume_role_policy_document(args)
10
10
  path = args[:path] || "/"
11
11
 
12
12
  _(name) do
@@ -14,7 +14,7 @@ _(name) do
14
14
  Properties do
15
15
  AssumeRolePolicyDocument do
16
16
  Version "2012-10-17"
17
- Statement _iam_assume_role_policy_document(service)
17
+ Statement policy
18
18
  end
19
19
  Path path
20
20
  end
@@ -7,8 +7,18 @@ require 'kumogata/template/iam'
7
7
 
8
8
  name = _resource_name(args[:name], "user")
9
9
  group = _ref_array("group", args)
10
- login_profile = args[:login_profile] || ""
11
- manaegd_policy_arns = args[:managed_policy_arns] || []
10
+ login_profile =
11
+ if args.key? :login_profile
12
+ _iam_login_profile(args[:login_profile])
13
+ else
14
+ []
15
+ end
16
+ managed_policies =
17
+ if args.key? :managed_policies
18
+ _iam_managed_policies(args)
19
+ else
20
+ []
21
+ end
12
22
  path = args[:path] || "/"
13
23
  policies = _iam_policies("policies", args)
14
24
 
@@ -17,7 +27,7 @@ _(name) do
17
27
  Properties do
18
28
  Group group unless group.empty?
19
29
  LoginProfile login_profile unless login_profile.empty?
20
- ManagedPolicyArns manaegd_policy_arns unless manaegd_policy_arns.empty?
30
+ ManagedPolicyArns managed_policies unless managed_policies.empty?
21
31
  Path path
22
32
  Policies policies unless policies.empty?
23
33
  end
@@ -4,5 +4,5 @@
4
4
 
5
5
  bucket = "#{args[:name]} bucket"
6
6
 
7
- _output "#{bucket} s3 domain name", ref_value: [ bucket, "DomainName" ] if args.key? :domain
7
+ _output "#{bucket} s3 domain name", ref_value: [ bucket, "DomainName" ]
8
8
  _output "#{bucket} s3 web site url", ref_value: [ bucket, "WebsiteURL" ]
@@ -40,6 +40,7 @@ maintenance = _maintenance_window("rds", args[:maintenance] || DEFAULT_MAINTENAN
40
40
  publicly = _bool("publicly", args, false)
41
41
  source_db = _ref_string("source_db", args, "db source db")
42
42
  storage_encrypted = _bool("encrypted", args, false)
43
+ storage_type = _valid_values(args[:storage_type], %w( standard gp2 io1 ), "gp2")
43
44
  tags = _tags(args)
44
45
  security_groups = _ref_array("security_groups", args, "security group")
45
46
 
@@ -75,7 +76,7 @@ _(name) do
75
76
  PubliclyAccessible publicly
76
77
  SourceDBInstanceIdentifier source_db unless source_db.empty?
77
78
  StorageEncrypted storage_encrypted if storage_encrypted == true
78
- #StorageType
79
+ StorageType storage_type
79
80
  Tags tags
80
81
  VPCSecurityGroups security_groups unless security_groups.empty?
81
82
  end
@@ -6,12 +6,12 @@ require 'kumogata/template/helper'
6
6
  require 'kumogata/template/iam'
7
7
 
8
8
  name = _resource_name(args[:name], "bucket policy")
9
- bucket = _ref_name("bucket", args)
9
+ bucket = _ref_string("bucket", args, "bucket")
10
10
 
11
11
  _(name) do
12
12
  Type "AWS::S3::BucketPolicy"
13
13
  Properties do
14
- BucketName bucket
14
+ Bucket bucket
15
15
  PolicyDocument do
16
16
  Version "2012-10-17"
17
17
  Statement _iam_policy_document("policy_document", args)
@@ -6,11 +6,7 @@ require 'kumogata/template/helper'
6
6
  require 'kumogata/template/s3'
7
7
 
8
8
  name = _resource_name(args[:name], "bucket")
9
- access = _valid_values(args[:access],
10
- %w( AuthenticatedRead AwsExecRead BucketOwnerRead
11
- BucketOwnerFullControl LogDeliveryWrite
12
- Private PublicRead PublicReadWrite ),
13
- "Private")
9
+ access = _s3_to_access(args[:access])
14
10
  access = "PublicRead" if args.key? :website
15
11
  bucket = _ref_name("bucket", args)
16
12
  cors = _s3_cors(args)
@@ -51,12 +51,14 @@ Test _autoscaling_notification(topic_arn: "test")
51
51
 
52
52
  def test_autoscaling_step
53
53
  template = <<-EOS
54
- Test _autoscaling_step(scaling: 10)
54
+ Test _autoscaling_step(scaling: 10, lower: 0, upper: 20)
55
55
  EOS
56
56
  act_template = run_client_as_json(template)
57
57
  exp_template = <<-EOS
58
58
  {
59
59
  "Test": {
60
+ "MetricIntervalLowerBound": "0",
61
+ "MetricIntervalUpperBound": "20",
60
62
  "ScalingAdjustment": "10"
61
63
  }
62
64
  }
@@ -279,6 +279,103 @@ Test _ec2_port_range({})
279
279
  "From": "0",
280
280
  "To": "65535"
281
281
  }
282
+ }
283
+ EOS
284
+ assert_equal exp_template.chomp, act_template
285
+ end
286
+
287
+ def test_ec2_spot_fleet_request
288
+ template = <<-EOS
289
+ Test _ec2_spot_fleet_request({ iam: "test", launches: [] })
290
+ EOS
291
+ act_template = run_client_as_json(template)
292
+ exp_template = <<-EOS
293
+ {
294
+ "Test": {
295
+ "AllocationStrategy": "lowestPrice",
296
+ "IamFleetRole": "test",
297
+ "LaunchSpecifications": [
298
+
299
+ ],
300
+ "SpotPrice": "0.0",
301
+ "TargetCapacity": "1",
302
+ "TerminateInstancesWithExpiration": "false"
303
+ }
304
+ }
305
+ EOS
306
+ assert_equal exp_template.chomp, act_template
307
+
308
+ template = <<-EOS
309
+ Test _ec2_spot_fleet_request({ iam: "test", launches: [ { image_id: "test", instance_type: "test" } ] })
310
+ EOS
311
+ act_template = run_client_as_json(template)
312
+ exp_template = <<-EOS
313
+ {
314
+ "Test": {
315
+ "AllocationStrategy": "lowestPrice",
316
+ "IamFleetRole": "test",
317
+ "LaunchSpecifications": [
318
+ {
319
+ "EbsOptimized": "false",
320
+ "ImageId": "test",
321
+ "InstanceType": "test",
322
+ "Monitoring": {
323
+ "Enabled": "false"
324
+ }
325
+ }
326
+ ],
327
+ "SpotPrice": "0.0",
328
+ "TargetCapacity": "1",
329
+ "TerminateInstancesWithExpiration": "false"
330
+ }
331
+ }
332
+ EOS
333
+ assert_equal exp_template.chomp, act_template
334
+ end
335
+
336
+ def test_ec2_spot_fleet_launches
337
+ template = <<-EOS
338
+ Test _ec2_spot_fleet_launches({ block_devices: [ { ref_size: "test" } ], iam: "test", image_id: "test", ref_instance_type: "test", ref_key_name: "test", network_interfaces: [ { ref_subnet_id: "test" } ] } )
339
+ EOS
340
+ act_template = run_client_as_json(template)
341
+ exp_template = <<-EOS
342
+ {
343
+ "Test": {
344
+ "BlockDeviceMappings": [
345
+ {
346
+ "DeviceName": "/dev/sda1",
347
+ "Ebs": {
348
+ "DeleteOnTermination": "true",
349
+ "VolumeSize": {
350
+ "Ref": "TestVolumeSize"
351
+ },
352
+ "VolumeType": "gp2"
353
+ }
354
+ }
355
+ ],
356
+ "EbsOptimized": "false",
357
+ "IamInstanceProfile": {
358
+ "Arn": "test"
359
+ },
360
+ "ImageId": "test",
361
+ "InstanceType": {
362
+ "Ref": "TestInstanceType"
363
+ },
364
+ "KeyName": {
365
+ "Ref": "TestKeyName"
366
+ },
367
+ "Monitoring": {
368
+ "Enabled": "false"
369
+ },
370
+ "NetworkInterfaces": [
371
+ {
372
+ "AssociatePublicIpAddress": "true",
373
+ "DeleteOnTermination": "true",
374
+ "DeviceIndex": "0",
375
+ "SubnetId": ""
376
+ }
377
+ ]
378
+ }
282
379
  }
283
380
  EOS
284
381
  assert_equal exp_template.chomp, act_template
@@ -42,14 +42,35 @@ Test _emr_bootstraps(bootstraps: [ { name: "test", script_path: "test" } ])
42
42
 
43
43
  def test_emr_configurations
44
44
  template = <<-EOS
45
- Test _emr_configurations(configurations: [ { classification: "test" } ])
45
+ configuration = {
46
+ classification: "test",
47
+ properties: {},
48
+ configurations: [
49
+ classification: "export",
50
+ properties: { JAVA_HOME: "/usr/java/default" },
51
+ ],
52
+ }
53
+ Test _emr_configurations(configurations: [ configuration ] )
46
54
  EOS
47
55
  act_template = run_client_as_json(template)
48
56
  exp_template = <<-EOS
49
57
  {
50
58
  "Test": [
51
59
  {
52
- "Classification": "test"
60
+ "Classification": "test",
61
+ "ConfigurationProperties": {
62
+ },
63
+ "Configurations": [
64
+ {
65
+ "Classification": "export",
66
+ "ConfigurationProperties": {
67
+ "JAVA_HOME": "/usr/java/default"
68
+ },
69
+ "Configurations": [
70
+
71
+ ]
72
+ }
73
+ ]
53
74
  }
54
75
  ]
55
76
  }
@@ -520,7 +520,7 @@ Test _availability_zones({})
520
520
  end
521
521
 
522
522
  def test_timestamp_utc
523
- assert_equal _timestamp_utc(2016, 4, 1), "2016-03-31T15:00:00Z"
523
+ assert_equal _timestamp_utc(Time.local(2016, 4, 1)), "2016-03-31T15:00:00Z"
524
524
  end
525
525
 
526
526
  def test_timestamp_utc_from_string
@@ -55,7 +55,7 @@ PolicyDocument _iam_policy_document "test", test: [ { service: "s3" } ]
55
55
 
56
56
  def test_iam_assume_role_policy_document
57
57
  template = <<-EOS
58
- Statement _iam_assume_role_policy_document("ec2")
58
+ Statement _iam_assume_role_policy_document({ service: "ec2" })
59
59
  EOS
60
60
  act_template = run_client_as_json(template)
61
61
  exp_template = <<-EOS
@@ -86,6 +86,65 @@ arn _iam_arn("s3", "test")
86
86
  exp_template = <<-EOS
87
87
  {
88
88
  "arn": "arn:aws:s3:::test"
89
+ }
90
+ EOS
91
+ assert_equal exp_template.chomp, act_template
92
+ end
93
+
94
+ def test_iam_s3_bucket_policy
95
+ template = <<-EOS
96
+ arn _iam_s3_bucket_policy("us_east1", "test", "test", 1234)
97
+ EOS
98
+ act_template = run_client_as_json(template)
99
+ exp_template = <<-EOS
100
+ {
101
+ "arn": [
102
+ {
103
+ "service": "s3",
104
+ "action": [
105
+ "PutObject"
106
+ ],
107
+ "principal": {
108
+ "AWS": [
109
+ null
110
+ ]
111
+ },
112
+ "resource": [
113
+ "test/test/AWSLogs/1234/*"
114
+ ]
115
+ }
116
+ ]
117
+ }
118
+ EOS
119
+ assert_equal exp_template.chomp, act_template
120
+ end
121
+
122
+ def test_iam_login_profile
123
+ template = <<-EOS
124
+ profile _iam_login_profile(password: "test")
125
+ EOS
126
+ act_template = run_client_as_json(template)
127
+ exp_template = <<-EOS
128
+ {
129
+ "profile": {
130
+ "Password": "test",
131
+ "PasswordResetRequired": "true"
132
+ }
133
+ }
134
+ EOS
135
+ assert_equal exp_template.chomp, act_template
136
+ end
137
+
138
+ def test_iam_managed_policies
139
+ template = <<-EOS
140
+ managed _iam_managed_policies(managed_policies: %w( admin ))
141
+ EOS
142
+ act_template = run_client_as_json(template)
143
+ exp_template = <<-EOS
144
+ {
145
+ "managed": [
146
+ "arn:aws:iam::aws:policy/AdministratorAccess"
147
+ ]
89
148
  }
90
149
  EOS
91
150
  assert_equal exp_template.chomp, act_template
@@ -15,6 +15,7 @@ _autoscaling_scaling_policy "test", ref_autoscaling: "test"
15
15
  "AutoScalingGroupName": {
16
16
  "Ref": "TestAutoscalingGroup"
17
17
  },
18
+ "Cooldown": "60",
18
19
  "PolicyType": "SimpleScaling",
19
20
  "ScalingAdjustment": "1"
20
21
  }
@@ -16,7 +16,7 @@ _cloudwatch_alarm "test", actions: "test", alarm_name: "test", namespace: "test"
16
16
  "test"
17
17
  ],
18
18
  "AlarmName": "test",
19
- "ComparisonOperator": "LessThanOrEqualToThreshold",
19
+ "ComparisonOperator": "LessThanThreshold",
20
20
  "Dimensions": [
21
21
  {
22
22
  "Name": "test",
@@ -23,7 +23,7 @@ _elb_loadbalancer "test", ref_security_groups: [ "test" ], listeners: [ protocol
23
23
  "ConnectionSettings": {
24
24
  "IdleTimeout": "60"
25
25
  },
26
- "CrossZone": "false",
26
+ "CrossZone": "true",
27
27
  "HealthCheck": {
28
28
  "HealthyThreshold": "10",
29
29
  "Interval": "30",
@@ -2,25 +2,6 @@ require 'abstract_unit'
2
2
 
3
3
  class OutputS3Test < Minitest::Test
4
4
  def test_normal
5
- template = <<-EOS
6
- _output_s3 "test"
7
- EOS
8
- act_template = run_client_as_json(template)
9
- exp_template = <<-EOS
10
- {
11
- "TestBucketS3WebSiteUrl": {
12
- "Description": "description of TestBucketS3WebSiteUrl",
13
- "Value": {
14
- "Fn::GetAtt": [
15
- "TestBucket",
16
- "WebsiteURL"
17
- ]
18
- }
19
- }
20
- }
21
- EOS
22
- assert_equal exp_template.chomp, act_template
23
-
24
5
  template = <<-EOS
25
6
  _output_s3 "test", domain: true
26
7
  EOS
@@ -51,6 +51,7 @@ _rds_db_instance "test", ref_db_name: "test", ref_port: "test", ref_subnet_group
51
51
  "PreferredBackupWindow": "21:30-22:00",
52
52
  "PreferredMaintenanceWindow": "Thu:20:30-Thu:21:00",
53
53
  "PubliclyAccessible": "false",
54
+ "StorageType": "gp2",
54
55
  "Tags": [
55
56
  {
56
57
  "Key": "Name",
@@ -4,7 +4,7 @@ class S3BucketPolicyTest < Minitest::Test
4
4
  def test_normal
5
5
  template = <<-EOS
6
6
  policy = {}
7
- _s3_bucket_policy "test", policy_document: policy
7
+ _s3_bucket_policy "test", bucket: "test", policy_document: policy
8
8
  EOS
9
9
  act_template = run_client_as_json(template)
10
10
  exp_template = <<-EOS
@@ -12,19 +12,7 @@ _s3_bucket_policy "test", policy_document: policy
12
12
  "TestBucketPolicy": {
13
13
  "Type": "AWS::S3::BucketPolicy",
14
14
  "Properties": {
15
- "BucketName": {
16
- "Fn::Join": [
17
- "-",
18
- [
19
- {
20
- "Ref": "Service"
21
- },
22
- {
23
- "Ref": "Name"
24
- }
25
- ]
26
- ]
27
- },
15
+ "Bucket": "test",
28
16
  "PolicyDocument": {
29
17
  "Version": "2012-10-17",
30
18
  "Statement": [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumogata-template
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naoya Nakazawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-26 00:00:00.000000000 Z
11
+ date: 2016-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk