CDAP
======================

Note: This blueprint is intended to be deployed, automatically, as part of the
DCAE bootstrap process, and is not normally invoked manually.

The ONAP DCAEGEN2 CDAP blueprint deploys a 7 node Cask Data Application
Platform (CDAP) cluster (version 4.1.x), for running data analysis
applications.  The template for the blueprint is at
``blueprints/cdapbp7.yaml-template`` in the ONAP
``dcaegen2.platform.blueprints`` project.  The ``02`` VM in the cluster
will be the CDAP master.

Blueprint Input Parameters
--------------------------

This blueprint has the following required input parameters:

* ``ubuntu1604image_id``

  This is the OpenStack image ID of the Ubuntu 16.04 VM image that will be
  used to launch the 7 VMs making up the cluster.

* ``flavor_id``

  This is the OpenStack flavor ID specifying the amount of memory, disk, and
  CPU available to each VM in the cluster.  While the required values will be
  largely application dependent, a minimum of 32 Gigabytes of memory is
  strongly recommended.

* ``security_group``

  This is the OpenStack security group specifying permitted inbound and
  outbound IP connectivity to the VMs in the cluster.

* ``public_net``

  This is the name of the OpenStack network from which floating IP addresses
  for the VMs in the cluster will be allocated.

* ``private_net``

  This is the name of the OpenStack network from which fixed IP addresses for
  the VMs in the cluster will be allocated.

* ``openstack``

  This is the JSON object / YAML associative array providing values necessary
  for accessing OpenStack.  The keys are:

  * ``auth_url``

    The URL for accessing the OpenStack Identity V2 API.  (The version of
    Cloudify currently being used, and the associated OpenStack plugin do
    not currently support Identity V3).

  * ``tenant_name``

    The name of the OpenStack tenant/project where the VMs will be launched.

  * ``region``

    The name of the OpenStack region within the deployment.  In smaller
    OpenStack deployments, where there is only one region, the region is
    often named ``RegionOne``.

  * ``username``

    The name of the OpenStack user used as a credential for accessing
    OpenStack.

  * ``password``

    The password of the OpenStack user.  (The version of Cloudify currently
    being used does not provide a mechanism for encrypting this value).

* ``keypair``

  The name of the ssh "key pair", within OpenStack, that will be given access,
  via the ubuntu login, to the VMs.  Note: OpenStack actually stores only the
  public key.

* ``key_filename``

  The full file path, on the Cloudify Manager VM used to deploy this blueprint,
  of the ssh private key file corresponding to the ``keypair`` input parameter.

* ``location_domain``

  The DNS domain/zone for DNS entries associated with the VMs in the cluster.
  If, for example, location_domain is ``dcae.example.com`` then the FQDN for
  a VM with hostname ``abcd`` would be ``abcd.dcae.example.com`` and a DNS
  lookup of that FQDN would lead an A (or AAAA) record giving the floating
  IP address assigned to that VM.

* ``location_prefix``

  The hostname prefix for hostnames of VMs in the cluster.  The hostnames
  assigned to the VMs are created by concatenating this prefix with a suffix
  identifying the individual VMs in the cluster (``cdap00``, ``cdap01``, ...,
  ``cdap06``).  If the location prefix is ``jupiter`` then the hostname of
  the CDAP master in the cluster would be ``jupitercdap02``.

* ``codesource_url`` and ``codesource_version``

  ``codesource_url`` is the base URL for downloading DCAE specific project
  installation scripts.  The intent is that this URL may be environment
  dependent, (for example it may, for security reasons, point to an internal
  mirror).  This is used in combination with the ``codesource_version`` input
  parameter to determine the URL for downloading the scripts.  There are 2
  scripts used by this blueprint - ``cdap-init.sh`` and
  ``instconsulagentub16.sh`` These scripts are part of the
  dcaegen2.deployments ONAP project.  This blueprint assumes that curl/wget
  can find these scripts at
  *codesource_url/codesource_version*\ ``/cloud_init/cdap-init.sh`` and
  *codesource_url/codesource_version*\ ``/cloud_init/instconsulagentub16.sh``
  respectively.  For example, if codesource_url is
  ``https://mymirror.example.com`` and codesource_version is ``rel1.0``,
  then the installation scripts would be expected to be stored under
  ``https://mymirror.example.com/rel1.0/raw/cloud_init/``

This blueprint has the following optional inputs:

* ``location_id`` (default ``solutioning-central``)

  The name of the Consul cluster to register this CDAP cluster with.

* ``cdap_cluster_name`` (default ``cdap``)

  The name of the service to register this cluster as, in Consul.
