diff options
author | Michael Hwang <mhwang@research.att.com> | 2017-09-11 13:49:15 -0400 |
---|---|---|
committer | Michael Hwang <mhwang@research.att.com> | 2017-09-12 11:23:54 -0400 |
commit | c74aad5faefcc5b7e7474c7dc74d9ab2cbc8fb72 (patch) | |
tree | f6eb90d35222ddae5223a05ecfb7f451b4bcd4c4 | |
parent | efb1851c15e51331f568c99b4a93bcf02932c2c6 (diff) |
Add blueprint for docker host and inventory
Change-Id: I94c3490aff836546902aeb06139ba7de3254274a
Issue-Id: DCAEGEN2-101
Signed-off-by: Michael Hwang <mhwang@research.att.com>
-rw-r--r-- | blueprints/DockerBP.yaml | 306 | ||||
-rw-r--r-- | blueprints/inventory.yaml | 137 |
2 files changed, 443 insertions, 0 deletions
diff --git a/blueprints/DockerBP.yaml b/blueprints/DockerBP.yaml new file mode 100644 index 0000000..37685d8 --- /dev/null +++ b/blueprints/DockerBP.yaml @@ -0,0 +1,306 @@ +tosca_definitions_version: cloudify_dsl_1_3 + +imports: + - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml + - http://www.getcloudify.org/spec/openstack-plugin/1.4/plugin.yaml + - http://www.getcloudify.org/spec/fabric-plugin/1.4.1/plugin.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_plugins_releases }}/type_files/dnsdesig/dns_types.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_ccsdk_platform_plugins_releases }}/type_files/sshkeyshare/sshkey_types.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases }}/type_files/relationship/1.0.0/node-type.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases }}/type_files/docker/2.3.0/node-type.yaml + +inputs: + registered_dockerhost_name: + description: the name that this Dockerhost is registered as + location_id: + description: the location ID for the location where the Docker hsot is being deployed + type: string + registrator_image: + description: |- + Full uri to registrator Docker image. Note! You should be using the forked version of + registrator in order to have Consul health checks for Docker containers. + type: string + centos7image_id: + type: string + default: '' + ubuntu1604image_id: + type: string + flavor_id: + type: string + security_group: + type: string + public_net: + type: string + private_net: + type: string + openstack: {} + fake_designate: + type: string + default: '' + keypair: + type: string + location_prefix: + type: string + location_domain: + type: string + node_name: + description: Used to construct the fqdn of the docker host + type: string + default: dokr00 + key_filename: + type: string + codesource_url: + type: string + codesource_version: + type: string + vm_init_dokr_00: + type: string + default: |- + #!/bin/sh + set -x + DATACENTER= + vm_init_dokr_01: + type: string + default: |- + REGNAME= + vm_init_dokr_fqdn: + type: string + description: |- + The FQDN environment variable is to be used in the cloud init script for the Docker host. + This is to be applied as metadata on the Consul node for the Docker host under the key + "fqdn". + default: |- + FQDN= + vm_init_dokr_service_tags: + type: string + description: |- + Environment variable assigned to a list of strings that are to be used as tags to label + the docker host. These tags are used when registering the docker host as a service in + Consul. The format of this input parameter is a string that is a shell script variable + assignment of the variable SERVICE_TAGS. It must be either null or a json array of strings. + Here is a valid example of when the value is a json array: + + 'SERVICE_TAGS="[\"foo\", \"bar\"]"' + + Note how the double quotes per array element are escaped. + default: "SERVICE_TAGS=null" + vm_init_dokr_02: + type: string + default: | + MYIP=`wget -qO- http://169.254.169.254/2009-04-04/meta-data/local-ipv4` + MYPUB=`wget -qO- http://169.254.169.254/2009-04-04/meta-data/public-ipv4` + echo "My public IP: $MYPUB" + MYNAME=`hostname` + echo >>/etc/hosts + echo $MYIP $MYNAME >>/etc/hosts + + # Grab nameservers to be used to setup recursors for Consul + cat <<EOF > /tmp/grab_nameservers.py + with open("/etc/resolv.conf", "r") as f: + nss = [line.split(" ")[1].strip() for line in f.readlines() if line.startswith("nameserver")] + print("[\"{0}\"]".format("\",\"".join(nss))) + EOF + NAMESERVERS=$(python3 /tmp/grab_nameservers.py) + + mkdir -p /opt/consul/config /opt/consul/data /opt/consul/bin + # Download Consul from Nexus + curl -Ss https://releases.hashicorp.com/consul/0.8.3/consul_0.8.3_linux_amd64.zip > /opt/consul/bin/consul_0.8.3_linux_amd64 + chmod +x /opt/consul/bin/consul_0.8.3_linux_amd64 + ln -s /opt/consul/bin/consul_0.8.3_linux_amd64 /opt/consul/bin/consul + cat <<EOF > /opt/consul/config/consul.json + { + "bind_addr" : "0.0.0.0", + "client_addr" : "0.0.0.0", + "advertise_addr" : "$MYIP", + "data_dir" : "/opt/consul/data", + "datacenter": "$DATACENTER", + "http_api_response_headers": { + "Access-Control-Allow-Origin" : "*" + }, + "rejoin_after_leave": true, + "server": false, + "ui": false, + "enable_syslog": true, + "log_level": "info", + "ports": { + "dns": 53 + }, + "recursors": $NAMESERVERS, + "service" : { + "id": "$REGNAME", + "name": "$REGNAME", + "address": "$MYPUB", + "port": 2376, + "tags": $SERVICE_TAGS + }, + "node_meta": { + "fqdn": "$FQDN" + } + } + EOF + + # Specify DOCKER_HOST environment variable to support healthchecks for Docker containers + # in Consul. Tried using the local unix socket but that did not work (possible bug in Consul) + # so forcing to use the http connection to Docker engine. + cat <<EOF > /lib/systemd/system/consul.service + [Unit] + Description=Consul + Requires=network-online.target + After=network.target + [Service] + Type=simple + Environment=DOCKER_HOST=tcp://localhost:2376 + ExecStart=/opt/consul/bin/consul agent -config-dir=/opt/consul/config + ExecReload=/bin/kill -HUP \$MAINPID + [Install] + WantedBy=multi-user.target + EOF + systemctl enable consul + systemctl start consul + until /opt/consul/bin/consul join "cloudify-manager-${DATACENTER}" + do + echo Waiting to join Consul cluster + sleep 60 + done + + apt-get update + DEBIAN_FRONTEND=noninteractive apt-get install -y -q linux-image-extra-`uname -r` linux-image-extra-virtual apparmor dirmngr + DEBIAN_FRONTEND=noninteractive apt-get install -y -q docker.io + echo 'DOCKER_OPTS="--raw-logs -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock"' >>/etc/default/docker + systemctl restart docker +node_templates: + key_pair: + type: cloudify.openstack.nodes.KeyPair + properties: + private_key_path: { get_input: key_filename } + use_external_resource: True + resource_id: { get_input: keypair } + openstack_config: &open_conf + get_input: openstack + private_net: + type: cloudify.openstack.nodes.Network + properties: + use_external_resource: True + resource_id: { get_input: private_net } + openstack_config: *open_conf + security_group: + type: cloudify.openstack.nodes.SecurityGroup + properties: + use_external_resource: True + resource_id: { get_input: security_group } + openstack_config: *open_conf + fixedip_dokr00: + type: cloudify.openstack.nodes.Port + properties: + port: + extra_dhcp_opts: + - opt_name: 'domain-name' + opt_value: { get_input: location_domain } + openstack_config: *open_conf + relationships: + - type: cloudify.relationships.contained_in + target: private_net + floatingip_dokr00: + type: cloudify.openstack.nodes.FloatingIP + properties: + openstack_config: *open_conf + interfaces: + cloudify.interfaces.lifecycle: + create: + inputs: + args: + floating_network_name: { get_input: public_net } + dns_dokr00: + type: dcae.nodes.dns.arecord + properties: + fqdn: { concat: [ { get_input: location_prefix }, { get_input: node_name }, '.', { get_input: location_domain } ] } + fakeurl: { get_input: fake_designate } + openstack: *open_conf + interfaces: + cloudify.interfaces.lifecycle: + create: + inputs: + args: + ip_addresses: + - { get_attribute: [ floatingip_dokr00, floating_ip_address ] } + relationships: + - type: cloudify.relationships.depends_on + target: floatingip_dokr00 + host_dokr00: + type: cloudify.openstack.nodes.Server + properties: + install_agent: false + image: { get_input: ubuntu1604image_id } + flavor: { get_input: flavor_id } + management_network_name: { get_input: private_net } + openstack_config: *open_conf + interfaces: + cloudify.interfaces.lifecycle: + create: + inputs: + args: + name: { concat: [ { get_input: location_prefix }, { get_input: node_name }] } + userdata: + concat: + - { get_input: vm_init_dokr_00 } + - { get_input: location_id } + - |+ + + - { get_input: vm_init_dokr_01 } + - { get_input: registered_dockerhost_name } + - |+ + + - { get_input: vm_init_dokr_fqdn } + - { get_property: [ dns_dokr00, fqdn ] } + - |+ + + - { get_input: vm_init_dokr_service_tags } + - |+ + + - { get_input: vm_init_dokr_02 } + relationships: + - type: cloudify.openstack.server_connected_to_port + target: fixedip_dokr00 + - type: cloudify.openstack.server_connected_to_security_group + target: security_group + - type: cloudify.openstack.server_connected_to_floating_ip + target: floatingip_dokr00 + - type: cloudify.openstack.server_connected_to_keypair + target: key_pair + - type: cloudify.relationships.depends_on + target: dns_dokr00 + + registrator: + type: dcae.nodes.DockerContainer + properties: + name: + 'registrator' + image: + { get_input: registrator_image } + relationships: + - type: dcae.relationships.component_contained_in + target: docker_host + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + envs: + EXTERNAL_IP: + get_attribute: [ floatingip_dokr00, floating_ip_address ] + volumes: + - host: + path: '/var/run/docker.sock' + container: + bind: '/tmp/docker.sock' + mode: 'ro' + + docker_host: + type: dcae.nodes.SelectedDockerHost + properties: + location_id: + { get_input: location_id } + docker_host_override: + { get_input: registered_dockerhost_name } + relationships: + - type: cloudify.relationships.depends_on #this is to avoid a race condition + target: host_dokr00 diff --git a/blueprints/inventory.yaml b/blueprints/inventory.yaml new file mode 100644 index 0000000..67f3d74 --- /dev/null +++ b/blueprints/inventory.yaml @@ -0,0 +1,137 @@ +tosca_definitions_version: cloudify_dsl_1_3 + +description: > + This blueprint is used to install and to uninstall DCAE inventory and DCAE service change + handler which are platform services. These applications are Docker containers. This blueprint + depends upon the deployment of a Docker host and the deployment of a central postgres that is + registered with Consul. + +imports: + - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases }}/type_files/relationship/1.0.0/node-type.yaml + - {{ ONAPTEMPLATE_RAWREPOURL_org_onap_dcaegen2_platform_plugins_releases }}/type_files/docker/2.3.0/node-type.yaml + +inputs: + + location_id: + description: Location of where to deploy to + + docker_host_override: + description: Target docker host to deploy applications to + asdc_address: + description: SDC host + asdc_uri: + description: SDC url + asdc_user: + description: SDC username + asdc_password: + description: SDC password + asdc_environment_name: + description: SDC environment name + + postgres_user_inventory: + description: Postgres user for inventory + postgres_password_inventory: + description: Postgres password for inventory + + service_change_handler_image: + description: Full uri to service change handler Docker image + inventory_image: + description: Full uri to inventory Docker image + +node_templates: + + service-change-handler: + type: dcae.nodes.DockerContainerForPlatforms + properties: + name: + "service-change-handler" + application_config: + asdcDistributionClient: + asdcAddress: { get_input: asdc_address } + asdcUri: { get_input: asdc_uri } + user: { get_input: asdc_user } + password: { get_input: asdc_password } + pollingInterval: 20 + pollingTimeout: 20 + consumerGroup: dcae + consumerId: dcae-sch + environmentName: { get_input: asdc_environment_name } + keyStorePath: + keyStorePassword: + activateServerTLSAuth: false + isFilterInEmptyResources: false + dcaeInventoryClient: + uri: http://inventory:8080 + image: + { get_input: service_change_handler_image } + relationships: + - type: cloudify.relationships.depends_on + target: inventory + - type: dcae.relationships.component_contained_in + target: docker_host + + inventory: + type: dcae.nodes.DockerContainerForPlatforms + properties: + name: + "inventory" + application_config: + database: + driverClass: org.postgresql.Driver + user: { get_input: postgres_user_inventory } + password: { get_input: postgres_password_inventory } + url: jdbc:postgresql://pstg-write:5432/dcae_inv + properties: + charSet: UTF-8 + maxWaitForConnection: 1s + validationQuery: "/* MyService Health Check */ SELECT 1" + minSize: 2 + maxSize: 8 + initialSize: 2 + checkConnectionWhileIdle: false + evictionInterval: 10s + minIdleTime: 1 minute + dcaeControllerConnection: + host: dcae-controller-hostname + port: 9998 + basePath: resources + user: + password: + required: false + databusControllerConnection: + host: databus-controller-hostname + port: 8443 + mechId: + password: + required: false + httpClient: + minThreads: 1 + maxThreads: 128 + gzipEnabled: false + gzipEnabledForRequests: false + timeout: 5000milliseconds + connectionTimeout: 5000milliseconds + docker_config: + healthcheck: + type: "http" + interval: "30s" + timeout: "3s" + endpoint: "/dcae-service-types" + image: + { get_input: inventory_image } + host_port: + 8080 + container_port: + 8080 + relationships: + - type: dcae.relationships.component_contained_in + target: docker_host + + docker_host: + type: dcae.nodes.SelectedDockerHost + properties: + location_id: + { get_input: location_id } + docker_host_override: + { get_input: docker_host_override } |