.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0

.. _dcae_cli_commands:

dcae_cli Commands
=================

The dcae_cli tool has four command groups. Each has several
sub-commands.

``catalog``
-----------

The ``catalog`` command lists and shows resources (components and
data_formats) in the ‘onboarding’ catalog (regardless of the owner). A
resource can have a status of ``staged`` or ``published``. By default,
only ``published`` resources are displayed. To see ``staged`` resources,
add the –expanded argument.

+-----------------------------------------------+-----------------------+
| Catalog Status                                | Meaning               |
+===============================================+=======================+
| staged                                        | resource has be added |
|                                               | (and validated), but  |
|                                               | is under development  |
+-----------------------------------------------+-----------------------+
| staged data_formats can only be referenced in |
| their owners component specs                  |
+-----------------------------------------------+-----------------------+
| staged components can only be deployed by     |
| their owners                                  |
+-----------------------------------------------+-----------------------+
| published                                     | resource has been     |
|                                               | tested and can be     |
|                                               | shared                |
+-----------------------------------------------+-----------------------+
| published data_formats can be used in         |
| anyone’s component spec                       |
+-----------------------------------------------+-----------------------+
| published components and be deployed by       |
| anyone                                        |
+-----------------------------------------------+-----------------------+

::

    $ dcae_cli catalog --help
    Usage: dcae_cli catalog [OPTIONS] COMMAND [ARGS]...

    Options:
      --help  Show this message and exit.

    Commands:
      list      Lists resources in the onboarding catalog
      show      Provides more information about resource

List onboarding catalog contents
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    $ dcae_cli catalog list
    Components:
    +--------------------------------+---------+--------+---------------------------------------------------------------------+--------+-----------+------------+
    | Name                           | Version | Type   | Description                                                         | Owner  | Status    | Published  |
    +--------------------------------+---------+--------+---------------------------------------------------------------------+--------+-----------+------------+
    | DcaeSyslogCollector            | 2.0.0   | docker | DCAE Control Plane Syslog Collector                                 | sh1986 | published | 2017-08-04 |
    | cdap.dmaap.spec.example        | 0.2.0   | cdap   | dmaap spec example. Not a functioning application, only for showing | tc677g | published | 2017-07-24 |
    |                                |         |        | how to pub/sub dmaap. Pretend this is like MAP with VES in and ou.. |        |           |            |
    | cdap.event.proc.enrich.app     | 1.0.3   | cdap   | CDAP Event Processing Enrich application                            | an4828 | published | 2017-09-20 |
    | cdap.event.proc.map.app        | 1.0.3   | cdap   | CDAP Event Processing Map application                               | an4828 | published | 2017-09-20 |

    ...

    Data formats:
    +--------------------------------------------+---------+-----------------------------------------------------------------------+--------+-----------+------------+
    | Name                                       | Version | Description                                                           | Owner  | Status    | Published  |
    +--------------------------------------------+---------+-----------------------------------------------------------------------+--------+-----------+------------+
    | FOI_PM_VHSS_data_format                    | 1.0.0   | CSV pipe delimited data format for VHSS PM files                      | sr229c | published | 2017-09-05 |
    | Map_input                                  | 1.0.0   | The input format for Mapper, that in 1707 is the UCSNMP Collector     | an4828 | published | 2017-07-18 |
    |                                            |         | output format, but will support more formats later                    |        |           |            |
    | Syslog Collector Parsed Json Message       | 1.0.0   | Post processed/parsed collected syslog message                        | sh1986 | published | 2017-08-04 |
    | Syslog Collector Syslog Message Input      | 1.0.0   | The input message for the DCAE syslog collector is free/unstructured  | sh1986 | published | 2017-08-04 |
    |                                            |         | text                                                                  |        |           |            |
    | myapp Alert Definition                     | 1.0.0   | The format of the output event from myapp                               | an4828 | published | 2017-08-10 |
    | VES_specification                          | 5.28.4  | VES spec for 5.4                                                      | vv770d | published | 2017-09-19 |

    ...

Show the contents of an item in the catalog
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    $ dcae_cli catalog show FOI_PM_VHSS_data_format

    Data format
    -----------
    {
        "dataformatversion": "1.0.0", 
        "delimitedschema": {
            "delimiter": "|", 
            "fields": [
                {
                    "description": "System ID", 
                    "fieldtype": "string", 
                    "name": "SYSTEM"
                }, 
                {
                    "description": "Date", 
                    "fieldtype": "string", 
                    "name": "DATE"
                }, 
                {
                    "description": "Time", 
                    "fieldtype": "string", 
                    "name": "TIME"
                }, 

    ...

.. _dcae_cli_component_commands:

--------------

``component``
-------------

The ``component`` command is for validating (adding), listing, showing,
verifying generated configuration, running, undeploying, and publishing
components that YOU own.

::

    $ dcae_cli component --help
    Usage: dcae_cli component [OPTIONS] COMMAND [ARGS]...

    Options:
      --help  Show this message and exit.

    Commands:
      add
      dev       Set up component in development for...
      list      Lists components in the onboarding catalog.
      publish   Pushes COMPONENT to the onboarding catalog
      run       Runs the latest version of COMPONENT.
      show      Provides more information about COMPONENT
      undeploy  Undeploys the latest version of COMPONENT.

--------------

.. _dcae_cli_add_a_component:

Add a Component
~~~~~~~~~~~~~~~

A component must be added to the onboarding catalog in order to be
tested by the dcae_cli tool. The process of adding a component also
validates it’s component specification. In order to add a component, the
component docker image (or CDAP jar) must exist locally.

Components in the onboarding catalog can be run by others, once they are
``published.`` ``Published`` components cannot be modified or deleted.
Rather a new version can be created instead.

Validated component specs are used later to generate Tosca models and
Cloudify Blueprints for the component, which makes them available for
use in the SDC Tool for creating services.

::

    $ dcae_cli component add --help
    Usage: dcae_cli component add [OPTIONS] COMPONENT-SPECIFICATION

    Options:
      --update  Updates a previously added component if it has not been already
                published
      --help    Show this message and exit.

::

    $ dcae_cli component add component-spec.json 

--------------

List Components
~~~~~~~~~~~~~~~

List components in the onboarding catalog that owned by YOUR userid..

::

    $ dcae_cli component list
    Active profile: solutioning
    +-------------------------+---------+--------+---------------------------------------------------------------+--------+----------------------------+-----------+
    | Name                    | Version | Type   | Description                                                   | Status | Modified                   | #Deployed |
    +-------------------------+---------+--------+---------------------------------------------------------------+--------+----------------------------+-----------+
    | cdap.helloworld.endnode | 0.8.0   | cdap   | cdap test component                                           | staged | 2017-05-23 04:14:35.588075 | 0         |
    | sandbox.platform.yourapp| 0.5.0   | docker | Web service used as a stand-alone test DCAE service compone.. | staged | 2017-05-23 04:07:44.065610 | 0         |
    +-------------------------+---------+--------+---------------------------------------------------------------+--------+----------------------------+-----------+

The fields ``Name``, ``Version``, ``Type``, ``Description`` are
referenced from the component specification’s ``self`` JSON. Use the
“–deployed” argument to see more details on deploymed components

--------------

.. _dcae_cli_run_a_component:

Run a Component
~~~~~~~~~~~~~~~

The ``run`` operation is to be used for running your application in its
container remotely on the activated environment. Docker containers have
the additional option to run locally on your development machine. If the
component uses Dmaap, you can specify the Dmaap Connection Object as
well. Refer to :doc:`Dmaap Connection Object <../component-specification/dmaap-connection-objects>`.

When you run a component via the dcae_cli Tool, remember the blueprint
has not been created and is not used for deployment.

In order to run the component, the data formats and component must have
been added to the onboarding catalog.

**DOCKER NOTE:** Make sure the Docker image has been uploaded to the
shared registry.

A docker component can be run in either ``attached`` or ``unattached``
mode. (Default is unattached).

+------------------+---------------------------------------------------+
| Mode             | Description                                       |
+==================+===================================================+
| attached         | component is run in the ‘foreground’, container   |
|                  | logs are streamed to stdout. Ctrl-C is used to    |
|                  | terminate the dcae_cli session.                   |
+------------------+---------------------------------------------------+
| unattached       | component is run in the ‘background’, container   |
|                  | logs are viewed via ``docker logs`` command,      |
|                  | container runs until undeployed with dcae_cli     |
|                  | ``undeploy`` command.                             |
+------------------+---------------------------------------------------+

Run a component in attached mode:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

    $ dcae_cli -v component run --attached sandbox.platform.yourapp:0.5.0

    DCAE.Docker | INFO | Running image 'registry.proto.server.com/dcae-rework/yourapp:0.4.0' as 'user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp'
    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO | Consul host: yourconsulhost.com

    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO | service name: mh677g.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp

    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO | Generated config: {'multiplier': 3}

    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO |  * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO | 135.205.226.140 - - [24/May/2017 03:37:57] "GET /health HTTP/1.1" 200 -

    DCAE.Docker.user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp | INFO | 135.205.226.140 - - [24/May/2017 03:38:12] "GET /health HTTP/1.1" 200 -

Hit Ctrl-C to terminate session.

::

    ^CDCAE.Docker | INFO | Stopping container 'user1.b7287639-37f5-4f25-8d54-8a2087f4c8da.0-5-0.sandbox-platform-yourapp' and cleaning up...

Run a component in unattached mode:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

    $ dcae_cli -v component run sandbox.platform.yourapp:0.5.0
    DCAE.Docker | INFO | Running image 'registry.proto.server.com/dcae-rework/yourapp:0.4.0' as 'user1.4811da0e-08d5-429f-93bf-bf6814924577.0-5-0.sandbox-platform-yourapp'
    DCAE.Run | INFO | Deployed /user1.4811da0e-08d5-429f-93bf-bf6814924577.0-5-0.sandbox-platform-yourapp

**NOTE** You must undeploy this component when finished testing. This is
important to conserve resources in the environment.

Run a component that subscribes to Dmaap MR or DR
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

    $ dcae_cli -v component run --attached --dmaap-file $dmaap-connection-file sandbox.platform.yourapp:0.5.0 

--------------

Undeploy a Component
~~~~~~~~~~~~~~~~~~~~

The ``undeploy`` command is used to undeploy any instance of a specified
component/version that you have deployed. This includes cleaning up the
configuration.

::

    $ dcae_cli component undeploy sandbox.platform.yourapp:0.5.0
    DCAE.Undeploy | WARNING | Undeploying components: 1
    DCAE.Undeploy | WARNING | Undeployed components: 1

--------------

Publish a component
~~~~~~~~~~~~~~~~~~~

| Once a component has been tested, it should be published in the
  onboarding catalog using the ``publish`` sub-command .
| Publishing will change the status of the component (from ``staged`` to
  ``published``), indicating that it has been tested, and making it
  accessible for other developers to use.

**Note** Before a component can be published, all data_formats that it
references must be published.

::

    dcae_cli component publish sandbox.platform.yourapp:0.5.0

--------------

Show a Component
~~~~~~~~~~~~~~~~

This will print out the contents of a component and is useful to copy a
component spec.

::

    $ dcae_cli component show

--------------

.. _dcae-cli-run-the-dev-command:

Run the ``dev`` command
~~~~~~~~~~~~~~~~~~~~~~~

The ``dev`` command is used as part of a process to see the platform
generated configuration. It established the environment variables and is
best explained
:any:`here <dcae-cli-view-the-platform>`.

::

    $ dcae_cli component dev component-spec.json
    Ready for component development

--------------

.. _dcae_cli_data_format:

``data_format``
---------------

The ``data_format`` command is for validating (adding), listing,
showing, publishing data_formats that YOU own. data_formats can also be
generated with this command.

::

    $ dcae_cli data_format --help
    Usage: dcae_cli data_format [OPTIONS] COMMAND [ARGS]...

    Options:
      --help  Show this message and exit.

    Commands:
      add       Tracks a data format file DATA_FORMAT-SPECIFICATION...
      generate  Create schema from a file or directory...
      list      Lists all your data formats
      publish   Publishes data format to make available to others...
      show      Provides more information about FORMAT

--------------

.. _dcae_cli_add_a_data_format:

Add a Data Format
~~~~~~~~~~~~~~~~~

A data_format must be in the onboarding catalog in order to be
referenced in the component specification. The process of adding a
data_format also validates it. Data_formats in the onboarding catalog
can be run by others, once they are ``published.`` ``Published``
data_formats cannot be modified or deleted. Rather a new version can be
created instead.

::

    $ dcae_cli data_format add --help
    Usage: dcae_cli data_format add [OPTIONS] DATA_FORMAT-SPECIFICATION

    Options:
      --update  Updates a previously added data_format if it has not been already
                published
      --help    Show this message and exit.

::

    dcae_cli data_format add health.json

--------------

List Data Formats
~~~~~~~~~~~~~~~~~

Only data_formats owned by YOUR userid will be shown.

::

    $ dcae_cli data_format list

    Data formats for user1
    +---------------------------------+---------+-------------------------------------------+--------+----------------------------+
    | Name                            | Version | Description                               | Status | Modified                   |
    +---------------------------------+---------+-------------------------------------------+--------+----------------------------+
    | sandbox.platform.yourapp.health | 0.1.0   | Data format used for the /health endpoint | staged | 2017-05-23 04:02:38.952799 |
    +---------------------------------+---------+-------------------------------------------+--------+----------------------------+

The fields ``name``, ``version``, ``description`` are referenced from
the data format specification’s ``self`` JSON. ``Status`` represents the
status of the data format in the catalog. See `Publish a Data
Format <#publish-a-data-format>`__ for more info.

--------------

Show a Data Format
~~~~~~~~~~~~~~~~~~

This will print out the contents of a data_format and is useful for
copying a data_format.

::

    $ dcae_cli data_format show

--------------

Publish a Data Format
~~~~~~~~~~~~~~~~~~~~~

| Once a data_format has been tested (by referencing it in a component
  spec that has been tested), it should be published in the onboarding
  catalog using the ``publish`` sub-command .
| Publishing will change the status of the data_format (from ``staged``
  to ``published``), indicating that it has been tested, and making it
  accessible for other developers to use.

::

    $ dcae_cli data_format publish data_format.json

--------------

Generate a Data Format
~~~~~~~~~~~~~~~~~~~~~~

If you already have a valid input or output file, you can use the
generate command to create the it’s data format specification.

::

    $ dcae_cli data_format generate name:version file-or-dir-path

--------------

``profiles``
------------

The\ ``profiles`` command is for creating, deleting, listing, showing,
activating, and updating (set) profiles. The profile contains
environment variables used to connect to different environments. This is
used in the running and deployment of a component using the
``dcae_cli component run`` or ``dev`` command.

::

    $ dcae_cli profiles --help
    Usage: dcae_cli profiles [OPTIONS] COMMAND [ARGS]...

    Options:
      --help  Show this message and exit.

    Commands:
      activate  Sets profile NAME as the active profile
      create    Creates a new profile NAME initialized with...
      delete    Deletes profile NAME
      list      Lists available profiles
      set       Updates profile NAME such that KEY=VALUE
      show      Prints the profile dictionary

--------------

List the available profiles
~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    $ dcae_cli profiles list
    *  solutioning
       1710
       1802

The \* identifies the active profile. ``dcae-cli`` is currently
installed with profiles for the ``solutioning``, ``1710``, and ``1802``
environments. They are intended for the following:

+-----------------------------------+-----------------------------------+
| Environment                       | Description                       |
+===================================+===================================+
| solutioning                       | default environment; used for     |
|                                   | initial component developer       |
|                                   | testing with the dcae_cli tool.   |
+-----------------------------------+-----------------------------------+
| 1710                              | FTL3 (Functional Testing Lab 3)   |
|                                   | environment, which represents the |
|                                   | 1710 release.                     |
+-----------------------------------+-----------------------------------+
| 1802                              | FTL3a (Functional Testing Lab 3a) |
|                                   | environment, which represents the |
|                                   | 1802 release.                     |
+-----------------------------------+-----------------------------------+

--------------

Show the details of a profile
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    $ dcae_cli profiles show solutioning
    {
        "cdap_broker": "cdap_broker",
        "config_binding_service": "config_binding_service",
        "consul_host": "yourconsulhost.com",
        "docker_host": "yourdockerhost.com:2376"
    }

--------------

.. _dcae_cli_activate_profile:

Activate a profile
~~~~~~~~~~~~~~~~~~

To switch among profiles, use the activate sub-command. A subsequent
``list`` will reveal the change made.

::

    $ dcae_cli profiles activate test

--------------

Create a new profile
~~~~~~~~~~~~~~~~~~~~

If you want to work in a different environment using the dcae_cli tool,
you can make your own profile. (The environment must be a working DCAE
Platform environment).

::

    $ dcae_cli profiles create new-profile

After creating you would assign the variables with the ``set``
sub-command. Then activate it to use.

--------------

Set variables in a profile
~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    $ dcae_cli profiles set $profile $key $value 

--------------

Delete a profile
~~~~~~~~~~~~~~~~

::

    $ dcae_cli profiles delete new-profile


