Skip to content

metadata.namespace is required by finalizer but not allowed by kubernetes_manifest in terraform #130

Open
@panophobicPanda

Description

@panophobicPanda

How to replicate:
Create a clustersecret via terraform and include the namespace field:

resource "kubernetes_manifest" "my-docker-secret-clustersecret" {
  manifest = {
    "apiVersion" = "clustersecret.io/v1"
    "kind"       = "ClusterSecret"
    "metadata" = {
      "name"      = "my-docker-secret"
      "namespace" = "cluster-secret"
    }
    "avoidNamespaces" = []
    "matchNamespace" = ["asdf"]
    "type" = "kubernetes.io/dockerconfigjson"
    "data" = {
      ".dockerconfigjson" = <some base64 secret>
    }
  }
}

Error from terraform:
Cluster level resource cannot take namespace
This is coded in terraform at https://github.com/hashicorp/terraform-provider-kubernetes/blob/main/manifest/provider/validate.go#L236

If we do not define the metadata.namespace, we can apply the terraform but then any modifications or deletions hang on the finalizer.

My Temporary Workaround:
Do not define the namespace in kubernetes_manifest and then delete the finalizer:

resource "null_resource" "my-docker-secret-clustersecret-finalizer-patch" {
# We need this to trigger every time we run terraform, or at least every time we update the resource (room for improvement here)
  triggers = {
    always_run = "${timestamp()}"
  }
  provisioner "local-exec" {
    command = "kubectl patch clusterSecret my-docker-secret --type json --patch='[ { \"op\": \"remove\", \"path\": \"/metadata/finalizers\" } ]'"
  }
  depends_on = [kubernetes_manifest.my-docker-secret-clustersecret]
}

Implications of workaround?
I presume none but I would be very interested to know this :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions