blob: 38612e17380ebd80c61d90e32a2713e87a6f2031 [file] [log] [blame]
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. _docker-specification:
Component specification (Docker)
================================
The Docker component specification contains the following groups of
information. Many of these are common to both Docker and CDAP components
and are therefore described in the common specification.
- :any:`Metadata <metadata>`
- :any:`Interfaces <interfaces>` including the
associated :any:`Data Formats <data-formats>`
- :any:`Parameters <parameters>`
- :any:`Auxiliary Details <docker-auxiliary-details>`
- :any:`List of Artifacts <artifacts>`
.. _docker-auxiliary-details:
Auxiliary Details
-----------------
``auxiliary`` contains Docker specific details like health check, port
mapping, volume mapping, and policy reconfiguration script details.
+-------------+----+----------+
| Name | Ty\| Descript\|
| | pe | ion |
+=============+====+==========+
| healthcheck | JS\| *Require\|
| | ON | d*. |
| | ob\| Health |
| | je\| check |
| | ct | definiti\|
| | | on |
| | | details |
+-------------+----+----------+
| ports | JS\| each |
| | ON | array |
| | ar\| item |
| | ra\| maps a |
| | y | containe\|
| | | r |
| | | port to |
| | | the host |
| | | port. |
| | | See |
| | | example |
| | | below. |
+-------------+----+----------+
| volume | JS\| each |
| | ON | array |
| | ar\| item |
| | ra\| contains |
| | y | a host |
| | | and |
| | | containe\|
| | | r |
| | | object. |
| | | See |
| | | example |
| | | below. |
+-------------+----+----------+
| policy | JS\| *Require\|
| | ON | d*. |
| | ar\| Policy |
| | ra\| script |
| | y | details |
+-------------+----+----------+
Health Check Definition
~~~~~~~~~~~~~~~~~~~~~~~
The platform uses Consul to perform periodic health check calls. Consul
provides different types of `check definitions <https://www.consul.io/docs/agent/checks.html>`_. The
platform currently supports http and docker health checks.
When choosing a value for interval, consider that too frequent
healthchecks will put unnecessary load on Consul and DCAE. If there is a
problematic resource, then more frequent healthchecks are warranted (eg
15s or 60s), but as stablility increases, so can these values, (eg
300s).
When choosing a value for timeout, consider that too small a number will
result in increasing timeout failures, and too large a number will
result in a delay in the notification of resource problem. A suggestion
is to start with 5s and workd from there.
http
^^^^
+-------------+----+----------+
| Property | Ty\| Descript\|
| Name | pe | ion |
+=============+====+==========+
| type | st\| *Require\|
| | ri\| d*. |
| | ng | ``http`` |
+-------------+----+----------+
| interval | st\| Interval |
| | ri\| duration |
| | ng | in |
| | | seconds |
| | | i.e. |
| | | ``60s`` |
+-------------+----+----------+
| timeout | st\| Timeout |
| | ri\| in |
| | ng | seconds |
| | | i.e. |
| | | ``5s`` |
+-------------+----+----------+
| endpoint | st\| *Require\|
| | ri\| d*. |
| | ng | GET |
| | | endpoint |
| | | provided |
| | | by the |
| | | componen\|
| | | t |
| | | for |
| | | Consul |
| | | to call |
| | | to check |
| | | health |
+-------------+----+----------+
Example:
.. code:: json
"auxilary": {
"healthcheck": {
"type": "http",
"interval": "15s",
"timeout": "1s",
"endpoint": "/my-health"
}
}
docker script example
^^^^^^^^^^^^^^^^^^^^^
+-------------+----+------------+
| Property | Ty\| Descript\ |
| Name | pe | ion |
+=============+====+============+
| type | st\| *Require\ |
| | ri\| d*. |
| | ng | ``docker`` |
+-------------+----+------------+
| interval | st\| Interval |
| | ri\| duration |
| | ng | in |
| | | seconds |
| | | i.e. |
| | | ``15s`` |
+-------------+----+------------+
| timeout | st\| Timeout |
| | ri\| in |
| | ng | seconds |
| | | i.e. |
| | | ``1s`` |
+-------------+----+------------+
| script | st\| *Require\ |
| | ri\| d*. |
| | ng | Full |
| | | path of |
| | | script |
| | | that |
| | | exists |
| | | in the |
| | | Docker |
| | | containe\ |
| | | r |
| | | to be |
| | | executed |
+-------------+----+------------+
Consul will use the `Docker exec API <https://docs.docker.com/engine/api/v1.29/#tag/Exec>`_ to
periodically call your script in your container. It will examine the
script result to identify whether your component is healthy. Your
component is considered healthy when the script returns ``0`` otherwise
your component is considered not healthy.
Example:
.. code:: json
"auxilary": {
"healthcheck": {
"type": "docker",
"script": "/app/resources/check_health.py",
"timeout": "30s",
"interval": "180s"
}
}
Ports
~~~~~
.. code:: json
"auxilary": {
"ports": ["8080:8000"]
}
In the example above, container port 8080 maps to host port 8000.
Volume Mapping
~~~~~~~~~~~~~~
.. code:: json
"auxilary": {
"volumes": [
{
"container": {
"bind": "/tmp/docker.sock",
"mode": "ro"
},
"host": {
"path": "/var/run/docker.sock"
}
}
]
}
At the top-level:
+---------------+-------+-------------------------------------+
| Property Name | Type | Description |
+===============+=======+=====================================+
| volumes | array | Contains container and host objects |
+---------------+-------+-------------------------------------+
The ``container`` object contains:
+----------------------+----------------------+----------------------+
| Property Name | Type | Description |
+======================+======================+======================+
| bind | string | path to the |
| | | container volume |
+----------------------+----------------------+----------------------+
| mode | string | ro - indicates |
| | | read-only volume |
| | | “” - indicates that |
| | | the container can |
| | | write into the bind |
| | | mount |
+----------------------+----------------------+----------------------+
The ``host`` object contains:
+---------------+--------+-------------------------+
| Property Name | Type | Description |
+===============+========+=========================+
| path | string | path to the host volume |
+---------------+--------+-------------------------+
Heres an example of the minimal JSON that must be provided as an input:
.. code:: json
"auxilary": {
"volumes": [
{
"container": {
"bind": "/tmp/docker.sock"
},
"host": {
"path": "/var/run/docker.sock"
}
}
]
}
In the example above, the container volume “/tmp/docker.sock maps to
host volume “/var/run/docker.sock”.
Policy
~~~~~~
Policy changes made in the Policy UI will be provided to the Docker
component by triggering a script that is defined here.
+-------------+----+------------+
| Property | Ty\| Descript\ |
| Name | pe | ion |
+=============+====+============+
| reconfigure | st\| *Require\ |
| _type | ri\| d*. |
| | ng | Current |
| | | value |
| | | supporte |
| | | d |
| | | is |
| | | ``policy`` |
+-------------+----+------------+
| script_path | st\| *Require\ |
| | ri\| d*. |
| | ng | Current |
| | | value |
| | | for |
| | | policy |
| | | reconfig\ |
| | | ure_type |
| | | must be |
| | | “/opt/ap\ |
| | | p/reconf\ |
| | | igure.sh |
| | | |
+-------------+----+------------+
Example:
.. code:: json
"auxilary": {
"policy": {
"reconfigure_type": "policy",
"script_path": "/opt/app/reconfigure.sh"
}
}
The docker script interface is as follows: \`/opt/app/reconfigure.sh
$reconfigure_type {“updated policies”: , application config”: }
+-----+----+---------------------------+
| Na\ | Ty\| Descript\ |
| me | pe | ion |
+=====+====+===========================+
| re\ | st\| policy |
| co\ | ri\| |
| nf\ | ng | |
| ig\ | | |
| ur\ | | |
| e_t\| | |
| y\ | | |
| pe\ | | |
+-----+----+---------------------------+
| up\ | js\| TBD |
| da\ | on | |
| te\ | | |
| d_p\| | |
| o\ | | |
| li\ | | |
| ci\ | | |
| es | | |
+-----+----+---------------------------+
| up\ | js\| complete |
| da\ | on | generate\ |
| te\ | | d |
| d_a\| | app_conf\ |
| p\ | | ig, |
| pl\ | | not |
| _c\ | | fully-re\ |
| on\ | | solved, |
| fi\ | | but |
| g | | ``policy-enabled`` |
| | | paramete\ |
| | | rs |
| | | have |
| | | been |
| | | updated. |
| | | In order |
| | | to get |
| | | the |
| | | complete |
| | | updated |
| | | app_conf\ |
| | | ig, |
| | | the |
| | | componen\ |
| | | t |
| | | would |
| | | have to |
| | | call |
| | | ``config-binding-service``|
| | | . |
+-----+----+---------------------------+
Docker Component Spec - Complete Example
----------------------------------------
.. code:: json
{
"self": {
"version": "1.0.0",
"name": "asimov.component.kpi_anomaly",
"description": "Classifies VNF KPI data as anomalous",
"component_type": "docker"
},
"streams": {
"subscribes": [{
"format": "dcae.vnf.kpi",
"version": "1.0.0",
"route": "/data",
"type": "http"
}],
"publishes": [{
"format": "asimov.format.integerClassification",
"version": "1.0.0",
"config_key": "prediction",
"type": "http"
}]
},
"services": {
"calls": [{
"config_key": "vnf-db",
"request": {
"format": "dcae.vnf.meta",
"version": "1.0.0"
},
"response": {
"format": "dcae.vnf.kpi",
"version": "1.0.0"
}
}],
"provides": [{
"route": "/score-vnf",
"request": {
"format": "dcae.vnf.meta",
"version": "1.0.0"
},
"response": {
"format": "asimov.format.integerClassification",
"version": "1.0.0"
}
}]
},
"parameters": [
{
"name": "threshold",
"value": 0.75,
"description": "Probability threshold to exceed to be anomalous"
}
],
"auxilary": {
"healthcheck": {
"type": "http",
"interval": "15s",
"timeout": "1s",
"endpoint": "/my-health"
}
},
"artifacts": [{
"uri": "fake.nexus.com/dcae/kpi_anomaly:1.0.0",
"type": "docker image"
}]
}