Skip to main content

PolicyDomain Schema

Complete reference for the PolicyDomain YAML schema.

Overview

A PolicyDomain is defined in YAML with the following top-level structure:

apiVersion: iamlite.manetu.io/v1beta1
kind: PolicyDomain
metadata:
name: string
spec:
policy-libraries: []
policies: []
roles: []
groups: []
resource-groups: []
resources: []
scopes: []
operations: []
mappers: []

API Version

apiVersion: iamlite.manetu.io/v1beta1

Supported versions: v1alpha3, v1alpha4, v1beta1

Version Differences

Featurev1alpha3v1alpha4v1beta1
resources sectionNot availableAvailableAvailable
selector in operationsOptionalRequiredRequired
selector in mappersOptionalRequiredRequired
Native annotation valuesNoNoYes

v1beta1 Native Annotations

In v1beta1, annotation values can be specified as native YAML instead of JSON-encoded strings:

# v1alpha4 - JSON-encoded strings
annotations:
- name: count
value: "42"
- name: tags
value: '["a", "b"]'

# v1beta1 - Native YAML values
annotations:
- name: count
value: 42
- name: tags
value:
- a
- b

Kind

The PolicyEngine supports two related document kinds:

KindDescription
PolicyDomainComplete bundle with inline Rego code
PolicyDomainReferenceDevelopment format that references external .rego files

PolicyDomain vs PolicyDomainReference

PolicyDomainReference is a superset of PolicyDomain designed for development workflows. The key differences:

AspectPolicyDomainPolicyDomainReference
Rego codeInline rego field onlyEither rego (inline) or rego_filename (external file)
Use caseDeployment, runtimeDevelopment, source control
Kubernetes OperatorSupported (Premium)Must convert first

Which format should I use?

  • For development: Use PolicyDomainReference with rego_filename to keep Rego code in separate .rego files. This enables IDE syntax highlighting, easier testing, and cleaner diffs in version control.

  • For deployment: Use PolicyDomain with inline rego. Convert from PolicyDomainReference using mpe build.

  • Community users: All tooling (mpe test, mpe serve, Go API) accepts both formats. Choose based on your workflow preference.

  • Premium users: The Kubernetes Operator requires PolicyDomain format. Develop in either format, but run mpe build before deployment.

Converting Between Formats

Use mpe build to convert PolicyDomainReference to PolicyDomain:

# Convert reference format to deployment format
mpe build -f policy-domain-ref.yaml -o policy-domain.yaml

The build process:

  1. Reads each rego_filename reference
  2. Loads the external .rego file content
  3. Replaces rego_filename with inline rego
  4. Changes kind from PolicyDomainReference to PolicyDomain

See mpe build for details.

Metadata

metadata:
name: my-domain-name
FieldTypeRequiredDescription
namestringYesUnique identifier for the domain

Spec Sections

SectionDescription
policy-librariesReusable Rego code
policiesAccess control policies
rolesIdentity-to-policy mappings
groupsGroup-to-role mappings
resource-groupsResource-to-policy mappings
resourcesResource selector-based routing (v1alpha4+)
scopesAccess-method constraint policies
operationsOperation routing
mappersInput transformation

Common Fields

MRN (Manetu Resource Notation)

All entities use MRN for identification:

mrn:<type>:<namespace>:<class>:<instance>

Examples:

  • mrn:iam:policy:admin
  • mrn:iam:role:developer
  • mrn:app:myservice:resource-group:default

YAML Anchors

Use YAML anchors for reference:

policies:
- mrn: &my-policy "mrn:iam:policy:my-policy"
name: my-policy
rego: |
package authz
default allow = true

roles:
- mrn: "mrn:iam:role:admin"
name: admin
policy: *my-policy # Reference

Full Example

apiVersion: iamlite.manetu.io/v1beta1
kind: PolicyDomain
metadata:
name: example-domain
spec:
policy-libraries:
- mrn: &utils "mrn:iam:library:utils"
name: utils
rego: |
package utils
match_any(patterns, value) {
glob.match(patterns[_], [], value)
}

policies:
- mrn: &allow-all "mrn:iam:policy:allow-all"
name: allow-all
rego: |
package authz
default allow = true

- mrn: &read-only "mrn:iam:policy:read-only"
name: read-only
rego: |
package authz
default allow = false
allow { input.operation == "read" }

- mrn: &main "mrn:iam:policy:main"
name: main
dependencies:
- *utils
rego: |
package authz
import data.utils
default allow = 0 # Tri-level: negative=DENY, 0=GRANT, positive=GRANT Override
allow = -1 { input.principal == {} } # DENY

roles:
- mrn: "mrn:iam:role:admin"
name: admin
policy: *allow-all
annotations:
- name: access_level
value: admin # v1beta1: native string value

groups:
- mrn: "mrn:iam:group:admins"
name: admins
roles:
- "mrn:iam:role:admin"

resource-groups:
- mrn: &rg-default "mrn:iam:resource-group:default"
name: default
default: true
policy: *allow-all

- mrn: &rg-sensitive "mrn:iam:resource-group:sensitive"
name: sensitive
policy: *read-only

resources:
- name: sensitive-data
description: "Sensitive data requiring read-only access"
selector:
- "mrn:data:sensitive:.*"
- "mrn:secret:.*"
group: *rg-sensitive
annotations:
- name: classification
value: HIGH # v1beta1: native string value
- name: retention_days
value: 365 # v1beta1: native number value

scopes:
- mrn: "mrn:iam:scope:api"
name: api
policy: *allow-all

operations:
- name: api
selector:
- ".*"
policy: *main

mappers:
- name: http
selector:
- ".*"
rego: |
package mapper
porc := {
"principal": input.claims,
"operation": input.operation,
"resource": input.resource,
"context": input
}