cloud-mu 3.0.0beta → 3.0.0

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