# Valid sample — uses every documented field per BLUEPRINT-AUTHORING.md §3
# example. Confirms the canonical shape continues to validate.
apiVersion: catalyst.openova.io/v1
kind: Blueprint
metadata:
  name: bp-wordpress-test
  labels:
    catalyst.openova.io/category: application
spec:
  version: 1.3.0
  card:
    title: WordPress
    summary: Self-hosted CMS
    description: A self-hosted WordPress instance with optional embedded Postgres.
    category: cms
    tags: [cms, blog, php]
    icon: ./card/icon.svg
    license: GPL-2.0
    documentation: https://wordpress.org/documentation
  visibility: listed
  owner:
    team: apps
    contact: apps@openova.io
  configSchema:
    type: object
    required: [domain, adminEmail]
    properties:
      domain:
        type: string
        format: hostname
      adminEmail:
        type: string
        format: email
      replicas:
        type: integer
        default: 2
        minimum: 1
        maximum: 20
  placementSchema:
    modes: [single-region, active-active, active-hotstandby]
    default: single-region
    minRegions: 1
    maxRegions: 5
  depends:
    - blueprint: bp-postgres
      version: ^1.4
      alias: db
      when: "{{ .config.postgres.mode == 'embedded' }}"
      values:
        databases: ["wp"]
        size: medium
  manifests:
    source:
      kind: HelmChart
      ref: oci://ghcr.io/openova-io/bp-wordpress:1.3.0
    overlays:
      small:
        replicas: 1
      medium:
        replicas: 2
      large:
        replicas: 5
  upgrades:
    from:
      - 1.2.x
      - 1.1.x
    blocks:
      - 1.0.x
  rotation:
    - kind: oauth-client-secret
      name: wp-keycloak-client
      ttl: 90d
  observability:
    metrics: prometheus
    logs: stdout
    traces: otlp
---
# Legacy v1alpha1 form with manifests.chart short-form must also pass.
apiVersion: catalyst.openova.io/v1alpha1
kind: Blueprint
metadata:
  name: bp-legacy-test
spec:
  version: 0.5.2
  card:
    title: Legacy
    summary: Legacy short-form blueprint.
  visibility: unlisted
  manifests:
    chart: ./chart
  placementSchema:
    modes: [single-region]
    default: single-region
