kumogata-template 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +19 -19
  3. data/lib/kumogata/template/alb.rb +99 -0
  4. data/lib/kumogata/template/certificate.rb +18 -0
  5. data/lib/kumogata/template/const.rb +7 -0
  6. data/lib/kumogata/template/ec2.rb +6 -0
  7. data/lib/kumogata/template/ecs.rb +9 -0
  8. data/lib/kumogata/template/ext/kumogata.rb +5 -6
  9. data/lib/kumogata/template/helper.rb +4 -0
  10. data/lib/kumogata/template/version.rb +1 -1
  11. data/lib/kumogata/template.rb +2 -0
  12. data/template/alb-listener-rule.rb +22 -0
  13. data/template/alb-listener.rb +26 -0
  14. data/template/alb-load-balancer.rb +27 -0
  15. data/template/alb-target-group.rb +39 -0
  16. data/template/autoscaling-group.rb +2 -0
  17. data/template/certificate.rb +20 -0
  18. data/template/ec2-flow-log.rb +41 -0
  19. data/template/ec2-host.rb +21 -0
  20. data/template/ec2-instance.rb +5 -1
  21. data/template/ec2-spot-fleet.rb +16 -0
  22. data/template/ecs-service.rb +2 -0
  23. data/template/{elb-loadbalancer.rb → elb-load-balancer.rb} +1 -1
  24. data/template/iam-group.rb +2 -0
  25. data/template/iam-role.rb +11 -0
  26. data/template/iam-user.rb +2 -0
  27. data/template/output-alb.rb +21 -0
  28. data/template/output-elb.rb +4 -0
  29. data/template/parameter-ec2.rb +4 -4
  30. data/test/alb_test.rb +25 -0
  31. data/test/ec2_test.rb +45 -0
  32. data/test/helper_test.rb +21 -0
  33. data/test/template/alb-listener-rule_test.rb +40 -0
  34. data/test/template/alb-listener_test.rb +33 -0
  35. data/test/template/alb-load-balancer_test.rb +72 -0
  36. data/test/template/alb-target-group_test.rb +89 -0
  37. data/test/template/certificate_test.rb +27 -0
  38. data/test/template/ec2-flow-log_test.rb +26 -0
  39. data/test/template/ec2-host_test.rb +23 -0
  40. data/test/template/ec2-spot-fleet_test.rb +173 -0
  41. data/test/template/{elb-loadbalancer_test.rb → elb-load-balancer_test.rb} +1 -1
  42. data/test/template/output-alb_test.rb +105 -0
  43. data/test/template/output-elb_test.rb +61 -0
  44. data/test/template/parameter-ec2_test.rb +38 -9
  45. metadata +36 -5
@@ -0,0 +1,21 @@
1
+ #
2
+ # Output alb
3
+ #
4
+
5
+ _output "#{args[:name]} load balancer",
6
+ ref_value: "#{args[:name]} load balancer"
7
+ _output "#{args[:name]} load balancer dns name",
8
+ ref_value: [ "#{args[:name]} load balancer", "DNSName" ]
9
+ _output "#{args[:name]} load balancer canonical hosted zone id",
10
+ ref_value: [ "#{args[:name]} load balancer", "CanonicalHostedZoneID" ] if args.key? :route53
11
+ _output "#{args[:name]} load balancer full name",
12
+ ref_value: [ "#{args[:name]} load balancer", "LoadBalancerFullName" ]
13
+ _output "#{args[:name]} load balancer name",
14
+ ref_value: [ "#{args[:name]} load balancer", "LoadBalancerName" ]
15
+
16
+ if args.key? :security_groups
17
+ args[:security_groups].times do |i|
18
+ _output "#{args[:name]} load balancer security group #{i}",
19
+ value: _select(i, _attr_string(args[:name], "SecurityGroups", "load balancer"))
20
+ end
21
+ end
@@ -4,6 +4,10 @@
4
4
 
5
5
  _output "#{args[:name]} load balancer",
6
6
  ref_value: "#{args[:name]} load balancer"
7
+ _output "#{args[:name]} load balancer canonical hosted zone name",
8
+ ref_value: [ "#{args[:name]} load balancer", "CanonicalHostedZoneName" ] if args.key? :route53
9
+ _output "#{args[:name]} load balancer canonical hosted zone id",
10
+ ref_value: [ "#{args[:name]} load balancer", "CanonicalHostedZoneID" ] if args.key? :route53
7
11
  _output "#{args[:name]} load balancer dns name",
8
12
  ref_value: [ "#{args[:name]} load balancer", "DNSName" ]
9
13
  _output "#{args[:name]} load balancer security group name",
@@ -9,14 +9,14 @@ _parameter "#{args[:name]} instance type",
9
9
  allowed_values: EC2_INSTANCE_TYPES
10
10
 
11
11
  _parameter "#{args[:name]} iam instance profile",
12
- default: args[:iam_instance] || "",
13
- description: "#{args[:name]} iam instance profile"
12
+ default: args[:iam_instance],
13
+ description: "#{args[:name]} iam instance profile" if args.key? :iam_instance
14
14
 
15
15
  _parameter "#{args[:name]} data volume size",
16
16
  default: args[:size] || 100,
17
17
  description: "#{args[:name]} data volume size"
18
18
 
19
19
  _parameter "#{args[:name]} key name",
20
- default: args[:key],
20
+ default: args[:key_name],
21
21
  description: "#{args[:name]} key name",
22
- type: "AWS::EC2::KeyPair::KeyName"
22
+ type: "AWS::EC2::KeyPair::KeyName" if args.key? :key_name
data/test/alb_test.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'abstract_unit'
2
+ require 'kumogata/template/alb'
3
+
4
+ class AlbTest < Minitest::Test
5
+ def test_alb_health_check
6
+ template = <<-EOS
7
+ Test _alb_health_check({})
8
+ EOS
9
+ act_template = run_client_as_json(template)
10
+ exp_template = <<-EOS
11
+ {
12
+ "Test": {
13
+ "interval": 30,
14
+ "path": "/",
15
+ "port": 80,
16
+ "protocol": "HTTP",
17
+ "timeout": 5,
18
+ "healthy": 10,
19
+ "unhealthly": 2
20
+ }
21
+ }
22
+ EOS
23
+ assert_equal exp_template.chomp, act_template
24
+ end
25
+ end
data/test/ec2_test.rb CHANGED
@@ -113,6 +113,26 @@ Test _ec2_tags(name: "test", tags_append: { ref_test: "test" })
113
113
  def test_ec2_security_group_egresses
114
114
  template = <<-EOS
115
115
  args = { egress: [ to: 80, group: "test" ] }
116
+ Test _ec2_security_group_egresses("egress", args)
117
+ EOS
118
+ act_template = run_client_as_json(template)
119
+ exp_template = <<-EOS
120
+ {
121
+ "Test": [
122
+ {
123
+ "CidrIp": "0.0.0.0/0",
124
+ "FromPort": "80",
125
+ "GroupId": "test",
126
+ "IpProtocol": "tcp",
127
+ "ToPort": "80"
128
+ }
129
+ ]
130
+ }
131
+ EOS
132
+ assert_equal exp_template.chomp, act_template
133
+
134
+ template = <<-EOS
135
+ args = { egress: [ to: 80, group: "test" ] }
116
136
  Test _ec2_security_group_egresses("egress", args)
117
137
  EOS
118
138
  act_template = run_client_as_json(template)
@@ -167,6 +187,31 @@ Test _ec2_security_group_ingresses("ingress", args)
167
187
  "ToPort": "80"
168
188
  }
169
189
  ]
190
+ }
191
+ EOS
192
+ assert_equal exp_template.chomp, act_template
193
+
194
+ template = <<-EOS
195
+ args = { ingress: [ 22, 80 ] }
196
+ Test _ec2_security_group_ingresses("ingress", args)
197
+ EOS
198
+ act_template = run_client_as_json(template)
199
+ exp_template = <<-EOS
200
+ {
201
+ "Test": [
202
+ {
203
+ "CidrIp": "0.0.0.0/0",
204
+ "FromPort": "22",
205
+ "IpProtocol": "tcp",
206
+ "ToPort": "22"
207
+ },
208
+ {
209
+ "CidrIp": "0.0.0.0/0",
210
+ "FromPort": "80",
211
+ "IpProtocol": "tcp",
212
+ "ToPort": "80"
213
+ }
214
+ ]
170
215
  }
171
216
  EOS
172
217
  assert_equal exp_template.chomp, act_template
data/test/helper_test.rb CHANGED
@@ -255,6 +255,27 @@ Test _find_in_map("Test", "test1", "test2")
255
255
  assert_equal exp_template.chomp, act_template
256
256
  end
257
257
 
258
+ def test_select
259
+ template = <<-EOS
260
+ Test _select(1, %w( test1 test2 ))
261
+ EOS
262
+ act_template = run_client_as_json(template)
263
+ exp_template = <<-EOS
264
+ {
265
+ "Test": {
266
+ "Fn::Select": [
267
+ "1",
268
+ [
269
+ "test1",
270
+ "test2"
271
+ ]
272
+ ]
273
+ }
274
+ }
275
+ EOS
276
+ assert_equal exp_template.chomp, act_template
277
+ end
278
+
258
279
  def test_tag
259
280
  template = <<-EOS
260
281
  Test _tag(key: "test", value: "test")
@@ -0,0 +1,40 @@
1
+ require 'abstract_unit'
2
+
3
+ class AlbListenerRuleTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _alb_listener_rule "test", actions: [ { ref_target: "test" } ], ref_listener: "test", conditions: [ [ "/img/*" ] ]
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestLoadBalancerListenerRule": {
12
+ "Type": "AWS::ElasticLoadBalancingV2::ListenerRule",
13
+ "Properties": {
14
+ "Actions": [
15
+ {
16
+ "TargetGroupArn": {
17
+ "Ref": "TestTargetGroup"
18
+ },
19
+ "Type": "forward"
20
+ }
21
+ ],
22
+ "Conditions": [
23
+ {
24
+ "Field": "path-pattern",
25
+ "Values": [
26
+ "/img/*"
27
+ ]
28
+ }
29
+ ],
30
+ "ListenerArn": {
31
+ "Ref": "TestLoadBalancerListener"
32
+ },
33
+ "Priority": "1"
34
+ }
35
+ }
36
+ }
37
+ EOS
38
+ assert_equal exp_template.chomp, act_template
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ require 'abstract_unit'
2
+
3
+ class AlbListenerTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _alb_listener "test", actions: [ { ref_target: "test" } ], ref_lb: "test"
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestLoadBalancerListener": {
12
+ "Type": "AWS::ElasticLoadBalancingV2::Listener",
13
+ "Properties": {
14
+ "DefaultActions": [
15
+ {
16
+ "TargetGroupArn": {
17
+ "Ref": "TestTargetGroup"
18
+ },
19
+ "Type": "forward"
20
+ }
21
+ ],
22
+ "LoadBalancerArn": {
23
+ "Ref": "TestLoadBalancer"
24
+ },
25
+ "Port": "80",
26
+ "Protocol": "HTTP"
27
+ }
28
+ }
29
+ }
30
+ EOS
31
+ assert_equal exp_template.chomp, act_template
32
+ end
33
+ end
@@ -0,0 +1,72 @@
1
+ require 'abstract_unit'
2
+
3
+ class AlbLoadbalancerTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _alb_load_balancer "test", attributes: [ { "test": "test" } ], ref_security_groups: [ "test" ]
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestLoadBalancer": {
12
+ "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
13
+ "Properties": {
14
+ "LoadBalancerAttributes": [
15
+ {
16
+ "Key": "test",
17
+ "Value": "test"
18
+ }
19
+ ],
20
+ "Name": {
21
+ "Fn::Join": [
22
+ "-",
23
+ [
24
+ {
25
+ "Ref": "Service"
26
+ },
27
+ {
28
+ "Ref": "Name"
29
+ }
30
+ ]
31
+ ]
32
+ },
33
+ "SecurityGroups": [
34
+ {
35
+ "Ref": "TestSecurityGroup"
36
+ }
37
+ ],
38
+ "Tags": [
39
+ {
40
+ "Key": "Name",
41
+ "Value": {
42
+ "Fn::Join": [
43
+ "-",
44
+ [
45
+ {
46
+ "Ref": "Service"
47
+ },
48
+ "test"
49
+ ]
50
+ ]
51
+ }
52
+ },
53
+ {
54
+ "Key": "Service",
55
+ "Value": {
56
+ "Ref": "Service"
57
+ }
58
+ },
59
+ {
60
+ "Key": "Version",
61
+ "Value": {
62
+ "Ref": "Version"
63
+ }
64
+ }
65
+ ]
66
+ }
67
+ }
68
+ }
69
+ EOS
70
+ assert_equal exp_template.chomp, act_template
71
+ end
72
+ end
@@ -0,0 +1,89 @@
1
+ require 'abstract_unit'
2
+
3
+ class AlbTargetGroupTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _alb_target_group "test", attributes: [ { key: "value" } ], targets: [ { ref_instance: "test" } ], ref_vpc: "test"
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestTargetGroup": {
12
+ "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
13
+ "Properties": {
14
+ "HealthCheckIntervalSeconds": "30",
15
+ "HealthCheckPath": "/",
16
+ "HealthCheckPort": "80",
17
+ "HealthCheckProtocol": "HTTP",
18
+ "HealthCheckTimeoutSeconds": "5",
19
+ "HealthyThresholdCount": "10",
20
+ "Matcher": {
21
+ "HttpCode": "200"
22
+ },
23
+ "Name": {
24
+ "Fn::Join": [
25
+ "-",
26
+ [
27
+ {
28
+ "Ref": "Service"
29
+ },
30
+ {
31
+ "Ref": "Name"
32
+ }
33
+ ]
34
+ ]
35
+ },
36
+ "Port": "80",
37
+ "Protocol": "HTTP",
38
+ "Tags": [
39
+ {
40
+ "Key": "Name",
41
+ "Value": {
42
+ "Fn::Join": [
43
+ "-",
44
+ [
45
+ {
46
+ "Ref": "Service"
47
+ },
48
+ "test"
49
+ ]
50
+ ]
51
+ }
52
+ },
53
+ {
54
+ "Key": "Service",
55
+ "Value": {
56
+ "Ref": "Service"
57
+ }
58
+ },
59
+ {
60
+ "Key": "Version",
61
+ "Value": {
62
+ "Ref": "Version"
63
+ }
64
+ }
65
+ ],
66
+ "TargetGroupAttributes": [
67
+ {
68
+ "Key": "key",
69
+ "Value": "value"
70
+ }
71
+ ],
72
+ "Targets": [
73
+ {
74
+ "Id": {
75
+ "Ref": "TestInstance"
76
+ }
77
+ }
78
+ ],
79
+ "UnhealthyThresholdCount": "2",
80
+ "VpcId": {
81
+ "Ref": "TestVpc"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ EOS
87
+ assert_equal exp_template.chomp, act_template
88
+ end
89
+ end
@@ -0,0 +1,27 @@
1
+ require 'abstract_unit'
2
+
3
+ class CertificateTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _certificate "test", domain: "test"
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestCertificate": {
12
+ "Type": "AWS::CertificateManager::Certificate",
13
+ "Properties": {
14
+ "DomainName": "test",
15
+ "DomainValidationOptions": [
16
+ {
17
+ "DomainName": "test",
18
+ "ValidationDomain": "test"
19
+ }
20
+ ]
21
+ }
22
+ }
23
+ }
24
+ EOS
25
+ assert_equal exp_template.chomp, act_template
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ require 'abstract_unit'
2
+
3
+ class Ec2LowLogTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _ec2_flow_log "test", ref_id: "test"
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestFlowLog": {
12
+ "Type": "AWS::EC2::FlowLog",
13
+ "Properties": {
14
+ "LogGroupName": "test",
15
+ "ResourceId": {
16
+ "Ref": "TestVpc"
17
+ },
18
+ "ResourceType": "VPC",
19
+ "TrafficType": "ALL"
20
+ }
21
+ }
22
+ }
23
+ EOS
24
+ assert_equal exp_template.chomp, act_template
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ require 'abstract_unit'
2
+
3
+ class Ec2HostTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ _ec2_host "test", auto: "on", az: "test"
7
+ EOS
8
+ act_template = run_client_as_json(template)
9
+ exp_template = <<-EOS
10
+ {
11
+ "TestHost": {
12
+ "Type": "AWS::EC2::Host",
13
+ "Properties": {
14
+ "AutoPlacement": "on",
15
+ "AvailabilityZone": "test",
16
+ "InstanceType": "c4.large"
17
+ }
18
+ }
19
+ }
20
+ EOS
21
+ assert_equal exp_template.chomp, act_template
22
+ end
23
+ end
@@ -0,0 +1,173 @@
1
+ require 'abstract_unit'
2
+
3
+ class Ec2SpotFeetTest < Minitest::Test
4
+ def test_normal
5
+ template = <<-EOS
6
+ launches = [
7
+ { block_devices: [ { ref_size: "test" } ],
8
+ ref_iam: "test", image_id: "test", ref_key_name: "test", instance_type: "test", network_interfaces: [ { ref_subnet: "test" } ] }
9
+ ]
10
+ _ec2_spot_fleet "test", iam: "test", price: 1000, ref_taget: "test", launches: launches, target: 1
11
+ EOS
12
+ act_template = run_client_as_json(template)
13
+ exp_template = <<-EOS
14
+ {
15
+ "TestSpotFleet": {
16
+ "Type": "AWS::EC2::SpotFleet",
17
+ "Properties": {
18
+ "SpotFleetRequestConfigData": {
19
+ "AllocationStrategy": "lowestPrice",
20
+ "IamFleetRole": "test",
21
+ "LaunchSpecifications": [
22
+ {
23
+ "BlockDeviceMappings": [
24
+ {
25
+ "DeviceName": "/dev/sda1",
26
+ "Ebs": {
27
+ "DeleteOnTermination": "true",
28
+ "VolumeSize": {
29
+ "Ref": "TestVolumeSize"
30
+ },
31
+ "VolumeType": "gp2"
32
+ }
33
+ }
34
+ ],
35
+ "EbsOptimized": "false",
36
+ "IamInstanceProfile": {
37
+ "Arn": {
38
+ "Ref": "TestIamInstanceProfile"
39
+ }
40
+ },
41
+ "ImageId": "test",
42
+ "InstanceType": "test",
43
+ "KeyName": {
44
+ "Ref": "TestKeyName"
45
+ },
46
+ "Monitoring": {
47
+ "Enabled": "false"
48
+ },
49
+ "NetworkInterfaces": [
50
+ {
51
+ "AssociatePublicIpAddress": "true",
52
+ "DeleteOnTermination": "true",
53
+ "DeviceIndex": "0",
54
+ "SubnetId": {
55
+ "Ref": "TestSubnet"
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ ],
61
+ "SpotPrice": "1000",
62
+ "TargetCapacity": "1",
63
+ "TerminateInstancesWithExpiration": "false"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ EOS
69
+ assert_equal exp_template.chomp, act_template
70
+ end
71
+
72
+ def test_aws
73
+ template = <<-EOS
74
+ launches = [
75
+ { ebs: false, ref_instance_type: "test", image: "test", ref_subnet: "subnet1", weighted: 8 },
76
+ { ebs: true, ref_instance_type: "test", image: "test", ref_subnet: "subnet0", weighted: 8, monitoring: true, ref_security_groups: [ "test" ], ref_iam: "root" },
77
+ ]
78
+ _ec2_spot_fleet "test", iam: "test", price: 1000, ref_target: "target capacity", launches: launches
79
+ EOS
80
+ act_template = run_client_as_json(template)
81
+ exp_template = <<-EOS
82
+ {
83
+ "TestSpotFleet": {
84
+ "Type": "AWS::EC2::SpotFleet",
85
+ "Properties": {
86
+ "SpotFleetRequestConfigData": {
87
+ "AllocationStrategy": "lowestPrice",
88
+ "IamFleetRole": "test",
89
+ "LaunchSpecifications": [
90
+ {
91
+ "EbsOptimized": "false",
92
+ "ImageId": {
93
+ "Fn::FindInMap": [
94
+ "AWSRegionArch2AMITest",
95
+ {
96
+ "Ref": "AWS::Region"
97
+ },
98
+ {
99
+ "Fn::FindInMap": [
100
+ "AWSInstanceType2Arch",
101
+ {
102
+ "Ref": "TestInstanceType"
103
+ },
104
+ "Arch"
105
+ ]
106
+ }
107
+ ]
108
+ },
109
+ "InstanceType": {
110
+ "Ref": "TestInstanceType"
111
+ },
112
+ "Monitoring": {
113
+ "Enabled": "false"
114
+ },
115
+ "SubnetId": {
116
+ "Ref": "Subnet1Subnet"
117
+ },
118
+ "WeightedCapacity": "8"
119
+ },
120
+ {
121
+ "EbsOptimized": "true",
122
+ "IamInstanceProfile": {
123
+ "Arn": {
124
+ "Ref": "RootIamInstanceProfile"
125
+ }
126
+ },
127
+ "ImageId": {
128
+ "Fn::FindInMap": [
129
+ "AWSRegionArch2AMITest",
130
+ {
131
+ "Ref": "AWS::Region"
132
+ },
133
+ {
134
+ "Fn::FindInMap": [
135
+ "AWSInstanceType2Arch",
136
+ {
137
+ "Ref": "TestInstanceType"
138
+ },
139
+ "Arch"
140
+ ]
141
+ }
142
+ ]
143
+ },
144
+ "InstanceType": {
145
+ "Ref": "TestInstanceType"
146
+ },
147
+ "Monitoring": {
148
+ "Enabled": "true"
149
+ },
150
+ "SecurityGroups": [
151
+ {
152
+ "Ref": "TestSecurityGroup"
153
+ }
154
+ ],
155
+ "SubnetId": {
156
+ "Ref": "Subnet0Subnet"
157
+ },
158
+ "WeightedCapacity": "8"
159
+ }
160
+ ],
161
+ "SpotPrice": "1000",
162
+ "TargetCapacity": {
163
+ "Ref": "TargetCapacity"
164
+ },
165
+ "TerminateInstancesWithExpiration": "false"
166
+ }
167
+ }
168
+ }
169
+ }
170
+ EOS
171
+ assert_equal exp_template.chomp, act_template
172
+ end
173
+ end
@@ -3,7 +3,7 @@ require 'abstract_unit'
3
3
  class ElbLoadbalancerTest < Minitest::Test
4
4
  def test_normal
5
5
  template = <<-EOS
6
- _elb_loadbalancer "test", ref_security_groups: [ "test" ], listeners: [ protocol: "http" ]
6
+ _elb_load_balancer "test", ref_security_groups: [ "test" ], listeners: [ protocol: "http" ]
7
7
  EOS
8
8
  act_template = run_client_as_json(template)
9
9
  exp_template = <<-EOS