diff --git a/fast/stages/0-org-setup/organization.tf b/fast/stages/0-org-setup/organization.tf
index 3a6064d76..3f6187944 100644
--- a/fast/stages/0-org-setup/organization.tf
+++ b/fast/stages/0-org-setup/organization.tf
@@ -81,6 +81,7 @@ module "organization" {
}
locations = local.ctx.locations
}
+ contacts = lookup(local.organization, "contacts", {})
factories_config = {
org_policy_custom_constraints = "${local.paths.organization}/custom-constraints"
custom_roles = "${local.paths.organization}/custom-roles"
diff --git a/fast/stages/0-org-setup/schemas/organization.schema.json b/fast/stages/0-org-setup/schemas/organization.schema.json
index 46b32cc2b..c0afbdeff 100644
--- a/fast/stages/0-org-setup/schemas/organization.schema.json
+++ b/fast/stages/0-org-setup/schemas/organization.schema.json
@@ -11,7 +11,7 @@
"type": "object",
"additionalProperties": false,
"patternProperties": {
- "^[a-z0-9_-]+$": {
+ "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$": {
"type": "array",
"items": {
"type": "string"
@@ -45,7 +45,7 @@
"type": "object",
"additionalProperties": false,
"patternProperties": {
- "^[a-z][a-z0-9-]+$": {
+ "^[a-z][a-z0-9-_]+$": {
"type": "object",
"additionalProperties": false,
"properties": {
diff --git a/fast/stages/0-org-setup/schemas/organization.schema.md b/fast/stages/0-org-setup/schemas/organization.schema.md
index fd55572bc..278764350 100644
--- a/fast/stages/0-org-setup/schemas/organization.schema.md
+++ b/fast/stages/0-org-setup/schemas/organization.schema.md
@@ -9,18 +9,19 @@
- **id**: *string*
- **contacts**: *object*
*additional properties: false*
- - **`^[a-z0-9_-]+$`**: *array*
+ - **`^[^@\s]+@[^@\s]+\.[^@\s]+$`**: *array*
- items: *string*
- **iam**: *reference([iam](#refs-iam))*
- **iam_bindings**: *reference([iam_bindings](#refs-iam_bindings))*
- **iam_bindings_additive**: *reference([iam_bindings_additive](#refs-iam_bindings_additive))*
- **iam_by_principals**: *reference([iam_by_principals](#refs-iam_by_principals))*
+- **iam_by_principals_additive**: *reference([iam_by_principals](#refs-iam_by_principals))*
- **logging**: *object*
*additional properties: false*
- **storage_location**: *string*
- **sinks**: *object*
*additional properties: false*
- - **`^[a-z][a-z0-9-]+$`**: *object*
+ - **`^[a-z][a-z0-9-_]+$`**: *object*
*additional properties: false*
- **description**: *string*
- **destination**: *string*
diff --git a/modules/gke-cluster-autopilot/README.md b/modules/gke-cluster-autopilot/README.md
index 179eedce7..f881bb528 100644
--- a/modules/gke-cluster-autopilot/README.md
+++ b/modules/gke-cluster-autopilot/README.md
@@ -297,12 +297,11 @@ module "cluster-1" {
| [cluster](outputs.tf#L23) | Cluster resource. | ✓ |
| [dns_endpoint](outputs.tf#L29) | Control plane DNS endpoint. | |
| [endpoint](outputs.tf#L37) | Cluster endpoint. | |
-| [fleet](outputs.tf#L42) | GKE Fleet Membership. | |
-| [id](outputs.tf#L47) | Fully qualified cluster ID. | |
-| [location](outputs.tf#L52) | Cluster location. | |
-| [master_version](outputs.tf#L57) | Master version. | |
-| [name](outputs.tf#L62) | Cluster name. | |
-| [notifications](outputs.tf#L67) | GKE Pub/Sub notifications topic. | |
-| [self_link](outputs.tf#L72) | Cluster self link. | ✓ |
-| [workload_identity_pool](outputs.tf#L78) | Workload identity pool. | |
+| [id](outputs.tf#L42) | Fully qualified cluster ID. | |
+| [location](outputs.tf#L47) | Cluster location. | |
+| [master_version](outputs.tf#L52) | Master version. | |
+| [name](outputs.tf#L57) | Cluster name. | |
+| [notifications](outputs.tf#L62) | GKE Pub/Sub notifications topic. | |
+| [self_link](outputs.tf#L67) | Cluster self link. | ✓ |
+| [workload_identity_pool](outputs.tf#L73) | Workload identity pool. | |
diff --git a/modules/gke-cluster-autopilot/outputs.tf b/modules/gke-cluster-autopilot/outputs.tf
index f6890b391..81bdc2a0c 100644
--- a/modules/gke-cluster-autopilot/outputs.tf
+++ b/modules/gke-cluster-autopilot/outputs.tf
@@ -39,11 +39,6 @@ output "endpoint" {
value = google_container_cluster.cluster.endpoint
}
-output "fleet" {
- description = "GKE Fleet Membership."
- value = google_container_cluster.cluster.endpoint
-}
-
output "id" {
description = "Fully qualified cluster ID."
value = google_container_cluster.cluster.id
diff --git a/modules/gke-cluster-standard/README.md b/modules/gke-cluster-standard/README.md
index 12b8aa294..3bbdf1b0e 100644
--- a/modules/gke-cluster-standard/README.md
+++ b/modules/gke-cluster-standard/README.md
@@ -543,12 +543,11 @@ module "cluster-1" {
| [cluster](outputs.tf#L25) | Cluster resource. | ✓ |
| [dns_endpoint](outputs.tf#L31) | Control plane DNS endpoint. | |
| [endpoint](outputs.tf#L39) | Cluster endpoint. | |
-| [fleet](outputs.tf#L44) | GKE Fleet Membership. | |
-| [id](outputs.tf#L49) | FUlly qualified cluster id. | |
-| [location](outputs.tf#L54) | Cluster location. | |
-| [master_version](outputs.tf#L59) | Master version. | |
-| [name](outputs.tf#L64) | Cluster name. | |
-| [notifications](outputs.tf#L69) | GKE PubSub notifications topic. | |
-| [self_link](outputs.tf#L74) | Cluster self link. | ✓ |
-| [workload_identity_pool](outputs.tf#L80) | Workload identity pool. | |
+| [id](outputs.tf#L44) | FUlly qualified cluster id. | |
+| [location](outputs.tf#L49) | Cluster location. | |
+| [master_version](outputs.tf#L54) | Master version. | |
+| [name](outputs.tf#L59) | Cluster name. | |
+| [notifications](outputs.tf#L64) | GKE PubSub notifications topic. | |
+| [self_link](outputs.tf#L69) | Cluster self link. | ✓ |
+| [workload_identity_pool](outputs.tf#L75) | Workload identity pool. | |
diff --git a/modules/gke-cluster-standard/outputs.tf b/modules/gke-cluster-standard/outputs.tf
index b6829fd27..bc6c8e9a4 100644
--- a/modules/gke-cluster-standard/outputs.tf
+++ b/modules/gke-cluster-standard/outputs.tf
@@ -41,11 +41,6 @@ output "endpoint" {
value = google_container_cluster.cluster.endpoint
}
-output "fleet" {
- description = "GKE Fleet Membership."
- value = google_container_cluster.cluster.endpoint
-}
-
output "id" {
description = "FUlly qualified cluster id."
value = google_container_cluster.cluster.id
diff --git a/modules/project-factory/projects.tf b/modules/project-factory/projects.tf
index c33e41cf7..9788ca0d3 100644
--- a/modules/project-factory/projects.tf
+++ b/modules/project-factory/projects.tf
@@ -37,6 +37,7 @@ locals {
_projects_raw = {
for f in try(fileset(local._projects_path, "**/*.yaml"), []) :
trimsuffix(f, ".yaml") => yamldecode(file("${local._projects_path}/${f}"))
+ if !endswith(f, ".config.yaml")
}
_templates_path = try(
pathexpand(var.factories_config.project_templates), null
diff --git a/tests/fast/stages/s0_org_setup/simple.yaml b/tests/fast/stages/s0_org_setup/simple.yaml
index 2e1a7a375..adc1a0190 100644
--- a/tests/fast/stages/s0_org_setup/simple.yaml
+++ b/tests/fast/stages/s0_org_setup/simple.yaml
@@ -2805,6 +2805,7 @@ counts:
google_bigquery_dataset: 1
google_bigquery_default_service_account: 2
google_billing_account_iam_member: 6
+ google_essential_contacts_contact: 1
google_folder: 8
google_folder_iam_binding: 44
google_iam_workload_identity_pool: 1
@@ -2836,5 +2837,5 @@ counts:
google_tags_tag_value_iam_binding: 4
local_file: 9
modules: 48
- resources: 311
+ resources: 312
terraform_data: 2