aws-must-templates 0.1.6 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +97 -44
  3. data/lib/tasks/cross-ref.rb +6 -0
  4. data/lib/tasks/suite.rake +150 -48
  5. data/lib/test-suites/test_suites.rb +13 -13
  6. data/mustache/commonDependsOn.mustache +24 -2
  7. data/mustache/commonRef.mustache +22 -0
  8. data/mustache/commonValue.mustache +1 -1
  9. data/mustache/commonXGressRule.mustache +31 -0
  10. data/mustache/mapping.mustache +3 -1
  11. data/mustache/mappingAmazonVpcNat.mustache +38 -0
  12. data/mustache/resource.mustache +4 -0
  13. data/mustache/resourceInstance.mustache +26 -7
  14. data/mustache/resourceInternetGateway.mustache +30 -16
  15. data/mustache/resourceRoute.mustache +50 -0
  16. data/mustache/resourceRouteTable.mustache +67 -0
  17. data/mustache/resourceSecurityGroup.mustache +13 -12
  18. data/mustache/resourceSubnet.mustache +20 -8
  19. data/mustache/root.mustache +26 -11
  20. data/spec/aws-must-templates/AllwaysOk/AllwaysOk_spec.rb +35 -0
  21. data/spec/aws-must-templates/AwsCommandLineInterfaceInstalled/AwsCommandLineInterfaceInstalled_spec.rb +19 -1
  22. data/spec/aws-must-templates/AwsMustTestRunnerProperties/AwsMustTestRunnerProperties_spec.rb +16 -1
  23. data/spec/aws-must-templates/CloudFormationHelperScriptsInstalled/CloudFormationHelperScriptsInstalled_spec.rb +17 -0
  24. data/spec/aws-must-templates/Ec2InstanceType/Ec2InstanceType_spec.rb +47 -0
  25. data/spec/aws-must-templates/Ec2PrivateIp/Ec2PrivateIp_spec.rb +49 -0
  26. data/spec/aws-must-templates/Ec2PublicIp/Ec2PublicIp_spec.rb +68 -0
  27. data/spec/aws-must-templates/Ec2Routes/Ec2Routes_spec.rb +69 -0
  28. data/spec/aws-must-templates/Ec2SecurityGroups/Ec2SecurityGroups_spec.rb +151 -0
  29. data/spec/aws-must-templates/Ec2StatusNormal/Ec2StatusNormal_spec.rb +55 -0
  30. data/spec/aws-must-templates/NetworkCanPing/NetworkCanPing_spec.rb +36 -0
  31. data/spec/aws-must-templates/ParameterTest/ParameterTest_spec.rb +17 -1
  32. data/spec/aws-must-templates/RespondsToPing/RespondsToPing_spec.rb +46 -0
  33. data/spec/aws-must-templates/S3NoAccess/S3NoAccess_spec.rb +17 -3
  34. data/spec/aws-must-templates/S3ReadAccessAllowed/S3ReadAccessAllowed_spec.rb +18 -1
  35. data/spec/aws-must-templates/Stack/Stack_spec.rb +28 -1
  36. data/spec/aws-must-templates/ValidOSVersion/ValidOSVersion_spec.rb +16 -1
  37. data/spec/aws-must-templates/Vpc/vpc_spec.rb +51 -0
  38. data/spec/aws-must-templates/table_of_content.mustache +67 -0
  39. data/spec/lib/test_suites_spec.rb +101 -28
  40. data/spec/mustache/commonDependsOn_spec.rb +57 -2
  41. data/spec/mustache/commonInstanceType_spec.rb +1 -1
  42. data/spec/mustache/mappingAmazonVpcNat_spec.rb +56 -0
  43. data/spec/mustache/mapping_spec.rb +48 -7
  44. data/spec/mustache/resourceInstance_spec.rb +102 -1
  45. data/spec/mustache/resourceInternetGateway_spec.rb +14 -9
  46. data/spec/mustache/resourcePolicy_spec.rb +1 -1
  47. data/spec/mustache/resourceS3Bucket_spec.rb +1 -1
  48. data/spec/mustache/resourceSecurityGroup_spec.rb +3 -3
  49. data/spec/mustache/resourceSubnet_spec.rb +50 -3
  50. data/spec/support/lib/aws/aws.rb +6 -0
  51. data/spec/support/lib/aws/ec2_resource.rb +177 -0
  52. data/spec/support/lib/aws/mixin_cidr.rb +18 -0
  53. data/spec/support/lib/aws/mixin_ec2.rb +53 -0
  54. data/spec/support/lib/aws/mixin_security_group.rb +15 -0
  55. data/spec/support/lib/aws/mixin_subnet.rb +77 -0
  56. data/spec/support/lib/aws/mixin_vpc.rb +10 -0
  57. data/spec/support/lib/aws/route_resource.rb +86 -0
  58. data/spec/support/lib/aws/security_group_resource.rb +120 -0
  59. data/spec/support/lib/aws/vpc_resource.rb +69 -0
  60. data/spec/support/lib/suite_value.rb +38 -0
  61. data/spec/support/lib/test_parameter.rb +12 -8
  62. data/spec/support/lib/valid_property.rb +29 -9
  63. data/spec/support/spec_helper.rb +75 -44
  64. data/spec/support/utils.rb +4 -0
  65. metadata +34 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a561a1094145391bcc56b1b4c91d4dd2daded2c8
4
- data.tar.gz: 972049e8dd61b986b738c61533be83d1bb3cc2f2
3
+ metadata.gz: f7ef597a5063b288cc1c4fba6f4a2119cf008391
4
+ data.tar.gz: b89652f4001fea744e1be3e6d42233ef154bc15f
5
5
  SHA512:
6
- metadata.gz: 46193b67910910d382a950cf47d773c3568fe7c8b5ac20e71bbd19d7423db8318aebbe77deaf8b3c693d3d576147a294548274cd264911974cb71f399aa4444c
7
- data.tar.gz: d2a0e4a27b32d51393f9569b935723efe1035f192572e659fa17b5c97f1ddfe69d3c029df5b4b0c9055765038e1b9bcb52a94e3decd391a11244e54cd1a5ac91
6
+ metadata.gz: 0f17a8a069e5249a231ec574e3b801e5149a2a7c54aef1f5e98dc5d0cbbacbbc76280568280aaa9fee9d85ea332656ed4fa9048fa7ab58cc2c88a6cd47cbb2ec
7
+ data.tar.gz: 024b79c1a947156e3ea98347a5312c832188bbb7ace1b09cd37fd54292051a4a1817e45e5c5023b1571ef0cdfeeb8d1a3e1c8f2e12c094e56e80c766a53e8a61
data/README.md CHANGED
@@ -1,11 +1,13 @@
1
- # aws-must-templates - cloudformation templates for aws-must - $Release:0.1.6$
1
+ # aws-must-templates - cloudformation templates for aws-must - $Release:0.2.1$
2
2
 
3
3
  Set of [extensible](#OVERRIDE)
4
4
  [templates](https://rawgit.com/jarjuk/aws-must-templates/master/generated-docs/aws-must-templates.html)
5
5
  for [aws-must](https://github.com/jarjuk/aws-must) tool to generate
6
6
  CloudFormation JSON from a YAML configuration, and a
7
- [Test Runner](#TESTING) for [validating correctness](#TEST_CASES) of
8
- CloudFormation stacks provisioned.
7
+ [Test Runner](#TESTING) with
8
+ [reusable tests](https://rawgit.com/jarjuk/aws-must-templates/master/generated-docs/aws-must-templates-spec.html)
9
+ for [validating correctness](#TEST_CASES) of CloudFormation stacks
10
+ provisioned.
9
11
 
10
12
  See blog posts
11
13
  [part1](https://jarjuk.wordpress.com/2015/08/18/announcing-aws-must-templates-part1)
@@ -50,8 +52,8 @@ When using code generators, consider
50
52
  the threshold to write tests
51
53
 
52
54
  3. by allowing users [to reuse](#TEST_CASES)
53
- [test cases](generated-docs/test-suites.md) used
54
- in **aws-must-templates** quality assurance
55
+ [test cases](https://rawgit.com/jarjuk/aws-must-templates/master/generated-docs/aws-must-templates-spec.html)
56
+ from **aws-must-templates** quality assurance
55
57
 
56
58
  4. by having the possibility to [include own test](#TEST_CASES)
57
59
  cases to test suites
@@ -90,8 +92,12 @@ used to validate **aws-must-templates** implementation. For, example
90
92
  bucket, one of the instances (`myInstance`) which is granted a read
91
93
  access to the S3 bucket
92
94
 
93
- See [test report](generated-docs/test-suites.md) of
94
- **aws-must-templates** for more information.
95
+ * [suite2.yaml](suite2.yaml): Creates VPC with Public and Private
96
+ Subnets (NAT) similar to
97
+ [scenario 2](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario2.html)
98
+
99
+ See [test report](https://gist.github.com/jarjuk/9ab1c25d436c4e468f5e)
100
+ of **aws-must-templates** for more information.
95
101
 
96
102
  ### Generate CloudFormation JSON templates
97
103
 
@@ -189,18 +195,29 @@ To use the **aws-must-templates** Test Runner
189
195
 
190
196
  Add following lines to `Rakefile`
191
197
 
198
+ # name of configuration file
199
+ suite_runner_configs= "suite-runner-configs.yaml"
200
+
201
+ # Override configuration in 'suite.rake'
202
+ $suite_runner_configs = File.exist?(suite_runner_configs) ? YAML.load_file( suite_runner_configs ) : {}
203
+
192
204
  spec = Gem::Specification.find_by_name 'aws-must-templates'
193
205
  load "#{spec.gem_dir}/lib/tasks/suite.rake"
194
206
 
195
- create an empty `test-suites.yaml` -file
207
+ Optionally, copy
208
+ [default Test Runner Configurations](https://rawgit.com/jarjuk/aws-must-templates/master/suite-runner-configs.yaml)
209
+ to `suite-runner-configs.yaml` file in current working directory, and
210
+ modify settings in the file to override default values.
211
+
212
+ Create an empty `test-suites.yaml` -file
196
213
 
197
214
  touch test-suites.yaml
198
215
 
199
216
  and run
200
217
 
201
- bundle exec rake -T suite
218
+ rake -T suite
202
219
 
203
- For an empty test-suites.yaml the result shows
220
+ For an empty `test-suites.yaml`, the result shows
204
221
 
205
222
  rake suite:all[gen_opts] # Run all suites
206
223
 
@@ -220,31 +237,60 @@ pair
220
237
 
221
238
  **Prepare ssh-connection configuration**
222
239
 
223
- Test Runner uses SSH connection to access an EC2 instance, and needs
224
- an entry in `ssh/config` file
225
- [defining](http://linux.die.net/man/5/ssh_config) user name, and
226
- ssh-key used in authentication, etc.
240
+ Test Runner uses
241
+ [SSH Client Configuration](http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man5/ssh_config.5?query=ssh_config&sec=5)
242
+ in `ssh/config.aws` file. Configuration file `ssh/config.aws` is
243
+ created automatically, using `ssh/config.init`, if it does not exist.
227
244
 
228
- For example, the SSH configuration below for an EC2 instance
229
- `myInstance` defines `IdentityFile` parameter matching `demo-key` EC2
230
- key used in **aws-must-templates** test suites.
245
+ For example, the following configuration in `ssh/config.init`
246
+ instructs OpenSSH
231
247
 
232
- host myInstance
233
- StrictHostKeyChecking no
234
- UserKnownHostsFile=/dev/null
235
- user ubuntu
236
- IdentityFile ~/.ssh/demo-key/demo-key
248
+ Host *.internal
249
+ ProxyCommand ssh myFront1 -F ssh/config.aws nc -q0 %h 22
250
+
251
+
252
+ # using RHEL Amazon vpc-nat instance --> ec2-user
253
+ Host myNat
254
+ user ec2-user
255
+
256
+ Host *
257
+ user ubuntu
258
+ StrictHostKeyChecking no
259
+ UserKnownHostsFile=/dev/null
260
+ IdentityFile ~/.ssh/demo-key/demo-key
261
+
262
+
263
+ * to use user name `ubuntu` and SSH private key in
264
+ `~/.ssh/demo-key/demo-key` for all hosts, expect for instance
265
+ `myNat` user name is `ec2-user`.
266
+
267
+ * to proxy connections to host names ending `.internal` to proxy
268
+ connections over instance `myFront1`
237
269
 
238
- Parameters `UserKnownHostsFile` and `StrictHostKeyChecking` prevent
239
- ssh from updating your default `.ssh/known_hosts` file with the
240
- fingerprint of the (temporary) instance used in testing.
270
+ * to prevent OpenSSH from updating your default `.ssh/known_hosts`
271
+ file with the fingerprint of the (temporary) instance used in
272
+ testing.
273
+
274
+ Once configuration in `ssh/config.init` is in place, running
275
+
276
+ rake suite:ec2-sync
277
+
278
+ updates EC2 instance metadata in `ssh/config.aws`.
279
+
280
+ **Notice** You may need to change `aws_region` setting values in
281
+ [suite-runner-configs.yaml](#SETUP-TEST-RUNNER).
282
+
283
+ See
284
+ [blog post](https://jarjuk.wordpress.com/2015/09/08/using-openssh-on-aws-platform/#more-273https://jarjuk.wordpress.com/2015/09/08/using-openssh-on-aws-platform)
285
+ for more information on using OpenSSH on AWS platform.
241
286
 
242
287
  ### Implement Test Cases<a id="TEST_CASES"/>
243
288
 
244
- Test Runner searches Test Cases first from sub-directories under
245
- `spec/aws-must-templates` directory, and if not found, tries to locate
246
- Test Cases in Gem **aws-must-templates**. This allows user to reuse
247
- existing test in **aws-must-templates** and implement own Test Cases.
289
+ Test Runner allows user to implement own Test Cases, or to
290
+ [reuse](https://rawgit.com/jarjuk/aws-must-templates/master/generated-docs/aws-must-templates-spec.html)
291
+ existing tests in **aws-must-templates**. It first searches Test
292
+ Cases locally under sub-directory `spec/aws-must-templates`, and if
293
+ not found, tries to locate Test Cases in Gem **aws-must-templates**.
248
294
 
249
295
  Test runner uses Rspec with [serverspec](http://serverspec.org/)
250
296
  library. For example, `ValidOSVersion` Test Case in
@@ -269,9 +315,9 @@ with the code shown:
269
315
 
270
316
 
271
317
  For more information on Test Cases, see
272
- [test report](generated-docs/test-suites.md) created, when running
273
- [test-suites](test-suites.yaml) in **aws-must-templates** development,
274
- and a [diagram](generated-docs/xref_suite_X_test.pdf) for an overview.
318
+ [test report](https://gist.github.com/jarjuk/9ab1c25d436c4e468f5e)
319
+ generated, when running [test-suites](test-suites.yaml) in
320
+ **aws-must-templates** development.
275
321
 
276
322
 
277
323
  ### Configure Test Suites <a id="TEST-SUITES"/>
@@ -284,12 +330,12 @@ The picture below present main elements used in `test-suites.yaml`.
284
330
  ![test-suites.yaml elements](./pics/test-suites.jpg)
285
331
 
286
332
  A Test Suite validates correctness of a CloudFormation Stack. One Test
287
- Suite defines tests for multiple EC2 Instances. Each EC2 Instance must
288
- have a corresponding SSH Connection prepared in
289
- [ssh/config](#TEST-CONTEXT) -file. An EC2 Instance acts in many
290
- Roles. A Role maps to a [Test Case](#TEST_CASES), and and defines
291
- values for the Test Case Parameters. The parameter may be a constant,
292
- or a reference to Stack Parameter, or to Stack Output.
333
+ Suite defines tests for multiple EC2 Instances. SSH Client
334
+ Configuration for a EC2 Instance is looked up in
335
+ [ssh/config.aws](#TEST-CONTEXT) -file. An EC2 Instance acts in many
336
+ Roles. A Role maps to a [Test Case](#TEST_CASES), and defines values
337
+ for the Test Case Parameters. The parameter may be a constant, or a
338
+ reference to Stack Parameter, or to Stack Output.
293
339
 
294
340
  As an example, the Test Suite for `mystack` is
295
341
 
@@ -327,16 +373,23 @@ a more detailed explanation, and for more examples.
327
373
 
328
374
  **NOTICE** It advisable to check on AWS console that all stack
329
375
  resources are deleted successfully after running test suites.
376
+
377
+ **Notice** Some of tests included in **aws-must-templates** use AWS
378
+ [SDK for Ruby - Version 2](http://docs.aws.amazon.com/sdkforruby/api/index.html). The
379
+ SDK searches `ENV['AWS_REGION']` for a region information. You have
380
+ the option to set the environment variable, or configure property
381
+ `aws_region` in [suite-runner-configs.yaml](#SETUP-TEST-RUNNER).
382
+
330
383
 
331
384
  To run test suite `mystack` defined in in `test-suites.yml` using
332
385
  default templates in **aws-must-templates** use the command
333
386
 
334
- bundle exec rake suite:mystack
387
+ rake suite:mystack
335
388
 
336
389
  To [override](#OVERRIDE) default implementation with templates in
337
390
  directory `myextensions`, use the command
338
391
 
339
- bundle exec rake suite:mystack['-m myextensions/ aws-must-templates']
392
+ rake suite:mystack['-m myextensions/ aws-must-templates']
340
393
 
341
394
 
342
395
  For a Test Suite, Test Runner
@@ -345,17 +398,17 @@ For a Test Suite, Test Runner
345
398
  * uses the JSON template to provision a stack on Amazon platform,
346
399
  * and, once the `StackStatus` is `CREATE_COMPLETE`,
347
400
  * iterates EC2 Instances and runs Test Cases in the EC2 Instance Role
348
- * creates a test report to `generated-doc/suites` directory
401
+ * creates test reports to `generated-doc/suites` directory
349
402
  * finally, after the test execution, the stack is deleted from Amazon platform.
350
403
 
351
404
 
352
405
  To run all test suites defined in `test-suites.yaml`, use the command
353
406
 
354
- bundle exec rake suite:all
407
+ rake suite:all
355
408
 
356
409
  or to override the default implementation
357
410
 
358
- bundle exec rake suite:all['-m myextensions/ aws-must-templates']
411
+ rake suite:all['-m myextensions/ aws-must-templates']
359
412
 
360
413
  Command
361
414
 
@@ -375,7 +428,7 @@ See [RELEASES](RELEASES.md)
375
428
 
376
429
  Add more tests, e.g.
377
430
 
378
- * VPC and subnets
431
+ * SNS
379
432
  * install Chef
380
433
 
381
434
  Add more template support
@@ -49,6 +49,12 @@ def xref_to_dot( xref_suite_X_test, xref_test_X_suite )
49
49
  puts <<-EOS
50
50
  digraph {
51
51
  rankdir=TB
52
+
53
+ // options for neato
54
+ // http://stackoverflow.com/questions/7670304/how-to-deal-with-densely-connected-graphs-with-neato
55
+ overlap=false;
56
+ splines=true;
57
+
52
58
 
53
59
  node [ fontname = "Courier"
54
60
  fontsize = 8
data/lib/tasks/suite.rake CHANGED
@@ -8,6 +8,18 @@ require 'json'
8
8
  require 'rake'
9
9
  require 'rspec/core/rake_task'
10
10
 
11
+ # ------------------------------------------------------------------
12
+ # configuration extesions (see task 'suite-runner-configs' for documentation)
13
+
14
+ default_suite_runner_configs = {
15
+ 'ssh_config_file' => "ssh/config.aws",
16
+ 'ssh_config_init' => "ssh/config.init",
17
+ 'aws_region' => nil,
18
+ }
19
+
20
+ suite_runner_configs =
21
+ default_suite_runner_configs.merge( $suite_runner_configs ? $suite_runner_configs : {} )
22
+
11
23
  # ------------------------------------------------------------------
12
24
  # test-suites.yaml
13
25
 
@@ -33,6 +45,45 @@ END_STATES = SUCESS_STATES + FAILURE_STATES
33
45
 
34
46
  namespace :suite do
35
47
 
48
+ # **********
49
+ # desc "Outpu configuration"
50
+ task "suite-runner-configs" do
51
+
52
+ # puts( default_suite_runner_configs.to_yaml)
53
+ doc = <<EOS
54
+ ---
55
+ # Test Runner suite-runner-default
56
+ # ------------------------------------------------------------------
57
+ #
58
+ # copy this file to cwd with the name 'suite-runner-configs.yaml' and
59
+ # add following lines to Rakefile
60
+ #
61
+ # suite_runner_configs= "suite-runner-configs.yaml"
62
+ # $suite_runner_configs = File.exist?(suite_runner_configs) ? YAML.load_file( suite_runner_configs ) : {}
63
+ #
64
+ # spec = Gem::Specification.find_by_name 'aws-must-templates'
65
+ # load "\#{spec.gem_dir}/lib/tasks/suite.rake"
66
+ #
67
+ # ------------------------------------------------------------------
68
+
69
+ # SSH Client Configuration file where EC2 Instance Tag Name/DNS Name
70
+ # mapping is synchronized
71
+ ssh_config_file: #{default_suite_runner_configs['ssh_config_file']}
72
+
73
+ # Name of file, which is used to seed 'ssh_config_file', if
74
+ # 'ssh_config_file' file does not exist
75
+ ssh_config_init: #{default_suite_runner_configs['ssh_config_init']}
76
+
77
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html#Configuration
78
+ # "The SDK searches the following locations for a region: ENV['AWS_REGION']"
79
+ #
80
+ # Test runner sets ENV['AWS_REGION'] if following property is set
81
+ #
82
+ aws_region: #{default_suite_runner_configs['aws_region']}
83
+ EOS
84
+ puts doc
85
+ end
86
+
36
87
  # suite_properties.each{ |a| a.keys.first }
37
88
 
38
89
  # **********
@@ -51,6 +102,14 @@ namespace :suite do
51
102
 
52
103
  end
53
104
 
105
+ # **********
106
+ desc "Syncrronize ec2 instance metadata to "
107
+ task "ec2-sync" do
108
+ aws_ssh_resolver="aws-ssh-resolver.rb"
109
+ sh "#{aws_ssh_resolver} aws --ssh-config-file #{suite_runner_configs['ssh_config_file']} --ssh-config-init #{suite_runner_configs['ssh_config_init']}"
110
+ end
111
+
112
+
54
113
  # **********
55
114
  all_suites = test_suites.suite_ids.map{ |id| "suite:" + id }
56
115
  task :suites, :gen_opts do |t,args|
@@ -91,16 +150,36 @@ namespace :suite do
91
150
  # find the stack name for suite
92
151
  stack = test_suites.get_suite_stack_id( suite_id )
93
152
 
153
+ desc "#{suite_id} - syncrhornize #{suite_runner_configs['ssh_config_file']}"
154
+ task "#{suite_id}-sync", :gen_opts do |t,args|
155
+ ssh_client_config_synchronize( suite_runner_configs )
156
+ end
157
+
158
+ # json
159
+ task "#{suite_id}-json", :gen_opts do |t,args|
160
+ args.with_defaults( :gen_opts => "-m aws-must-templates" )
161
+ json_template="#{aws_must} gen #{stack}.yaml #{args.gen_opts}"
162
+ sh "#{json_template}"
163
+ end
164
+
165
+
166
+ desc "#{suite_id} - create stack '#{stack}', wait to complete, sync #{suite_runner_configs['ssh_config_file']}"
167
+ task "#{suite_id}-stack-start", :gen_opts do |t,args|
168
+ Rake::Task["suite:#{suite_id}-stack-create"].invoke(args.gen_opts)
169
+ Rake::Task["suite:#{suite_id}-stack-wait"].invoke()
170
+ Rake::Task["suite:#{suite_id}-sync"].invoke()
171
+ end
172
+
94
173
  # **********
95
174
  # Create stack for a suite
96
- desc "Create stack #{stack} for suite #{suite_id}"
175
+ desc "#{suite_id} - create stack '#{stack}'"
97
176
  task "#{suite_id}-stack-create", :gen_opts do |t,args|
98
177
  args.with_defaults( :gen_opts => "-m aws-must-templates" )
99
178
  json_template="#{aws_must} gen #{stack}.yaml #{args.gen_opts}"
100
179
  sh "aws cloudformation create-stack --stack-name #{stack} --capabilities CAPABILITY_IAM --template-body \"$(#{json_template})\" --disable-rollback"
101
180
  end
102
181
 
103
- desc "Create stack #{stack} for suite #{suite_id}"
182
+ desc "#{suite_id} - wait stack #{stack} #{END_STATES.join(', ')} "
104
183
  task "#{suite_id}-stack-wait" do
105
184
 
106
185
  while true
@@ -123,7 +202,7 @@ namespace :suite do
123
202
 
124
203
  # **********
125
204
  # delete stack for a suite
126
- desc "Delete stack #{stack} for suite #{suite_id}"
205
+ desc "#{suite_id} - delete stack #{stack}"
127
206
  task "#{suite_id}-stack-delete" do
128
207
  sh "aws cloudformation delete-stack --stack-name #{stack}"
129
208
  end
@@ -134,25 +213,28 @@ namespace :suite do
134
213
  end
135
214
 
136
215
  # **********
137
- desc "Show status for stack #{stack}"
216
+ desc "#{suite_id} - show status for stack #{stack}"
138
217
  task "#{suite_id}-stack-status" do
139
218
  sh "aws cloudformation describe-stacks --stack-name #{stack}"
140
219
  end
141
220
 
142
221
  # **********
143
222
  # Test common roles for suite
144
- desc "Suite #{suite_id} - common roles"
223
+ desc "#{suite_id} - common roles"
145
224
  RSpec::Core::RakeTask.new( "#{suite_id}-common" ) do |t|
146
- puts "------------------------------------------------------------------"
147
- puts "suite=#{suite_id }"
148
225
 
149
- # see spec/spec_helper.rb
150
- ENV['TARGET_SUITE_ID'] = suite_id
226
+ set_rspec_task( t, suite_runner_configs, test_suites, suite_id )
227
+
228
+ # puts "------------------------------------------------------------------"
229
+ # puts "suite=#{suite_id }"
230
+
231
+ # # see spec/spec_helper.rb
232
+ # ENV['TARGET_SUITE_ID'] = suite_id
151
233
 
152
234
  # test all roles for the instance
153
- t.rspec_opts = rspec_opts( suite_id )
154
- t.fail_on_error = false
155
- t.ruby_opts= rspec_ruby_opts
235
+ # t.rspec_opts = rspec_opts( suite_id )
236
+ # t.fail_on_error = false
237
+ # t.ruby_opts= rspec_ruby_opts
156
238
  # t.pattern = suite["roles"].map { |r| spec_pattern( r ) }.join(",")
157
239
  t.pattern = test_suites.suite_role_ids( suite_id ).map{ |r| spec_pattern( r ) }.join(",")
158
240
 
@@ -161,18 +243,18 @@ namespace :suite do
161
243
 
162
244
 
163
245
  # **********
164
- # Run tasks for suite suite_id
246
+ # Run tasks for 'suite_id'
165
247
 
166
- desc "Run all takss for suite '#{suite_id}' - {suite['desc']"
248
+ desc "#{suite_id} - #{test_suites.get_suite(suite_id)['desc']}"
167
249
  suite_tasks =
168
250
  [
169
251
  "suite:report_dir",
170
252
  [ "suite:#{suite_id}-stack-create", "gen_opts" ],
171
- "suite:#{suite_id}-stack-wait",
253
+ "suite:#{suite_id}-stack-wait",
254
+ "suite:#{suite_id}-sync",
172
255
  ] +
173
256
  ( Rake::Task.task_defined?( "suite:#{suite_id}-common" ) ? [ "suite:#{suite_id}-common" ] : [] ) +
174
- # ( suite["instances"] ? suite["instances"].each.map{ |a| "suite:#{suite_id}:" + a.keys.first } : [] ) +
175
- ( test_suites.suite_instance_ids( suite_id ).each.map{ |instance_id| "suite:#{suite_id}:" + instance_id } ) +
257
+ ( test_suites.suite_instance_names( suite_id ).each.map{ |instance_name| "suite:#{suite_id}:" + instance_name } ) +
176
258
  [ "suite:#{suite_id}-stack-delete" ]
177
259
 
178
260
  task suite_id, :gen_opts do |ta,args|
@@ -185,6 +267,7 @@ namespace :suite do
185
267
  taskname = task.shift
186
268
  Rake::Task[taskname].invoke( *(task.select{ |arg_name| args[arg_name]}.map{ |arg_name| args[arg_name] }) )
187
269
  else
270
+ taskname = task
188
271
  Rake::Task[task].invoke( args )
189
272
  end
190
273
  failed_tasks << task unless ( $?.nil? || $?.success? )
@@ -192,7 +275,7 @@ namespace :suite do
192
275
  # sh "rake #{t}; true"
193
276
  rescue => e
194
277
  puts "#{e.class}: #{e.message}"
195
- failed_tasks << task
278
+ failed_tasks << taskname
196
279
  # puts e.backtrace
197
280
  puts "continue with next task"
198
281
  end
@@ -213,37 +296,19 @@ namespace :suite do
213
296
  namespace suite_id do
214
297
 
215
298
  # suite["instances"].each do |instance_map|
216
- test_suites.suite_instance_ids( suite_id ).each do |instance_id|
299
+ test_suites.suite_instance_names( suite_id ).each do |instance_name|
217
300
 
218
- # instance_id = instance_map.keys.first
219
- # instance = instance_map[instance_id]
301
+ # instance_name = instance_map.keys.first
302
+ # instance = instance_map[instance_name]
220
303
 
221
304
  # **********
222
- desc "Test roles for instance '#{instance_id}' in suite '#{suite_id}'"
223
- RSpec::Core::RakeTask.new( instance_id ) do |t|
224
-
225
- puts "------------------------------------------------------------------"
226
- puts "suite=#{suite_id }, instance=#{instance_id}"
227
-
228
- # see spec/spec_helper.rb
229
- ENV['TARGET_SUITE_ID'] = suite_id
230
- ENV['TARGET_INSTANCE_ID'] = instance_id
231
-
232
- t.rspec_opts = rspec_opts( suite_id, instance_id )
233
- t.fail_on_error = false
234
- t.ruby_opts= rspec_ruby_opts
235
-
236
- # test all roles for the instance
237
- pattern = test_suites.suite_instance_role_ids( suite_id, instance_id ).map{ |r| spec_pattern( r ) }.join(",")
238
- raise <<-EOS if pattern.nil? || pattern.empty?
305
+ desc "#{suite_id} - test instance '#{instance_name}'"
306
+ RSpec::Core::RakeTask.new( instance_name ) do |t|
239
307
 
240
- No tests defined for an instance in suite=#{suite_id }, instance=#{instance_id}
241
-
242
- EOS
243
- t.pattern = pattern
308
+ set_rspec_task( t, suite_runner_configs, test_suites, suite_id, instance_name )
244
309
 
245
310
  end
246
- end # instance_ids
311
+ end # instance_names
247
312
  end # ns suite_id
248
313
 
249
314
  end # suite_properties.each
@@ -278,20 +343,57 @@ namespace :suite do
278
343
  end
279
344
 
280
345
  # to pass to rpsec
281
- def rspec_opts( suite_id, instance_id=nil )
346
+ def rspec_opts( suite_id, instance_name=nil )
282
347
  # "--format documentation"
283
- # "--format progress --format documentation --out generated-docs/suites/#{suite_id}#{ instance_id ? '-'+instance_id : ""}.txt"
284
- "--format progress --format documentation --out #{suite_test_report_filepath( suite_id, instance_id )}"
348
+ # "--format progress --format documentation --out generated-docs/suites/#{suite_id}#{ instance_name ? '-'+instance_name : ""}.txt"
349
+ "--format progress --format documentation --out #{suite_test_report_filepath( suite_id, instance_name )}"
285
350
  end
286
351
 
287
- def suite_test_report_filepath( suite_id, instance_id=nil )
288
- "#{suite_test_report_dirpath()}/#{suite_id}#{ instance_id ? '-' + instance_id : ""}.txt"
352
+ def suite_test_report_filepath( suite_id, instance_name=nil )
353
+ "#{suite_test_report_dirpath()}/#{suite_id}#{ instance_name ? '-' + instance_name : ""}.txt"
289
354
  end
290
355
 
291
356
  def suite_test_report_dirpath
292
357
  "generated-docs/suites"
293
358
  end
294
359
 
360
+ # read ec2 instance metadata && update 'ssh_config_file'
361
+ def ssh_client_config_synchronize( suite_runner_configs )
362
+ aws_ssh_resolver="aws-ssh-resolver.rb"
363
+ sh "#{aws_ssh_resolver} aws --ssh-config-file #{suite_runner_configs['ssh_config_file']} --ssh-config-init #{suite_runner_configs['ssh_config_init']}"
364
+ end
365
+
366
+ def set_rspec_task( t, suite_runner_configs, test_suites, suite_id, instance_name=nil )
367
+
368
+ puts "------------------------------------------------------------------"
369
+ puts "suite=#{suite_id } #{instance_name ? ' instance: ' + instance_name : ''}"
370
+
371
+ # see spec/spec_helper.rb
372
+ ENV['TARGET_SUITE_ID'] = suite_id
373
+ if instance_name then
374
+ ENV['TARGET_INSTANCE_NAME'] = instance_name
375
+ else
376
+ ENV.delete('TARGET_INSTANCE_NAME')
377
+ end
378
+ ENV['AWS_REGION'] = suite_runner_configs["aws_region"] if suite_runner_configs["aws_region"]
379
+
380
+ t.rspec_opts = rspec_opts( suite_id, instance_name )
381
+ t.fail_on_error = false
382
+ t.ruby_opts= rspec_ruby_opts
383
+
384
+ # test all roles for the instance
385
+ pattern = (instance_name ?
386
+ test_suites.suite_instance_role_ids( suite_id, instance_name ).map{ |r| spec_pattern( r ) }.join(",") :
387
+ test_suites.suite_role_ids( suite_id ).map{ |r| spec_pattern( r ) }.join(",") )
388
+
389
+ raise <<-EOS if pattern.nil? || pattern.empty?
390
+
391
+ No tests defined for an instance in suite=#{suite_id } #{instance_name ? ' for instance ' + instance_name : ''}
392
+
393
+ EOS
394
+ t.pattern = pattern
395
+
396
+ end
295
397
 
296
398
 
297
399
  end # ns suite
@@ -53,7 +53,7 @@ module AwsMustTemplates
53
53
 
54
54
  # ------------------------------------------------------------------
55
55
  # return list of instanceid for a suite
56
- def suite_instance_ids( suite_id )
56
+ def suite_instance_names( suite_id )
57
57
  suite = get_suite( suite_id )
58
58
  return nil unless suite
59
59
  return suite["instances"] ? suite["instances"].map{ |instance_hash| instance_hash.keys.first } : []
@@ -75,21 +75,21 @@ module AwsMustTemplates
75
75
  return suite_id
76
76
  end
77
77
 
78
- # return array of role_ids for 'instance_id' in 'suite_id'
79
- def suite_instance_role_ids( suite_id, instance_id )
80
- roles = suite_instance_roles( suite_id, instance_id )
78
+ # return array of role_ids for 'instance_name' in 'suite_id'
79
+ def suite_instance_role_ids( suite_id, instance_name )
80
+ roles = suite_instance_roles( suite_id, instance_name )
81
81
  return roles unless roles
82
82
  return roles.map{ |r| r.is_a?( Hash ) ? r.keys.first : r }
83
83
  end
84
84
 
85
- # return roles for 'instance_id' in 'suite_id'
86
- def suite_instance_roles( suite_id, instance_id )
87
- instance = suite_instance( suite_id, instance_id )
85
+ # return roles for 'instance_name' in 'suite_id'
86
+ def suite_instance_roles( suite_id, instance_name )
87
+ instance = suite_instance( suite_id, instance_name )
88
88
  return nil unless instance
89
- return [] unless instance[instance_id]
90
- return [] unless instance[instance_id]["roles"]
89
+ return [] unless instance[instance_name]
90
+ return [] unless instance[instance_name]["roles"]
91
91
  # roles may be a hash or a string
92
- return instance[instance_id]["roles"]
92
+ return instance[instance_name]["roles"]
93
93
  end
94
94
 
95
95
 
@@ -98,11 +98,11 @@ module AwsMustTemplates
98
98
 
99
99
  private
100
100
 
101
- # instance sub document for `instance_id` in `suite_id`
102
- def suite_instance( suite_id, instance_id )
101
+ # instance sub document for `instance_name` in `suite_id`
102
+ def suite_instance( suite_id, instance_name )
103
103
  suite = get_suite( suite_id )
104
104
  return nil unless suite && suite["instances"]
105
- return suite["instances"].select { |i| i.keys.first == instance_id }.first
105
+ return suite["instances"].select { |i| i.keys.first == instance_name }.first
106
106
  end
107
107
 
108
108