cloud-mu 3.0.0beta → 3.0.0

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -8
  3. data/ansible/roles/mu-nat/README.md +33 -0
  4. data/ansible/roles/mu-nat/defaults/main.yml +3 -0
  5. data/ansible/roles/mu-nat/handlers/main.yml +2 -0
  6. data/ansible/roles/mu-nat/meta/main.yml +60 -0
  7. data/ansible/roles/mu-nat/tasks/main.yml +65 -0
  8. data/ansible/roles/mu-nat/tests/inventory +2 -0
  9. data/ansible/roles/mu-nat/tests/test.yml +5 -0
  10. data/ansible/roles/mu-nat/vars/main.yml +2 -0
  11. data/bin/mu-cleanup +2 -1
  12. data/bin/mu-configure +950 -948
  13. data/bin/mu-gen-docs +6 -0
  14. data/cloud-mu.gemspec +2 -2
  15. data/cookbooks/mu-tools/recipes/gcloud.rb +8 -1
  16. data/modules/mommacat.ru +1 -1
  17. data/modules/mu.rb +31 -39
  18. data/modules/mu/cloud.rb +11 -1
  19. data/modules/mu/clouds/aws.rb +8 -3
  20. data/modules/mu/clouds/aws/alarm.rb +5 -8
  21. data/modules/mu/clouds/aws/bucket.rb +15 -9
  22. data/modules/mu/clouds/aws/cache_cluster.rb +60 -26
  23. data/modules/mu/clouds/aws/collection.rb +4 -4
  24. data/modules/mu/clouds/aws/container_cluster.rb +50 -33
  25. data/modules/mu/clouds/aws/database.rb +25 -21
  26. data/modules/mu/clouds/aws/dnszone.rb +12 -14
  27. data/modules/mu/clouds/aws/endpoint.rb +5 -8
  28. data/modules/mu/clouds/aws/firewall_rule.rb +9 -4
  29. data/modules/mu/clouds/aws/folder.rb +4 -7
  30. data/modules/mu/clouds/aws/function.rb +5 -8
  31. data/modules/mu/clouds/aws/group.rb +5 -8
  32. data/modules/mu/clouds/aws/habitat.rb +2 -5
  33. data/modules/mu/clouds/aws/loadbalancer.rb +12 -16
  34. data/modules/mu/clouds/aws/log.rb +6 -9
  35. data/modules/mu/clouds/aws/msg_queue.rb +16 -19
  36. data/modules/mu/clouds/aws/nosqldb.rb +27 -18
  37. data/modules/mu/clouds/aws/notifier.rb +6 -9
  38. data/modules/mu/clouds/aws/role.rb +4 -7
  39. data/modules/mu/clouds/aws/search_domain.rb +50 -23
  40. data/modules/mu/clouds/aws/server.rb +20 -14
  41. data/modules/mu/clouds/aws/server_pool.rb +22 -12
  42. data/modules/mu/clouds/aws/storage_pool.rb +9 -14
  43. data/modules/mu/clouds/aws/user.rb +5 -8
  44. data/modules/mu/clouds/aws/userdata/linux.erb +7 -1
  45. data/modules/mu/clouds/aws/vpc.rb +16 -14
  46. data/modules/mu/clouds/azure.rb +1 -1
  47. data/modules/mu/clouds/azure/container_cluster.rb +1 -1
  48. data/modules/mu/clouds/azure/server.rb +16 -2
  49. data/modules/mu/clouds/azure/user.rb +1 -1
  50. data/modules/mu/clouds/azure/userdata/linux.erb +84 -80
  51. data/modules/mu/clouds/azure/vpc.rb +32 -13
  52. data/modules/mu/clouds/cloudformation/server.rb +1 -1
  53. data/modules/mu/clouds/google.rb +2 -3
  54. data/modules/mu/clouds/google/container_cluster.rb +9 -1
  55. data/modules/mu/clouds/google/firewall_rule.rb +6 -0
  56. data/modules/mu/clouds/google/role.rb +1 -3
  57. data/modules/mu/clouds/google/server.rb +25 -4
  58. data/modules/mu/clouds/google/user.rb +1 -1
  59. data/modules/mu/clouds/google/userdata/linux.erb +9 -5
  60. data/modules/mu/clouds/google/vpc.rb +102 -21
  61. data/modules/mu/config.rb +250 -49
  62. data/modules/mu/config/alarm.rb +1 -0
  63. data/modules/mu/config/container_cluster.yml +0 -1
  64. data/modules/mu/config/database.yml +4 -1
  65. data/modules/mu/config/search_domain.yml +4 -3
  66. data/modules/mu/config/server.rb +7 -3
  67. data/modules/mu/config/server.yml +4 -1
  68. data/modules/mu/config/server_pool.yml +2 -0
  69. data/modules/mu/config/vpc.rb +42 -29
  70. data/modules/mu/deploy.rb +12 -5
  71. data/modules/mu/groomers/ansible.rb +4 -1
  72. data/modules/mu/groomers/chef.rb +5 -1
  73. data/modules/mu/kittens.rb +60 -11
  74. data/modules/mu/logger.rb +6 -4
  75. data/modules/mu/mommacat.rb +39 -19
  76. data/modules/mu/mu.yaml.rb +276 -0
  77. metadata +13 -4
@@ -248,6 +248,7 @@ module MU
248
248
  # ok = false
249
249
  #end
250
250
  end
251
+ alarm["notification_endpoint"] ||= MU.muCfg['mu_admin_email']
251
252
 
252
253
  if alarm["dimensions"]
253
254
  alarm["dimensions"].each{ |dimension|
@@ -5,7 +5,6 @@ instance_type: t2.medium
5
5
  instance_count: 4
6
6
  kubernetes:
7
7
  max_pods: 10
8
- instance_subnet_pref: all_public
9
8
  platform: centos
10
9
  # This stanza is optional; normal deployments to EKS might be done with kubectl
11
10
  # or through a CI tool such as GitLab
@@ -11,14 +11,17 @@ auto_minor_version_upgrade: false
11
11
  backup_retention_period: 10
12
12
  cluster_node_count: 2
13
13
  create_cluster: true
14
+ vpc:
15
+ vpc_name: <%= vpc_name %>
14
16
  create_read_replica: true
15
17
  master_user: Bob
16
18
  multi_az_on_create: true
17
- region: us-west-2
18
19
 
19
20
  <% else %> # IF NOT COMPLEX THEN ASSUME SIMPLE
20
21
 
21
22
  name: database-simple
23
+ vpc:
24
+ vpc_name: <%= vpc_name %>
22
25
  size: <%= db_size %>
23
26
  engine: mariadb
24
27
  storage: 5
@@ -3,11 +3,12 @@
3
3
  name: searchdomain-complex
4
4
  instance_type: t2.small.elasticsearch
5
5
  instance_count: 4
6
- dedicated_masters: 1
6
+ dedicated_masters: 3
7
7
  master_instance_type: t2.medium.elasticsearch
8
8
  zone_aware: true
9
- ebs_iops: 100
10
- ebs_type: gp2
9
+ #ebs_iops: 100 # also has value restrictions, eesh
10
+ #ebs_size: 35 # this is somehow locked to instance type
11
+ #ebs_type: gp2
11
12
  elasticsearch_version: "6.2"
12
13
  advanced_options:
13
14
  "indices.query.bool.max_clause_count": 512
@@ -146,9 +146,13 @@ module MU
146
146
  "default" => true
147
147
  },
148
148
  "groom" => {
149
- "type" => "boolean",
150
- "default" => true,
151
- "description" => "Whether to run a host configuration agent, e.g. Chef, when bootstrapping"
149
+ "type" => "boolean",
150
+ "default" => true,
151
+ "description" => "Whether to run a host configuration agent, e.g. Chef, when bootstrapping"
152
+ },
153
+ "groomer_variables" => {
154
+ "type" => "object",
155
+ "description" => "Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense."
152
156
  },
153
157
  "groomer_timeout" => {
154
158
  "type" => "integer",
@@ -1,8 +1,11 @@
1
1
  <% if $complexity == 'complex' %>
2
2
  name: servercomplex
3
3
  size: <%= instance_type %>
4
- # TODO: BUILD OUT COMPLEX EXAMPLE
4
+ vpc:
5
+ vpc_name: <%= vpc_name %>
5
6
  <% else %>
6
7
  name: serversimple
7
8
  size: <%= instance_type %>
9
+ vpc:
10
+ vpc_name: <%= vpc_name %>
8
11
  <% end %>
@@ -1,6 +1,8 @@
1
1
  <% if $complexity == 'complex' %>
2
2
  name: <%= server_pools_name %>
3
3
  cloud: AWS
4
+ vpc:
5
+ vpc_name: <%= vpc_name %>
4
6
  alarms:
5
7
  - comparison_operator: "GreaterThanThreshold"
6
8
  metric_name: "HTTPCode_Target_5XX_Count"
@@ -417,8 +417,22 @@ module MU
417
417
 
418
418
  using_default_cidr = false
419
419
  if !vpc['ip_block']
420
- using_default_cidr = true
421
- vpc['ip_block'] = "10.0.0.0/16"
420
+ if configurator.updating and configurator.existing_deploy and
421
+ configurator.existing_deploy.original_config['vpcs']
422
+ pieces = []
423
+ configurator.existing_deploy.original_config['vpcs'].each { |v|
424
+ if v['name'] == vpc['name']
425
+ vpc['ip_block'] = v['ip_block']
426
+ break
427
+ elsif v['virtual_name'] == vpc['name']
428
+ vpc['ip_block'] = v['parent_block']
429
+ break
430
+ end
431
+ }
432
+ else
433
+ using_default_cidr = true
434
+ vpc['ip_block'] = "10.0.0.0/16"
435
+ end
422
436
  end
423
437
 
424
438
  # Look for a common YAML screwup in route table land
@@ -439,33 +453,34 @@ module MU
439
453
  rtb['routes'].uniq!
440
454
  }
441
455
 
442
- # if we're peering with other on-the-fly VPCs who might be using
443
- # the default range, make sure our ip_blocks don't overlap
444
456
  peer_blocks = []
445
- my_cidr = NetAddr::IPv4Net.parse(vpc['ip_block'].to_s)
446
- if vpc["peers"]
447
- siblings = configurator.haveLitterMate?(nil, "vpcs", has_multiple: true)
457
+ siblings = configurator.haveLitterMate?(nil, "vpcs", has_multiple: true)
458
+ if siblings
448
459
  siblings.each { |v|
449
460
  next if v['name'] == vpc['name']
450
461
  peer_blocks << v['ip_block'] if v['ip_block']
451
462
  }
452
- if peer_blocks.size > 0 and using_default_cidr
453
- begin
454
- have_overlaps = false
455
- peer_blocks.each { |cidr|
456
- sibling_cidr = NetAddr::IPv4Net.parse(cidr)
457
- have_overlaps = true if my_cidr.rel(sibling_cidr) != nil
458
- }
459
- if have_overlaps
460
- my_cidr = my_cidr.next_sib
461
- my_cidr = nil if my_cidr.to_s.match(/^10\.255\./)
462
- end
463
- end while have_overlaps
464
- if !my_cidr.nil? and vpc['ip_block'] != my_cidr.to_s
465
- vpc['ip_block'] = my_cidr.to_s
466
- else
467
- my_cidr = NetAddr::IPv4Net.parse(vpc['ip_block'])
463
+ end
464
+
465
+ # if we're peering with other on-the-fly VPCs who might be using
466
+ # the default range, make sure our ip_blocks don't overlap
467
+ my_cidr = NetAddr::IPv4Net.parse(vpc['ip_block'].to_s)
468
+ if peer_blocks.size > 0 and using_default_cidr and !configurator.updating
469
+ begin
470
+ have_overlaps = false
471
+ peer_blocks.each { |cidr|
472
+ sibling_cidr = NetAddr::IPv4Net.parse(cidr.to_s)
473
+ have_overlaps = true if my_cidr.rel(sibling_cidr) != nil
474
+ }
475
+ if have_overlaps
476
+ my_cidr = my_cidr.next_sib
477
+ my_cidr = nil if my_cidr.to_s.match(/^10\.255\./)
468
478
  end
479
+ end while have_overlaps
480
+ if !my_cidr.nil? and vpc['ip_block'] != my_cidr.to_s
481
+ vpc['ip_block'] = my_cidr.to_s
482
+ else
483
+ my_cidr = NetAddr::IPv4Net.parse(vpc['ip_block'])
469
484
  end
470
485
  end
471
486
 
@@ -501,7 +516,7 @@ module MU
501
516
  vpc['peers'] << {
502
517
  "vpc" => { "id" => MU.myVPC, "type" => "vpcs" }
503
518
  }
504
- else
519
+ elsif !configurator.updating
505
520
  MU.log "#{vpc['ip_block']} overlaps with existing routes, will not be able to peer with Master's VPC", MU::WARN
506
521
  end
507
522
  end
@@ -513,6 +528,9 @@ module MU
513
528
  if !can_peer and have_public and vpc["create_bastion"]
514
529
  serverclass = Object.const_get("MU").const_get("Cloud").const_get(vpc["cloud"]).const_get("Server")
515
530
  bastion = serverclass.genericNAT.dup
531
+ bastion["groomer_variables"] = {
532
+ "nat_ip_block" => vpc["ip_block"].to_s
533
+ }
516
534
  bastion['name'] = vpc['name']+"-natstion" # XXX account for multiples somehow
517
535
  bastion['credentials'] = vpc['credentials']
518
536
  bastion['ingress_rules'] ||= []
@@ -522,11 +540,6 @@ module MU
522
540
  "proto" => proto
523
541
  }
524
542
  }
525
- bastion["application_attributes"] = {
526
- "nat" => {
527
- "private_net" => vpc["ip_block"].to_s
528
- }
529
- }
530
543
  bastion["vpc"] = {
531
544
  "name" => vpc["name"],
532
545
  "subnet_pref" => "public"
@@ -137,11 +137,7 @@ module MU
137
137
  MU.log "Deployment id: #{MU.appname} \"#{MU.handle}\" (#{MU.deploy_id})"
138
138
  end
139
139
 
140
- # Instance variables that are effectively class variables
141
- @my_instance_id = MU::Cloud::AWS.getAWSMetaData("instance-id")
142
- @my_az = MU::Cloud::AWS.getAWSMetaData("placement/availability-zone")
143
-
144
- @fromName ='chef-server';
140
+ @fromName = MU.muCfg['mu_admin_email']
145
141
 
146
142
  MU::Cloud.resource_types.each { |cloudclass, data|
147
143
  if !@main_config[data[:cfg_plural]].nil? and @main_config[data[:cfg_plural]].size > 0
@@ -632,6 +628,17 @@ MESSAGE_END
632
628
  end
633
629
  myservice['#MUOBJECT'] ||= myservice["#MU_CLOUDCLASS"].new(mommacat: @mommacat, kitten_cfg: myservice, delayed_save: @updating)
634
630
  end
631
+ rescue RuntimeError => e
632
+ # cloud implementations can iterate over these same hashes,
633
+ # which can throw this if we catch them at the wrong moment.
634
+ # here's your hacky workaround.
635
+ if e.message.match(/can't add a new key into hash during iteration/)
636
+ MU.log e.message+" in main deploy thread, probably transient", MU::DEBUG
637
+ sleep 1
638
+ retry
639
+ else
640
+ raise e
641
+ end
635
642
  rescue Exception => e
636
643
  MU::MommaCat.unlockAll
637
644
  @main_thread.raise MuError, "Error instantiating object from #{myservice["#MU_CLOUDCLASS"]} (#{e.inspect})", e.backtrace
@@ -268,7 +268,7 @@ module MU
268
268
  @server.describe(update_cache: true) # Make sure we're fresh
269
269
 
270
270
  allvars = {
271
- "mu_deployment" => MU.structToHash(@server.deploy.deployment),
271
+ "mu_deployment" => MU::Config.stripConfig(@server.deploy.deployment),
272
272
  "mu_service_name" => @config["name"],
273
273
  "mu_canonical_ip" => @server.canonicalIP,
274
274
  "mu_admin_email" => $MU_CFG['mu_admin_email'],
@@ -301,6 +301,9 @@ module MU
301
301
  if !@config['application_attributes'].nil?
302
302
  groupvars["application_attributes"] = @config['application_attributes']
303
303
  end
304
+ if !@config['groomer_variables'].nil?
305
+ groupvars["mu"] = @config['groomer_variables']
306
+ end
304
307
 
305
308
  File.open(@ansible_path+"/group_vars/"+@server.config['name']+".yml", File::CREAT|File::RDWR|File::TRUNC, 0600) { |f|
306
309
  f.flock(File::LOCK_EX)
@@ -261,6 +261,10 @@ module MU
261
261
  chef_node.normal['application_attributes'] = @config['application_attributes']
262
262
  chef_node.save
263
263
  end
264
+ if !@config['groomer_variables'].nil?
265
+ chef_node.normal['mu'] = @config['groomer_variables']
266
+ chef_node.save
267
+ end
264
268
  if @server.deploy.original_config.has_key?('parameters')
265
269
  MU.log "Setting node:#{@server.mu_name} parameters", MU::DEBUG, details: @server.deploy.original_config['parameters']
266
270
  chef_node.normal['mu_parameters'] = @server.deploy.original_config['parameters']
@@ -461,7 +465,7 @@ module MU
461
465
 
462
466
  retries = 0
463
467
  begin
464
- ssh = @server.getSSHSession(15)
468
+ ssh = @server.getSSHSession(25)
465
469
  Timeout::timeout(60) {
466
470
  if leave_ours
467
471
  MU.log "Expunging pre-existing Chef install on #{@server.mu_name}, if we didn't create it", MU::NOTICE
@@ -1,5 +1,7 @@
1
1
  ### THIS FILE IS AUTOMATICALLY GENERATED, DO NOT EDIT ###
2
-
2
+ #
3
+ #
4
+ #
3
5
  module MU
4
6
  class Config
5
7
  # The configuration file format for Mu application stacks.
@@ -201,7 +203,7 @@ class Config
201
203
  #
202
204
  # `AWS`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
203
205
  #
204
- # `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
206
+ # `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
205
207
  class folders
206
208
  # @!group Optional parameters
207
209
 
@@ -358,7 +360,7 @@ class Config
358
360
  #
359
361
  # `AWS`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
360
362
  #
361
- # `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
363
+ # `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
362
364
  #
363
365
  # `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
364
366
  class habitats
@@ -5105,6 +5107,13 @@ class Config
5105
5107
  end
5106
5108
  end
5107
5109
  end
5110
+ class BasketofKittens
5111
+ class servers
5112
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
5113
+ class groomer_variables
5114
+ end
5115
+ end
5116
+ end
5108
5117
  class BasketofKittens
5109
5118
  class servers
5110
5119
  # Tags to apply to this resource. Will apply at the cloud provider level and in node groomers, where applicable.
@@ -6622,6 +6631,12 @@ class Config
6622
6631
  # @return [Boolean]
6623
6632
  attr_accessor :groom
6624
6633
 
6634
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
6635
+ #
6636
+ # @return [BasketofKittens::servers::groomer_variables]
6637
+ # @see BasketofKittens::servers::groomer_variables
6638
+ attr_accessor :groomer_variables
6639
+
6625
6640
  # **Default: `1800`** -
6626
6641
  # Maximum execution time for a groomer run
6627
6642
  #
@@ -7599,6 +7614,13 @@ class Config
7599
7614
  end
7600
7615
  end
7601
7616
  end
7617
+ class BasketofKittens
7618
+ class server_pools
7619
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
7620
+ class groomer_variables
7621
+ end
7622
+ end
7623
+ end
7602
7624
  class BasketofKittens
7603
7625
  class server_pools
7604
7626
  class alarms
@@ -9183,6 +9205,12 @@ class Config
9183
9205
  # @return [Boolean]
9184
9206
  attr_accessor :groom
9185
9207
 
9208
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
9209
+ #
9210
+ # @return [BasketofKittens::server_pools::groomer_variables]
9211
+ # @see BasketofKittens::server_pools::groomer_variables
9212
+ attr_accessor :groomer_variables
9213
+
9186
9214
  # **Default: `1800`** -
9187
9215
  # Maximum execution time for a groomer run
9188
9216
  #
@@ -11555,6 +11583,14 @@ class Config
11555
11583
  #
11556
11584
  # @return [String]
11557
11585
  attr_accessor :credentials
11586
+
11587
+ # **AWS & CLOUDFORMATION ONLY** -
11588
+ # +AWS+: Create a replication group; will be set automatically if +engine+ is +redis+ and +node_count+ is greated than one.
11589
+ #
11590
+ ## +CLOUDFORMATION+: Create a replication group; will be set automatically if +engine+ is +redis+ and +node_count+ is greated than one.
11591
+ #
11592
+ # @return [Boolean]
11593
+ attr_accessor :create_replication_group
11558
11594
  # @!endgroup
11559
11595
  end
11560
11596
  end
@@ -14129,6 +14165,13 @@ class Config
14129
14165
  end
14130
14166
  end
14131
14167
  end
14168
+ class BasketofKittens
14169
+ class container_clusters
14170
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
14171
+ class groomer_variables
14172
+ end
14173
+ end
14174
+ end
14132
14175
  class BasketofKittens
14133
14176
  class container_clusters
14134
14177
  class alarms
@@ -16331,6 +16374,12 @@ class Config
16331
16374
  # @return [Boolean]
16332
16375
  attr_accessor :groom
16333
16376
 
16377
+ # Metadata variables to expose to Groomer clients, under a top-level key named +mu+. Same thing as +application_attributes+, but with a name that makes a modicum of sense.
16378
+ #
16379
+ # @return [BasketofKittens::container_clusters::groomer_variables]
16380
+ # @see BasketofKittens::container_clusters::groomer_variables
16381
+ attr_accessor :groomer_variables
16382
+
16334
16383
  # **Default: `1800`** -
16335
16384
  # Maximum execution time for a groomer run
16336
16385
  #
@@ -17330,14 +17379,14 @@ class Config
17330
17379
 
17331
17380
  # **AWS ONLY**,
17332
17381
  # **Default: `7.1`** -
17333
- # +AWS+: A supported ElasticSearch version for the region of this SearchDomain. Known versions from : 7.1, 6.8, 6.7, 6.5, 6.4, 6.3, 6.2, 6.0, 5.6, 5.5, 5.3, 5.1, 2.3, 1.5
17382
+ # +AWS+: A supported ElasticSearch version for the region of this SearchDomain. Known versions from us-east-1: 7.1, 6.8, 6.7, 6.5, 6.4, 6.3, 6.2, 6.0, 5.6, 5.5, 5.3, 5.1, 2.3, 1.5
17334
17383
  #
17335
17384
  # @return [String]
17336
17385
  attr_accessor :elasticsearch_version
17337
17386
 
17338
17387
  # **AWS ONLY**,
17339
17388
  # **Default: `c5.large.elasticsearch`** -
17340
- # +AWS+: A supported ElasticSearch instance type for the region of this SearchDomain. Known types from : c5.large.elasticsearch, c5.xlarge.elasticsearch, c5.2xlarge.elasticsearch, c5.4xlarge.elasticsearch, c5.9xlarge.elasticsearch, c5.18xlarge.elasticsearch, i3.large.elasticsearch, i3.xlarge.elasticsearch, i3.2xlarge.elasticsearch, i3.4xlarge.elasticsearch, i3.8xlarge.elasticsearch, i3.16xlarge.elasticsearch, m5.large.elasticsearch, m5.xlarge.elasticsearch, m5.2xlarge.elasticsearch, m5.4xlarge.elasticsearch, m5.12xlarge.elasticsearch, r5.large.elasticsearch, r5.xlarge.elasticsearch, r5.2xlarge.elasticsearch, r5.4xlarge.elasticsearch, r5.12xlarge.elasticsearch, t2.small.elasticsearch, t2.medium.elasticsearch, c4.large.elasticsearch, c4.xlarge.elasticsearch, c4.2xlarge.elasticsearch, c4.4xlarge.elasticsearch, c4.8xlarge.elasticsearch, i2.xlarge.elasticsearch, i2.2xlarge.elasticsearch, m4.large.elasticsearch, m4.xlarge.elasticsearch, m4.2xlarge.elasticsearch, m4.4xlarge.elasticsearch, m4.10xlarge.elasticsearch, r4.large.elasticsearch, r4.xlarge.elasticsearch, r4.2xlarge.elasticsearch, r4.4xlarge.elasticsearch, r4.8xlarge.elasticsearch, r4.16xlarge.elasticsearch, m3.medium.elasticsearch, m3.large.elasticsearch, m3.xlarge.elasticsearch, m3.2xlarge.elasticsearch, r3.large.elasticsearch, r3.xlarge.elasticsearch, r3.2xlarge.elasticsearch, r3.4xlarge.elasticsearch, r3.8xlarge.elasticsearch.
17389
+ # +AWS+: A supported ElasticSearch instance type for the region of this SearchDomain. Known types from us-east-1: c5.large.elasticsearch, c5.xlarge.elasticsearch, c5.2xlarge.elasticsearch, c5.4xlarge.elasticsearch, c5.9xlarge.elasticsearch, c5.18xlarge.elasticsearch, i3.large.elasticsearch, i3.xlarge.elasticsearch, i3.2xlarge.elasticsearch, i3.4xlarge.elasticsearch, i3.8xlarge.elasticsearch, i3.16xlarge.elasticsearch, m5.large.elasticsearch, m5.xlarge.elasticsearch, m5.2xlarge.elasticsearch, m5.4xlarge.elasticsearch, m5.12xlarge.elasticsearch, r5.large.elasticsearch, r5.xlarge.elasticsearch, r5.2xlarge.elasticsearch, r5.4xlarge.elasticsearch, r5.12xlarge.elasticsearch, t2.small.elasticsearch, t2.medium.elasticsearch, c4.large.elasticsearch, c4.xlarge.elasticsearch, c4.2xlarge.elasticsearch, c4.4xlarge.elasticsearch, c4.8xlarge.elasticsearch, i2.xlarge.elasticsearch, i2.2xlarge.elasticsearch, m4.large.elasticsearch, m4.xlarge.elasticsearch, m4.2xlarge.elasticsearch, m4.4xlarge.elasticsearch, m4.10xlarge.elasticsearch, r4.large.elasticsearch, r4.xlarge.elasticsearch, r4.2xlarge.elasticsearch, r4.4xlarge.elasticsearch, r4.8xlarge.elasticsearch, r4.16xlarge.elasticsearch, m3.medium.elasticsearch, m3.large.elasticsearch, m3.xlarge.elasticsearch, m3.2xlarge.elasticsearch, r3.large.elasticsearch, r3.xlarge.elasticsearch, r3.2xlarge.elasticsearch, r3.4xlarge.elasticsearch, r3.8xlarge.elasticsearch.
17341
17390
  #
17342
17391
  # @return [String]
17343
17392
  attr_accessor :instance_type
@@ -18113,7 +18162,7 @@ class Config
18113
18162
  #
18114
18163
  # `AWS`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
18115
18164
  #
18116
- # `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
18165
+ # `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
18117
18166
  #
18118
18167
  # `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
18119
18168
  class users
@@ -19499,7 +19548,7 @@ class Config
19499
19548
  #
19500
19549
  # `AWS`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
19501
19550
  #
19502
- # `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
19551
+ # `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
19503
19552
  #
19504
19553
  # `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
19505
19554
  class roles
@@ -20337,7 +20386,7 @@ class Config
20337
20386
  ##
20338
20387
  ## `AWS`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
20339
20388
  ##
20340
- ## `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20389
+ ## `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
20341
20390
  #
20342
20391
  # @return [Array<BasketofKittens::folders>]
20343
20392
  # @see BasketofKittens::folders
@@ -20347,7 +20396,7 @@ class Config
20347
20396
  ##
20348
20397
  ## `AWS`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
20349
20398
  ##
20350
- ## `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20399
+ ## `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
20351
20400
  ##
20352
20401
  ## `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
20353
20402
  #
@@ -20549,7 +20598,7 @@ class Config
20549
20598
  ##
20550
20599
  ## `AWS`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20551
20600
  ##
20552
- ## `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20601
+ ## `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
20553
20602
  ##
20554
20603
  ## `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
20555
20604
  #
@@ -20571,7 +20620,7 @@ class Config
20571
20620
  ##
20572
20621
  ## `AWS`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20573
20622
  ##
20574
- ## `Google`: This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested.
20623
+ ## `Google`: This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications.
20575
20624
  ##
20576
20625
  ## `Azure`: This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested.
20577
20626
  #