Replicated YAML Schema

Generated documentation for the Replicated YAML spec.

This content is associated with a legacy version of the Replicated product. For the current Replicated product docs, click here.

Schema

The schema is published as a JSONSchema V4 document in the Replicated Lint Repository

The canonical source for all available Replicated YAML options is available at github.com/replicatedhq/libyaml. This is a great reference to look up supported options and learn how different sections fit together.

Additional Linter Rules

The following list documents rules that will be applied by the Replicated release editor and the replicated-lint cli.

prop-admincommand-component-exists

Admin commands must reference an existing component and container

Examples:

Incorrect: admin command but no containers

---
admin_commands:
- alias: aliasecho
  command: [echo]
  component: DB
  container: redis

Incorrect: Admin command but no matching containers

---
admin_commands:
- alias: aliasecho
  command: [echo]
  component: DB
  container: redis

components:
- name: DB
  containers:
  - image_name: postgres
    source: public
    version: latest

Incorrect: Old style admin command but no matching containers

---
admin_commands:
- alias: aliasecho
  command: [echo]
  component: DB
  image:
    image_name: redis

components:
- name: DB
  containers:
  - image_name: postgres
    source: public
    version: latest

Incorrect: Admin multi command but no matching containers

---
admin_commands:
- alias: aliasecho
  command: [echo]
  replicated:
    component: DB
    container: redis
  swarm:
    service: myapp
  kubernetes:
    selector:
      tier: backend
      app: mine
    container: node

components:
- name: DB
  containers:
  - image_name: postgres
    source: public
    version: latest

Incorrect: Admin source multi command but no matching containers

---
admin_commands:
- alias: aliasecho
  command: [echo]
  source:
    replicated:
      component: DB
      container: redis
    swarm:
      service: myapp
    kubernetes:
      selector:
        tier: backend
        app: mine
      container: node

components:
- name: DB
  containers:
  - image_name: postgres
    source: public
    version: latest

Correct: No commands, no containers

---
admin_commands: []
components: []

Correct: Admin command with matching container

---
admin_commands:
- alias: aliasecho
  command: [echo]
  component: DB
  container: redis

components:
- name: DB
  containers:
  - image_name: redis
    source: public
    version: latest

Correct: Admin command has service, so this is probably a swarm command and thus is not tested here

---
admin_commands:
- alias: aliasecho
  command: [echo]
  service: database

Correct: Admin command has selector, so this is probably a kubernetes command and thus is not tested here

---
admin_commands:
- alias: aliasecho
  command: [echo]
  selector:
    tier: database

Correct: Old style admin command with a matching container

---
admin_commands:
- alias: aliasecho
  command: [echo]
  component: DB
  image:
    image_name: redis

components:
- name: DB
  containers:
  - image_name: redis
    source: public
    version: latest

Correct: Admin multi command with matching container

---
admin_commands:
- alias: aliasecho
  command: [echo]
  replicated:
    component: DB
    container: redis
  swarm:
    service: myapp
  kubernetes:
    selector:
      tier: backend
      app: mine
    container: node

components:
- name: DB
  containers:
  - image_name: redis
    source: public
    version: latest

Correct: Admin source multi command with matching container

---
admin_commands:
- alias: aliasecho
  command: [echo]
  source:
    replicated:
      component: DB
      container: redis
    swarm:
      service: myapp
    kubernetes:
      selector:
        tier: backend
        app: mine
      container: node

components:
- name: DB
  containers:
  - image_name: redis
    source: public
    version: latest

prop-admincommand-shellalias-valid

An admin command’s alias must be a valid shell alias

Examples:

Incorrect: admin command’s alias contains invalid character &

---
admin_commands:
- alias: exec&echo
  command: ["echo"]
  run_type: exec
  component: DB
  container: redis

Incorrect: admin command’s alias contains invalid character *

---
admin_commands:
- alias: exec**echo
  command: ["echo"]
  run_type: exec
  component: DB
  container: redis

Correct: valid alias

---
admin_commands:
- alias: redis_echo-command--
  command: ["echo"]
  run_type: exec
  component: DB
  container: redis

prop-admincommand-requirements-present

Basic requirements for an admin command must be present - an alias and a command

Examples:

Incorrect: alias missing

---
admin_commands:
- command: [echo]
  component: DB
  container: redis

Incorrect: command missing

---
admin_commands:
- alias: echo
  component: DB
  container: redis

Correct: Valid new-style replicated command

---
admin_commands:
- alias: echo
  command: [echo]
  component: DB
  container: redis

prop-admincommand-old-style-requirements-present

image_name must be present within admin_commands.image and admin_commands.component must exist if admin_commands.image is present

Examples:

Incorrect: image is present, but not image.image_name

---
admin_commands:
- alias: echo
  command: [echo]
  component: alpha
  image: {}

Incorrect: image is present, but not component

---
admin_commands:
- alias: echo
  command: [echo]
  image:
    image_name: redis

Correct: Valid old-style (depreciated) command

---
admin_commands:
- alias: echo
  command: [echo]
  component: DB
  image:
    image_name: redis

prop-admincommand-multi-requirements-present

container and component must both be present within admin_commands.replicated if it is present

Examples:

Incorrect: replicated is present, but not replicated.component

---
admin_commands:
- alias: echo
  command: [echo]
  replicated:
    container: redis
  swarm:
    service: myapp

Incorrect: replicated is present, but not replicated.container

---
admin_commands:
- alias: echo
  command: [echo]
  replicated:
    component: DB
  swarm:
    service: myapp

Correct: Valid admin multi command

---
admin_commands:
- alias: echo
  command: [echo]
  replicated:
    component: DB
    container: redis
  swarm:
    service: myapp

prop-admincommand-verbose-requirements-present

container and component must both be present within admin_commands.source.replicated if it is present

Examples:

Incorrect: source.replicated is present, but not source.replicated.component

---
admin_commands:
- alias: echo
  command: [echo]
  source:
    replicated:
      container: redis
    swarm:
      service: myapp

Incorrect: source.replicated is present, but not source.replicated.container

---
admin_commands:
- alias: echo
  command: [echo]
  source:
    replicated:
      component: redis
    swarm:
      service: myapp

Correct: Valid verbose admin multi command

---
admin_commands:
- alias: echo
  command: [echo]
  source:
    replicated:
      component: DB
      container: redis
    swarm:
      service: myapp

prop-admincommand-one-present

Admin command must use one of several methods to identify the relevant container

Examples:

Incorrect: None of the options are present

---
admin_commands:
- alias: echo
  command: [echo]

Correct: Valid new-style replicated command

---
admin_commands:
- alias: echo
  command: [echo]
  component: DB
  container: redis

Correct: Valid old-style (depreciated) admin command

---
admin_commands:
- alias: echo
  command: [echo]
  component: DB
  image:
    image_name: redis

Correct: Valid admin multi command

---
admin_commands:
- alias: echo
  command: [echo]
  replicated:
    component: DB
    container: redis
  swarm:
    service: myapp

Correct: Valid verbose admin multi command

---
admin_commands:
- alias: echo
  command: [echo]
  source:
    replicated:
      component: DB
      container: redis
    swarm:
      service: myapp

prop-component-cluster-count

If cluster_host_count.min and cluster_host_count.max are both set to 1, then it will be impossible to run multiple instances of this container anywhere in the cluster.

Examples:

Incorrect: cluster_host_count.min and cluster_host_count.max are both set to 1

---
components:
- name: DB
  cluster: true
  tags:
  - db
  cluster_host_count:
    min: 1
    max: 1
  containers:
  - source: public
    image_name: redis
    version: latest

Correct: cluster_host_count.min and cluster_host_count.max is a range

---
components:
- name: DB
  cluster: true
  tags:
  - db
  cluster_host_count:
    min: 1
    max: 3
  containers:
  - source: public
    image_name: redis
    version: latest

Correct: cluster_host_count.min and cluster_host_count.max are unset

---
components:
- name: DB
  cluster: true
  tags:
  - db
  containers:
  - source: public
    image_name: redis
    version: latest

prop-component-cluster-strategy

A component’s cluster strategy must be either random or autoscale

Examples:

Incorrect: strategy is set to all-on-one-host, which is not a supported clustering strategy

---
components:
- name: DB
  cluster: true
  tags:
  - db
  cluster_host_count:
    strategy: all-on-one-host
  containers:
  - source: public
    image_name: redis
    version: latest

Correct: strategy is set to autoscale, a supported option

---
components:
- name: DB
  cluster: true
  tags:
  - db
  cluster_host_count:
    strategy: autoscale
  containers:
  - source: public
    image_name: redis
    version: latest

Correct: strategy is unset

---
components:
- name: DB
  cluster: true
  tags:
  - db
  cluster_host_count: {}
  containers:
  - source: public
    image_name: redis
    version: latest

prop-component-volume-path-absolute

Component volume’s host_path must be absolute

Examples:

Incorrect: host path is not absolute

---
components:
- name: DB
  host_volumes:
    - host_path: ubuntu/workspace
  containers:
  - source: public
    image_name: mongo

Correct: host path is absolute

---
components:
- name: DB
  host_volumes:
    - host_path: /home/ubuntu/workspace
  containers:
  - source: public
    image_name: mongo

Correct: host path is a templated field

---
components:
- name: DB
  host_volumes:
    - host_path: '{{repl ConfigOption "custom_volume_path" }}'
  containers:
  - source: public
    image_name: mongo

prop-component-cluster-boolstring

component.cluster must be a template or a boolean

Examples:

Incorrect: component.cluster is not a boolean or template

---
components:
- name: DB
  cluster: "yes please"

Correct: component.cluster absent

---
components:
- name: DB

Correct: component.cluster boolean

---
components:
- name: DB
  cluster: true

Correct: component.cluster string boolean

---
components:
- name: DB
  cluster: "false"

Correct: component.cluster == 0

---
components:
- name: DB
  cluster: "0"

Correct: component.cluster == 1

---
components:
- name: DB
  cluster: "1"

Correct: component.cluster template

---
components:
- name: DB
  cluster: '{{repl ConfigOption "use_cluster"}}'

prop-port-min-api-version

The minimum Replicated API version to use container.ports.public_port is 2.8.0

Examples:

Incorrect: public_port used and replicated api version set to 2.7.0

---
replicated_api_version: "2.7.0"
components:
- name: DB
  containers:
    - source: public
      ports:
        - public_port: "10000"
      image_name: redis
      version: latest

Incorrect: public_port used and replicated api version set to 1.8.5

---
replicated_api_version: "1.8.5"
components:
- name: DB
  containers:
    - source: public
      ports:
        - public_port: "10000"
      image_name: redis
      version: latest

Correct: public_port used and replicated api version set to 2.8.0

---
replicated_api_version: "2.8.0"
components:
- name: DB
  containers:
    - source: public
      ports:
        - public_port: "10000"
      image_name: redis
      version: latest

Correct: public_port used and replicated api version set to 2.8.1

---
replicated_api_version: "2.8.1"
components:
- name: DB
  containers:
    - source: public
      ports:
        - public_port: "10000"
      image_name: redis
      version: latest

prop-component-container-host-count-min-uint

Container’s cluster_host_count property min must be an unsigned integer

Examples:

Incorrect: cluster_host_count.min must be an unsigned integer, and this parses as a negative integer

---
components:
- cluster_host_count:
    min: "-2"

Correct: cluster_host_count.min is an unsigned integer

---
components:
- cluster_host_count:
    min: 3

prop-component-container-host-count-max-uint

Container’s cluster_host_count property max must be an unsigned integer

Examples:

Incorrect: cluster_host_count.max must be an unsigned integer, and this is a negative integer

---
components:
- cluster_host_count:
    max: -10

Correct: cluster_host_count.max is an unsigned integer

---
components:
- cluster_host_count:
    max: 10

prop-component-container-host-count-healthy-uint

Container’s cluster_host_count property threshold_healthy must be an unsigned integer

Examples:

Incorrect: cluster_host_count.threshold_healthy must be an unsigned integer, and this is a string

---
components:
- cluster_host_count:
    threshold_healthy: "all"

Correct: cluster_host_count.threshold_healthy is an unsigned integer

---
components:
- cluster_host_count:
    threshold_healthy: 5

prop-component-container-host-count-degraded-uint

Container’s cluster_host_count property threshold_degraded must be an unsigned integer

Examples:

Incorrect: cluster_host_count.threshold_degraded must be an unsigned integer, and this parses as a float

---
components:
- cluster_host_count:
    threshold_degraded: "2.5"

Correct: cluster_host_count.threshold_degraded is an unsigned integer

---
components:
- cluster_host_count:
    threshold_degraded: 2

prop-cluster-size-public-port

If using container.ports.public_port, cluster must be disabled or cluster size must be 1

Examples:

Incorrect: public_port used and cluster_instance_count.max is not 1

---
components:
- name: DB
  containers:
  - cluster_instance_count:
      max: 2
    cluster: "true"
    ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

Incorrect: public_port used and cluster_instance_count.max is not 1

---
components:
- name: DB
  containers:
  - cluster_instance_count:
      max: "0"
    cluster: true
    ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

Correct: public_port used and cluster_instance_count.max is 1

---
components:
- name: DB
  containers:
  - cluster_instance_count:
      max: 1
    cluster: true
    ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

Correct: public_port used and cluster_instance_count.initial is 1

---
components:
- name: DB
  containers:
  - cluster_instance_count:
      initial: "1"
    cluster: true
    ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

Correct: public_port used and cluster is set to false

---
components:
- name: DB
  containers:
  - cluster: false
    ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

Correct: public_port used and cluster is not set

---
components:
- name: DB
  containers:
  - ports:
    - public_port: "10000"
    image_name: redis
    source: public
    version: latest

tmpl-configoption-exists

Options referenced with {{repl ConfigOption }} must be present in the config section

Examples:

Incorrect: Config Option not_existent is not defined in config section

---
config:
- name: settings
  title: Settings
  items:
  - name: hostname
    title: Hostname
    type: text
    default: ""

components:
- name: App
  cluster: false
  containers:
  - image_name: wlaoh/counter
    name: '{{repl ConfigOption "not_existent" }}'
    source: public

Correct: All uses of repl ConfigOption reference defined Config Options

---
config:
- name: hostname
  title: Hostname
  description: Ensure this domain name is routable on your network.
  items:
  - name: hostname
    title: Hostname
    type: text
    recommended: false
    default: ""
    value_cmd:
      name: host_ip
      value_at: 0
    when: ""
    affix: ""
    required: false
    items: []
  - name: host_count
    title: Host Count
    type: select_many
    items:
      - name: one_host
        default: "0"
      - name: two_hosts
        default: "0"

components:
- name: App
  cluster: false
  containers:
  - source: public
    image_name: wlaoh/counter
    version: signed
    cmd: '{{ repl ConfigOption "one_host" }}'
    name: '{{repl ConfigOption "hostname" }}'

prop-configitem-type-password

It looks like this Config Option may contain sensitive data – consider setting type: password

Examples:

Incorrect: Config Option with name database_password should have type: password

---
config:
- name: database
  title: Database
  items:
  - name: database_password
    title: Password
    type: text
    default: ""

Correct: Config Option with name database_password correctly has type: password

---
config:
- name: database
  title: Database
  items:
  - name: database_password
    title: Password
    type: password
    default: ""

tmpl-configoption-not-circular

A Config Options’s fields may not reference the Config Option they describe

Examples:

Incorrect: Config Option circular references {{repl ConfigOption "circular" }} in it’s when field

---
config:
- name: hostname
  title: Hostname
  items:
  - name: circular
    title: A Circle
    type: text
    when: '{{ repl ConfigOptionEquals "circular" "I heard you liked circles" }}'

Correct: No config options reference themselves

---
config:
- name: hostname
  title: Hostname
  items:
  - name: left
    title: Left
    type: text
    when: '{{ repl ConfigOptionEquals "right" "right option" }}'
  - name: right
    title: Right
    type: text
    when: '{{ repl ConfigOptionEquals "left" "left option" }}'

prop-configitem-type-valid

A Config Item must have a valid type

Examples:

Incorrect: Config Option type image_upload is not valid

---
config:
- name: images
  title: Images
  items:
  - name: cat_picture
    title: Cat Picture
    type: image_upload
    default: ""

Correct: All config options have valid types

---
config:
- name: database
  title: Database
  items:
  - name: database_use_ssl
    title: Use SSL
    type: bool
    default: ""
  - name: database_host
    title: Host
    type: text
    default: ""
  - name: database_ssl_cert
    title: SSL Certificate
    type: textarea
    default: ""

prop-configitem-when-valid

A Config Item’s when clause must be either empty, a template, a boolean literal, or reference a valid config option with = or !=

Examples:

Incorrect: Config Option when field references non-existent option ssl_is_good

---
config:
- name: database
  title: Database
  items:
  - name: database_use_ssl
    title: Use SSL
    type: bool
    default: ""
  - name: database_ssl_cert
    title: SSL Certificate
    type: textarea
    default: ""
    when: ssl_is_good=1

Incorrect: Config Option when field references non-existent option ssl_is_bad

---
config:
- name: database
  title: Database
  items:
  - name: database_use_ssl
    title: Use SSL
    type: bool
    default: ""
  - name: database_ssl_cert
    title: SSL Certificate
    type: textarea
    default: ""
    when: ssl_is_bad!=1

Incorrect: Config Section when uses unsupported < operator on option auth_source

---
config:
- name: auth
  title: Authentication
  description: Where will user accounts be provisioned
  items:
  - name: auth_source
    default: auth_type_internal
    type: select_one
    items:
    - name: auth_type_internal
      title: Built In
    - name: auth_type_ldap
      title: LDAP
    - name: auth_type_ldap_advanced
      title: LDAP Advanced
- name: ldap_settings
  title: LDAP Server Settings
  when: auth_source>auth_type_ldap
  items: []

Correct: All config options have valid when clauses

---
config:
- name: database
  title: Database
  items:
  - name: database_use_ssl
    title: Use SSL
    type: bool
    default: ""
    when: ""

  - name: database_use_ssl_2
    title: Use SSL
    type: bool
    default: ""
    when: ""

  - name: database_use_udp
    title: Use UDP
    type: boolean
    default: ""
    when: false

  - name: database_use_tcp
    title: Use UDP
    type: boolean
    default: ""
    when: true

  - name: database_use_index
    title: Use Index?
    type: boolean
    default: ""
    when: "false"

  - name: database_use_btree
    title: Use Btree?
    type: boolean
    default: ""
    when: "true"

  - name: database_ssl_cert
    title: SSL Certificate
    type: textarea
    default: ""
    when: '{{repl ConfigOptionEquals "database_use_ssl" "1"}}'

  - name: database_ssl_key
    title: SSL Key
    type: textarea
    default: ""
    when: database_use_ssl=1

  - name: database_strong_password
    title: Require strong password
    type: bool
    default: ""
    when: database_use_ssl!=1

Correct: Config option group’s when clause references a valid multi-select option

---
config:
- name: ssl
  title: SSL Configuration
  description: SSL Options
  items:
  - name: ssl_cipher
    default: ssl_cipher_ecdsa
    type: select_one
    items:
    - name: ssl_cipher_ecdsa
      title: ECDSA
    - name: ssl_cipher_rsa
      title: RSA
- name: database
  title: Database
  when: ssl_cipher=ssl_cipher_ecdsa
  items:
  - name: database_use_ssl
    title: Use SSL
    type: bool

prop-component-container-names-unique

Custom requirements must have unique ids

Examples:

Incorrect: duplicated ids

---
custom_requirements:
- id: alpha
  message: beta
- id: alpha
  message: delta

Incorrect: separated duplicated ids

---
custom_requirements:
- id: alpha
  message: beta
- id: gamma
  message: delta
- id: alpha
  message: zeta

Correct: no duplicated ids

---
custom_requirements:
- id: alpha
  message: beta
- id: gamma
  message: delta

prop-component-container-unnamed-when-cluster-true

With clustering turned on, setting container.name will prevent multiple instances of the container from being scheduled on a single node

Examples:

Incorrect: container in component with cluster_instance_count: 2 should not have a name specified

---
components:
- name: DB
  cluster: true
  cluster_host_count:
    min: 1
    max: 4
  containers:
  - source: public
    cluster: true
    cluster_instance_count:
      initial: 2
    image_name: redis
    name: database

Correct: container in component with cluster_instance_count: 2 does not have a name specified

---
components:
- name: DB
  tags:
  - db
  cluster: true
  cluster_host_count:
    min: 1
    max: 4
  containers:
  - source: public
    cluster_instance_count:
     initial: 2
    image_name: redis
    version: latest

prop-component-container-event-subscription-container-exists

Container event subscriptions must reference an existing component/container

Examples:

Incorrect: container redis has a publish_event that references missing container Pipeline/logstash

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
  - source: public
    image_name: redis
    publish_events:
      - name: event
        subscriptions:
        - component: Pipeline
          container: logstash
          action: start

Incorrect: container redis has a publish_event that references missing container Pipeline/logstash

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
  - source: public
    image_name: logstash
    version: latest
  - source: public
    image_name: redis
    version: latest
    publish_events:
      - name: event
        subscriptions:
        - component: Pipeline
          container: logstash
          action: start

Correct: All containers referenced in publish_events have a matching component/container definition

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
  - source: public
    image_name: redis
    publish_events:
      - name: event
        subscriptions:
        - component: Pipeline
          container: logstash
          action: start
- name: Pipeline
  containers:
  - source: public
    image_name: logstash

prop-component-container-volume-modes-valid

Container volume must not specify conflicting options

Examples:

Incorrect: volume options contains conflicting options rw and ro

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp
        options:
          - rw
          - ro

Incorrect: volume options contains conflicting options z and Z

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp
        options:
          - z
          - Z

Incorrect: volume options contains conflicting options rshared and private

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp
        options:
          - rshared
          - private

Incorrect: volume options contains duplicated option nocopy

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp
        options:
          - nocopy
          - nocopy

Correct: no volumes are defined

---
components:
- name: DB
  containers:
  - source: public
    image_name: redis
    version: latest

Correct: no volume options are defined

---
components:
- name: DB
  containers:
  - source: public
    image_name: redis
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp

Correct: No conflicting volume options are defined

---
components:
- name: DB
  containers:
  - source: public
    image_name: redis
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /tmp
        options:
          - rw
          - Z
          - rshared
          - nocopy

prop-component-container-volume-path-absolute

Container volume’s container_path must be absolute

Examples:

Incorrect: container path is not absolute

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: ubuntu/workspace

Correct: container path is absolute

---
components:
- name: DB
  containers:
  - source: public
    image_name: mongo
    version: latest
    volumes:
      - host_path: /tmp
        container_path: /home/ubuntu/workspace

Correct: container path is a templated field

---
components:
- name: DB
  containers:
  - source: public
    image_name: redis
    version: latest
    volumes:
      - host_path: /tmp
        container_path: '{{repl ConfigOption "mount_path"}}'

prop-component-container-contenttrust-fingerprint-valid

A container’s content_trust.public_key_fingerprint must be a valid RFC4716 fingerprint, e.g. cb:69:19:cd:76:1f:17:54:92:a4:fc:a9:6f:a5:57:72

Examples:

Incorrect: invalid public_key_fingerprint

---
components:
  - name: DB
    containers:
    - source: public
      name: redis
      image_name: redis
      version: 3.2.1
      content_trust:
        public_key_fingerprint: flksdjflkds

Correct: valid fingerprint

components:
  - name: DB
    containers:
    - source: public
      name: redis
      image_name: redis
      version: 3.2.1
      content_trust:
        public_key_fingerprint: cb:69:19:cd:76:1f:17:54:92:a4:fc:a9:6f:a5:57:72
    - source: public
      name: redis
      image_name: redis
      version: 3.2.1
      content_trust:
        public_key_fingerprint: aa:9c:75:89:de:46:3a:92:08:c7:ba:9a:29:fb:12:cc

prop-component-container-volumesfrom-exists

A container’s volumes_from must reference an existing container’s name field

Examples:

Incorrect: volumes_from references own container

---
components:
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: redis
      version: 3.2.1
      volumes_from:
        - redis

Incorrect: volumes_from references non-existing container

---
components:
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: redis
      version: 3.2.1
      volumes_from:
        - mongo

Correct: valid volumes_from reference

components:
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: redis
      version: 3.2.1
      volumes_from:
        - mongo
    - source: public
      image_name: mongo
      name: mongo
      version: 3.2.1

prop-component-container-names-unique

A component’s container’s must have unique name entries

Examples:

Incorrect: duplicated names in single component

---
components:
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: db
      version: 3.2.1
    - source: public
      image_name: mongo
      name: db
      version: latest

Incorrect: duplicated names across components

---
components:
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: db
      version: 3.2.1
  - name: MoreDB
    containers:
    - source: public
      image_name: mongo
      name: db
      version: latest

Correct: no duplicated names

components:
  - name: UI
    containers:
    - source: public
      image_name: nginx
      name: ui
      version: 1.10.2
  - name: DB
    containers:
    - source: public
      image_name: redis
      name: redis
      version: 3.2.1
    - source: public
      image_name: mongo
      name: mongo
      version: "3.2"

prop-component-container-instance-count-initial-uint

Container’s cluster_instance_count property initial must be an unsigned integer

Examples:

Incorrect: cluster_instance_count.initial must be an unsigned integer, and this is a float

---
components:
- containers:
  - cluster_instance_count:
      initial: 3.5
    image_name: redis
    version: latest
    source: public

Incorrect: cluster_instance_count.initial must be an unsigned integer, and this parses as a negative integer

---
components:
- containers:
  - cluster_instance_count:
      initial: "-2"
    image_name: redis
    version: latest
    source: public

Correct: cluster_instance_count.initial is an unsigned integer

---
components:
- containers:
  - cluster_instance_count:
      initial: 3
    image_name: redis
    version: latest
    source: public

prop-component-container-instance-count-max-uint

Container’s cluster_instance_count property max must be an unsigned integer

Examples:

Incorrect: cluster_instance_count.max must be an unsigned integer, and this is a negative integer

---
components:
- containers:
  - cluster_instance_count:
      max: -10
    image_name: redis
    version: latest
    source: public

Correct: cluster_instance_count.max is an unsigned integer

---
components:
- containers:
  - cluster_instance_count:
      max: 10
    image_name: redis
    version: latest
    source: public

prop-component-container-instance-count-degraded-uint

Container’s cluster_instance_count property threshold_degraded must be an unsigned integer

Examples:

Incorrect: cluster_instance_count.threshold_degraded must be an unsigned integer, and this parses as a float

---
components:
- containers:
  - cluster_instance_count:
      threshold_degraded: "2.8"
    image_name: redis
    version: latest
    source: public

Correct: cluster_instance_count.threshold_degraded is an unsigned integer

---
components:
- containers:
  - cluster_instance_count:
      threshold_degraded: "2"
    image_name: redis
    version: latest
    source: public

prop-component-container-instance-count-healthy-uint

Container’s cluster_instance_count property threshold_healthy must be an unsigned integer

Examples:

Incorrect: cluster_instance_count.threshold_healthy must be an unsigned integer, and this is a string

---
components:
- containers:
  - cluster_instance_count:
      threshold_healthy: "all"
    image_name: redis
    version: latest
    source: public

Correct: cluster_instance_count.threshold_healthy is an unsigned integer

---
components:
- containers:
  - cluster_instance_count:
      threshold_healthy: "5"
    image_name: redis
    version: latest
    source: public

prop-component-container-volumesfrom-subscription-exists

A container’s volumes_from must reference a container that subscribes to it

Examples:

Incorrect: volumes_from references container that does not exist

---
components:
- name: DB
  containers:
  - name: notalpha
    image_name: redis
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB
        container: beta
  - image_name: beta
    volumes_from:
    - alpha
    version: latest
    source: public

Incorrect: volumes_from references container that does not subscribe to it

---
components:
- name: DB
  containers:
  - name: alpha
    publish_events:
    - subscriptions:
      - component: DB
        container: notalpine
    image_name: redis
    version: latest
    source: public
  - volumes_from:
    - alpha
    image_name: alpine
    version: latest
    source: public

Incorrect: volumes_from references multiple containers, of which one is not valid

---
components:
- name: DB
  containers:
  - name: alpha
    image_name: alpha
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB
        container: beta
  - image_name: beta
    volumes_from:
    - alpha
    - gamma
    version: latest
    source: public

Incorrect: volumes_from references itself

---
components:
- name: DB
  containers:
  - name: alphaname
    image_name: alpha
    version: latest
    source: public
    volumes_from:
    - alpha
    publish_events:
    - subscriptions:
      - component: DB
        container: alphaname

Correct: valid volumes_from reference

---
components:
- name: DB
  containers:
  - name: alpha
    image_name: irrelevant
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB
        container: beta
  - image_name: beta
    volumes_from:
    - alpha
    version: latest
    source: public

Correct: multiple valid volumes_from references

---
components:
- name: DB
  containers:
  - name: alpha
    image_name: irrelevant
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB
        container: beta
      - component: DB
        container: gamma
  - image_name: gamma
    volumes_from:
    - alpha
    version: latest
    source: public
  - image_name: beta
    volumes_from:
    - alpha
    version: latest
    source: public

Correct: Chained dependency for volumes_from across components

---
components:
- name: DB
  containers:
  - name: alpha
    image_name: irrelevant
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB2
        container: gamma
  - image_name: beta
    volumes_from:
    - alpha
    version: latest
    source: public
- name: DB2
  containers:
  - image_name: gamma
    version: latest
    source: public
    publish_events:
    - subscriptions:
      - component: DB
        container: beta

prop-component-container-volume-ephemeral-type-check

is_ephemeral must be a bool string, boolean literal, or template function

Examples:

Incorrect: yes is not a valid value for is_ephemeral

---
components:
- containers:
  - volumes:
    - is_ephemeral: "yes"
    image_name: redis
    version: latest
    source: public

Correct: "true", true, "false" and false are all valid values for is_ephemeral

---
components:
- containers:
  - volumes:
    - is_ephemeral: "true"
    - is_ephemeral: "false"
    - is_ephemeral: true
    - is_ephemeral: false
    image_name: redis
    version: latest
    source: public

Correct: {{repl AppID}} is a valid template function and is thus a valid if questionable value for is_ephemeral

---
components:
- containers:
  - volumes:
    - is_ephemeral: "{{repl AppID}}"
    image_name: redis
    version: latest
    source: public

prop-component-container-volume-excluded-type-check

is_excluded_from_backup must be a bool string, boolean literal, or template function

Examples:

Incorrect: yes is not a valid value for is_excluded_from_backup

---
components:
- containers:
  - volumes:
    - is_excluded_from_backup: "yes"
    image_name: redis
    version: latest
    source: public

Correct: "true", true, "false" and false are all valid values for is_excluded_from_backup

---
components:
- containers:
  - volumes:
    - is_excluded_from_backup: "true"
    - is_excluded_from_backup: "false"
    - is_excluded_from_backup: true
    - is_excluded_from_backup: false
    image_name: redis
    version: latest
    source: public

Correct: {{repl AppID}} is a valid template function and is thus a valid value for is_excluded_from_backup

---
components:
- containers:
  - volumes:
    - is_excluded_from_backup: "{{repl AppID}}"
    image_name: redis
    version: latest
    source: public

prop-component-container-envvars-staticval-deprecated

static_val is deprecated, use value instead

Examples:

Incorrect: static_val deprecated

---
components:
- containers:
  - env_vars:
    - static_val: blah
      value: blah
    image_name: redis
    version: latest
    source: public

Incorrect: static_val deprecated empty

---
components:
- containers:
  - env_vars:
    - static_val: ""
      value: blah
    image_name: redis
    version: latest
    source: public

Correct: value preferred over static_val

---
components:
- containers:
  - name: first
    env_vars:
    - value: "blah"
    image_name: redis
    version: latest
    source: public

prop-component-container-envvars-excluded-type-check

is_excluded_from_support must be a bool string, boolean literal, or template function

Examples:

Incorrect: yes is not a valid value for is_excluded_from_support

---
components:
- containers:
  - env_vars:
    - is_excluded_from_support: "yes"
    image_name: redis
    version: latest
    source: public

Correct: "true", true, "false" and false are all valid values for is_excluded_from_support

---
components:
- containers:
  - env_vars:
    - is_excluded_from_support: "true"
    - is_excluded_from_support: "false"
    - is_excluded_from_support: true
    - is_excluded_from_support: false
    image_name: redis
    version: latest
    source: public

Correct: {{repl AppID}} is a valid template function and is thus a valid value for is_excluded_from_support

---
components:
- containers:
  - env_vars:
    - is_excluded_from_support: "{{repl AppID}}"
    image_name: redis
    version: latest
    source: public

prop-component-container-shm-size-uint

Container’s property shm_size must be an unsigned integer

Examples:

Incorrect: shm_size must be an unsigned integer, and this is a negative integer

---
components:
- containers:
  - shm_size: -10
    image_name: redis
    version: latest
    source: public

Correct: shm_size is an unsigned integer

---
components:
- containers:
  - shm_size: 10
    image_name: redis
    version: latest
    source: public

prop-hostreq-docker-version-valid

host_requirements.docker_version must be a valid docker version specification

Examples:

Incorrect: Invalid docker version the.good.one, not semver

---
host_requirements:
  docker_version: the.good.one

Incorrect: Invalid docker version 0.1.1

---
host_requirements:
  docker_version: 0.1.1

Incorrect: Invalid docker version 1.09.1, no leading zeros

---
host_requirements:
  docker_version: 1.09.1

Incorrect: Invalid docker version 1.14.1, never released

---
host_requirements:
  docker_version: 1.14.1

Incorrect: Invalid docker version 17.13.1-ce, 13 is not a valid month

---
host_requirements:
  docker_version: 17.13.1-ce

Correct: Valid docker version

---
host_requirements:
  docker_version: 17.09.1-ce

Correct: Valid docker version

---
host_requirements:
  docker_version: 17.09.1

Correct: Valid docker version

---
host_requirements:
  docker_version: 1.12.1

prop-hostreq-replicated-version-semver-valid

host_requirements.replicated_version must be a semver range specification

Examples:

Incorrect: Invalid replicated version the.good.one, not semver

---
host_requirements:
  replicated_version: the.good.one

Incorrect: Invalid replicated version alpha-0.1.1

---
host_requirements:
  replicated_version: alpha-0.1.1

Correct: valid version 2.x

---
host_requirements:
    replicated_version: 2.x

Correct: valid version 2.5.3

---
host_requirements:
    replicated_version: 2.5.3

Correct: valid version <=2.5.3 >2.5.x

---
host_requirements:
    replicated_version: '<=2.5.3 >2.5.x'

Correct: valid version 1.x

---
host_requirements:
    replicated_version: '1.x'

Correct: valid version =1.x

---
host_requirements:
    replicated_version: '=1.x'

Correct: valid version >=1.4 <1.7

---
host_requirements:
    replicated_version: '>=1.4 <1.7'

prop-hostreq-system-ram-specs-valid

host_requirements.memory must be a positive decimal with a unit of measurement like M, MB, G, or GB

Examples:

Incorrect: Invalid memory size, not a properly formatted size

---
host_requirements:
  memory: "128"

Incorrect: Invalid memory size, too many digits past the decimal point

---
host_requirements:
  memory: 0.0625TB

Correct: Valid memory size, 2.0TB

---
host_requirements:
  memory: 2.0TB

Correct: Valid memory size, 128KB

---
host_requirements:
  memory: 128KB

prop-hostreq-system-storage-specs-valid

host_requirements.disk_space be a positive decimal with a unit of measurement like M, MB, G, or GB

Examples:

Incorrect: Invalid disk size, not a properly formatted size

---
host_requirements:
  disk_space: "128"

Incorrect: Invalid disk size, too many digits past the decimal point

---
host_requirements:
  disk_space: 0.0625EB

Correct: Valid disk size, 20.0TB

---
host_requirements:
  disk_space: 20.0TB

Correct: Valid disk size, 128GB

---
host_requirements:
  disk_space: 128GB

prop-hostreq-docker-storage-specs-valid

host_requirements.docker_space be a positive decimal with a unit of measurement like M, MB, G, or GB

Examples:

Incorrect: Invalid disk size, not a properly formatted size

---
host_requirements:
  docker_space: "128"

Incorrect: Invalid disk size, too many digits past the decimal point

---
host_requirements:
  docker_space: 0.0625EB

Correct: Valid disk size, 20.0TB

---
host_requirements:
  docker_space: 20.0TB

Correct: Valid disk size, 128GB

---
host_requirements:
  docker_space: 128GB

prop-kubernetes-requirements-version-valid

kubernetes.requirements.server_version must be a valid semver specification

Examples:

Incorrect: server_version is not valid semver

---
kubernetes:
  requirements:
    server_version: 17.01.1-ce

Correct: valid version 1.5.3

---
kubernetes:
  requirements:
    server_version: 1.5.3

Correct: valid version <=1.5.3 >1.5.x

---
kubernetes:
  requirements:
    server_version: '<=1.5.3 >1.5.x'

Correct: valid version 1.x

---
kubernetes:
  requirements:
    server_version: '1.x'

Correct: valid version =1.x

---
kubernetes:
  requirements:
    server_version: '=1.x'

Correct: valid version >=1.4 <1.7

---
kubernetes:
  requirements:
    server_version: '>=1.4 <1.7'

prop-kubernetes-total-memory-valid

kubernetes.requirements.total_memory must be expressed as a plain integer, a fixed-point integer, or the power-of-two equivalent (e.g. 128974848, 129e6, 129M, 123Mi)

Examples:

Incorrect: Invalid memory size, too many digits past the decimal point

---
kubernetes:
  requirements:
    total_memory: 0.0625TB

Correct: Valid memory size, 2.0TB

---
kubernetes:
  requirements:
    total_memory: 2.0TB

Correct: Valid memory size, 128KB

---
kubernetes:
  requirements:
    total_memory: 128KB

Correct: Valid kubernetes memory size, 128

---
kubernetes:
  requirements:
    total_memory: "128"

Correct: Valid kubernetes memory size, 129e6

---
kubernetes:
  requirements:
    total_memory: "129e6"

prop-kubernetes-persistent-storage-valid

kubernetes.persistent_volume_claims.storage must be expressed as a plain integer, a fixed-point integer, or the power-of-two equivalent (e.g. 128974848, 129e6, 129M, 123Mi)

Examples:

Incorrect: Invalid storage size, too many digits past the decimal point

---
kubernetes:
  persistent_volume_claims:
  - storage: 0.0625TB

Correct: Valid storage size, 2.0TB

---
kubernetes:
  persistent_volume_claims:
  - storage: 2.0TB

Correct: Valid storage size, 128KB

---
kubernetes:
  persistent_volume_claims:
  - storage: 128KB

Correct: Valid kubernetes storage size, 128

---
kubernetes:
  persistent_volume_claims:
  - storage: "128"

Correct: Valid kubernetes storage size, 129e6

---
kubernetes:
  persistent_volume_claims:
  - storage: "129e6"

Correct: No storage size given

---
kubernetes:
  persistent_volume_claims: []

prop-monitors-cpuacct-container-exists

Entries in monitors.cpuacct must have matching component+container or the scheduler must be swarm

Examples:

Incorrect: cpuacct monitor references a component that does not exist

---
components:
  - name: Kibana
    containers:
      - image_name: quay.io/getelk/logstash
        version: latest
        source: public
monitors:
  cpuacct:
    - Logstash,quay.io/getelk/logstash

Incorrect: cpuacct monitor references a container that does not exist

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/elasticsearch
        version: latest
        source: public
monitors:
  cpuacct:
    - Logstash,quay.io/getelk/logstash

Correct: All cpuacct monitors reference existing containers

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/logstash
        version: latest
        source: public
monitors:
  cpuacct:
    - Logstash,quay.io/getelk/logstash

Correct: All cpuacct monitors are valid if the scheduler is swarm

---
monitors:
  cpuacct:
    - swarmstash
swarm:
  minimum_node_count: "1"

Correct: No monitors, no containers

---
monitors:
  cpuacct: []

prop-monitors-memory-container-exists

Entries in monitors.memory must have matching component+container or the scheduler must be swarm

Examples:

Incorrect: memacct monitor references a component that does not exist

---
components:
  - name: Kibana
    containers:
      - image_name: quay.io/getelk/logstash
        version: latest
        source: public
monitors:
  memory:
    - Logstash,quay.io/getelk/logstash

Incorrect: memacct monitor references a container that does not exist

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/elasticsearch
        version: latest
        source: public
monitors:
  memory:
    - Logstash,quay.io/getelk/logstash

Correct: All memacct monitors reference existing containers

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/logstash
        version: latest
        source: public
monitors:
  memory:
    - Logstash,quay.io/getelk/logstash

Correct: All memacct monitors are valid if the scheduler is swarm

---
monitors:
  memory:
    - swarmstash
swarm:
  minimum_node_count: "1"

prop-monitors-custom-has-target

Entries in monitors.custom must have at least one target

Examples:

Incorrect: custom monitor has no targets

---
monitors:
  custom:
    - name: whatever
      targets: []

Incorrect: single target is empty

---
monitors:
  custom:
    - name: whatever
      target: ""

Incorrect: custom monitor has null targets

---
monitors:
  custom:
    - name: whatever

Correct: All custom monitors have at least one target

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/logstash
        version: latest
        source: public
monitors:
  custom:
    - name: whenever
      target: stats.gauges.myapp100.ping.*
    - name: whatever
      targets:
        - stats.gauges.myapp100.ping.*
        - movingAverage(stats.gauges.myapp100.ping.*,60)
        - movingAverage(stats.gauges.myapp100.ping.*,600)

prop-monitors-custom-has-target

Entries in monitors.custom have valid color specifications

Examples:

Incorrect: custom monitor has invalid stroke_color

---
monitors:
  custom:
    - name: whatever
      targets: [stats.mystat.*]
      display:
        stroke_color: blue

Incorrect: custom monitor has invalid fill_color

---
monitors:
  custom:
    - name: whatever
      targets: [stats.mystat.*]
      display:
        fill_color: blue

Correct: custom monitor has valid color specs

---
components:
  - name: Logstash
    containers:
      - image_name: quay.io/getelk/logstash
        source: public
        version: latest
monitors:
  custom:
    - name: whenever
      target: stats.gauges.myapp100.ping.*
    - name: whatever
      targets:
        - stats.gauges.myapp100.ping.*
        - movingAverage(stats.gauges.myapp100.ping.*,60)
        - movingAverage(stats.gauges.myapp100.ping.*,600)
      display:
        fill_color: '#44BB66'
        stroke_color: '#444444'

prop-statsd-port-valid

If specified, statsd.port must be a valid TCP port

Examples:

Incorrect: statsd.port is negative

---
statsd:
  port: -100

Incorrect: statsd.port is above the maximum tcp port range

---
statsd:
  port: 100000

Correct: statsd port valid

---
statsd:
  port: 43221

Correct: statsd port not specified

---
statsd: {}

prop-graphite-port-valid

If specified, graphite.port must be a valid TCP port

Examples:

Incorrect: graphite.port is negative

---
graphite:
  port: -100

Incorrect: graphite.port is above the maximum tcp port range

---
graphite:
  port: 100000

Correct: graphite port valid

---
graphite:
  port: 43221

Correct: graphite port not specified

---
graphite: {}

prop-custommetric-retention-valid

If specified, a custom_metric’s retention must be in a valid format, e.g.15s:7d,1m:21d,15m:5y

Examples:

Incorrect: retention invalid

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15 second resolution for  10 days
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: no custom metrics

---
custom_metrics: []

Correct: custom retention not specified

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: minimal valid retention

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: valid retention with spaces

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d, 1m:22d, 15m:2h
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: valid retention 1

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d,1m:21d,15m:5y
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: valid retention 2

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: "1m:1h,1h:7d,1d:90d"
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: valid retention 3

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: "1s:10m,1m:4h,1h:30d"
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: valid retention 4

---
custom_metrics:
  - target: stats.gauges.myapp100.ping.*
    retention: "10s:10m,1m:20m,1h:30d"
    aggregation_method: "average"
    xfiles_factor: 0.3

prop-custommetric-aggregation-valid

If specified, a custom_metric’s aggregation must one of average, sum, min, max, last

Examples:

Incorrect: aggregation invalid

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d,1m:14d,15m:1y
    aggregation_method: "middle-out"
    xfiles_factor: 0.3

Correct: no custom metrics

---
custom_metrics: []

Correct: custom aggregation not specified

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*

Correct: aggregation == sum

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d
    aggregation_method: "sum"
    xfiles_factor: 0.3

Correct: aggregation == average

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d, 1m:22d, 15m:2h
    aggregation_method: "average"
    xfiles_factor: 0.3

Correct: aggregation == max

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: 15s:7d,1m:21d,15m:5y
    aggregation_method: "max"
    xfiles_factor: 0.3

Correct: aggregation == min

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: "1m:1h,1h:7d,1d:90d"
    aggregation_method: "min"
    xfiles_factor: 0.3

Correct: aggregation == last

---
custom_metrics:
  - target: stats.gauges.ping.rtt.*
    retention: "1s:10m,1m:4h,1h:30d"
    aggregation_method: "last"
    xfiles_factor: 0.3

prop-monitors-custom-display-labelscale-valid

If specified, a custom monitor’s display.label_scale must be one of metric, none or a parseable float

Examples:

Incorrect: label_scale == kfbr392, not a valid float

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: kfbr392

Incorrect: label_scale == 1.1.02, not a valid float

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: 1.1.02

Correct: label_scale == metric

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: metric

Correct: label_scale == none

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: none

Correct: label_scale == 1.84

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: 1.84

Correct: label_scale == .1

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: .1

Correct: label_scale == 12

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: 12

Correct: label_scale == -12.23131131

---
monitors:
  custom:
    - target: stats.gauges.kfbr392.*
      display:
        label_scale: -12.23131131

prop-replicated-api-version-present

replicated_api_version must be present and be a valid Semver specification

Examples:

Incorrect: replicated_api_version is missing

---
{}

Incorrect: replicated_api_version is not valid semver

---
replicated_api_version: kfbr392

Correct: replicated_api_version is valid semver

---
replicated_api_version: 2.9.0

prop-image-contenttrust-fingerprint-valid

An image’s content_trust.public_key_fingerprint must be a valid RFC4716 fingerprint, e.g. cb:69:19:cd:76:1f:17:54:92:a4:fc:a9:6f:a5:57:72

Examples:

Incorrect:

---
images:
  - source: public
    name: redis
    tag: 3.2.1
    content_trust:
      public_key_fingerprint: flksdjflkds

Correct: valid fingerprint

---
images:
  - source: public
    name: redis
    tag: 3.2.1
    content_trust:
      public_key_fingerprint: cb:69:19:cd:76:1f:17:54:92:a4:fc:a9:6f:a5:57:72

prop-properties-shellalias-valid

properties.shell_alias must be a valid shell alias

Examples:

Incorrect: alias contains invalid character &

---
properties:
  shell_alias: exec&echo

Incorrect: admin command contains invalid character *

---
properties:
  shell_alias: exec**echo

Correct: valid alias

---
properties:
  shell_alias: do_a-replicated_thing---plz

prop-properties-logourl-valid

Logo URL must be a valid http or https URL

Examples:

Incorrect: protocol not in [http, https]

---
properties:
  logo_url: yo://mylogo.com/logo.png

Incorrect: invalid url

---
properties:
  logo_url: kfbr392

Incorrect: invalid url

---
properties:
  logo_url: http://i.goo gr.com/rnZ3Ftf.png

Correct: valid url

---
properties:
  logo_url: http://x.y+a.com:3000/b/c

mesg-yaml-valid

Document must be valid YAML. This could occur for many reasons, consult individual error details for more info.

More Info:

Examples:

Incorrect: Document must have valid syntax

---
}}{{}}{{

mesg-yaml-not-empty

Document must not be empty

Examples:

Incorrect: Document may not be empty

---

prop-schema-valid

Document must conform to the Replicated YAML document schema

More Info:

Examples:

Incorrect: container missing a source

---
components:
- containers:
  - image_name: kfbr
    version: 392

Incorrect: container missing an image_name

---
components:
- containers:
  - source: public
    version: 3.2

Incorrect: Property deploy_this_great_app is not present in the schema

---
deploy_this_great_app: plz&thx

Incorrect: Property replicated_api_version is not of correct type, should be string, but 2.11 is parsed as type float

---
replicated_api_version: 2.11

Incorrect: 2 is not a valid value for is_ephemeral

---
components:
- containers:
- volumes:
  - is_ephemeral: 2

Incorrect: 1 is not a valid value for is_ephemeral, though "1" is

---
components:
- containers:
- volumes:
  - is_ephemeral: 1

Incorrect: 2 is not a valid value for is_excluded_from_backup

---
components:
- containers:
- volumes:
  - is_excluded_from_backup: 2

Incorrect: 1 is not a valid value for is_excluded_from_backup, though "1" is

---
components:
- containers:
- volumes:
  - is_excluded_from_backup: 1

Incorrect: statsd.port is not an integer

---
statsd:
port: foo

Incorrect: graphite.port is not an integer

---
graphite:
port: foo

Incorrect: cluster_host_count.min must be an unsigned integer, and this is a boolean

---
components:
- cluster_host_count:
  min: false

Correct: container.version can be a string or a number

---
components:
- containers:
  - image_name: kfbr
    version: 392
    source: replicated
  - image_name: redis
    version: latest
    source: replicated

prop-support-bundle

For customers using Version 2 of the support bundle, custom files and commands can be configured in Replicated Console.

More Info:

Examples:

Incorrect: support key detected

support:
  commands:
    - filename: output.txt
      command: ["sleep", "10"]
      source:
        replicated:
          component: LB
          container: wlaoh/nginx
    - filename: output.txt
      command: ["echo", "Hello World!"]
      source:
        replicated:
          component: LB
          container: wlaoh/nginx
  files:
    - filename: output.txt
      source:
        replicated:
          component: LB
          container: wlaoh/nginx

Correct: support key not detected

---
  replicated_api_version: "2.10.1"

prop-swarm-secret-name-value

Swarm secrets require both a name and a value to function.

Examples:

Incorrect: A swarm secret must contain a name and a value, and this only has a name

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: foo

Incorrect: A swarm secret must contain a name and a value, and this name is empty

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: ""
    value: bar

Incorrect: A swarm secret must contain a name and a value even when labels exist

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: ""
    value: bar
    labels:
      alpha: beta

Correct: This swarm secret contains a name and a value

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: foo
    value: bar

prop-swarm-secret-label-key

Labels within a swarm secret must have keys.

Examples:

Incorrect: Swarm secret labels must not be the empty string

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: foo
    value: bar
    labels:
      alpha: beta
      "": delta

Correct: These swarm secret labels are not the empty string

---
replicated_api_version: "2.7.0"
swarm:
  secrets:
  - name: foo
    value: bar
    labels:
      alpha: beta
      gamma: delta

prop-swarm-config-name-value

Swarm configs require both a name and a value to function.

Examples:

Incorrect: A swarm config must contain a name and a value, and this only has a name

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: foo

Incorrect: A swarm config must contain a name and a value, and this name is empty

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: ""
    value: bar

Incorrect: A swarm config must contain a name and a value even when labels exist

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: ""
    value: bar
    labels:
      alpha: beta

Correct: This swarm config contains a name and a value

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: foo
    value: bar

prop-swarm-config-label-key

Labels within a swarm config must have keys.

Examples:

Incorrect: Swarm config labels must not be the empty string

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: foo
    value: bar
    labels:
      alpha: beta
      "": delta

Correct: These swarm config labels are not the empty string

---
replicated_api_version: "2.7.0"
swarm:
  configs:
  - name: foo
    value: bar
    labels:
      alpha: beta
      gamma: delta

prop-configitem-testproc-run-on-save

If a config item’s test_proc.run_on_save is not set to true, test_proc’s will not be checked automatically. Consider setting to true to automatically validate inputs

More Info:

Examples:

Incorrect: A config item’s test_proc.run_on_save set to false

---
config:
- name: configs
  title: Configuration
  items:
  - name: phone_number
    type: text
    test_proc:
      display_name: Is this a Phone Number?
      command: regex_match
      run_on_save: false
      args:
      - "([0-9]{3})[-]([0-9]{3})[-]([0-9]{4})$"
      - "That doesn't seem to be a phone number!"

Incorrect: A config groups’s test_proc.run_on_save set to false

---
config:
- name: configs
  title: Configuration
  test_proc:
    display_name: Is this a Phone Number?
    command: regex_match
    run_on_save: false
    args:
    - "([0-9]{3})[-]([0-9]{3})[-]([0-9]{4})$"
    - "That doesn't seem to be a phone number!"
  items:
  - name: phone_number
    type: text

Correct: All test_procs have run_on_save == true

---
config:
- name: configs
  title: Configuration
  items:
  - name: phone_number
    type: text
    test_proc:
      display_name: Is this a Phone Number?
      command: regex_match
      run_on_save: true
      args:
      - "([0-9]{3})[-]([0-9]{3})[-]([0-9]{4})$"
      - "That doesn't seem to be a phone number!"

Correct: No config items have test procs

---
config:
- name: configs
  title: Configuration
  items:
  - name: phone_number
    type: text

prop-configitem-testproc-command-valid

A test_proc’s command entry must be a valid command.

More Info:

Examples:

Incorrect: config item’s test_proc.command is set to json_is_good, which is not a supported Test Proc command

---
config:
- name: configs
  title: Configuration
  items:
  - name: phone_number
    type: text
    test_proc:
      display_name: Is the json good?
      command: json_is_good

Incorrect: config group’s test_proc.command is set to all_the_json_is_good, which is not a supported Test Proc command

---
config:
- name: configs
  title: Configuration
  test_proc:
    display_name: Is the json good?
    command: all_the_json_is_good
  items:
  - name: phone_number
    type: text

Correct: item and group’s test_proc.commands are set to resolve_host and smtp_auth, both supported Test Proc commands

---
config:
- name: configs
  title: Configuration
  test_proc:
    display_name: Is docs.replicated.com reachable?
    command: smtp_auth
  items:
  - name: docs_host
    type: text
    test_proc:
      display_name: Is docs.replicated.com reachable?
      command: resolve_host
      args:
      - docs.replicated.com

Correct: item’s test_proc.command is set to resolve_host

---
config:
- name: hostname
  title: Hostname
  description: Ensure this domain name is routable on your network.
  items:
  - name: hostname
    title: Hostname
    value: '{{repl ConsoleSetting "tls.hostname"}}'
    type: text
    test_proc:
      display_name: Check DNS
      command: resolve_host

Correct: no test procs specified

---
config:
- name: configs
  title: Configuration
  items:
  - name: docs_host
    type: text

Correct: test_proc.custom_command specified instead of test_proc.command

---
config:
- name: configs
  title: Configuration
  items:
  - name: docs_host
    type: text
    test_proc:
      display_name: Check DNS
      custom_command:
        id: scheduler
        timeout: 15
        data:
          replicated:
            component: password-checker
            container: debian
      results:
      - status: success
        message: Success!
        condition:
          status_code: 0
          error: false

Autogenerated reference documentation for Replicated YAML Linter Generated at Tue Nov 06 2018 09:22:41 GMT-0800 (PST)