apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sazureblockdefault
spec:
  crd:
    spec:
      names:
        kind: K8sAzureBlockDefault
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sazureblockdefault

        violation[{"msg": msg}] {
          obj := input.review.object
          is_default_namespace(obj.metadata)
          not is_allowed(obj)
          msg := sprintf("Usage of the default namespace is not allowed, name: %v, kind: %v", [obj.metadata.name, obj.kind])
        }

        is_default_namespace(metadata) {
          not metadata.namespace
        }

        is_default_namespace(metadata) {
          metadata.namespace == "default"
        }

        is_allowed(obj) {
          obj.kind == "ServiceAccount"
          obj.metadata.name == "default"
        }

        is_allowed(obj) {
          obj.kind == "Secret"
          obj.type == "kubernetes.io/service-account-token"
          obj.metadata.annotations["kubernetes.io/service-account.name"] == "default"
        }

        is_allowed(obj) {
          obj.kind == "Service"
          obj.metadata.name == "kubernetes"
        }
