From c56458e2db1dae550955b4db14de5778692951fc Mon Sep 17 00:00:00 2001 From: mateuszjanczak Date: Mon, 16 Oct 2023 23:28:28 +0200 Subject: [PATCH 1/4] Create custom provider for Render via GraphQL --- environments/dev/main.tf | 39 ++- environments/dev/variables.tf | 4 - .../graphql/createMutation.graphql | 246 +++++++++++++++++ .../graphql/deleteMutation.graphql | 3 + modules/application/graphql/readQuery.graphql | 248 ++++++++++++++++++ modules/application/main.tf | 68 +++++ modules/application/variables.tf | 9 + 7 files changed, 601 insertions(+), 16 deletions(-) create mode 100644 modules/application/graphql/createMutation.graphql create mode 100644 modules/application/graphql/deleteMutation.graphql create mode 100644 modules/application/graphql/readQuery.graphql create mode 100644 modules/application/main.tf create mode 100644 modules/application/variables.tf diff --git a/environments/dev/main.tf b/environments/dev/main.tf index 5519dc0..2710781 100644 --- a/environments/dev/main.tf +++ b/environments/dev/main.tf @@ -1,19 +1,34 @@ -data "akeyless_static_secret" "rabbitmq_endpoint" { - path = "rabbitmq/endpoint" -} +#data "akeyless_static_secret" "rabbitmq_endpoint" { +# path = "rabbitmq/endpoint" +#} +# +#data "akeyless_static_secret" "rabbitmq_username" { +# path = "rabbitmq/username" +#} +# +#data "akeyless_static_secret" "rabbitmq_password" { +# path = "rabbitmq/password" +#} -data "akeyless_static_secret" "rabbitmq_username" { - path = "rabbitmq/username" +data "akeyless_static_secret" "render_email" { + path = "render/email" } -data "akeyless_static_secret" "rabbitmq_password" { - path = "rabbitmq/password" +data "akeyless_static_secret" "render_password" { + path = "render/password" } -module "rabbitmq" { - source = "../../modules/rabbitmq" +#module "rabbitmq" { +# source = "../../modules/rabbitmq" +# +# endpoint = data.akeyless_static_secret.rabbitmq_endpoint.value +# password = data.akeyless_static_secret.rabbitmq_password.value +# username = data.akeyless_static_secret.rabbitmq_username.value +#} + +module "application" { + source = "../../modules/application" - endpoint = data.akeyless_static_secret.rabbitmq_endpoint.value - password = data.akeyless_static_secret.rabbitmq_password.value - username = data.akeyless_static_secret.rabbitmq_username.value + email = data.akeyless_static_secret.render_email.value + password = data.akeyless_static_secret.render_password.value } \ No newline at end of file diff --git a/environments/dev/variables.tf b/environments/dev/variables.tf index b144bcf..25fb331 100644 --- a/environments/dev/variables.tf +++ b/environments/dev/variables.tf @@ -1,7 +1,3 @@ -variable "kubernetes_url" { - type = string -} - variable "akeyless_api_gateway_address" { type = string default = "https://api.akeyless.io" diff --git a/modules/application/graphql/createMutation.graphql b/modules/application/graphql/createMutation.graphql new file mode 100644 index 0000000..f22357a --- /dev/null +++ b/modules/application/graphql/createMutation.graphql @@ -0,0 +1,246 @@ +mutation createServer($server: ServerInput!) { + createServer(server: $server) { + ...serverFields + __typename + } +} + +fragment serverFields on Server { + ...serviceFields + autoscalingConfig { + enabled + min + max + cpuPercentage + cpuEnabled + memoryPercentage + memoryEnabled + __typename + } + deletedAt + deploy { + ...deployFields + __typename + } + deployKey + externalImage { + ...externalImageFields + __typename + } + extraInstances + healthCheckHost + healthCheckPath + isPrivate + isWorker + openPorts + maintenanceScheduledAt + parentServer { + ...serviceFields + __typename + } + pendingMaintenanceBy + plan { + name + cpu + mem + price + __typename + } + prPreviewsEnabled + preDeployCommand + pullRequestId + rootDir + startCommand + staticPublishPath + suspenders + url + disk { + ...diskFields + __typename + } + maintenance { + id + type + scheduledAt + pendingMaintenanceBy + state + __typename + } + __typename +} + +fragment serviceFields on Service { + id + type + env { + ...envFields + __typename + } + repo { + ...repoFields + __typename + } + user { + id + email + __typename + } + owner { + id + email + billingStatus + featureFlags + __typename + } + name + slug + sourceBranch + buildCommand + buildFilter { + paths + ignoredPaths + __typename + } + buildPlan { + name + cpu + mem + __typename + } + externalImage { + ...externalImageFields + __typename + } + autoDeploy + notifyOnFail + userFacingType + userFacingTypeSlug + baseDir + dockerCommand + dockerfilePath + createdAt + updatedAt + outboundIPs + region { + id + description + __typename + } + rootDir + shellURL + state + suspenders + sshAddress + sshServiceAvailable + lastDeployedAt + maintenanceScheduledAt + pendingMaintenanceBy + environment { + ...environmentFields + __typename + } + __typename +} + +fragment envFields on Env { + id + name + language + isStatic + sampleBuildCommand + sampleStartCommand + __typename +} + +fragment environmentFields on Environment { + id + name + project { + id + name + owner { + id + __typename + } + __typename + } + __typename +} + +fragment repoFields on Repo { + id + provider + providerId + name + ownerName + webURL + isPrivate + __typename +} + +fragment externalImageFields on ExternalImage { + imageHost + imageName + imageRef + imageRepository + imageURL + ownerId + registryCredentialId + __typename +} + +fragment deployFields on Deploy { + id + status + buildId + commitId + commitShortId + commitMessage + commitURL + commitCreatedAt + finishedAt + finishedAtUnixNano + initialDeployHookFinishedAtUnixNano + createdAt + updatedAt + server { + id + userFacingTypeSlug + __typename + } + rollbackSupportStatus + reason { + ...failureReasonFields + __typename + } + imageSHA + externalImage { + imageRef + __typename + } + __typename +} + +fragment failureReasonFields on FailureReason { + badStartCommand + evicted + evictionReason + nonZeroExit + oomKilled { + memoryLimit + __typename + } + rootDirMissing + timedOutSeconds + unhealthy + step + __typename +} + +fragment diskFields on Disk { + id + name + mountPath + sizeGB + __typename +} diff --git a/modules/application/graphql/deleteMutation.graphql b/modules/application/graphql/deleteMutation.graphql new file mode 100644 index 0000000..d044bc8 --- /dev/null +++ b/modules/application/graphql/deleteMutation.graphql @@ -0,0 +1,3 @@ +mutation deleteServer($id: String!) { + deleteServer(id: $id) +} diff --git a/modules/application/graphql/readQuery.graphql b/modules/application/graphql/readQuery.graphql new file mode 100644 index 0000000..160efb9 --- /dev/null +++ b/modules/application/graphql/readQuery.graphql @@ -0,0 +1,248 @@ +query server($id: String!) { + server(id: $id) { + ...serverFields + verifiedDomains + isGithubRepoEmpty + __typename + } +} + +fragment serverFields on Server { + ...serviceFields + autoscalingConfig { + enabled + min + max + cpuPercentage + cpuEnabled + memoryPercentage + memoryEnabled + __typename + } + deletedAt + deploy { + ...deployFields + __typename + } + deployKey + externalImage { + ...externalImageFields + __typename + } + extraInstances + healthCheckHost + healthCheckPath + isPrivate + isWorker + openPorts + maintenanceScheduledAt + parentServer { + ...serviceFields + __typename + } + pendingMaintenanceBy + plan { + name + cpu + mem + price + __typename + } + prPreviewsEnabled + preDeployCommand + pullRequestId + rootDir + startCommand + staticPublishPath + suspenders + url + disk { + ...diskFields + __typename + } + maintenance { + id + type + scheduledAt + pendingMaintenanceBy + state + __typename + } + __typename +} + +fragment serviceFields on Service { + id + type + env { + ...envFields + __typename + } + repo { + ...repoFields + __typename + } + user { + id + email + __typename + } + owner { + id + email + billingStatus + featureFlags + __typename + } + name + slug + sourceBranch + buildCommand + buildFilter { + paths + ignoredPaths + __typename + } + buildPlan { + name + cpu + mem + __typename + } + externalImage { + ...externalImageFields + __typename + } + autoDeploy + notifyOnFail + userFacingType + userFacingTypeSlug + baseDir + dockerCommand + dockerfilePath + createdAt + updatedAt + outboundIPs + region { + id + description + __typename + } + rootDir + shellURL + state + suspenders + sshAddress + sshServiceAvailable + lastDeployedAt + maintenanceScheduledAt + pendingMaintenanceBy + environment { + ...environmentFields + __typename + } + __typename +} + +fragment envFields on Env { + id + name + language + isStatic + sampleBuildCommand + sampleStartCommand + __typename +} + +fragment environmentFields on Environment { + id + name + project { + id + name + owner { + id + __typename + } + __typename + } + __typename +} + +fragment repoFields on Repo { + id + provider + providerId + name + ownerName + webURL + isPrivate + __typename +} + +fragment externalImageFields on ExternalImage { + imageHost + imageName + imageRef + imageRepository + imageURL + ownerId + registryCredentialId + __typename +} + +fragment deployFields on Deploy { + id + status + buildId + commitId + commitShortId + commitMessage + commitURL + commitCreatedAt + finishedAt + finishedAtUnixNano + initialDeployHookFinishedAtUnixNano + createdAt + updatedAt + server { + id + userFacingTypeSlug + __typename + } + rollbackSupportStatus + reason { + ...failureReasonFields + __typename + } + imageSHA + externalImage { + imageRef + __typename + } + __typename +} + +fragment failureReasonFields on FailureReason { + badStartCommand + evicted + evictionReason + nonZeroExit + oomKilled { + memoryLimit + __typename + } + rootDirMissing + timedOutSeconds + unhealthy + step + __typename +} + +fragment diskFields on Disk { + id + name + mountPath + sizeGB + __typename +} diff --git a/modules/application/main.tf b/modules/application/main.tf new file mode 100644 index 0000000..9d00a00 --- /dev/null +++ b/modules/application/main.tf @@ -0,0 +1,68 @@ +terraform { + required_providers { + graphql = { + source = "sullivtr/graphql" + version = "2.5.4" + } + } +} + +provider "graphql" { + url = "https://api.render.com/graphql" + + oauth2_login_query = "mutation signIn($email:String!,$password:String!){signIn(email:$email,password:$password){...authResultFields __typename}}fragment authResultFields on AuthResult{idToken expiresAt user{...userFields sudoModeExpiresAt __typename}readOnly __typename}fragment userFields on User{id active createdAt email featureFlags githubId gitlabId name notifyOnFail notifyOnPrUpdate otpEnabled passwordExists tosAcceptedAt intercomEmailHMAC __typename}" + oauth2_login_query_variables = { + "email" = var.email + "password" = var.password + } + oauth2_login_query_value_attribute = "data.signIn.idToken" +} + +resource "graphql_mutation" "basic_mutation" { + mutation_variables = { + // Parametrize it + "server" = jsonencode({ + "autoDeploy" : true, + "baseDir" : "", + "branch" : "", + "buildCommand" : "", + "name" : "test", + "dockerfilePath" : "", + "dockerCommand" : "", + "envId" : "image", + "envVars" : [], + "healthCheckPath" : "", + "ownerId" : "usr-123123123", // Input or fetch (?) + "plan" : "Free", + "repo" : null, + "externalImage" : { + "imageURL" : "docker.io/library/nginx:latest", + "ownerID" : "usr-123123123", + "registryCredentialID" : null + }, + "isWorker" : false, + "isPrivate" : false, + "region" : "oregon", + "startCommand" : "", + "staticPublishPath" : "", + "rootDir" : "", + "buildFilter" : { + "paths" : [], + "ignoredPaths" : [] + }, + "preDeployCommand" : null, + "environmentId" : null + }) + } + + compute_from_create = true + + compute_mutation_keys = { + "id" = "data.createServer.id" + } + + create_mutation = file("${path.module}/graphql/createMutation.graphql") + update_mutation = file("${path.module}/graphql/readQuery.graphql") // Update is not available + delete_mutation = file("${path.module}/graphql/deleteMutation.graphql") + read_query = file("${path.module}/graphql/readQuery.graphql") +} \ No newline at end of file diff --git a/modules/application/variables.tf b/modules/application/variables.tf new file mode 100644 index 0000000..d0a5c75 --- /dev/null +++ b/modules/application/variables.tf @@ -0,0 +1,9 @@ +variable "email" { + type = string + sensitive = true +} + +variable "password" { + type = string + sensitive = true +} \ No newline at end of file From 85e215e543a214b511fcc8c6c422f930d6e04f80 Mon Sep 17 00:00:00 2001 From: mateuszjanczak Date: Mon, 16 Oct 2023 23:50:44 +0200 Subject: [PATCH 2/4] Reorganize modules --- environments/dev/main.tf | 8 +++ .../render}/graphql/createMutation.graphql | 0 .../render}/graphql/deleteMutation.graphql | 0 external_modules/render/graphql/login.graphql | 36 ++++++++++ .../render}/graphql/readQuery.graphql | 0 external_modules/render/main.tf | 67 +++++++++++++++++ external_modules/render/variables.tf | 22 ++++++ modules/application/main.tf | 72 ++----------------- modules/application/variables.tf | 13 ++++ 9 files changed, 153 insertions(+), 65 deletions(-) rename {modules/application => external_modules/render}/graphql/createMutation.graphql (100%) rename {modules/application => external_modules/render}/graphql/deleteMutation.graphql (100%) create mode 100644 external_modules/render/graphql/login.graphql rename {modules/application => external_modules/render}/graphql/readQuery.graphql (100%) create mode 100644 external_modules/render/main.tf create mode 100644 external_modules/render/variables.tf diff --git a/environments/dev/main.tf b/environments/dev/main.tf index 2710781..c7b3c60 100644 --- a/environments/dev/main.tf +++ b/environments/dev/main.tf @@ -18,6 +18,10 @@ data "akeyless_static_secret" "render_password" { path = "render/password" } +data "akeyless_static_secret" "render_userId" { + path = "render/userId" +} + #module "rabbitmq" { # source = "../../modules/rabbitmq" # @@ -31,4 +35,8 @@ module "application" { email = data.akeyless_static_secret.render_email.value password = data.akeyless_static_secret.render_password.value + userId = data.akeyless_static_secret.render_userId.value + + name = "agent" + dockerImageUrl = "docker.io/library/nginx:latest" } \ No newline at end of file diff --git a/modules/application/graphql/createMutation.graphql b/external_modules/render/graphql/createMutation.graphql similarity index 100% rename from modules/application/graphql/createMutation.graphql rename to external_modules/render/graphql/createMutation.graphql diff --git a/modules/application/graphql/deleteMutation.graphql b/external_modules/render/graphql/deleteMutation.graphql similarity index 100% rename from modules/application/graphql/deleteMutation.graphql rename to external_modules/render/graphql/deleteMutation.graphql diff --git a/external_modules/render/graphql/login.graphql b/external_modules/render/graphql/login.graphql new file mode 100644 index 0000000..c1d7fa9 --- /dev/null +++ b/external_modules/render/graphql/login.graphql @@ -0,0 +1,36 @@ +mutation signIn($email: String!, $password: String!) { + signIn(email: $email, password: $password) { + ...authResultFields + __typename + } +} + +fragment authResultFields on AuthResult { + idToken + expiresAt + user { + ...userFields + sudoModeExpiresAt + __typename + } + readOnly + __typename +} + +fragment userFields on User { + id + active + createdAt + email + featureFlags + githubId + gitlabId + name + notifyOnFail + notifyOnPrUpdate + otpEnabled + passwordExists + tosAcceptedAt + intercomEmailHMAC + __typename +} \ No newline at end of file diff --git a/modules/application/graphql/readQuery.graphql b/external_modules/render/graphql/readQuery.graphql similarity index 100% rename from modules/application/graphql/readQuery.graphql rename to external_modules/render/graphql/readQuery.graphql diff --git a/external_modules/render/main.tf b/external_modules/render/main.tf new file mode 100644 index 0000000..2153431 --- /dev/null +++ b/external_modules/render/main.tf @@ -0,0 +1,67 @@ +terraform { + required_providers { + graphql = { + source = "sullivtr/graphql" + version = "2.5.4" + } + } +} + +provider "graphql" { + url = "https://api.render.com/graphql" + + oauth2_login_query = file("${path.module}/graphql/login.graphql") + oauth2_login_query_variables = { + "email" = var.email + "password" = var.password + } + oauth2_login_query_value_attribute = "data.signIn.idToken" +} + +resource "graphql_mutation" "basic_mutation" { + mutation_variables = { + "server" = jsonencode({ + "autoDeploy" : true, + "baseDir" : "", + "branch" : "", + "buildCommand" : "", + "name" : var.name, + "dockerfilePath" : "", + "dockerCommand" : "", + "envId" : "image", + "envVars" : [], + "healthCheckPath" : "", + "ownerId" : var.userId, + "plan" : "Free", + "repo" : null, + "externalImage" : { + "imageURL" : var.dockerImageUrl, + "ownerID" : var.userId, + "registryCredentialID" : null + }, + "isWorker" : false, + "isPrivate" : false, + "region" : "frankfurt", + "startCommand" : "", + "staticPublishPath" : "", + "rootDir" : "", + "buildFilter" : { + "paths" : [], + "ignoredPaths" : [] + }, + "preDeployCommand" : null, + "environmentId" : null + }) + } + + compute_from_create = true + + compute_mutation_keys = { + "id" = "data.createServer.id" + } + + create_mutation = file("${path.module}/graphql/createMutation.graphql") + update_mutation = file("${path.module}/graphql/readQuery.graphql") // Update is not available + delete_mutation = file("${path.module}/graphql/deleteMutation.graphql") + read_query = file("${path.module}/graphql/readQuery.graphql") +} \ No newline at end of file diff --git a/external_modules/render/variables.tf b/external_modules/render/variables.tf new file mode 100644 index 0000000..9677dde --- /dev/null +++ b/external_modules/render/variables.tf @@ -0,0 +1,22 @@ +variable "email" { + type = string + sensitive = true +} + +variable "password" { + type = string + sensitive = true +} + +variable "userId" { + type = string + sensitive = true +} + +variable "name" { + type = string +} + +variable "dockerImageUrl" { + type = string +} \ No newline at end of file diff --git a/modules/application/main.tf b/modules/application/main.tf index 9d00a00..7e09567 100644 --- a/modules/application/main.tf +++ b/modules/application/main.tf @@ -1,68 +1,10 @@ -terraform { - required_providers { - graphql = { - source = "sullivtr/graphql" - version = "2.5.4" - } - } -} +module "application" { + source = "../../external_modules/render" -provider "graphql" { - url = "https://api.render.com/graphql" + email = var.email + password = var.password + userId = var.userId - oauth2_login_query = "mutation signIn($email:String!,$password:String!){signIn(email:$email,password:$password){...authResultFields __typename}}fragment authResultFields on AuthResult{idToken expiresAt user{...userFields sudoModeExpiresAt __typename}readOnly __typename}fragment userFields on User{id active createdAt email featureFlags githubId gitlabId name notifyOnFail notifyOnPrUpdate otpEnabled passwordExists tosAcceptedAt intercomEmailHMAC __typename}" - oauth2_login_query_variables = { - "email" = var.email - "password" = var.password - } - oauth2_login_query_value_attribute = "data.signIn.idToken" -} - -resource "graphql_mutation" "basic_mutation" { - mutation_variables = { - // Parametrize it - "server" = jsonencode({ - "autoDeploy" : true, - "baseDir" : "", - "branch" : "", - "buildCommand" : "", - "name" : "test", - "dockerfilePath" : "", - "dockerCommand" : "", - "envId" : "image", - "envVars" : [], - "healthCheckPath" : "", - "ownerId" : "usr-123123123", // Input or fetch (?) - "plan" : "Free", - "repo" : null, - "externalImage" : { - "imageURL" : "docker.io/library/nginx:latest", - "ownerID" : "usr-123123123", - "registryCredentialID" : null - }, - "isWorker" : false, - "isPrivate" : false, - "region" : "oregon", - "startCommand" : "", - "staticPublishPath" : "", - "rootDir" : "", - "buildFilter" : { - "paths" : [], - "ignoredPaths" : [] - }, - "preDeployCommand" : null, - "environmentId" : null - }) - } - - compute_from_create = true - - compute_mutation_keys = { - "id" = "data.createServer.id" - } - - create_mutation = file("${path.module}/graphql/createMutation.graphql") - update_mutation = file("${path.module}/graphql/readQuery.graphql") // Update is not available - delete_mutation = file("${path.module}/graphql/deleteMutation.graphql") - read_query = file("${path.module}/graphql/readQuery.graphql") + name = var.name + dockerImageUrl = var.dockerImageUrl } \ No newline at end of file diff --git a/modules/application/variables.tf b/modules/application/variables.tf index d0a5c75..9677dde 100644 --- a/modules/application/variables.tf +++ b/modules/application/variables.tf @@ -6,4 +6,17 @@ variable "email" { variable "password" { type = string sensitive = true +} + +variable "userId" { + type = string + sensitive = true +} + +variable "name" { + type = string +} + +variable "dockerImageUrl" { + type = string } \ No newline at end of file From cb37eaa3ded6949774a01b49518677020e6217ca Mon Sep 17 00:00:00 2001 From: mateuszjanczak Date: Mon, 16 Oct 2023 23:53:05 +0200 Subject: [PATCH 3/4] Enable commented resources --- environments/dev/main.tf | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/environments/dev/main.tf b/environments/dev/main.tf index c7b3c60..a3271e0 100644 --- a/environments/dev/main.tf +++ b/environments/dev/main.tf @@ -1,14 +1,14 @@ -#data "akeyless_static_secret" "rabbitmq_endpoint" { -# path = "rabbitmq/endpoint" -#} -# -#data "akeyless_static_secret" "rabbitmq_username" { -# path = "rabbitmq/username" -#} -# -#data "akeyless_static_secret" "rabbitmq_password" { -# path = "rabbitmq/password" -#} +data "akeyless_static_secret" "rabbitmq_endpoint" { + path = "rabbitmq/endpoint" +} + +data "akeyless_static_secret" "rabbitmq_username" { + path = "rabbitmq/username" +} + +data "akeyless_static_secret" "rabbitmq_password" { + path = "rabbitmq/password" +} data "akeyless_static_secret" "render_email" { path = "render/email" @@ -22,13 +22,13 @@ data "akeyless_static_secret" "render_userId" { path = "render/userId" } -#module "rabbitmq" { -# source = "../../modules/rabbitmq" -# -# endpoint = data.akeyless_static_secret.rabbitmq_endpoint.value -# password = data.akeyless_static_secret.rabbitmq_password.value -# username = data.akeyless_static_secret.rabbitmq_username.value -#} +module "rabbitmq" { + source = "../../modules/rabbitmq" + + endpoint = data.akeyless_static_secret.rabbitmq_endpoint.value + password = data.akeyless_static_secret.rabbitmq_password.value + username = data.akeyless_static_secret.rabbitmq_username.value +} module "application" { source = "../../modules/application" From 47a6a362edf4b51e1c104c532539cf4ef1434d8f Mon Sep 17 00:00:00 2001 From: mateuszjanczak Date: Tue, 12 Mar 2024 01:16:48 +0100 Subject: [PATCH 4/4] Update module --- external_modules/render/graphql/createMutation.graphql | 1 - external_modules/render/graphql/login.graphql | 2 +- external_modules/render/graphql/readQuery.graphql | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/external_modules/render/graphql/createMutation.graphql b/external_modules/render/graphql/createMutation.graphql index f22357a..d746056 100644 --- a/external_modules/render/graphql/createMutation.graphql +++ b/external_modules/render/graphql/createMutation.graphql @@ -112,7 +112,6 @@ fragment serviceFields on Service { __typename } autoDeploy - notifyOnFail userFacingType userFacingTypeSlug baseDir diff --git a/external_modules/render/graphql/login.graphql b/external_modules/render/graphql/login.graphql index c1d7fa9..25d0d53 100644 --- a/external_modules/render/graphql/login.graphql +++ b/external_modules/render/graphql/login.graphql @@ -25,8 +25,8 @@ fragment userFields on User { featureFlags githubId gitlabId + googleId name - notifyOnFail notifyOnPrUpdate otpEnabled passwordExists diff --git a/external_modules/render/graphql/readQuery.graphql b/external_modules/render/graphql/readQuery.graphql index 160efb9..a1bf701 100644 --- a/external_modules/render/graphql/readQuery.graphql +++ b/external_modules/render/graphql/readQuery.graphql @@ -114,7 +114,6 @@ fragment serviceFields on Service { __typename } autoDeploy - notifyOnFail userFacingType userFacingTypeSlug baseDir