Files
kubemirror/examples/transform-configmap.yaml
T

323 lines
9.2 KiB
YAML

# Transformation Examples for KubeMirror
# These examples demonstrate the transformation rules feature
---
# Example 1: Static Value Transformation
# Changes LOG_LEVEL to "error" in all mirrors
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-static
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3"
kubemirror.raczylo.com/transform: |
rules:
- path: data.LOG_LEVEL
value: "error"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "static-value-transform"
data:
LOG_LEVEL: "debug"
APP_NAME: "my-app"
---
# Example 2: Template-Based Transformation
# Creates namespace-specific API URLs
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-template
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3,namespace-4"
kubemirror.raczylo.com/transform: |
rules:
- path: data.API_URL
template: "https://{{.TargetNamespace}}.api.example.com"
- path: data.NAMESPACE_UPPER
template: "{{upper .TargetNamespace}}"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "template-transform"
data:
API_URL: "https://default.api.example.com"
NAMESPACE_UPPER: "DEFAULT"
---
# Example 3: Merge Transformation
# Adds environment-specific labels to mirrored ConfigMaps
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-merge
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3"
kubemirror.raczylo.com/transform: |
rules:
- path: metadata.labels
merge:
environment: "production"
managed-by: "kubemirror"
labels:
kubemirror.raczylo.com/enabled: "true"
app: "myapp"
example: "merge-transform"
data:
config: "value"
---
# Example 4: Delete Transformation
# Removes sensitive debug fields from mirrors
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-delete
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3"
kubemirror.raczylo.com/transform: |
rules:
- path: data.DEBUG_MODE
delete: true
- path: data.INTERNAL_API_KEY
delete: true
labels:
kubemirror.raczylo.com/enabled: "true"
example: "delete-transform"
data:
DEBUG_MODE: "true"
INTERNAL_API_KEY: "secret-key"
PUBLIC_CONFIG: "safe-value"
---
# Example 5: Multi-Rule Complex Transformation
# Combines value, template, merge, and delete operations
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-complex
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3,namespace-4"
kubemirror.raczylo.com/transform: |
rules:
# Set log level to error in production mirrors
- path: data.LOG_LEVEL
value: "error"
# Create namespace-specific database URL
- path: data.DATABASE_URL
template: "postgres://{{.TargetNamespace}}.db.svc.cluster.local:5432/app"
# Create namespace-specific cache prefix
- path: data.CACHE_PREFIX
template: "{{replace .TargetNamespace \"-\" \"_\"}}"
# Add environment labels
- path: metadata.labels
merge:
environment: "production"
tier: "backend"
# Remove debug configurations
- path: data.DEBUG_MODE
delete: true
# Remove development API keys
- path: data.DEV_API_KEY
delete: true
labels:
kubemirror.raczylo.com/enabled: "true"
app: "complex-app"
example: "multi-rule-transform"
data:
LOG_LEVEL: "debug"
DATABASE_URL: "postgres://localhost:5432/app"
CACHE_PREFIX: "dev"
DEBUG_MODE: "true"
DEV_API_KEY: "dev-key-12345"
APP_NAME: "my-app"
---
# Example 6: Template Functions Showcase
# Demonstrates all available template functions
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-functions
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2"
kubemirror.raczylo.com/transform: |
rules:
# String manipulation
- path: data.UPPER_NAMESPACE
template: "{{upper .TargetNamespace}}"
- path: data.LOWER_NAMESPACE
template: "{{lower .TargetNamespace}}"
- path: data.TRIMMED_PREFIX
template: "{{trimPrefix .TargetNamespace \"namespace-\"}}"
- path: data.REPLACED_DASH
template: "{{replace .TargetNamespace \"-\" \"_\"}}"
# Default value for missing field
- path: data.WITH_DEFAULT
template: "{{default \"fallback-value\" .OptionalField}}"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "template-functions"
data:
placeholder: "will-be-replaced"
---
# Example 7: Strict Mode Transformation
# Transformation errors will block mirroring
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-strict
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2"
kubemirror.raczylo.com/transform-strict: "true"
kubemirror.raczylo.com/transform: |
rules:
- path: data.CRITICAL_VALUE
value: "must-succeed"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "strict-mode"
data:
CRITICAL_VALUE: "default"
---
# Example 8: Namespace Pattern - Environment-Specific Configuration
# Apply different GraphQL hosts based on namespace patterns
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-pattern
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "preprod-api,preprod-worker,prod-api,staging-api"
kubemirror.raczylo.com/transform: |
rules:
# Preprod environments get preprod GraphQL endpoint
- path: data.GRAPHQL_HOST
value: "https://preprod.example.com/v1/graphql"
namespacePattern: "preprod-*"
# Production environments get production endpoint
- path: data.GRAPHQL_HOST
value: "https://api.example.com/v1/graphql"
namespacePattern: "prod-*"
# Staging environments get staging endpoint
- path: data.GRAPHQL_HOST
value: "https://staging.example.com/v1/graphql"
namespacePattern: "*-staging"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "namespace-pattern"
data:
GRAPHQL_HOST: "https://default.example.com/v1/graphql"
APP_NAME: "my-app"
---
# Example 9: Namespace Pattern with Templates
# Combine patterns with template-based transformations
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-pattern-template
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "preprod-api,preprod-worker,prod-api,prod-worker"
kubemirror.raczylo.com/transform: |
rules:
# Preprod: low log level
- path: data.LOG_LEVEL
value: "debug"
namespacePattern: "preprod-*"
# Production: high log level
- path: data.LOG_LEVEL
value: "error"
namespacePattern: "prod-*"
# All preprod: namespace-specific database URL
- path: data.DATABASE_URL
template: "postgres://{{.TargetNamespace}}.db.preprod.example.com:5432/mydb"
namespacePattern: "preprod-*"
# All prod: namespace-specific database URL
- path: data.DATABASE_URL
template: "postgres://{{.TargetNamespace}}.db.prod.example.com:5432/mydb"
namespacePattern: "prod-*"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "pattern-with-template"
data:
LOG_LEVEL: "info"
DATABASE_URL: "postgres://localhost:5432/mydb"
---
# Example 10: Complex Multi-Pattern Rules
# Multiple patterns with different transformations
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-multipattern
namespace: namespace-1
annotations:
kubemirror.raczylo.com/sync: "true"
kubemirror.raczylo.com/target-namespaces: "namespace-2,namespace-3,preprod-api,prod-api"
kubemirror.raczylo.com/transform: |
rules:
# Global rule (no pattern) - applies to ALL namespaces
- path: data.APP_NAME
value: "universal-app"
# Only for numbered namespaces (namespace-2, namespace-3)
- path: data.ENVIRONMENT
value: "development"
namespacePattern: "namespace-?"
# Only for preprod environments
- path: data.ENVIRONMENT
value: "preproduction"
namespacePattern: "preprod-*"
# Only for production environments
- path: data.ENVIRONMENT
value: "production"
namespacePattern: "prod-*"
# Add security label only to production
- path: metadata.labels
merge:
security-tier: "high"
compliance: "required"
namespacePattern: "prod-*"
labels:
kubemirror.raczylo.com/enabled: "true"
example: "multi-pattern"
data:
APP_NAME: "default-app"
ENVIRONMENT: "unknown"