Modules, Definitions and Entities#

This page is a top down explanation of the above key terms by referencing the example IOC instance bl45p-mo-ioc-02 used in the system tests for this project.

The explanations rely on an understanding of the difference between generic IOCs and IOC instances. See Generic IOCs and instances.

Modules#

Every generic IOC image will include a number of EPICS support modules.

The bl45p-mo-ioc-02 ioc instance example uses the generic IOC container image ioc-pmac . This image contains the support modules pmac and motor plus the common support modules from epics-modules

Each IOC instance will mount a generic IOC image and therefore be able to make use of the libraries and DB templates in any of those support modules.

The goal of ibek is to allow a developer to define an instance of an IOC and make use of functions of its support modules.

ibek uses a support module definition file to determine what features of a support module may be instantiated.

Hence there is a collection of support module definition files inside of each generic IOC.

In the code the class GenericIoc is used to represent a generic IOC and an instance of that class represent an IOC instance.

Definition#

Each support module has its own support module definition file . This is a YAML file whose name is by convention <support_module>.ibek.support.yaml

These will all reside in a folder called /ibek in the container image.

The support module definition file contains Definitions which determine what Entities an IOC instance may instantiate.

For example the pmac support module declares the following Definitions in pmac.ibek.support.yaml (currently this is limited to 3 - the full implementation would have more):

  • Geobrick

  • DlsPmacAsynIPPort

  • DlsPmacAsynMotor

Each Definition describes a class of Entity by providing:

  • Entity class name

  • a list of arguments to supply when declaring an Entity

  • boot script entries to add for the Entity in the form of a jinja template that may refer to the above arguments

  • database templates to instantiate for the Entity with macro values from the above arguments

Expand below for the example pmac support module definition file:

pmac.ibek.support.yaml
# yaml-language-server: $schema=../_global/ibek.defs.schema.json

# TODO - make naming convention compliant
# Defs Names should be CamelCase
# args names should be snake_case

module: pmac

defs:
  - name: PmacAsynSSHPort
    description: |
      Add a Power PMAC asyn port to the IOC
      This port uses SSH to connect to the Power PMAC
    args:
      - type: id
        name: name
        description: Asyn port name

      - type: str
        name: IP
        description: IP address of Power pmac

      - type: str
        name: USERNAME
        description: Username for login
        default: root

      - type: str
        name: PASSWORD
        description: Password for login
        default: deltatau

      - type: int
        name: PRIORITY
        description: Priority of the port
        default: 0

      - type: int
        name: NOAUTOCONNECT
        description: Disables autoconnect if set to 1
        default: 0

      - type: int
        name: NOEOS
        description: No EOS used if set to 1
        default: 0

    script:
      - drvAsynPowerPMACPortConfigure("{{name}}", "{{IP}}", "{{USERNAME}}", "{{PASSWORD}}", "{{PRIORITY}}", "{{NOAUTOCONNECT}}", "{{NOEOS}}")

  - name: PmacAsynIPPort
    description: |
      Add a Turbo PMAC asyn port to the IOC
      This port uses TCP to connect to the PMAC
    args:
      - type: id
        name: name
        description: Asyn port name

      - type: str
        name: IP
        description: IP address of pmac

      - type: int
        name: PORT
        description: TCP port for connection
        default: 1025

    script:
      - pmacAsynIPConfigure({{ name }}, {{ IP }}:{{ PORT }})

  - name: Geobrick
    description: Add a geobrick to the IOC
    args:
      - type: id
        name: name
        description: Name to use for the geobrick's asyn port

      - type: object
        name: PORT
        description: Asyn port name for PmacAsynIPPort to connect to

      - type: str
        name: P
        description: PV Prefix for all pmac db templates

      - type: int
        name: numAxes
        description: number of axes to initialize for the controller
        default: 8

      - type: int
        name: idlePoll
        description: Idle Poll Period in ms
        default: 500

      - type: int
        name: movingPoll
        description: Moving Poll Period in ms
        default: 100

      - type: int
        name: TIMEOUT
        description: timeout in seconds for asyn
        default: 4

      - type: int
        name: FEEDRATE
        description: feedrate below which we go into error
        default: 100

      - type: str
        name: CSG0
        description: Name for Coordinate System Group 0
        default: ""

      - type: str
        name: CSG1
        description: Name for Coordinate System Group 1
        default: ""

      - type: str
        name: CSG2
        description: Name for Coordinate System Group 2
        default: ""

      - type: str
        name: CSG3
        description: Name for Coordinate System Group 3
        default: ""

      - type: str
        name: CSG4
        description: Name for Coordinate System Group 3
        default: ""

    # numAxes must be supplied for geobrick (but builder.py counted the axes created)
    # TODO is counting num_axes is an example of something hard to do in this new approach?
    script:
      - pmacCreateController({{name}}, {{PORT.name}}, 0, {{numAxes}}, {{movingPoll}}, {{idlePoll}})
      - pmacCreateAxes({{name}}, {{numAxes}})

    databases:
      - file: pmacController.template
        define_args: |
          NAXES={{numAxes}}
          PORT={{name}}
        include_args:
          [P, idlePoll, movingPoll, TIMEOUT, CSG0, CSG1, CSG2, CSG3, CSG4]
      - file: pmacStatus.template
        define_args: PORT={{name}}
        include_args:
          - P

  - name: DlsPmacAsynMotor
    description: Add a motor to a motor controller
    args:
      # IMPORTANT: all non-defaulted args must come first

      - type: str
        name: name
        description: Object name and gui association name

      - type: object
        name: Controller
        description: PMAC Controller to attach to

      - type: int
        name: axis
        description: which axis number this motor drives

      - type: str
        name: P
        description: PV prefix name for this motor

      - type: str
        name: M
        description: PV motor name for this motor

      - type: str
        name: DESC
        description: Description, displayed on EDM screen
        default: ""

      - type: float
        name: MRES
        description: Motor Step Size (EGU)
        default: 0.0001

      - type: float
        name: VELO
        description: axis Velocity (EGU/s)
        default: 1.0

      - type: int
        name: PREC

        description: Display Precision
        default: 3

      - type: str
        name: EGU
        description: Engineering Units
        default: mm

      - type: float
        name: TWV
        description: Tweak Step Size (EGU)
        default: 1

      - type: str
        name: DTYP
        description: Datatype of record
        default: asynMotor

      - type: int
        name: DIR
        description: User direction
        default: 0

      - type: float
        name: VBAS
        description: Base Velocity (EGU/s)
        default: 1.0

      # TODO type float
      - type: str
        name: VMAX
        description: Max Velocity (EGU/s)
        # TODO make default a UNION of type and str (for jinja)
        default: "{{VELO}}"

      - type: float
        name: ACCL
        description: Seconds to Velocity
        default: 0.5

      - type: float
        name: BDST
        description: BL Distance (EGU)
        default: 0

      - type: float
        name: BVEL
        description: BL Velocity(EGU/s)
        default: 0

      - type: float
        name: BACC
        description: BL Seconds to Veloc
        default: 0

      - type: float
        name: DHLM
        description: Dial High Limit
        default: 10000

      - type: float
        name: DLLM
        description: Dial low limit
        default: -10000

      - type: float
        name: HLM
        description: User High Limit
        default: 0

      - type: float
        name: LLM
        description: User Low Limit
        default: 0

      - type: str
        name: HLSV
        description: HW Lim, Violation Svr
        default: MAJOR

      - type: str
        name: INIT
        description: Startup commands
        default: ""

      - type: int
        name: SREV
        description: Steps per Revolution
        default: 1000

      - type: float
        name: RRES
        description: Readback Step Size (EGU
        default: 0

      - type: float
        name: ERES
        description: Encoder Step Size (EGU)
        default: 0

      - type: float
        name: JAR
        description: Jog Acceleration (EGU/s^2)
        default: 0

      - type: int
        name: UEIP
        description: Use Encoder If Present
        default: 0

      - type: int
        name: URIP
        description: Use RDBL If Present
        default: 0

      - type: str
        name: RDBL
        description: Readback Location, set URIP =1 if you specify this
        default: "0"

      - type: str
        name: RLNK
        description: Readback output link
        default: ""

      - type: int
        name: RTRY
        description: Max retry count
        default: 0

      - type: float
        name: DLY
        description: Readback settle time (s)
        default: 0

      - type: float
        name: "OFF"
        description: User Offset (EGU)
        default: 0

      - type: float
        name: RDBD
        description: Retry Deadband (EGU)
        default: 0

      - type: int
        name: FOFF
        description: Freeze Offset, 0=variable, 1=frozen
        default: 0

      - type: float
        name: ADEL
        description: Alarm monitor deadband (EGU)
        default: 0

      - type: int
        name: NTM
        description: New Target Monitor, only set to 0 for soft motors
        default: 1

      - type: float
        name: FEHIGH
        description: HIGH limit for following error
        default: 0

      - type: float
        name: FEHIHI
        description: HIHI limit for following error
        default: 0

      - type: str
        name: FEHHSV
        description: HIHI alarm severity for following error
        default: NO_ALARM

      - type: str
        name: FEHSV
        description: HIGH alarm severity for following error
        default: NO_ALARM

      - type: int
        name: SCALE
        description: ""
        default: 1

      - type: int
        name: HOMEVIS
        description: If 1 then home is visible on the gui
        default: 1

      - type: str
        name: HOMEVISSTR
        description: ""
        default: Use motor summary screen

      - type: str
        name: alh
        description: Set this to alh to add the motor to the alarm handler and send emails
        default: ""

      - type: str
        name: HOME
        description: Prefix for autohome instance. Defaults to $(P) If unspecified
        default: "{{P}}"

      - type: str
        name: ALLOW_HOMED_SET
        description: Set to a blank to allow this axis to have its homed
        default: "#"

      - type: str
        name: RLINK
        description: not sure what this is
        default: ""

    databases:
      - file: dls_pmac_asyn_motor.template
        define_args: |
          ADDR={{ axis }}
          PMAC={{ Controller.P }}
          PORT={{ Controller.name }}
          SPORT={{ Controller.PORT.name }}
        include_args:
          [
            P,
            M,
            DESC,
            MRES,
            VELO,
            PREC,
            EGU,
            TWV,
            DTYP,
            DIR,
            VBAS,
            VMAX,
            ACCL,
            BDST,
            BVEL,
            BACC,
            DHLM,
            DLLM,
            HLM,
            LLM,
            HLSV,
            INIT,
            SREV,
            RRES,
            ERES,
            JAR,
            UEIP,
            RDBL,
            RLINK,
            RTRY,
            DLY,
            "OFF",
            RDBD,
            FOFF,
            ADEL,
            NTM,
            FEHIGH,
            FEHIHI,
            FEHHSV,
            FEHSV,
            SCALE,
            HOMEVIS,
            HOMEVISSTR,
            name,
            alh,
            HOME,
            ALLOW_HOMED_SET,
          ]

  - name: DlsCsPmacAsynMotor
    description: add a DLS Coordinate system motor
    args:
      - type: str
        name: name
        description: Object name and gui association name

      - type: object
        name: CsController
        description: Coordinate system controller to attach to

      - type: int
        name: axis
        description: which axis number this motor drives

      - type: str
        name: P
        description: PV prefix name for this motor

      - type: str
        name: M
        description: PV motor name for this motor

      - type: str
        name: DESC
        description: Description, displayed on EDM screen
        default: ""

      - type: float
        name: MRES
        description: Motor Step Size (EGU)
        default: 0.0001

      - type: float
        name: VELO
        description: axis Velocity (EGU/s)
        default: 1.0

      - type: int
        name: PREC
        description: Display Precision
        default: 3

      - type: str
        name: EGU
        description: Engineering Units
        default: mm

      - type: float
        name: TWV
        description: Tweak Step Size (EGU)
        default: 1

      - type: str
        name: DTYP
        description: Datatype of record
        default: asynMotor

      - type: int
        name: DIR
        description: User direction
        default: 0

      - type: float
        name: VBAS
        description: Base Velocity (EGU/s)
        default: 1.0

      - type: str
        name: VMAX
        description: Max Velocity (EGU/s)
        default: "{{VELO}}"

      - type: float
        name: ACCL
        description: Seconds to Velocity
        default: 0.5

      - type: float
        name: BDST
        description: BL Distance (EGU)
        default: 0

      - type: float
        name: BVEL
        description: BL Velocity(EGU/s)
        default: 0

      - type: float
        name: BACC
        description: BL Seconds to Veloc
        default: 0

      - type: float
        name: DHLM
        description: Dial High Limit
        default: 10000

      - type: float
        name: DLLM
        description: Dial low limit
        default: -10000

      - type: float
        name: HLM
        description: User High Limit
        default: 0

      - type: float
        name: LLM
        description: User Low Limit
        default: 0

      - type: str
        name: HLSV
        description: HW Lim, Violation Svr
        default: MAJOR

      - type: str
        name: INIT
        description: Startup commands
        default: ""

      - type: int
        name: SREV
        description: Steps per Revolution
        default: 1000

      - type: float
        name: RRES
        description: Readback Step Size (EGU
        default: 0

      - type: float
        name: ERES
        description: Encoder Step Size (EGU)
        default: 0

      - type: float
        name: JAR
        description: Jog Acceleration (EGU/s^2)
        default: 0

      - type: int
        name: UEIP
        description: Use Encoder If Present
        default: 0

      - type: int
        name: URIP
        description: Use RDBL If Present
        default: 0

      - type: str
        name: RDBL
        description: Readback Location, set URIP =1 if you specify this
        default: "0"

      - type: str
        name: RLNK
        description: Readback output link
        default: ""

      - type: int
        name: RTRY
        description: Max retry count
        default: 0

      - type: float
        name: DLY
        description: Readback settle time (s)
        default: 0

      - type: float
        name: "OFF"
        description: User Offset (EGU)
        default: 0

      - type: float
        name: RDBD
        description: Retry Deadband (EGU)
        default: 0

      - type: int
        name: FOFF
        description: Freeze Offset, 0=variable, 1=frozen
        default: 0

      - type: float
        name: ADEL
        description: Alarm monitor deadband (EGU)
        default: 0

      - type: int
        name: NTM
        description: New Target Monitor, only set to 0 for soft motors
        default: 1

      - type: float
        name: FEHEIGH
        description: HIGH limit for following error
        default: 0

      - type: float
        name: FEHIHI
        description: HIHI limit for following error
        default: 0

      - type: str
        name: FEHHSV
        description: HIHI alarm severity for following error
        default: NO_ALARM

      - type: str
        name: FEHSV
        description: HIGH alarm severity for following error
        default: NO_ALARM

      - type: int
        name: SCALE
        description: ""
        default: 1

      - type: int
        name: HOMEVIS
        description: If 1 then home is visible on the gui
        default: 1

      - type: str
        name: HOMEVISSTR
        description: ""
        default: Use motor summary screen

      - type: str
        name: alh
        description: Set this to alh to add the motor to the alarm handler and send emails
        default: ""

      - type: str
        name: HOME
        description: Prefix for autohome instance. Defaults to $(P) If unspecified
        default: "{{P}}"

      - type: str
        name: ALLOW_HOMED_SET
        description: Set to a blank to allow this axis to have its homed
        default: "#"

    databases:
      - file: dls_pmac_cs_asyn_motor.template
        define_args: |
          ADDR={{ axis }}
          PORT={{ CsController.name }}
          CS=CS{{ CsController.CS }}
          PMAC={{ CsController.Controller.name }}
        include_args:
          [
            P,
            M,
            DESC,
            MRES,
            VELO,
            PREC,
            EGU,
            TWV,
            DTYP,
            DIR,
            VBAS,
            VMAX,
            ACCL,
            BDST,
            BVEL,
            BACC,
            DHLM,
            DLLM,
            HLM,
            LLM,
            HLSV,
            INIT,
            SREV,
            RRES,
            ERES,
            JAR,
            UEIP,
            RDBL,
            RLINK,
            RTRY,
            DLY,
            "OFF",
            RDBD,
            FOFF,
            ADEL,
            NTM,
            FEHIGH,
            FEHIHI,
            FEHHSV,
            FEHSV,
            SCALE,
            HOMEVIS,
            HOMEVISSTR,
            name,
            alh,
            HOME,
            ALLOW_HOMED_SET,
          ]

  - name: pmacDisableLimitsCheck
    description: disable the limits check on an axis
    args:
      - type: object
        name: Controller
        description: Geobrick on which to disable limits

      - type: int
        name: Axis
        description: Axis to have limits disabled

    script:
      - pmacDisableLimitsCheck({{ Controller.name }}, {{ Axis }}, 0)

  - name: autohome
    description: setup auto home groups
    args:
      - type: object
        name: Controller
        description: the PMAC Controller

      - type: int
        name: PLC
        description: PLC number of the auto home PLC

      - type: str
        name: P
        description: Prefix for auto home PVs

      - type: str
        name: GRP1
        description: name of the 'ALL' group of auto home axes
        default: All
      - type: str
        name: GRP2
        description: name of the second group of auto home axes
        default: ""
      - type: str
        name: GRP3
        description: name of the third group of auto home axes
        default: ""
      - type: str
        name: GRP4
        description: name of the fourth group of auto home axes
        default: ""
      - type: str
        name: GRP5
        description: name of the fourth group of auto home axes
        default: ""
      - type: str
        name: GRP6
        description: name of the fourth group of auto home axes
        default: ""
      - type: str
        name: GRP7
        description: name of the fourth group of auto home axes
        default: ""
      - type: str
        name: GRP8
        description: name of the fourth group of auto home axes
        default: ""
      - type: str
        name: GRP9
        description: name of the fourth group of auto home axes
        default: ""

    databases:
      - file: autohome.template
        define_args: |
          PORT={{Controller.name}}
          CTRL={{Controller.P}}
        include_args:
          [P, PLC, GRP1, GRP2, GRP3, GRP4, GRP5, GRP6, GRP7, GRP8, GRP9]

  - name: CS
    description: Create a coordinate system
    args:
      - type: id
        name: name
        description: Asyn port name for this object

      - type: object
        name: Controller
        description: the PMAC Controller

      - type: int
        name: CS
        description: Coordinate system number

      - type: int
        name: NAxes
        description: number of CS axes
        default: 9

      - type: int
        name: Program
        description: PROG number for CS motion
        default: 10

    script:
      - pmacCreateCS("{{name}}", "{{Controller.name}}", {{CS}}, {{Program}})
      - pmacCreateCSAxes("{{name}}", {{NAxes}})
    databases:
      - file: pmacCsController.template
        define_args: |
          PORT={{name}}
          TIMEOUT={{Controller.TIMEOUT}}
          PARENTPORT={{Controller.name}}
          PMAC={{Controller.P}}
        include_args: [CS]

Definition is implemented in the code using a class of the same name.

Entity#

ibek can generate an IOC instance using an IOC instance entity file. This is a YAML file with name of the form <ioc_name>.<container>.yaml.

The IOC instance entity file declares the Entities that the IOC instance requires.

An Entity represents any piece of functionality of an IOC that is configured through EPICS database and/or startup script.

The classes of Entity that can be instantiated for a given generic IOC are declared in the Definitions files described above.

Declaring an Entity for an IOC instance will cause ibek to generate lines in the startup script. The generated startup script will also supply the EPICS database entries using dbLoadRecords and database templates.

The example motion IOC instance bl45p-mo-ioc-02 has the following entities:

  • DlsPmacAsynIPPort (one instance)

    • represents a connection to a motion controller

    • configured via

      • pmacAsynIPConfigure in the boot script

  • Geobrick (one instance)

    • represents the motion controller itself

    • configured via

      • pmacCreateController in boot script

      • pmacCreateAxes in the boot script

      • dbLoadRecords of pmacController.template and pmacStatus.template

  • DlsPmacAsynMotor (two instances)

    • represents a single motor connected to the controller

    • configured via:

      • dbLoadRecords of dls_pmac_asyn_motor.template

The example IOC instance entity file is shown below along with the st.cmd file that ibek will generate from it.

Click the arrows to reveal the files.

bl45p-mo-ioc-02.ibek.ioc.yaml
# yaml-language-server: $schema=../schemas/all.ibek.support.schema.json
ioc_name: bl45p-mo-ioc-02
description: an example motion ioc for ibek testing
generic_ioc_image: ghcr.io/epics-containers/ioc-pmac:main.run
entities:
  - type: pmac.PmacAsynIPPort
    name: BRICK1port
    IP: 192.168.0.12:1112

  - type: pmac.Geobrick
    name: BL45P-MO-BRICK-01
    PORT: BRICK1port
    P: "BL45P-MO-STEP-01:"
    numAxes: 8
    idlePoll: 100
    movingPoll: 500

  - type: pmac.DlsPmacAsynMotor
    name: X1 motor
    Controller: BL45P-MO-BRICK-01
    axis: 1
    P: BL45P-MO-THIN-01
    M: ":X1"
    MRES: 0.001

  - type: pmac.DlsPmacAsynMotor
    name: Y1 motor
    Controller: BL45P-MO-BRICK-01
    axis: 2
    P: BL45P-MO-THIN-01
    M: ":Y1"
    MRES: 0.001
st.cmd
# EPICS IOC Startup Script generated by https://github.com/epics-containers/ibek

cd "/repos/epics/ioc"
dbLoadDatabase dbd/ioc.dbd
ioc_registerRecordDeviceDriver pdbbase

pmacAsynIPConfigure(BRICK1port, 192.168.0.12:1112:1025)
pmacCreateController(BL45P-MO-BRICK-01, BRICK1port, 0, 8, 500, 100)
pmacCreateAxes(BL45P-MO-BRICK-01, 8)

dbLoadRecords /tmp/ioc.db
iocInit

Entity is implemented in the code using a class of the same name.

Schemas#

The YAML files described above are constrained by schemas. These schemas are available to the developer and may be used to assist in generating the YAML.

Note that the author of an IOC instance needs access to <container>.schema.json in order to correctly craft a correct <ioc>.<container>.yaml. For this reason the container schema file is published as a github artifact along with the release of the container image. All other ibek operations happen within the container or during container development.

Thus, the sequence of files is as follows:

Summary of ibek files sequence#

num

Name

Description

1

ibek.defs.schema.json

Global Schema for 2

2

<support>.ibek.support.yaml

Definition file for a support module. Generates part of 3

3

<container>.entities.schema.json

Schema for 4. Generated by combining all of 2 from a container

4

<ioc>.ibek.ioc.yaml

Description of Entities for an IOC instance.

5

IOC Startup Script st.cmd

Startup script for booting the IOC

The Global Schema and example IOC instance schema are below:

ibek.defs.schema.json
{
  "type": "object",
  "properties": {
    "module": {
      "type": "string",
      "description": "Support module name, normally the repo name"
    },
    "defs": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Publish Definition as type <module>.<name> for IOC instances"
          },
          "description": {
            "type": "string",
            "description": "Describes the purpose of the definition"
          },
          "args": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "float",
                      "default": "float"
                    },
                    "default": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "str",
                      "default": "str"
                    },
                    "default": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "int",
                      "default": "int"
                    },
                    "default": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "bool",
                      "default": "bool"
                    },
                    "default": {
                      "type": [
                        "boolean",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "object",
                      "default": "object"
                    },
                    "default": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the argument that the IOC instance should pass"
                    },
                    "description": {
                      "type": "string",
                      "description": "Description of what the argument will be used for"
                    },
                    "type": {
                      "type": "string",
                      "const": "id",
                      "default": "id"
                    },
                    "default": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "If given, and instance doesn't supply argument, what value should be used"
                    }
                  },
                  "required": [
                    "name",
                    "description"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "description": "The arguments IOC instance should supply",
            "default": []
          },
          "values": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the value that the IOC instance will expose"
                },
                "description": {
                  "type": "string",
                  "description": "Description of what the value will be used for"
                },
                "value": {
                  "type": "string",
                  "description": "The contents of the value"
                }
              },
              "required": [
                "name",
                "description",
                "value"
              ],
              "additionalProperties": false
            },
            "description": "The values IOC instance should supply",
            "default": []
          },
          "databases": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "file": {
                  "type": "string",
                  "description": "Filename of the database template in <module_root>/db"
                },
                "include_args": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "List of args to pass through to database",
                  "default": []
                },
                "define_args": {
                  "type": "string",
                  "description": "Arg string list to be generated as Jinja template",
                  "default": ""
                }
              },
              "required": [
                "file"
              ],
              "additionalProperties": false
            },
            "description": "Databases to instantiate",
            "default": []
          },
          "script": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name of the function to call"
                    },
                    "args": {
                      "type": "object",
                      "description": "The arguments IOC instance should supply"
                    },
                    "header": {
                      "type": "string",
                      "description": "commands/comments to appear before the function",
                      "default": ""
                    },
                    "once": {
                      "type": "boolean",
                      "description": "If true, only call the function once",
                      "default": false
                    },
                    "type": {
                      "type": "string",
                      "const": "function",
                      "default": "function"
                    }
                  },
                  "required": [
                    "name",
                    "args"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "const": "once",
                      "default": "once"
                    },
                    "value": {
                      "type": "string",
                      "description": "Startup script snippets defined as Jinja template",
                      "default": ""
                    }
                  },
                  "additionalProperties": false
                }
              ]
            },
            "description": "Startup script snippets defined as Jinja template or function",
            "default": []
          },
          "env_vars": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of environment variable"
                },
                "value": {
                  "type": "string",
                  "description": "Value to set"
                }
              },
              "required": [
                "name",
                "value"
              ],
              "additionalProperties": false
            },
            "description": "Environment variables to set in the boot script",
            "default": []
          },
          "post_ioc_init": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Entries to add post iocInit(), such as dbpf",
            "default": []
          }
        },
        "required": [
          "name",
          "description"
        ],
        "additionalProperties": false
      },
      "description": "The definitions an IOC can create using this module"
    }
  },
  "required": [
    "module",
    "defs"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
pmac.ibek.entities.schema.json
{
  "type": "object",
  "properties": {
    "ioc_name": {
      "type": "string",
      "description": "Name of IOC instance"
    },
    "description": {
      "type": "string",
      "description": "Description of what the IOC does"
    },
    "entities": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Asyn port name",
                "vscode_ibek_plugin_type": "type_id"
              },
              "IP": {
                "type": "string",
                "description": "IP address of Power pmac"
              },
              "USERNAME": {
                "type": "string",
                "description": "Username for login",
                "default": "root"
              },
              "PASSWORD": {
                "type": "string",
                "description": "Password for login",
                "default": "deltatau"
              },
              "PRIORITY": {
                "type": "integer",
                "description": "Priority of the port",
                "default": 0
              },
              "NOAUTOCONNECT": {
                "type": "integer",
                "description": "Disables autoconnect if set to 1",
                "default": 0
              },
              "NOEOS": {
                "type": "integer",
                "description": "No EOS used if set to 1",
                "default": 0
              },
              "type": {
                "type": "string",
                "const": "pmac.PmacAsynSSHPort",
                "default": "pmac.PmacAsynSSHPort"
              }
            },
            "required": [
              "name",
              "IP"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Asyn port name",
                "vscode_ibek_plugin_type": "type_id"
              },
              "IP": {
                "type": "string",
                "description": "IP address of pmac"
              },
              "PORT": {
                "type": "integer",
                "description": "TCP port for connection",
                "default": 1025
              },
              "type": {
                "type": "string",
                "const": "pmac.PmacAsynIPPort",
                "default": "pmac.PmacAsynIPPort"
              }
            },
            "required": [
              "name",
              "IP"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Name to use for the geobrick's asyn port",
                "vscode_ibek_plugin_type": "type_id"
              },
              "PORT": {
                "type": "string",
                "description": "Asyn port name for PmacAsynIPPort to connect to",
                "vscode_ibek_plugin_type": "type_object"
              },
              "P": {
                "type": "string",
                "description": "PV Prefix for all pmac db templates"
              },
              "numAxes": {
                "type": "integer",
                "description": "number of axes to initialize for the controller",
                "default": 8
              },
              "idlePoll": {
                "type": "integer",
                "description": "Idle Poll Period in ms",
                "default": 500
              },
              "movingPoll": {
                "type": "integer",
                "description": "Moving Poll Period in ms",
                "default": 100
              },
              "TIMEOUT": {
                "type": "integer",
                "description": "timeout in seconds for asyn",
                "default": 4
              },
              "FEEDRATE": {
                "type": "integer",
                "description": "feedrate below which we go into error",
                "default": 100
              },
              "CSG0": {
                "type": "string",
                "description": "Name for Coordinate System Group 0",
                "default": ""
              },
              "CSG1": {
                "type": "string",
                "description": "Name for Coordinate System Group 1",
                "default": ""
              },
              "CSG2": {
                "type": "string",
                "description": "Name for Coordinate System Group 2",
                "default": ""
              },
              "CSG3": {
                "type": "string",
                "description": "Name for Coordinate System Group 3",
                "default": ""
              },
              "CSG4": {
                "type": "string",
                "description": "Name for Coordinate System Group 3",
                "default": ""
              },
              "type": {
                "type": "string",
                "const": "pmac.Geobrick",
                "default": "pmac.Geobrick"
              }
            },
            "required": [
              "name",
              "PORT",
              "P"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Object name and gui association name"
              },
              "Controller": {
                "type": "string",
                "description": "PMAC Controller to attach to",
                "vscode_ibek_plugin_type": "type_object"
              },
              "axis": {
                "type": "integer",
                "description": "which axis number this motor drives"
              },
              "P": {
                "type": "string",
                "description": "PV prefix name for this motor"
              },
              "M": {
                "type": "string",
                "description": "PV motor name for this motor"
              },
              "DESC": {
                "type": "string",
                "description": "Description, displayed on EDM screen",
                "default": ""
              },
              "MRES": {
                "type": "number",
                "description": "Motor Step Size (EGU)",
                "default": 0.0001
              },
              "VELO": {
                "type": "number",
                "description": "axis Velocity (EGU/s)",
                "default": 1.0
              },
              "PREC": {
                "type": "integer",
                "description": "Display Precision",
                "default": 3
              },
              "EGU": {
                "type": "string",
                "description": "Engineering Units",
                "default": "mm"
              },
              "TWV": {
                "type": "number",
                "description": "Tweak Step Size (EGU)",
                "default": 1.0
              },
              "DTYP": {
                "type": "string",
                "description": "Datatype of record",
                "default": "asynMotor"
              },
              "DIR": {
                "type": "integer",
                "description": "User direction",
                "default": 0
              },
              "VBAS": {
                "type": "number",
                "description": "Base Velocity (EGU/s)",
                "default": 1.0
              },
              "VMAX": {
                "type": "string",
                "description": "Max Velocity (EGU/s)",
                "default": "{{VELO}}"
              },
              "ACCL": {
                "type": "number",
                "description": "Seconds to Velocity",
                "default": 0.5
              },
              "BDST": {
                "type": "number",
                "description": "BL Distance (EGU)",
                "default": 0.0
              },
              "BVEL": {
                "type": "number",
                "description": "BL Velocity(EGU/s)",
                "default": 0.0
              },
              "BACC": {
                "type": "number",
                "description": "BL Seconds to Veloc",
                "default": 0.0
              },
              "DHLM": {
                "type": "number",
                "description": "Dial High Limit",
                "default": 10000.0
              },
              "DLLM": {
                "type": "number",
                "description": "Dial low limit",
                "default": -10000.0
              },
              "HLM": {
                "type": "number",
                "description": "User High Limit",
                "default": 0.0
              },
              "LLM": {
                "type": "number",
                "description": "User Low Limit",
                "default": 0.0
              },
              "HLSV": {
                "type": "string",
                "description": "HW Lim, Violation Svr",
                "default": "MAJOR"
              },
              "INIT": {
                "type": "string",
                "description": "Startup commands",
                "default": ""
              },
              "SREV": {
                "type": "integer",
                "description": "Steps per Revolution",
                "default": 1000
              },
              "RRES": {
                "type": "number",
                "description": "Readback Step Size (EGU",
                "default": 0.0
              },
              "ERES": {
                "type": "number",
                "description": "Encoder Step Size (EGU)",
                "default": 0.0
              },
              "JAR": {
                "type": "number",
                "description": "Jog Acceleration (EGU/s^2)",
                "default": 0.0
              },
              "UEIP": {
                "type": "integer",
                "description": "Use Encoder If Present",
                "default": 0
              },
              "URIP": {
                "type": "integer",
                "description": "Use RDBL If Present",
                "default": 0
              },
              "RDBL": {
                "type": "string",
                "description": "Readback Location, set URIP =1 if you specify this",
                "default": "0"
              },
              "RLNK": {
                "type": "string",
                "description": "Readback output link",
                "default": ""
              },
              "RTRY": {
                "type": "integer",
                "description": "Max retry count",
                "default": 0
              },
              "DLY": {
                "type": "number",
                "description": "Readback settle time (s)",
                "default": 0.0
              },
              "OFF": {
                "type": "number",
                "description": "User Offset (EGU)",
                "default": 0.0
              },
              "RDBD": {
                "type": "number",
                "description": "Retry Deadband (EGU)",
                "default": 0.0
              },
              "FOFF": {
                "type": "integer",
                "description": "Freeze Offset, 0=variable, 1=frozen",
                "default": 0
              },
              "ADEL": {
                "type": "number",
                "description": "Alarm monitor deadband (EGU)",
                "default": 0.0
              },
              "NTM": {
                "type": "integer",
                "description": "New Target Monitor, only set to 0 for soft motors",
                "default": 1
              },
              "FEHIGH": {
                "type": "number",
                "description": "HIGH limit for following error",
                "default": 0.0
              },
              "FEHIHI": {
                "type": "number",
                "description": "HIHI limit for following error",
                "default": 0.0
              },
              "FEHHSV": {
                "type": "string",
                "description": "HIHI alarm severity for following error",
                "default": "NO_ALARM"
              },
              "FEHSV": {
                "type": "string",
                "description": "HIGH alarm severity for following error",
                "default": "NO_ALARM"
              },
              "SCALE": {
                "type": "integer",
                "default": 1
              },
              "HOMEVIS": {
                "type": "integer",
                "description": "If 1 then home is visible on the gui",
                "default": 1
              },
              "HOMEVISSTR": {
                "type": "string",
                "default": "Use motor summary screen"
              },
              "alh": {
                "type": "string",
                "description": "Set this to alh to add the motor to the alarm handler and send emails",
                "default": ""
              },
              "HOME": {
                "type": "string",
                "description": "Prefix for autohome instance. Defaults to $(P) If unspecified",
                "default": "{{P}}"
              },
              "ALLOW_HOMED_SET": {
                "type": "string",
                "description": "Set to a blank to allow this axis to have its homed",
                "default": "#"
              },
              "RLINK": {
                "type": "string",
                "description": "not sure what this is",
                "default": ""
              },
              "type": {
                "type": "string",
                "const": "pmac.DlsPmacAsynMotor",
                "default": "pmac.DlsPmacAsynMotor"
              }
            },
            "required": [
              "name",
              "Controller",
              "axis",
              "P",
              "M"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Object name and gui association name"
              },
              "CsController": {
                "type": "string",
                "description": "Coordinate system controller to attach to",
                "vscode_ibek_plugin_type": "type_object"
              },
              "axis": {
                "type": "integer",
                "description": "which axis number this motor drives"
              },
              "P": {
                "type": "string",
                "description": "PV prefix name for this motor"
              },
              "M": {
                "type": "string",
                "description": "PV motor name for this motor"
              },
              "DESC": {
                "type": "string",
                "description": "Description, displayed on EDM screen",
                "default": ""
              },
              "MRES": {
                "type": "number",
                "description": "Motor Step Size (EGU)",
                "default": 0.0001
              },
              "VELO": {
                "type": "number",
                "description": "axis Velocity (EGU/s)",
                "default": 1.0
              },
              "PREC": {
                "type": "integer",
                "description": "Display Precision",
                "default": 3
              },
              "EGU": {
                "type": "string",
                "description": "Engineering Units",
                "default": "mm"
              },
              "TWV": {
                "type": "number",
                "description": "Tweak Step Size (EGU)",
                "default": 1.0
              },
              "DTYP": {
                "type": "string",
                "description": "Datatype of record",
                "default": "asynMotor"
              },
              "DIR": {
                "type": "integer",
                "description": "User direction",
                "default": 0
              },
              "VBAS": {
                "type": "number",
                "description": "Base Velocity (EGU/s)",
                "default": 1.0
              },
              "VMAX": {
                "type": "string",
                "description": "Max Velocity (EGU/s)",
                "default": "{{VELO}}"
              },
              "ACCL": {
                "type": "number",
                "description": "Seconds to Velocity",
                "default": 0.5
              },
              "BDST": {
                "type": "number",
                "description": "BL Distance (EGU)",
                "default": 0.0
              },
              "BVEL": {
                "type": "number",
                "description": "BL Velocity(EGU/s)",
                "default": 0.0
              },
              "BACC": {
                "type": "number",
                "description": "BL Seconds to Veloc",
                "default": 0.0
              },
              "DHLM": {
                "type": "number",
                "description": "Dial High Limit",
                "default": 10000.0
              },
              "DLLM": {
                "type": "number",
                "description": "Dial low limit",
                "default": -10000.0
              },
              "HLM": {
                "type": "number",
                "description": "User High Limit",
                "default": 0.0
              },
              "LLM": {
                "type": "number",
                "description": "User Low Limit",
                "default": 0.0
              },
              "HLSV": {
                "type": "string",
                "description": "HW Lim, Violation Svr",
                "default": "MAJOR"
              },
              "INIT": {
                "type": "string",
                "description": "Startup commands",
                "default": ""
              },
              "SREV": {
                "type": "integer",
                "description": "Steps per Revolution",
                "default": 1000
              },
              "RRES": {
                "type": "number",
                "description": "Readback Step Size (EGU",
                "default": 0.0
              },
              "ERES": {
                "type": "number",
                "description": "Encoder Step Size (EGU)",
                "default": 0.0
              },
              "JAR": {
                "type": "number",
                "description": "Jog Acceleration (EGU/s^2)",
                "default": 0.0
              },
              "UEIP": {
                "type": "integer",
                "description": "Use Encoder If Present",
                "default": 0
              },
              "URIP": {
                "type": "integer",
                "description": "Use RDBL If Present",
                "default": 0
              },
              "RDBL": {
                "type": "string",
                "description": "Readback Location, set URIP =1 if you specify this",
                "default": "0"
              },
              "RLNK": {
                "type": "string",
                "description": "Readback output link",
                "default": ""
              },
              "RTRY": {
                "type": "integer",
                "description": "Max retry count",
                "default": 0
              },
              "DLY": {
                "type": "number",
                "description": "Readback settle time (s)",
                "default": 0.0
              },
              "OFF": {
                "type": "number",
                "description": "User Offset (EGU)",
                "default": 0.0
              },
              "RDBD": {
                "type": "number",
                "description": "Retry Deadband (EGU)",
                "default": 0.0
              },
              "FOFF": {
                "type": "integer",
                "description": "Freeze Offset, 0=variable, 1=frozen",
                "default": 0
              },
              "ADEL": {
                "type": "number",
                "description": "Alarm monitor deadband (EGU)",
                "default": 0.0
              },
              "NTM": {
                "type": "integer",
                "description": "New Target Monitor, only set to 0 for soft motors",
                "default": 1
              },
              "FEHEIGH": {
                "type": "number",
                "description": "HIGH limit for following error",
                "default": 0.0
              },
              "FEHIHI": {
                "type": "number",
                "description": "HIHI limit for following error",
                "default": 0.0
              },
              "FEHHSV": {
                "type": "string",
                "description": "HIHI alarm severity for following error",
                "default": "NO_ALARM"
              },
              "FEHSV": {
                "type": "string",
                "description": "HIGH alarm severity for following error",
                "default": "NO_ALARM"
              },
              "SCALE": {
                "type": "integer",
                "default": 1
              },
              "HOMEVIS": {
                "type": "integer",
                "description": "If 1 then home is visible on the gui",
                "default": 1
              },
              "HOMEVISSTR": {
                "type": "string",
                "default": "Use motor summary screen"
              },
              "alh": {
                "type": "string",
                "description": "Set this to alh to add the motor to the alarm handler and send emails",
                "default": ""
              },
              "HOME": {
                "type": "string",
                "description": "Prefix for autohome instance. Defaults to $(P) If unspecified",
                "default": "{{P}}"
              },
              "ALLOW_HOMED_SET": {
                "type": "string",
                "description": "Set to a blank to allow this axis to have its homed",
                "default": "#"
              },
              "type": {
                "type": "string",
                "const": "pmac.DlsCsPmacAsynMotor",
                "default": "pmac.DlsCsPmacAsynMotor"
              }
            },
            "required": [
              "name",
              "CsController",
              "axis",
              "P",
              "M"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "Controller": {
                "type": "string",
                "description": "Geobrick on which to disable limits",
                "vscode_ibek_plugin_type": "type_object"
              },
              "Axis": {
                "type": "integer",
                "description": "Axis to have limits disabled"
              },
              "type": {
                "type": "string",
                "const": "pmac.pmacDisableLimitsCheck",
                "default": "pmac.pmacDisableLimitsCheck"
              }
            },
            "required": [
              "Controller",
              "Axis"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "Controller": {
                "type": "string",
                "description": "the PMAC Controller",
                "vscode_ibek_plugin_type": "type_object"
              },
              "PLC": {
                "type": "integer",
                "description": "PLC number of the auto home PLC"
              },
              "P": {
                "type": "string",
                "description": "Prefix for auto home PVs"
              },
              "GRP1": {
                "type": "string",
                "description": "name of the 'ALL' group of auto home axes",
                "default": "All"
              },
              "GRP2": {
                "type": "string",
                "description": "name of the second group of auto home axes",
                "default": ""
              },
              "GRP3": {
                "type": "string",
                "description": "name of the third group of auto home axes",
                "default": ""
              },
              "GRP4": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "GRP5": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "GRP6": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "GRP7": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "GRP8": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "GRP9": {
                "type": "string",
                "description": "name of the fourth group of auto home axes",
                "default": ""
              },
              "type": {
                "type": "string",
                "const": "pmac.autohome",
                "default": "pmac.autohome"
              }
            },
            "required": [
              "Controller",
              "PLC",
              "P"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "entity_enabled": {
                "type": "boolean",
                "default": true
              },
              "name": {
                "type": "string",
                "description": "Asyn port name for this object",
                "vscode_ibek_plugin_type": "type_id"
              },
              "Controller": {
                "type": "string",
                "description": "the PMAC Controller",
                "vscode_ibek_plugin_type": "type_object"
              },
              "CS": {
                "type": "integer",
                "description": "Coordinate system number"
              },
              "NAxes": {
                "type": "integer",
                "description": "number of CS axes",
                "default": 9
              },
              "Program": {
                "type": "integer",
                "description": "PROG number for CS motion",
                "default": 10
              },
              "type": {
                "type": "string",
                "const": "pmac.CS",
                "default": "pmac.CS"
              }
            },
            "required": [
              "name",
              "Controller",
              "CS"
            ],
            "additionalProperties": false
          }
        ]
      },
      "description": "List of entities this IOC instantiates"
    },
    "generic_ioc_image": {
      "type": "string",
      "description": "The generic IOC container image registry URL"
    }
  },
  "required": [
    "ioc_name",
    "description",
    "entities",
    "generic_ioc_image"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

This results in the overall generated file structure:

ibek.defs.schema.jsonpmac.ibek.support.yamlasyn.ibek.support.yamlcontainer.ibek.entities.schema.jsonioc.ibek.ioc.yaml

Commands#

The ibek commands to progress through the file sequence above are as follows

Summary of ibek stages#

num

Name

Command

1

ibek.defs.schema.json

ibek ibek-schema

2

<support>.ibek.support.yaml

Hand crafted by the container developer. Held in the container.

3

<container>.ibek.entities.schema.json

ibek ioc-schema ... run at container build time. ... == all <support>.ibek.support.yaml within the container.

4

<ioc>.ibek.ioc.yaml

Hand crafted at IOC instance design time

5

IOC startup script

ibek build-startup <ioc>.ibek.ioc.yaml .... Run at IOC startup time in the container. ... == all <support>.ibek.support.yaml within the container.