cloud-mu 3.1.4 → 3.1.5

Sign up to get free protection for your applications and to get access to all the features.
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