New to KubeVault? Please start here.

WeaviateRole

What is WeaviateRole

A WeaviateRole is a Kubernetes CustomResourceDefinition (CRD) which allows a user to create a database secret engine role in a Kubernetes native way.

When a WeaviateRole is created, the KubeVault operator creates a role according to specification. If the user deletes the WeaviateRole CRD, then the respective role will also be deleted from Vault.

Dynamic credentials generated from a WeaviateRole create a dynamic user in Weaviate, assign the configured RBAC roles, and return a dynamic API key.

WeaviateRole CRD Specification

Like any official Kubernetes resource, a WeaviateRole object has TypeMeta, ObjectMeta, Spec and Status sections.

A sample WeaviateRole object is shown below:

apiVersion: engine.kubevault.com/v1alpha1
kind: WeaviateRole
metadata:
  name: weaviate-role
  namespace: demo
spec:
  secretEngineRef:
    name: weaviate-engine
  defaultTTL: "1h"
  maxTTL: "24h"
  creationStatements:
    - |
      {
        "roles": [
          "viewer"
        ]
      }      
status:
  observedGeneration: 1
  phase: Success

Note: To resolve the naming conflict, name of the role in Vault will follow this format: k8s.{clusterName}.{metadata.namespace}.{metadata.name}

Here, we are going to describe the various sections of the WeaviateRole CRD.

WeaviateRole Spec

WeaviateRole spec contains information that is necessary for creating a database role.

spec:
  secretEngineRef:
    name: <secret-engine-name>
  defaultTTL: <default-ttl>
  maxTTL: <max-ttl>
  creationStatements:
    - "statement-0"

WeaviateRole spec has the following fields:

spec.secretEngineRef

spec.secretEngineRef is a required field that specifies the name of a SecretEngine.

spec:
  secretEngineRef:
    name: weaviate-secret-engine

spec.creationStatements

spec.creationStatements is a required field that specifies the roles assigned to the dynamically-created user in Weaviate. It accepts a JSON object with existing roles and/or custom_roles:

spec:
  creationStatements:
    - |
      {
        "roles": [
          "viewer"
        ],
        "custom_roles": [
          {
            "name": "customrole",
            "permissions": [
              {
                "action": "read_data",
                "collections": {
                  "collection": "Products"
                }
              }
            ]
          }
        ]
      }      

spec.defaultTTL

spec.defaultTTL is an optional field that specifies the TTL for the leases associated with this role. Accepts time suffixed strings (“1h”) or an integer number of seconds. Defaults to system/engine default TTL time.

spec:
  defaultTTL: "1h"

spec.maxTTL

spec.maxTTL is an optional field that specifies the maximum TTL for the leases associated with this role. Accepts time suffixed strings (“1h”) or an integer number of seconds. Defaults to system/engine default TTL time.

spec:
  maxTTL: "24h"

WeaviateRole Status

status shows the status of the WeaviateRole. It is managed by the KubeVault operator. It contains the following fields:

  • observedGeneration: Specifies the most recent generation observed for this resource. It corresponds to the resource’s generation, which is updated on mutation by the API Server.

  • phase: Indicates whether the role successfully applied to Vault or not.

  • conditions: Represent observations of a WeaviateRole.

Namespace inheritance (tenant isolation)

A WeaviateRole never sets or resolves an OpenBao namespace itself. It always inherits the effective namespace of the SecretEngine it references via spec.secretEngineRef (SecretEngine.status.effectiveNamespace) — empty for root, or the tenant’s OpenBao namespace once tenant isolation has placed that engine in one. Every credential this role issues, and every revocation (SecretAccessRequest), is scoped to that same namespace automatically — no WeaviateRole-level configuration is needed.