Skip to content

Commit c728bbe

Browse files
authored
Stabilize the deployment process by adding check steps (#43)
* add checks and waits on resource creation * fix lint issues * addressing PR comments * fix lint issues
1 parent 5688b53 commit c728bbe

8 files changed

Lines changed: 94 additions & 3 deletions

File tree

scripts/common.sh

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ run_terraform() {
4949
_TERRAFORM_RUN_DIR=$1
5050
shift
5151
terraform -chdir="${_TERRAFORM_RUN_DIR}" version
52-
terraform -chdir="${_TERRAFORM_RUN_DIR}" init -input=false -migrate-state
52+
terraform -chdir="${_TERRAFORM_RUN_DIR}" init -migrate-state
5353
terraform -chdir="${_TERRAFORM_RUN_DIR}" validate
5454
terraform -chdir="${_TERRAFORM_RUN_DIR}" apply -input=false -auto-approve "$@"
5555
unset _TERRAFORM_RUN_DIR
@@ -68,3 +68,31 @@ create_terraform_variables_file() {
6868
unset _TERRAFORM_RUN_DIR
6969
unset _TERRAFORM_VARIABLE_FILE_PATH
7070
}
71+
72+
wait_for_state() {
73+
_STATE_CHECK_CMD="$1"
74+
_STATE_CHECK_CMD_ARGS="$2"
75+
_VALIDATION_SEARCH_TERM="$3"
76+
_ERROR_MESSAGE="$4"
77+
_WAIT_PER_LOOP_SEC=${5:-10}
78+
_MAX_TRIES=${6:-50}
79+
_COUNTER=0
80+
81+
# shellcheck disable=SC2086
82+
while ! "${_STATE_CHECK_CMD}" ${_STATE_CHECK_CMD_ARGS} | grep -i "${_VALIDATION_SEARCH_TERM}" && [ $_COUNTER -lt $_MAX_TRIES ]; do
83+
sleep "${_WAIT_PER_LOOP_SEC}"
84+
_COUNTER=$((_COUNTER + 1))
85+
done
86+
if [ $_COUNTER -eq "${_MAX_TRIES}" ]; then
87+
echo "${_ERROR_MESSAGE}"
88+
exit 1
89+
fi
90+
91+
unset _STATE_CHECK_CMD
92+
unset _STATE_CHECK_CMD_ARGS
93+
unset _VALIDATION_SEARCH_TERM
94+
unset _ERROR_MESSAGE
95+
unset _WAIT_PER_LOOP_SEC
96+
unset _MAX_TRIES
97+
unset _COUNTER
98+
}

terraform/infra-setup/main.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ module "gcp_network" {
118118
},
119119
]
120120
}
121+
122+
depends_on = [local_file.tf_backend_config]
121123
}
122124

123125
resource "google_project_iam_custom_role" "iap_admin_role" {
@@ -134,6 +136,8 @@ resource "google_project_iam_custom_role" "iap_admin_role" {
134136
"clientauthconfig.clients.delete",
135137
"clientauthconfig.clients.update"
136138
]
139+
140+
depends_on = [local_file.tf_backend_config]
137141
}
138142

139143
module "iap_bastion" {

terraform/modules/admin-lb/main.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,29 @@ resource "kubernetes_manifest" "admin-server-cert" {
3030
}
3131
}
3232

33+
resource "null_resource" "wait_for_server_cert_creation" {
34+
provisioner "local-exec" {
35+
interpreter = ["/bin/sh", "-c"]
36+
command = <<-EOT
37+
. ../common.sh
38+
wait_for_state kubectl "describe managedcertificate ${var.admin_server_cert_id} --namespace=${var.deployment_namespace}" 'certificate name' 'The managed server certificate was not created, please ensure that the managed certificate with ID ${var.admin_server_cert_id} is present on your GKE cluster before proceeding with the deployment.' 15 50
39+
EOT
40+
}
41+
42+
depends_on = [
43+
kubernetes_manifest.admin-server-cert
44+
]
45+
}
46+
3347
data "kubernetes_resource" "managed_certificate" {
3448
api_version = kubernetes_manifest.admin-server-cert.manifest.apiVersion
3549
kind = kubernetes_manifest.admin-server-cert.manifest.kind
3650
metadata {
3751
name = kubernetes_manifest.admin-server-cert.manifest.metadata.name
3852
namespace = kubernetes_manifest.admin-server-cert.manifest.metadata.namespace
3953
}
54+
55+
depends_on = [null_resource.wait_for_server_cert_creation]
4056
}
4157

4258
resource "kubernetes_ingress_v1" "admin-ingress" {

terraform/modules/admin-lb/versions.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,10 @@ terraform {
2424
source = "hashicorp/kubernetes"
2525
version = "2.19.0"
2626
}
27+
28+
null = {
29+
source = "hashicorp/null"
30+
version = "3.2.1"
31+
}
2732
}
2833
}

terraform/modules/emqx-ee/main.tf

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ module "emqx" {
3636
module_depends_on = var.module_depends_on
3737
}
3838

39+
resource "null_resource" "wait_for_neg_creation" {
40+
provisioner "local-exec" {
41+
interpreter = ["/bin/sh", "-c"]
42+
command = <<-EOT
43+
. ../common.sh
44+
wait_for_state kubectl "describe svcneg ${var.mqtt_tcp_neg_id}" 'network endpoint groups' 'Network Endpoint Group for the MQTT service was not created, please ensure that the network endpoint group with ID ${var.mqtt_tcp_neg_id} is present before proceeding with the deployment. You can check this in the Cloud Console.' 30 50
45+
EOT
46+
}
47+
48+
depends_on = [
49+
module.emqx.wait
50+
]
51+
}
52+
3953
resource "local_file" "admin_service_manifest" {
4054
filename = "admin-service-manifest.yaml"
4155
content = templatefile("../modules/emqx-ee/admin-service-manifest.tftpl", {
@@ -63,6 +77,6 @@ data "kubernetes_resource" "tcp_neg" {
6377
namespace = var.deployment_namespace
6478
}
6579
depends_on = [
66-
module.emqx.wait
80+
null_resource.wait_for_neg_creation
6781
]
6882
}

terraform/modules/emqx-ee/versions.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,10 @@ terraform {
2424
source = "hashicorp/local"
2525
version = "2.4.0"
2626
}
27+
28+
null = {
29+
source = "hashicorp/null"
30+
version = "3.2.1"
31+
}
2732
}
2833
}

terraform/modules/emqx-oss/main.tf

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ module "emqx" {
3636
module_depends_on = var.module_depends_on
3737
}
3838

39+
resource "null_resource" "wait_for_neg_creation" {
40+
provisioner "local-exec" {
41+
interpreter = ["/bin/sh", "-c"]
42+
command = <<-EOT
43+
. ../common.sh
44+
wait_for_state kubectl "describe svcneg ${var.mqtt_tcp_neg_id}" 'network endpoint groups' 'Network Endpoint Group for the MQTT service was not created, please ensure that the network endpoint group with ID ${var.mqtt_tcp_neg_id} is present before proceeding with the deployment. You can check this in the Cloud Console.' 30 50
45+
EOT
46+
}
47+
48+
depends_on = [
49+
module.emqx.wait
50+
]
51+
}
52+
3953
data "kubernetes_resource" "tcp_neg" {
4054
api_version = "networking.gke.io/v1beta1"
4155
kind = "ServiceNetworkEndpointGroup"
@@ -44,6 +58,6 @@ data "kubernetes_resource" "tcp_neg" {
4458
namespace = var.deployment_namespace
4559
}
4660
depends_on = [
47-
module.emqx.wait
61+
null_resource.wait_for_neg_creation
4862
]
4963
}

terraform/modules/emqx-oss/versions.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,10 @@ terraform {
2424
source = "hashicorp/local"
2525
version = "2.4.0"
2626
}
27+
28+
null = {
29+
source = "hashicorp/null"
30+
version = "3.2.1"
31+
}
2732
}
2833
}

0 commit comments

Comments
 (0)