cloud-mu 3.1.4 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/ansible/roles/mu-windows/README.md +33 -0
  3. data/ansible/roles/mu-windows/defaults/main.yml +2 -0
  4. data/ansible/roles/mu-windows/handlers/main.yml +2 -0
  5. data/ansible/roles/mu-windows/meta/main.yml +53 -0
  6. data/ansible/roles/mu-windows/tasks/main.yml +20 -0
  7. data/ansible/roles/mu-windows/tests/inventory +2 -0
  8. data/ansible/roles/mu-windows/tests/test.yml +5 -0
  9. data/ansible/roles/mu-windows/vars/main.yml +2 -0
  10. data/cloud-mu.gemspec +4 -2
  11. data/cookbooks/mu-tools/recipes/selinux.rb +2 -1
  12. data/cookbooks/mu-tools/recipes/windows-client.rb +140 -144
  13. data/cookbooks/mu-tools/resources/windows_users.rb +44 -43
  14. data/extras/image-generators/AWS/win2k12.yaml +16 -13
  15. data/extras/image-generators/AWS/win2k16.yaml +16 -13
  16. data/extras/image-generators/AWS/win2k19.yaml +19 -0
  17. data/modules/mu.rb +72 -9
  18. data/modules/mu/adoption.rb +14 -2
  19. data/modules/mu/cloud.rb +111 -10
  20. data/modules/mu/clouds/aws.rb +23 -7
  21. data/modules/mu/clouds/aws/container_cluster.rb +640 -692
  22. data/modules/mu/clouds/aws/dnszone.rb +49 -45
  23. data/modules/mu/clouds/aws/firewall_rule.rb +177 -214
  24. data/modules/mu/clouds/aws/role.rb +17 -8
  25. data/modules/mu/clouds/aws/search_domain.rb +1 -1
  26. data/modules/mu/clouds/aws/server.rb +734 -1027
  27. data/modules/mu/clouds/aws/userdata/windows.erb +2 -1
  28. data/modules/mu/clouds/aws/vpc.rb +297 -786
  29. data/modules/mu/clouds/aws/vpc_subnet.rb +286 -0
  30. data/modules/mu/clouds/google/bucket.rb +1 -1
  31. data/modules/mu/clouds/google/container_cluster.rb +21 -17
  32. data/modules/mu/clouds/google/function.rb +8 -2
  33. data/modules/mu/clouds/google/server.rb +102 -32
  34. data/modules/mu/clouds/google/vpc.rb +1 -1
  35. data/modules/mu/config.rb +12 -1
  36. data/modules/mu/config/server.yml +1 -0
  37. data/modules/mu/defaults/AWS.yaml +51 -28
  38. data/modules/mu/groomers/ansible.rb +54 -17
  39. data/modules/mu/groomers/chef.rb +13 -7
  40. data/modules/mu/master/ssl.rb +0 -1
  41. data/modules/mu/mommacat.rb +8 -0
  42. data/modules/tests/ecs.yaml +23 -0
  43. data/modules/tests/includes-and-params.yaml +2 -1
  44. data/modules/tests/server-with-scrub-muisms.yaml +1 -0
  45. data/modules/tests/win2k12.yaml +25 -0
  46. data/modules/tests/win2k16.yaml +25 -0
  47. data/modules/tests/win2k19.yaml +25 -0
  48. data/requirements.txt +1 -0
  49. metadata +50 -4
  50. data/extras/image-generators/AWS/windows.yaml +0 -18
  51. data/modules/tests/needwork/win2k12.yaml +0 -13
@@ -513,7 +513,7 @@ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
513
513
  # @param target_subnets_key [String]: The subnet/subnets on the other side of the peered VPC.
514
514
  # @param instance_id [String]: The instance ID in the target subnet/subnets.
515
515
  # @return [Boolean]
516
- def self.have_route_peered_vpc?(source_subnets_key, target_subnets_key, instance_id)
516
+ def self.can_route_to_master_peer?(source_subnets_key, target_subnets_key, instance_id)
517
517
  end
518
518
 
519
519
  # Retrieves the route tables of used by subnets
@@ -180,8 +180,19 @@ module MU
180
180
  $file_format = MU::Config.guessFormat(path)
181
181
  $yaml_refs = {}
182
182
  erb = ERB.new(File.read(path), nil, "<>")
183
+ erb.filename = path
183
184
 
184
- raw_text = erb.result(erb_binding)
185
+ begin
186
+ raw_text = erb.result(erb_binding)
187
+ rescue NameError => e
188
+ loc = e.backtrace[0].sub(/:(\d+):.*/, ':\1')
189
+ msg = if e.message.match(/wrong constant name Config.getTail PLACEHOLDER ([^\s]+) REDLOHECALP/)
190
+ "Variable '#{Regexp.last_match[1]}' referenced in config, but not defined. Missing required parameter?"
191
+ else
192
+ e.message
193
+ end
194
+ raise ValidationError, msg+" at "+loc
195
+ end
185
196
  raw_json = nil
186
197
 
187
198
  # If we're working in YAML, do some magic to make includes work better.
@@ -7,6 +7,7 @@ vpc:
7
7
  platform: ubuntu
8
8
  ssh_user: ubuntu
9
9
  associate_public_ip: true
10
+ add_private_ips: 3
10
11
  canned_iam_policies:
11
12
  - AmazonDynamoDBReadOnlyAccess
12
13
  - AmazonElastiCacheFullAccess
@@ -73,33 +73,56 @@ ubuntu14:
73
73
  ap-southeast-1: ami-2855964b
74
74
  ap-southeast-2: ami-d19fc4b2
75
75
  win2k12r2: &1
76
- us-east-1: ami-055c10ae78f3a58a2
77
- us-east-2: ami-fbbe929e
78
- us-west-1: ami-ec91ac8c
79
- us-west-2: ami-106ca068
80
- eu-central-1: ami-59e15a36
81
- eu-west-1: ami-65b16b1c
82
- sa-east-1: ami-93d6afff
83
- ap-northeast-1: ami-dcd375ba
84
- ap-northeast-2: ami-fa2e8b94
85
- ap-southeast-1: ami-b61657d5
86
- ap-southeast-2: ami-9a7b97f8
87
- ap-south-1: ami-99a8eaf6
88
- ca-central-1: ami-608b3304
89
- win2k16:
90
- us-east-1: ami-d2cb25a8
91
- us-east-2: ami-2db59748
92
- us-west-1: ami-2db59748
93
- us-west-2: ami-3b47ba43
94
- eu-central-1: ami-37d46558
95
- eu-west-1: ami-06c5d662
96
- sa-east-1: ami-53fd803f
97
- ap-northeast-1: ami-ce8b42a8
98
- ap-northeast-2: ami-c17ca7af
99
- ap-southeast-1: ami-fe51279d
100
- ap-southeast-2: ami-792bcd1b
101
- ap-south-1: ami-448dcb2b
102
- ca-central-1: ami-a39920c7
76
+ us-east-1: ami-00f7cf8d57d29a8a7
77
+ us-east-2: ami-0c14a2a9b1d88428d
78
+ ca-central-1: ami-0210e4efc4186f89d
79
+ us-west-2: ami-036681205605cba8c
80
+ us-west-1: ami-072d0f2b03f351e5c
81
+ eu-west-1: ami-061524b3efcc026da
82
+ eu-west-2: ami-0a7aeb2dae7c7154b
83
+ eu-west-3: ami-0b16adff6701f08bb
84
+ eu-north-1: ami-09bd34c6465aa914b
85
+ sa-east-1: ami-078221cae70b179c4
86
+ eu-central-1: ami-047d37ec58a8469fb
87
+ ap-northeast-1: ami-0ce23ffef990003d2
88
+ ap-south-1: ami-0106284f16a19651a
89
+ ap-northeast-2: ami-0518e43d0367f1a6d
90
+ ap-southeast-1: ami-0858019a829a5169d
91
+ ap-southeast-2: ami-0e0d7d3acb6427f53
92
+ win2k16: &5
93
+ us-east-1: ami-090dd1749dc0be91d
94
+ us-east-2: ami-09c9eeb95291e63d7
95
+ ca-central-1: ami-0c63a53a15fca4238
96
+ us-west-2: ami-0b8540e9a207143eb
97
+ eu-west-1: ami-067b5d8d85d3c8cf8
98
+ us-west-1: ami-0a2dc7e2cf21ab3e9
99
+ eu-west-2: ami-0cece465ae4b18027
100
+ eu-west-3: ami-0cc5f29ed6e0e8a67
101
+ eu-central-1: ami-02d4da18299373531
102
+ sa-east-1: ami-021d5c906c1898430
103
+ ap-northeast-1: ami-01129c98f812a3be7
104
+ ap-south-1: ami-005c7910458e9541d
105
+ ap-northeast-2: ami-024840a881c449d78
106
+ ap-southeast-2: ami-070af17644a596301
107
+ ap-southeast-1: ami-0bc2e098a07140bc4
108
+ eu-north-1: ami-03dcc78d77d2ee027
109
+ win2k19:
110
+ us-east-1: ami-09946f18cbcdce65c
111
+ us-east-2: ami-02ab72768678bb7d0
112
+ ca-central-1: ami-0fcf1b24169d88d7f
113
+ us-west-2: ami-025ca67c85e4e147d
114
+ eu-west-2: ami-08a0e09c469e6a557
115
+ us-west-1: ami-05960eb854f91cbb8
116
+ eu-west-1: ami-0f91d02c05561cf5b
117
+ eu-central-1: ami-0faafc220143c941c
118
+ eu-west-3: ami-0d2a0b6f21c7ce4a2
119
+ eu-north-1: ami-0fecae116e9e331bf
120
+ sa-east-1: ami-050693ece618acaa5
121
+ ap-northeast-2: ami-0e0ebd96765911d72
122
+ ap-northeast-1: ami-0729606d0a4051499
123
+ ap-southeast-1: ami-06ba249ee50ee9669
124
+ ap-southeast-2: ami-03a051a6d0f2b79d5
125
+ ap-south-1: ami-02c287a24c5e872f6
103
126
  amazon:
104
127
  us-east-1: ami-b73b63a0
105
128
  us-east-2: ami-58277d3d
@@ -114,7 +137,7 @@ amazon:
114
137
  ap-southeast-1: ami-b953f2da
115
138
  ap-southeast-2: ami-db704cb8
116
139
  win2k12: *1
117
- windows: *1
140
+ windows: *5
118
141
  ubuntu: *2
119
142
  centos: *3
120
143
  rhel7: *4
@@ -66,6 +66,7 @@ module MU
66
66
  # @param permissions [Boolean]: If true, save the secret under the current active deploy (if any), rather than in the global location for this user
67
67
  # @param deploy_dir [String]: If permissions is +true+, save the secret here
68
68
  def self.saveSecret(vault: nil, item: nil, data: nil, permissions: false, deploy_dir: nil)
69
+
69
70
  if vault.nil? or vault.empty? or item.nil? or item.empty?
70
71
  raise MuError, "Must call saveSecret with vault and item names"
71
72
  end
@@ -73,7 +74,6 @@ module MU
73
74
  raise MuError, "Ansible vault/item names cannot include forward slashes"
74
75
  end
75
76
  pwfile = vaultPasswordFile
76
-
77
77
 
78
78
  dir = if permissions
79
79
  if deploy_dir
@@ -95,8 +95,9 @@ module MU
95
95
  if File.exist?(path)
96
96
  MU.log "Overwriting existing vault #{vault} item #{item}"
97
97
  end
98
+
98
99
  File.open(path, File::CREAT|File::RDWR|File::TRUNC, 0600) { |f|
99
- f.write data
100
+ f.write data.to_yaml
100
101
  }
101
102
 
102
103
  cmd = %Q{#{ansibleExecDir}/ansible-vault encrypt #{path} --vault-password-file #{pwfile}}
@@ -115,14 +116,23 @@ module MU
115
116
  # @param item [String]: The item within the repository to retrieve
116
117
  # @param field [String]: OPTIONAL - A specific field within the item to return.
117
118
  # @return [Hash]
118
- def self.getSecret(vault: nil, item: nil, field: nil)
119
+ def self.getSecret(vault: nil, item: nil, field: nil, deploy_dir: nil)
119
120
  if vault.nil? or vault.empty?
120
121
  raise MuError, "Must call getSecret with at least a vault name"
121
122
  end
122
-
123
123
  pwfile = vaultPasswordFile
124
- dir = secret_dir+"/"+vault
125
- if !Dir.exist?(dir)
124
+
125
+ dir = nil
126
+ try = [secret_dir+"/"+vault]
127
+ try << deploy_dir+"/ansible/vaults/"+vault if deploy_dir
128
+ try << MU.mommacat.deploy_dir+"/ansible/vaults/"+vault if MU.mommacat.deploy_dir
129
+ try.each { |maybe_dir|
130
+ if Dir.exist?(maybe_dir) and (item.nil? or File.exist?(maybe_dir+"/"+item))
131
+ dir = maybe_dir
132
+ break
133
+ end
134
+ }
135
+ if dir.nil?
126
136
  raise MuNoSuchSecret, "No such vault #{vault}"
127
137
  end
128
138
 
@@ -135,17 +145,23 @@ module MU
135
145
  cmd = %Q{#{ansibleExecDir}/ansible-vault view #{itempath} --vault-password-file #{pwfile}}
136
146
  MU.log cmd
137
147
  a = `#{cmd}`
138
- # If we happen to have stored recognizeable JSON, return it as parsed,
139
- # which is a behavior we're used to from Chef vault. Otherwise, return
140
- # a String.
148
+ # If we happen to have stored recognizeable JSON or YAML, return it
149
+ # as parsed, which is a behavior we're used to from Chef vault.
150
+ # Otherwise, return a String.
141
151
  begin
142
152
  data = JSON.parse(a)
143
- if field and data[field]
144
- data = data[field]
145
- end
146
153
  rescue JSON::ParserError
147
- data = a
154
+ begin
155
+ data = YAML.load(a)
156
+ rescue Psych::SyntaxError => e
157
+ data = a
158
+ end
148
159
  end
160
+ [vault, item, field].each { |tier|
161
+ if data and data.is_a?(Hash) and tier and data[tier]
162
+ data = data[tier]
163
+ end
164
+ }
149
165
  else
150
166
  data = []
151
167
  Dir.foreach(dir) { |entry|
@@ -160,7 +176,7 @@ module MU
160
176
 
161
177
  # see {MU::Groomer::Ansible.getSecret}
162
178
  def getSecret(vault: nil, item: nil, field: nil)
163
- self.class.getSecret(vault: vault, item: item, field: field)
179
+ self.class.getSecret(vault: vault, item: item, field: field, deploy_dir: @server.deploy.deploy_dir)
164
180
  end
165
181
 
166
182
  # Delete a Ansible data bag / Vault
@@ -215,7 +231,9 @@ module MU
215
231
  play = {
216
232
  "hosts" => @server.config['name']
217
233
  }
218
- play["become"] = "yes" if @server.config['ssh_user'] != "root"
234
+ if !@server.windows? and @server.config['ssh_user'] != "root"
235
+ play["become"] = "yes"
236
+ end
219
237
  play["roles"] = override_runlist if @server.config['run_list'] and !@server.config['run_list'].empty?
220
238
  play["vars"] = @server.config['ansible_vars'] if @server.config['ansible_vars']
221
239
 
@@ -252,6 +270,7 @@ module MU
252
270
  sleep 30
253
271
  retries += 1
254
272
  MU.log "Failed Ansible run, will retry (#{retries.to_s}/#{max_retries.to_s})", MU::NOTICE, details: cmd
273
+
255
274
  retry
256
275
  else
257
276
  tmpfile.unlink if tmpfile
@@ -280,7 +299,7 @@ module MU
280
299
  "hosts" => @server.config['name']
281
300
  }
282
301
 
283
- if @server.config['ssh_user'] != "root"
302
+ if !@server.windows? and @server.config['ssh_user'] != "root"
284
303
  play["become"] = "yes"
285
304
  end
286
305
 
@@ -292,9 +311,26 @@ module MU
292
311
  play["vars"] = @server.config['ansible_vars']
293
312
  end
294
313
 
314
+ if @server.windows?
315
+ play["vars"] ||= {}
316
+ play["vars"]["ansible_connection"] = "winrm"
317
+ play["vars"]["ansible_winrm_scheme"] = "https"
318
+ play["vars"]["ansible_winrm_transport"] = "ntlm"
319
+ play["vars"]["ansible_winrm_server_cert_validation"] = "ignore" # XXX this sucks; use Mu_CA.pem if we can get it to work
320
+ # play["vars"]["ansible_winrm_ca_trust_path"] = "#{MU.mySSLDir}/Mu_CA.pem"
321
+ play["vars"]["ansible_user"] = @server.config['windows_admin_username']
322
+ win_pw = @server.getWindowsAdminPassword
323
+
324
+ pwfile = MU::Groomer::Ansible.vaultPasswordFile
325
+ cmd = %Q{#{MU::Groomer::Ansible.ansibleExecDir}/ansible-vault}
326
+ output = %x{#{cmd} encrypt_string '#{win_pw.gsub(/'/, "\\\\'")}' --vault-password-file #{pwfile}}
327
+
328
+ play["vars"]["ansible_password"] = output
329
+ end
330
+
295
331
  File.open(@ansible_path+"/"+@server.config['name']+".yml", File::CREAT|File::RDWR|File::TRUNC, 0600) { |f|
296
332
  f.flock(File::LOCK_EX)
297
- f.puts [play].to_yaml
333
+ f.puts [play].to_yaml.sub(/ansible_password: \|-?[\n\s]+/, 'ansible_password: ') # Ansible doesn't like this (legal) YAML
298
334
  f.flock(File::LOCK_UN)
299
335
  }
300
336
  end
@@ -388,6 +424,7 @@ module MU
388
424
  if !system(cmd, "encrypt_string", string, "--name", name, "--vault-password-file", pwfile)
389
425
  raise MuError, "Failed Ansible command: #{cmd} encrypt_string <redacted> --name #{name} --vault-password-file"
390
426
  end
427
+ output
391
428
  end
392
429
 
393
430
  # Hunt down and return a path for Ansible executables
@@ -329,7 +329,7 @@ module MU
329
329
  }
330
330
  else
331
331
  MU.log "Invoking Chef over WinRM on #{@server.mu_name}: #{purpose}"
332
- winrm = @server.getWinRMSession(haveBootstrapped? ? 1 : max_retries)
332
+ winrm = @server.getWinRMSession(haveBootstrapped? ? 2 : max_retries)
333
333
  if @server.windows? and @server.windowsRebootPending?(winrm)
334
334
  # Windows frequently gets stuck here
335
335
  if retries > 5
@@ -415,9 +415,9 @@ module MU
415
415
  if retries < max_retries
416
416
  retries += 1
417
417
  MU.log "#{@server.mu_name}: Chef run '#{purpose}' failed after #{Time.new - runstart} seconds, retrying (#{retries}/#{max_retries})", MU::WARN, details: e.message.dup
418
- if purpose != "Base Windows configuration"
419
- windows_try_ssh = !windows_try_ssh
420
- end
418
+ # if purpose != "Base Windows configuration"
419
+ # windows_try_ssh = !windows_try_ssh
420
+ # end
421
421
  if e.is_a?(WinRM::WinRMError)
422
422
  if @server.windows? and retries >= 3 and retries % 3 == 0
423
423
  # Mix in a hard reboot if WinRM isn't answering
@@ -623,9 +623,15 @@ module MU
623
623
  kb.config[:winrm_port] = 5986
624
624
  kb.config[:session_timeout] = timeout
625
625
  kb.config[:operation_timeout] = timeout
626
- kb.config[:winrm_authentication_protocol] = :cert
627
- kb.config[:winrm_client_cert] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.crt"
628
- kb.config[:winrm_client_key] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.key"
626
+ if retries % 2 == 0
627
+ kb.config[:winrm_authentication_protocol] = :basic
628
+ kb.config[:winrm_user] = @server.config['windows_admin_username']
629
+ kb.config[:winrm_password] = @server.getWindowsAdminPassword
630
+ else
631
+ kb.config[:winrm_authentication_protocol] = :cert
632
+ kb.config[:winrm_client_cert] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.crt"
633
+ kb.config[:winrm_client_key] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.key"
634
+ end
629
635
  # kb.config[:ca_trust_file] = "#{MU.mySSLDir}/Mu_CA.pem"
630
636
  # XXX ca_trust_file doesn't work for some reason, so we have to set the below for now
631
637
  kb.config[:winrm_ssl_verify_mode] = :verify_none
@@ -160,7 +160,6 @@ module MU
160
160
 
161
161
  key = getKey(name, for_user: for_user)
162
162
 
163
- puts cn_str
164
163
  cn = OpenSSL::X509::Name.parse(cn_str)
165
164
 
166
165
  # If we're generating our local CA, we're not really doing a CSR, but
@@ -976,8 +976,15 @@ module MU
976
976
  nil
977
977
  elsif !mu_name.nil?
978
978
  mu_name
979
+ # AWS-style tags
980
+ elsif descriptor.respond_to?(:tags) and
981
+ descriptor.tags.is_a?(Array) and
982
+ descriptor.tags.first.respond_to?(:key) and
983
+ descriptor.tags.map { |t| t.key }.include?("Name")
984
+ descriptor.tags.select { |t| t.key == "Name" }.first.value
979
985
  else
980
986
  try = nil
987
+ # Various GCP fields
981
988
  [:display_name, :name, (resourceclass.cfg_name+"_name").to_sym].each { |field|
982
989
  if descriptor.respond_to?(field) and descriptor.send(field).is_a?(String)
983
990
  try = descriptor.send(field)
@@ -1568,6 +1575,7 @@ MESSAGE_END
1568
1575
  MU::Master::SSL.bootstrap
1569
1576
  sans = []
1570
1577
  sans << canonical_ip if canonical_ip
1578
+ sans << resource.mu_name.downcase if resource.mu_name and resource.mu_name != cert_cn
1571
1579
  # XXX were there other names we wanted to include?
1572
1580
  key = MU::Master::SSL.getKey(cert_cn, keysize: keysize)
1573
1581
  cert, pfx_cert = MU::Master::SSL.getCert(cert_cn, "/CN=#{cert_cn}/O=Mu/C=US", sans: sans, pfx: is_windows)
@@ -0,0 +1,23 @@
1
+ # Test ECS
2
+ # clouds: AWS
3
+ ---
4
+ appname: smoketest
5
+ vpcs:
6
+ - name: ecs
7
+ container_clusters:
8
+ - name: ecsplain
9
+ flavor: ECS
10
+ instance_type: t2.medium
11
+ vpc:
12
+ name: ecs
13
+ containers:
14
+ - name: nginx
15
+ image: "nginx:1.8"
16
+ - name: ecsfargate
17
+ flavor: Fargate
18
+ instance_type: t2.medium
19
+ vpc:
20
+ name: ecs
21
+ containers:
22
+ - name: nginx
23
+ image: "nginx:1.8"
@@ -7,7 +7,7 @@ appname: smoketest
7
7
  parameters:
8
8
  - name: instancesize
9
9
  prettyname: "Instance Size"
10
- default: <%= $environment == "prod" ? "t3.large" : "t3.small" %>
10
+ default: <%= $environment == "prod" ? "m4.large" : "t2.small" %>
11
11
  <%= include("poolparams-include.inc") %>
12
12
  vpcs:
13
13
  - name: parsemess
@@ -18,6 +18,7 @@ server_pools:
18
18
  - name: svr
19
19
  cloud: AWS
20
20
  ssh_user: ec2-user
21
+ platform: amazon
21
22
  tags:
22
23
  - key: Env
23
24
  value: <%= env %>
@@ -10,6 +10,7 @@ servers:
10
10
  - name: <%= name %>
11
11
  groomer: Ansible
12
12
  platform: centos7
13
+ ssh_user: centos
13
14
  cloud: <%= cloud %>
14
15
  <% if cloud == "AWS" %>
15
16
  size: t2.medium
@@ -0,0 +1,25 @@
1
+ # Windows Server tests
2
+ # clouds: AWS, Google
3
+ ---
4
+ appname: smoketest
5
+ us_only: true
6
+ vpcs:
7
+ - name: windows
8
+ cloud: <%= cloud %>
9
+ servers:
10
+ - name: win2k12
11
+ platform: win2k12
12
+ cloud: <%= cloud %>
13
+ <% if cloud == "AWS" %>
14
+ size: m4.large
15
+ <% elsif cloud == "Azure" %>
16
+ size: Standard_DS1_v2
17
+ <% elsif cloud == "Google" %>
18
+ size: n1-standard-2
19
+ <% end %>
20
+ vpc:
21
+ name: windows
22
+ subnet_pref: public
23
+ associate_public_ip: true
24
+ static_ip:
25
+ assign_ip: true
@@ -0,0 +1,25 @@
1
+ # Windows Server tests
2
+ # clouds: AWS, Google
3
+ ---
4
+ appname: smoketest
5
+ us_only: true
6
+ vpcs:
7
+ - name: windows
8
+ cloud: <%= cloud %>
9
+ servers:
10
+ - name: win2k16
11
+ platform: win2k16
12
+ cloud: <%= cloud %>
13
+ <% if cloud == "AWS" %>
14
+ size: m4.large
15
+ <% elsif cloud == "Azure" %>
16
+ size: Standard_DS1_v2
17
+ <% elsif cloud == "Google" %>
18
+ size: n1-standard-2
19
+ <% end %>
20
+ vpc:
21
+ name: windows
22
+ subnet_pref: public
23
+ associate_public_ip: true
24
+ static_ip:
25
+ assign_ip: true