cloud-mu 3.1.4 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +5 -1
- data/ansible/roles/mu-windows/README.md +33 -0
- data/ansible/roles/mu-windows/defaults/main.yml +2 -0
- data/ansible/roles/mu-windows/files/LaunchConfig.json +9 -0
- data/ansible/roles/mu-windows/files/config.xml +76 -0
- data/ansible/roles/mu-windows/handlers/main.yml +2 -0
- data/ansible/roles/mu-windows/meta/main.yml +53 -0
- data/ansible/roles/mu-windows/tasks/main.yml +36 -0
- data/ansible/roles/mu-windows/tests/inventory +2 -0
- data/ansible/roles/mu-windows/tests/test.yml +5 -0
- data/ansible/roles/mu-windows/vars/main.yml +2 -0
- data/bin/mu-adopt +16 -12
- data/bin/mu-azure-tests +57 -0
- data/bin/mu-cleanup +2 -4
- data/bin/mu-configure +52 -0
- data/bin/mu-deploy +3 -3
- data/bin/mu-findstray-tests +25 -0
- data/bin/mu-gen-docs +2 -4
- data/bin/mu-load-config.rb +2 -1
- data/bin/mu-node-manage +15 -16
- data/bin/mu-run-tests +37 -12
- data/cloud-mu.gemspec +5 -3
- data/cookbooks/mu-activedirectory/resources/domain.rb +4 -4
- data/cookbooks/mu-activedirectory/resources/domain_controller.rb +4 -4
- data/cookbooks/mu-tools/libraries/helper.rb +1 -1
- data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
- data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
- data/cookbooks/mu-tools/recipes/eks.rb +2 -2
- data/cookbooks/mu-tools/recipes/selinux.rb +2 -1
- data/cookbooks/mu-tools/recipes/windows-client.rb +163 -164
- data/cookbooks/mu-tools/resources/windows_users.rb +44 -43
- data/extras/clean-stock-amis +25 -19
- data/extras/generate-stock-images +1 -0
- data/extras/image-generators/AWS/win2k12.yaml +18 -13
- data/extras/image-generators/AWS/win2k16.yaml +18 -13
- data/extras/image-generators/AWS/win2k19.yaml +21 -0
- data/modules/mommacat.ru +1 -1
- data/modules/mu.rb +158 -107
- data/modules/mu/adoption.rb +386 -59
- data/modules/mu/cleanup.rb +214 -303
- data/modules/mu/cloud.rb +128 -1632
- data/modules/mu/cloud/database.rb +49 -0
- data/modules/mu/cloud/dnszone.rb +44 -0
- data/modules/mu/cloud/machine_images.rb +212 -0
- data/modules/mu/cloud/providers.rb +81 -0
- data/modules/mu/cloud/resource_base.rb +926 -0
- data/modules/mu/cloud/server.rb +40 -0
- data/modules/mu/cloud/server_pool.rb +1 -0
- data/modules/mu/cloud/ssh_sessions.rb +228 -0
- data/modules/mu/cloud/winrm_sessions.rb +237 -0
- data/modules/mu/cloud/wrappers.rb +169 -0
- data/modules/mu/config.rb +135 -82
- data/modules/mu/config/alarm.rb +2 -6
- data/modules/mu/config/bucket.rb +32 -3
- data/modules/mu/config/cache_cluster.rb +2 -2
- data/modules/mu/config/cdn.rb +100 -0
- data/modules/mu/config/collection.rb +1 -1
- data/modules/mu/config/container_cluster.rb +7 -2
- data/modules/mu/config/database.rb +84 -105
- data/modules/mu/config/database.yml +1 -2
- data/modules/mu/config/dnszone.rb +5 -4
- data/modules/mu/config/doc_helpers.rb +5 -6
- data/modules/mu/config/endpoint.rb +2 -1
- data/modules/mu/config/firewall_rule.rb +3 -19
- data/modules/mu/config/folder.rb +1 -1
- data/modules/mu/config/function.rb +17 -8
- data/modules/mu/config/group.rb +1 -1
- data/modules/mu/config/habitat.rb +1 -1
- data/modules/mu/config/job.rb +89 -0
- data/modules/mu/config/loadbalancer.rb +57 -11
- data/modules/mu/config/log.rb +1 -1
- data/modules/mu/config/msg_queue.rb +1 -1
- data/modules/mu/config/nosqldb.rb +1 -1
- data/modules/mu/config/notifier.rb +8 -19
- data/modules/mu/config/ref.rb +92 -14
- data/modules/mu/config/role.rb +1 -1
- data/modules/mu/config/schema_helpers.rb +38 -37
- data/modules/mu/config/search_domain.rb +1 -1
- data/modules/mu/config/server.rb +12 -13
- data/modules/mu/config/server.yml +1 -0
- data/modules/mu/config/server_pool.rb +3 -7
- data/modules/mu/config/storage_pool.rb +1 -1
- data/modules/mu/config/tail.rb +11 -0
- data/modules/mu/config/user.rb +1 -1
- data/modules/mu/config/vpc.rb +27 -23
- data/modules/mu/config/vpc.yml +0 -1
- data/modules/mu/defaults/AWS.yaml +91 -68
- data/modules/mu/defaults/Azure.yaml +1 -0
- data/modules/mu/defaults/Google.yaml +1 -0
- data/modules/mu/deploy.rb +33 -19
- data/modules/mu/groomer.rb +16 -1
- data/modules/mu/groomers/ansible.rb +123 -21
- data/modules/mu/groomers/chef.rb +64 -11
- data/modules/mu/logger.rb +120 -144
- data/modules/mu/master.rb +97 -4
- data/modules/mu/master/ssl.rb +0 -1
- data/modules/mu/mommacat.rb +154 -867
- data/modules/mu/mommacat/daemon.rb +23 -14
- data/modules/mu/mommacat/naming.rb +110 -3
- data/modules/mu/mommacat/search.rb +495 -0
- data/modules/mu/mommacat/storage.rb +225 -192
- data/modules/mu/{clouds → providers}/README.md +1 -1
- data/modules/mu/{clouds → providers}/aws.rb +281 -64
- data/modules/mu/{clouds → providers}/aws/alarm.rb +3 -3
- data/modules/mu/{clouds → providers}/aws/bucket.rb +275 -41
- data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +14 -50
- data/modules/mu/providers/aws/cdn.rb +782 -0
- data/modules/mu/{clouds → providers}/aws/collection.rb +5 -5
- data/modules/mu/{clouds → providers}/aws/container_cluster.rb +708 -749
- data/modules/mu/providers/aws/database.rb +1744 -0
- data/modules/mu/{clouds → providers}/aws/dnszone.rb +75 -57
- data/modules/mu/providers/aws/endpoint.rb +1072 -0
- data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +212 -242
- data/modules/mu/{clouds → providers}/aws/folder.rb +1 -1
- data/modules/mu/{clouds → providers}/aws/function.rb +289 -134
- data/modules/mu/{clouds → providers}/aws/group.rb +18 -20
- data/modules/mu/{clouds → providers}/aws/habitat.rb +3 -3
- data/modules/mu/providers/aws/job.rb +466 -0
- data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +50 -41
- data/modules/mu/{clouds → providers}/aws/log.rb +5 -5
- data/modules/mu/{clouds → providers}/aws/msg_queue.rb +14 -11
- data/modules/mu/{clouds → providers}/aws/nosqldb.rb +96 -5
- data/modules/mu/{clouds → providers}/aws/notifier.rb +135 -63
- data/modules/mu/{clouds → providers}/aws/role.rb +94 -57
- data/modules/mu/{clouds → providers}/aws/search_domain.rb +173 -42
- data/modules/mu/{clouds → providers}/aws/server.rb +782 -1107
- data/modules/mu/{clouds → providers}/aws/server_pool.rb +36 -46
- data/modules/mu/{clouds → providers}/aws/storage_pool.rb +21 -38
- data/modules/mu/{clouds → providers}/aws/user.rb +12 -16
- data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +5 -4
- data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +2 -1
- data/modules/mu/{clouds → providers}/aws/vpc.rb +429 -849
- data/modules/mu/providers/aws/vpc_subnet.rb +286 -0
- data/modules/mu/{clouds → providers}/azure.rb +13 -0
- data/modules/mu/{clouds → providers}/azure/container_cluster.rb +1 -5
- data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +8 -1
- data/modules/mu/{clouds → providers}/azure/habitat.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/role.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/server.rb +32 -24
- data/modules/mu/{clouds → providers}/azure/user.rb +1 -1
- data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/vpc.rb +4 -6
- data/modules/mu/{clouds → providers}/cloudformation.rb +10 -0
- data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
- data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
- data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
- data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +3 -3
- data/modules/mu/{clouds → providers}/docker.rb +0 -0
- data/modules/mu/{clouds → providers}/google.rb +29 -6
- data/modules/mu/{clouds → providers}/google/bucket.rb +5 -5
- data/modules/mu/{clouds → providers}/google/container_cluster.rb +59 -37
- data/modules/mu/{clouds → providers}/google/database.rb +5 -12
- data/modules/mu/{clouds → providers}/google/firewall_rule.rb +5 -5
- data/modules/mu/{clouds → providers}/google/folder.rb +5 -9
- data/modules/mu/{clouds → providers}/google/function.rb +14 -8
- data/modules/mu/{clouds → providers}/google/group.rb +9 -17
- data/modules/mu/{clouds → providers}/google/habitat.rb +4 -8
- data/modules/mu/{clouds → providers}/google/loadbalancer.rb +5 -5
- data/modules/mu/{clouds → providers}/google/role.rb +50 -31
- data/modules/mu/{clouds → providers}/google/server.rb +142 -55
- data/modules/mu/{clouds → providers}/google/server_pool.rb +14 -14
- data/modules/mu/{clouds → providers}/google/user.rb +34 -24
- data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/google/vpc.rb +46 -15
- data/modules/tests/aws-jobs-functions.yaml +46 -0
- data/modules/tests/centos6.yaml +15 -0
- data/modules/tests/centos7.yaml +15 -0
- data/modules/tests/centos8.yaml +12 -0
- data/modules/tests/ecs.yaml +23 -0
- data/modules/tests/eks.yaml +1 -1
- data/modules/tests/functions/node-function/lambda_function.js +10 -0
- data/modules/tests/functions/python-function/lambda_function.py +12 -0
- data/modules/tests/includes-and-params.yaml +2 -1
- data/modules/tests/microservice_app.yaml +288 -0
- data/modules/tests/rds.yaml +108 -0
- data/modules/tests/regrooms/rds.yaml +123 -0
- data/modules/tests/server-with-scrub-muisms.yaml +2 -1
- data/modules/tests/super_complex_bok.yml +2 -2
- data/modules/tests/super_simple_bok.yml +3 -5
- data/modules/tests/win2k12.yaml +25 -0
- data/modules/tests/win2k16.yaml +25 -0
- data/modules/tests/win2k19.yaml +25 -0
- data/requirements.txt +1 -0
- data/spec/mu/clouds/azure_spec.rb +2 -2
- metadata +169 -93
- data/extras/image-generators/AWS/windows.yaml +0 -18
- data/modules/mu/clouds/aws/database.rb +0 -1974
- data/modules/mu/clouds/aws/endpoint.rb +0 -596
- data/modules/tests/needwork/win2k12.yaml +0 -13
data/modules/mu/config/alarm.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/alarm.rb
|
18
18
|
class Alarm
|
19
19
|
|
20
20
|
# Sections of Alarm schema shared between Alarms as a first-class
|
@@ -281,11 +281,7 @@ module MU
|
|
281
281
|
}
|
282
282
|
ok = false if !configurator.insertKitten(notifier, "notifiers")
|
283
283
|
end
|
284
|
-
alarm["
|
285
|
-
alarm["dependencies"] << {
|
286
|
-
"name" => alarm["notification_group"],
|
287
|
-
"type" => "notifier"
|
288
|
-
}
|
284
|
+
MU::Config.addDependency(alarm, alarm["notification_group"], "notifier")
|
289
285
|
end
|
290
286
|
end
|
291
287
|
|
data/modules/mu/config/bucket.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/bucket.rb
|
18
18
|
class Bucket
|
19
19
|
|
20
20
|
# Base configuration schema for a Bucket
|
@@ -50,6 +50,24 @@ module MU
|
|
50
50
|
"default" => "index.html",
|
51
51
|
"description" => "If +web_enabled+, return this object when \"diretory\" (a path not ending in a key/object) is invoked."
|
52
52
|
},
|
53
|
+
"upload" => {
|
54
|
+
"type" => "array",
|
55
|
+
"items" => {
|
56
|
+
"type" => "object",
|
57
|
+
"description" => "Upload objects to a bucket, where supported",
|
58
|
+
"required" => ["source", "destination"],
|
59
|
+
"properties" => {
|
60
|
+
"source" => {
|
61
|
+
"type" => "string",
|
62
|
+
"description" => "A file or directory to upload. If a directory is specified, it will be recursively mirrored to the bucket +destination+."
|
63
|
+
},
|
64
|
+
"destination" => {
|
65
|
+
"type" => "string",
|
66
|
+
"description" => "Path to which +source+ file(s) will be uploaded in the bucket, relative to +/+"
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
},
|
53
71
|
"policies" => {
|
54
72
|
"type" => "array",
|
55
73
|
"items" => MU::Config::Role.policy_primitive(subobjects: true, grant_to: true, permissions_optional: true, targets_optional: true)
|
@@ -59,12 +77,23 @@ module MU
|
|
59
77
|
end
|
60
78
|
|
61
79
|
# Generic pre-processing of {MU::Config::BasketofKittens::buckets}, bare and unvalidated.
|
62
|
-
# @param
|
80
|
+
# @param bucket [Hash]: The resource to process and validate
|
63
81
|
# @param _configurator [MU::Config]: The overall deployment configurator of which this resource is a member
|
64
82
|
# @return [Boolean]: True if validation succeeded, False otherwise
|
65
|
-
def self.validate(
|
83
|
+
def self.validate(bucket, _configurator)
|
66
84
|
ok = true
|
67
85
|
|
86
|
+
if bucket['upload']
|
87
|
+
bucket['upload'].each { |batch|
|
88
|
+
if !File.exists?(batch['source'])
|
89
|
+
MU.log "Bucket '#{bucket['name']}' specifies upload for file/directory that does not exist", MU::ERR, details: batch
|
90
|
+
ok = false
|
91
|
+
next
|
92
|
+
end
|
93
|
+
batch['source'] = File.realpath(File.expand_path(batch['source']))
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
68
97
|
ok
|
69
98
|
end
|
70
99
|
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/cache_cluster.rb
|
18
18
|
class CacheCluster
|
19
19
|
|
20
20
|
# Base configuration schema for a CacheCluster
|
@@ -54,7 +54,7 @@ module MU
|
|
54
54
|
"type" => "string",
|
55
55
|
"default" => "redis"
|
56
56
|
},
|
57
|
-
"dns_records" => MU::Config::DNSZone.records_primitive(need_target: false, default_type: "CNAME", need_zone: true),
|
57
|
+
"dns_records" => MU::Config::DNSZone.records_primitive(need_target: false, default_type: "CNAME", need_zone: true, embedded_type: "cache_cluster"),
|
58
58
|
"dns_sync_wait" => {
|
59
59
|
"type" => "boolean",
|
60
60
|
"description" => "Wait for DNS record to propagate in DNS Zone.",
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# Copyright:: Copyright (c) 2020 eGlobalTech, Inc., all rights reserved
|
2
|
+
#
|
3
|
+
# Licensed under the BSD-3 license (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License in the root of the project or at
|
6
|
+
#
|
7
|
+
# http://egt-labs.com/mu/LICENSE.html
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module MU
|
16
|
+
class Config
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/job.rb
|
18
|
+
class CDN
|
19
|
+
|
20
|
+
# Base configuration schema for a scheduled job
|
21
|
+
# @return [Hash]
|
22
|
+
def self.schema
|
23
|
+
{
|
24
|
+
"type" => "object",
|
25
|
+
"additionalProperties" => false,
|
26
|
+
"required" => ["origins"],
|
27
|
+
"properties" => {
|
28
|
+
"name" => {
|
29
|
+
"type" => "string"
|
30
|
+
},
|
31
|
+
"dns_records" => MU::Config::DNSZone.records_primitive(need_target: false, default_type: "CNAME", need_zone: true, embedded_type: "cdn"),
|
32
|
+
"default_object" => {
|
33
|
+
"type" => "string",
|
34
|
+
"default" => "index.html"
|
35
|
+
},
|
36
|
+
"credentials" => MU::Config.credentials_primitive,
|
37
|
+
"aliases" => {
|
38
|
+
"type" => "array",
|
39
|
+
"items" => {
|
40
|
+
"type" => "string"
|
41
|
+
}
|
42
|
+
},
|
43
|
+
"origins" => {
|
44
|
+
"type" => "array",
|
45
|
+
"minItems" => 1,
|
46
|
+
"items" => {
|
47
|
+
"type" => "object",
|
48
|
+
"description" => "One or more back-end sources which this CDN will cache",
|
49
|
+
"required" => ["name"],
|
50
|
+
"properties" => {
|
51
|
+
"name" => {
|
52
|
+
"type" => "string",
|
53
|
+
"description" => "A unique identifying string which other components of this distribution may use to reference this origin"
|
54
|
+
},
|
55
|
+
"domain_name" => {
|
56
|
+
"type" => "string",
|
57
|
+
"description" => "Domain name of the back-end web server or other resource behind this CDN"
|
58
|
+
},
|
59
|
+
"path" => {
|
60
|
+
"type" => "string",
|
61
|
+
"default" => "",
|
62
|
+
"description" => "Optional path on back-end service to which to map front-end requests"
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
},
|
67
|
+
"behaviors" => {
|
68
|
+
"type" => "array",
|
69
|
+
"items" => {
|
70
|
+
"description" => "Customize the behavior of requests sent to one of this CDN's configured +origins+",
|
71
|
+
"type" => "object",
|
72
|
+
"properties" => {
|
73
|
+
"origin" => {
|
74
|
+
"type" => "string",
|
75
|
+
"description" => "Which of our +origins+ this set of behaviors should map to, by its +name+ field."
|
76
|
+
},
|
77
|
+
"path_pattern" => {
|
78
|
+
"type" => "string",
|
79
|
+
"description" => "The request path or paths for which this behavior should be invoked"
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
# Generic pre-processing of {MU::Config::BasketofKittens::jobs}, bare and unvalidated.
|
89
|
+
# @param _job [Hash]: The resource to process and validate
|
90
|
+
# @param _configurator [MU::Config]: The overall deployment configurator of which this resource is a member
|
91
|
+
# @return [Boolean]: True if validation succeeded, False otherwise
|
92
|
+
def self.validate(_job, _configurator)
|
93
|
+
ok = true
|
94
|
+
|
95
|
+
ok
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/collection.rb
|
18
18
|
class Collection
|
19
19
|
|
20
20
|
# Base configuration schema for a Collection
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/container_cluster.rb
|
18
18
|
class ContainerCluster
|
19
19
|
|
20
20
|
# Base configuration schema for a ContainerCluster
|
@@ -48,7 +48,7 @@ module MU
|
|
48
48
|
"properties" => {
|
49
49
|
"version" => {
|
50
50
|
"type" => "string",
|
51
|
-
"default" => "1.
|
51
|
+
"default" => "1.15",
|
52
52
|
"description" => "Version of Kubernetes control plane to deploy",
|
53
53
|
},
|
54
54
|
"max_pods" => {
|
@@ -104,6 +104,11 @@ module MU
|
|
104
104
|
cluster["min_size"] ||= [cluster["instance_count"], cluster["min_size"]].reject { |c| c.nil? }.min
|
105
105
|
end
|
106
106
|
|
107
|
+
if cluster['kubernetes_resources'] and !MU::Master.kubectl
|
108
|
+
MU.log "Cannot apply kubernetes resources without a working kubectl executable", MU::ERR
|
109
|
+
ok = false
|
110
|
+
end
|
111
|
+
|
107
112
|
ok
|
108
113
|
end
|
109
114
|
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
module MU
|
16
16
|
class Config
|
17
|
-
# Basket of Kittens config schema and parser logic. See modules/mu/
|
17
|
+
# Basket of Kittens config schema and parser logic. See modules/mu/providers/*/database.rb
|
18
18
|
class Database
|
19
19
|
|
20
20
|
# Base configuration schema for a Database
|
@@ -23,7 +23,7 @@ module MU
|
|
23
23
|
{
|
24
24
|
"type" => "object",
|
25
25
|
"description" => "Create a dedicated database server.",
|
26
|
-
"required" => ["name", "engine", "size", "cloud"
|
26
|
+
"required" => ["name", "engine", "size", "cloud"],
|
27
27
|
"additionalProperties" => false,
|
28
28
|
"properties" => {
|
29
29
|
"groomer" => {
|
@@ -53,7 +53,7 @@ module MU
|
|
53
53
|
},
|
54
54
|
"engine_version" => {"type" => "string"},
|
55
55
|
"engine" => {
|
56
|
-
"enum" => ["mysql", "postgres", "oracle-se1", "oracle-se2", "oracle-se", "oracle-ee", "sqlserver-ee", "sqlserver-se", "sqlserver-ex", "sqlserver-web", "aurora", "mariadb"],
|
56
|
+
"enum" => ["mysql", "postgres", "oracle", "oracle-se1", "oracle-se2", "oracle-se", "oracle-ee", "sqlserver-ee", "sqlserver-se", "sqlserver-ex", "sqlserver-web", "aurora", "mariadb"],
|
57
57
|
"type" => "string"
|
58
58
|
},
|
59
59
|
"add_cluster_node" => {
|
@@ -61,11 +61,8 @@ module MU
|
|
61
61
|
"description" => "Internal use",
|
62
62
|
"default" => false
|
63
63
|
},
|
64
|
-
"member_of_cluster" =>
|
65
|
-
|
66
|
-
"type" => "object"
|
67
|
-
},
|
68
|
-
"dns_records" => MU::Config::DNSZone.records_primitive(need_target: false, default_type: "CNAME", need_zone: true),
|
64
|
+
"member_of_cluster" => MU::Config::Ref.schema(type: "databases", desc: "Internal use"),
|
65
|
+
"dns_records" => MU::Config::DNSZone.records_primitive(need_target: false, default_type: "CNAME", need_zone: true, embedded_type: "database"),
|
69
66
|
"dns_sync_wait" => {
|
70
67
|
"type" => "boolean",
|
71
68
|
"description" => "Wait for DNS record to propagate in DNS Zone.",
|
@@ -78,20 +75,16 @@ module MU
|
|
78
75
|
},
|
79
76
|
"storage" => {
|
80
77
|
"type" => "integer",
|
81
|
-
"description" => "Storage space for this database instance (GB)."
|
82
|
-
|
83
|
-
"storage_type" => {
|
84
|
-
"enum" => ["standard", "gp2", "io1"],
|
85
|
-
"type" => "string",
|
86
|
-
"default" => "gp2"
|
78
|
+
"description" => "Storage space for this database instance (GB).",
|
79
|
+
"default" => 20
|
87
80
|
},
|
88
81
|
"run_sql_on_deploy" => {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
82
|
+
"type" => "array",
|
83
|
+
"minItems" => 1,
|
84
|
+
"items" => {
|
85
|
+
"description" => "Arbitrary SQL commands to run after the database is fully configred (PostgreSQL databases only).",
|
86
|
+
"type" => "string"
|
87
|
+
}
|
95
88
|
},
|
96
89
|
"port" => {"type" => "integer"},
|
97
90
|
"vpc" => MU::Config::VPC.reference(MU::Config::VPC::MANY_SUBNETS, MU::Config::VPC::NAT_OPTS, "all_public"),
|
@@ -144,22 +137,24 @@ module MU
|
|
144
137
|
"default" => false
|
145
138
|
},
|
146
139
|
"creation_style" => {
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
140
|
+
"type" => "string",
|
141
|
+
"enum" => ["existing", "new", "new_snapshot", "existing_snapshot", "point_in_time"],
|
142
|
+
"description" => "+new+ creates a pristine database instance; +existing+ clones an existing database instance; +new_snapshot+ creates a snapshot of an existing database, then creates a new instance from that snapshot; +existing_snapshot+ creates database from a pre-existing snapshot; +point_in_time+ create database from point in time backup of an existing database. All styles other than +new+ require that +identifier+ or +source+ be set.",
|
143
|
+
"default" => "new"
|
151
144
|
},
|
152
145
|
"identifier" => {
|
153
|
-
|
154
|
-
|
146
|
+
"type" => "string",
|
147
|
+
"description" => "Cloud id of a source database to use for creation styles other than +new+; use +source+ for more sophisticated resource references."
|
155
148
|
},
|
149
|
+
"source" => MU::Config::Ref.schema(type: "databases", "desc": "Reference a source database to use for +creation_style+ settings +existing+, +new_snapshot+, +existing_snapshot+, or +point_in_time+."),
|
156
150
|
"master_user" => {
|
157
151
|
"type" => "string",
|
158
152
|
"description" => "Set master user name for this database instance; if not specified a random username will be generated"
|
159
153
|
},
|
160
154
|
"restore_time" => {
|
161
155
|
"type" => "string",
|
162
|
-
"description" => "Must either be set to 'latest' or date/time value in the following format: 2015-09-12T22:30:00Z. Applies only to point_in_time creation_style"
|
156
|
+
"description" => "Must either be set to 'latest' or date/time value in the following format: 2015-09-12T22:30:00Z. Applies only to point_in_time creation_style",
|
157
|
+
"default" => "latest"
|
163
158
|
},
|
164
159
|
"create_read_replica" => {
|
165
160
|
"type" => "boolean",
|
@@ -215,27 +210,11 @@ module MU
|
|
215
210
|
# Schema block for other resources to use when referencing a sibling Database
|
216
211
|
# @return [Hash]
|
217
212
|
def self.reference
|
218
|
-
|
219
|
-
"
|
220
|
-
"
|
221
|
-
|
222
|
-
|
223
|
-
"properties" => {
|
224
|
-
"db_id" => {"type" => "string"},
|
225
|
-
"db_name" => {"type" => "string"},
|
226
|
-
"region" => MU::Config.region_primitive,
|
227
|
-
"cloud" => MU::Config.cloud_primitive,
|
228
|
-
"tag" => {
|
229
|
-
"type" => "string",
|
230
|
-
"description" => "Identify this Database by a tag (key=value). Note that this tag must not match more than one resource.",
|
231
|
-
"pattern" => "^[^=]+=.+"
|
232
|
-
},
|
233
|
-
"deploy_id" => {
|
234
|
-
"type" => "string",
|
235
|
-
"description" => "Look for a Database fitting this description in another Mu deployment with this id.",
|
236
|
-
}
|
237
|
-
}
|
238
|
-
}
|
213
|
+
schema_aliases = [
|
214
|
+
{ "db_id" => "id" },
|
215
|
+
{ "db_name" => "name" }
|
216
|
+
]
|
217
|
+
MU::Config::Ref.schema(schema_aliases, type: "databases")
|
239
218
|
end
|
240
219
|
|
241
220
|
# Generic pre-processing of {MU::Config::BasketofKittens::databases}, bare and unvalidated.
|
@@ -266,6 +245,22 @@ module MU
|
|
266
245
|
end
|
267
246
|
end
|
268
247
|
|
248
|
+
if db["identifier"]
|
249
|
+
if db["source"]
|
250
|
+
if db["source"]["id"] != db["identifier"]
|
251
|
+
MU.log "Database #{db['name']} specified identifier '#{db["identifier"]}' with a source parameter that doesn't match", MU::ERR, db["source"]
|
252
|
+
ok = false
|
253
|
+
end
|
254
|
+
else
|
255
|
+
db["source"] = MU::Config::Ref.get(
|
256
|
+
id: db["identifier"],
|
257
|
+
cloud: db["cloud"],
|
258
|
+
credentials: db["credentials"],
|
259
|
+
type: "databases"
|
260
|
+
)
|
261
|
+
end
|
262
|
+
db.delete("identifier")
|
263
|
+
end
|
269
264
|
|
270
265
|
if db["storage"].nil? and db["creation_style"] == "new" and !db['create_cluster']
|
271
266
|
MU.log "Must provide a value for 'storage' when creating a new database.", MU::ERR, details: db
|
@@ -296,13 +291,13 @@ module MU
|
|
296
291
|
|
297
292
|
if db["creation_style"] == "point_in_time" && db["restore_time"].nil?
|
298
293
|
ok = false
|
299
|
-
MU.log "
|
294
|
+
MU.log "Database '#{db['name']}' must provide restore_time when creation_style is point_in_time", MU::ERR
|
300
295
|
end
|
301
296
|
|
302
297
|
if %w{existing new_snapshot existing_snapshot point_in_time}.include?(db["creation_style"])
|
303
|
-
if db["
|
298
|
+
if db["source"].nil?
|
304
299
|
ok = false
|
305
|
-
MU.log "
|
300
|
+
MU.log "Database '#{db['name']}' needs existing database/snapshot, but no identifier or source was specified", MU::ERR
|
306
301
|
end
|
307
302
|
end
|
308
303
|
|
@@ -336,16 +331,17 @@ module MU
|
|
336
331
|
replica["credentials"] = db["credentials"]
|
337
332
|
replica['create_read_replica'] = false
|
338
333
|
replica["create_cluster"] = false
|
334
|
+
replica["region"] = db['read_replica_region']
|
335
|
+
if db['region'] != replica['region']
|
336
|
+
replica.delete("vpc")
|
337
|
+
end
|
339
338
|
replica['read_replica_of'] = {
|
340
|
-
"
|
339
|
+
"name" => db['name'],
|
341
340
|
"cloud" => db['cloud'],
|
342
|
-
"region" => db['
|
343
|
-
|
344
|
-
replica['dependencies'] << {
|
345
|
-
"type" => "database",
|
346
|
-
"name" => db["name"],
|
347
|
-
"phase" => "groom"
|
341
|
+
"region" => db['region'],
|
342
|
+
"credentials" => db['credentials'],
|
348
343
|
}
|
344
|
+
MU::Config.addDependency(replica, db["name"], "database", phase: "groom")
|
349
345
|
read_replicas << replica
|
350
346
|
end
|
351
347
|
end
|
@@ -354,6 +350,7 @@ module MU
|
|
354
350
|
# duplicating the declaration of the master as a new first-class
|
355
351
|
# resource and tweaking it.
|
356
352
|
if db["create_cluster"] and db['cluster_mode'] != "serverless"
|
353
|
+
db["add_cluster_node"] = false
|
357
354
|
(1..db["cluster_node_count"]).each{ |num|
|
358
355
|
node = Marshal.load(Marshal.dump(db))
|
359
356
|
node["name"] = "#{db['name']}-#{num}"
|
@@ -363,16 +360,14 @@ module MU
|
|
363
360
|
node["creation_style"] = "new"
|
364
361
|
node["add_cluster_node"] = true
|
365
362
|
node["member_of_cluster"] = {
|
366
|
-
"
|
363
|
+
"name" => db['name'],
|
367
364
|
"cloud" => db['cloud'],
|
368
|
-
"region" => db['region']
|
365
|
+
"region" => db['region'],
|
366
|
+
"credentials" => db['credentials'],
|
367
|
+
"type" => "databases"
|
369
368
|
}
|
370
369
|
# AWS will figure out for us which database instance is the writer/master so we can create all of them concurrently.
|
371
|
-
node[
|
372
|
-
"type" => "database",
|
373
|
-
"name" => db["name"],
|
374
|
-
"phase" => "groom"
|
375
|
-
}
|
370
|
+
MU::Config.addDependency(node, db["name"], "database", phase: "groom")
|
376
371
|
cluster_nodes << node
|
377
372
|
|
378
373
|
# Alarms are set on each DB cluster node, not on the cluster itself,
|
@@ -387,55 +382,39 @@ module MU
|
|
387
382
|
end
|
388
383
|
|
389
384
|
if !db['read_replica_of'].nil?
|
390
|
-
rr = db['read_replica_of']
|
391
|
-
if !rr
|
392
|
-
db['dependencies'] << { "name" => rr
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
rr['cloud'],
|
398
|
-
"database",
|
399
|
-
deploy_id: rr["deploy_id"],
|
400
|
-
cloud_id: rr["db_id"],
|
401
|
-
tag_key: tag_key,
|
402
|
-
tag_value: tag_value,
|
403
|
-
region: rr["region"],
|
404
|
-
dummy_ok: true
|
405
|
-
)
|
406
|
-
ext_database = found.first if !found.nil? and found.size == 1
|
407
|
-
if !ext_database
|
408
|
-
MU.log "Couldn't resolve Database reference to a unique live Database in #{db['name']}", MU::ERR, details: rr
|
409
|
-
ok = false
|
410
|
-
end
|
385
|
+
rr = MU::Config::Ref.get(db['read_replica_of'])
|
386
|
+
if rr.name and !rr.deploy_id
|
387
|
+
db['dependencies'] << { "name" => rr.name, "type" => "database" }
|
388
|
+
MU::Config.addDependency(db, rr.name, "database")
|
389
|
+
elsif !rr.kitten
|
390
|
+
MU.log "Couldn't resolve Database reference to a unique live Database in #{db['name']}", MU::ERR, details: rr
|
391
|
+
ok = false
|
411
392
|
end
|
412
393
|
elsif db["member_of_cluster"]
|
413
|
-
|
414
|
-
if
|
415
|
-
if !configurator.haveLitterMate?(
|
416
|
-
MU.log "Database cluster node #{db['name']} references sibling source #{
|
394
|
+
cluster = MU::Config::Ref.get(db["member_of_cluster"])
|
395
|
+
if cluster['name']
|
396
|
+
if !configurator.haveLitterMate?(cluster['name'], "databases")
|
397
|
+
MU.log "Database cluster node #{db['name']} references sibling source #{cluster['name']}, but I have no such database", MU::ERR
|
417
398
|
ok = false
|
418
399
|
end
|
419
400
|
else
|
420
|
-
|
421
|
-
|
422
|
-
found = MU::MommaCat.findStray(
|
423
|
-
rr['cloud'],
|
424
|
-
"database",
|
425
|
-
deploy_id: rr["deploy_id"],
|
426
|
-
cloud_id: rr["db_id"],
|
427
|
-
tag_key: tag_key,
|
428
|
-
tag_value: tag_value,
|
429
|
-
region: rr["region"],
|
430
|
-
dummy_ok: true
|
431
|
-
)
|
432
|
-
ext_database = found.first if !found.nil? and found.size == 1
|
433
|
-
if !ext_database
|
434
|
-
MU.log "Couldn't resolve Database reference to a unique live Database in #{db['name']}", MU::ERR, details: rr
|
401
|
+
if !cluster.kitten
|
402
|
+
MU.log "Couldn't resolve Database reference to a unique live Database in #{db['name']}", MU::ERR, details: cluster.to_h
|
435
403
|
ok = false
|
436
404
|
end
|
437
405
|
end
|
438
406
|
end
|
407
|
+
|
408
|
+
if db["source"]
|
409
|
+
|
410
|
+
if db["source"]["name"] and
|
411
|
+
!db["source"]["deploy_id"] and
|
412
|
+
configurator.haveLitterMate?(db["source"]["name"], "databases")
|
413
|
+
MU::Config.addDependency(db, db["source"]["name"], "database")
|
414
|
+
end
|
415
|
+
db["source"]["cloud"] ||= db["cloud"]
|
416
|
+
end
|
417
|
+
|
439
418
|
db['dependencies'].uniq!
|
440
419
|
|
441
420
|
read_replicas.each { |new_replica|
|