Merge "Add split-stack environments"
authorJenkins <jenkins@review.openstack.org>
Mon, 26 Jun 2017 23:59:05 +0000 (23:59 +0000)
committerGerrit Code Review <review@openstack.org>
Mon, 26 Jun 2017 23:59:05 +0000 (23:59 +0000)
97 files changed:
ci/environments/multinode.yaml
ci/environments/scenario002-multinode-containers.yaml
ci/environments/scenario003-multinode-containers.yaml
ci/environments/scenario004-multinode-containers.yaml
common/README [new file with mode: 0644]
docker/docker-puppet.py
docker/services/cinder-volume.yaml
docker/services/collectd.yaml
docker/services/containers-common.yaml
docker/services/database/mysql-client.yaml [new file with mode: 0644]
docker/services/ec2-api.yaml [new file with mode: 0644]
docker/services/ironic-api.yaml
docker/services/manila-api.yaml
docker/services/pacemaker/cinder-backup.yaml [new file with mode: 0644]
docker/services/pacemaker/cinder-volume.yaml [new file with mode: 0644]
docker/services/sensu-client.yaml
docker/services/services.yaml [deleted file]
environments/cinder-netapp-config.yaml
environments/docker-services-tls-everywhere.yaml
environments/docker.yaml
environments/enable-tls.yaml
environments/inject-trust-anchor-hiera.yaml
environments/inject-trust-anchor.yaml
environments/networking/neutron-midonet.yaml [new file with mode: 0644]
environments/neutron-midonet.yaml
environments/neutron-ml2-ovn-ha.yaml [new file with mode: 0644]
environments/puppet-ceph-external.yaml
environments/services-docker/ec2-api.yaml [new file with mode: 0644]
environments/services/ironic.yaml
environments/ssl/enable-tls.yaml [new file with mode: 0644]
environments/ssl/inject-trust-anchor-hiera.yaml [new file with mode: 0644]
environments/ssl/inject-trust-anchor.yaml [new file with mode: 0644]
environments/ssl/tls-endpoints-public-dns.yaml [new file with mode: 0644]
environments/ssl/tls-endpoints-public-ip.yaml [new file with mode: 0644]
environments/ssl/tls-everywhere-endpoints-dns.yaml [new file with mode: 0644]
environments/storage/cinder-netapp-config.yaml [new file with mode: 0644]
environments/storage/cinder-nfs.yaml [new file with mode: 0644]
environments/storage/enable-ceph.yaml [new file with mode: 0644]
environments/storage/external-ceph.yaml [new file with mode: 0644]
environments/storage/glance-nfs.yaml [new file with mode: 0644]
environments/tls-endpoints-public-dns.yaml
environments/tls-endpoints-public-ip.yaml
environments/undercloud.yaml
extraconfig/tasks/pacemaker_common_functions.sh
extraconfig/tasks/yum_update.sh
net-config-bond.yaml
network/config/bond-with-vlans/ceph-storage.yaml
network/config/bond-with-vlans/cinder-storage.yaml
network/config/bond-with-vlans/compute-dpdk.yaml
network/config/bond-with-vlans/compute.yaml
network/config/bond-with-vlans/controller-no-external.yaml
network/config/bond-with-vlans/controller-v6.yaml
network/config/bond-with-vlans/controller.yaml
network/config/bond-with-vlans/swift-storage.yaml
network/scripts/run-os-net-config.sh
network/service_net_map.j2.yaml
overcloud-resource-registry-puppet.j2.yaml
overcloud.j2.yaml
puppet/all-nodes-config.yaml
puppet/blockstorage-role.yaml
puppet/cephstorage-role.yaml
puppet/compute-role.yaml
puppet/controller-role.yaml
puppet/deploy-artifacts.sh
puppet/objectstorage-role.yaml
puppet/role.role.j2.yaml
puppet/services/database/mysql.yaml
puppet/services/database/redis.yaml
puppet/services/horizon.yaml
puppet/services/ironic-api.yaml
puppet/services/ironic-inspector.yaml [new file with mode: 0644]
puppet/services/keystone.yaml
puppet/services/nova-api.yaml
puppet/services/nova-scheduler.yaml
puppet/services/ovn-dbs.yaml
puppet/services/pacemaker/database/mysql.yaml
puppet/services/pacemaker/ovn-dbs.yaml [new file with mode: 0644]
releasenotes/notes/baremetal-cell-hosts-cd5cf5aa8a33643c.yaml [new file with mode: 0644]
releasenotes/notes/baremetal-role-34cb48cc30d7bdb4.yaml [new file with mode: 0644]
releasenotes/notes/fix-glance-api-network-4f9d7c20475a5994.yaml [new file with mode: 0644]
releasenotes/notes/fix-rpm-deploy-artifact-urls-03d5694073ad159d.yaml [new file with mode: 0644]
releasenotes/notes/ironic-inspector-43441782bdf0f84e.yaml [new file with mode: 0644]
releasenotes/notes/max-active-fernet-keys-f960f08838a75eee.yaml [new file with mode: 0644]
releasenotes/notes/ovn-ha-c0139ac519680872.yaml [new file with mode: 0644]
roles/IronicConductor.yaml [new file with mode: 0644]
roles_data_undercloud.yaml
sample-env-generator/README.rst
sample-env-generator/networking.yaml [new file with mode: 0644]
sample-env-generator/predictable-placement.yaml [moved from sample-env-generator/sample-environments.yaml with 100% similarity]
sample-env-generator/ssl.yaml [new file with mode: 0644]
sample-env-generator/storage.yaml [new file with mode: 0644]
services.yaml [moved from puppet/services/services.yaml with 88% similarity]
test-requirements.txt
tools/yaml-validate.py
tox.ini
tripleo_heat_templates/environment_generator.py
tripleo_heat_templates/tests/test_environment_generator.py

index 20e37e3..102787a 100644 (file)
@@ -52,6 +52,8 @@ parameter_defaults:
     - OS::TripleO::Services::Timezone
     - OS::TripleO::Services::NovaCompute
     - OS::TripleO::Services::NovaLibvirt
+    - OS::TripleO::Services::Horizon
+    - OS::TripleO::Services::TripleoFirewall
     - OS::TripleO::Services::Sshd
   ControllerExtraConfig:
     nova::compute::libvirt::services::libvirt_virt_type: qemu
index 7191dea..92c834b 100644 (file)
@@ -6,9 +6,10 @@
 resource_registry:
   OS::TripleO::Controller::Net::SoftwareConfig: ../common/net-config-multinode.yaml
   OS::TripleO::Compute::Net::SoftwareConfig: ../common/net-config-multinode.yaml
-  OS::TripleO::Services::BarbicanApi: ../../puppet/services/barbican-api.yaml
-  OS::TripleO::Services::Zaqar: ../../puppet/services/zaqar.yaml
-  OS::TripleO::Services::Ec2Api: ../../puppet/services/ec2-api.yaml
+  # TODO: Barbican is not yet containerized: https://review.openstack.org/#/c/474327
+  # OS::TripleO::Services::BarbicanApi: ../../docker/services/barbican-api.yaml
+  OS::TripleO::Services::Zaqar: ../../docker/services/zaqar.yaml
+  OS::TripleO::Services::Ec2Api: ../../docker/services/ec2-api.yaml
   # NOTE: This is needed because of upgrades from Ocata to Pike. We
   # deploy the initial environment with Ocata templates, and
   # overcloud-resource-registry.yaml there doesn't have this Docker
index cfb0507..7b917ae 100644 (file)
@@ -6,11 +6,11 @@
 resource_registry:
   OS::TripleO::Controller::Net::SoftwareConfig: ../common/net-config-multinode.yaml
   OS::TripleO::Compute::Net::SoftwareConfig: ../common/net-config-multinode.yaml
-  OS::TripleO::Services::SaharaApi: ../../puppet/services/sahara-api.yaml
-  OS::TripleO::Services::SaharaEngine: ../../puppet/services/sahara-engine.yaml
-  OS::TripleO::Services::MistralApi: ../../puppet/services/mistral-api.yaml
-  OS::TripleO::Services::MistralEngine: ../../puppet/services/mistral-engine.yaml
-  OS::TripleO::Services::MistralExecutor: ../../puppet/services/mistral-executor.yaml
+  OS::TripleO::Services::SaharaApi: ../../docker/services/sahara-api.yaml
+  OS::TripleO::Services::SaharaEngine: ../../docker/services/sahara-engine.yaml
+  OS::TripleO::Services::MistralApi: ../../docker/services/mistral-api.yaml
+  OS::TripleO::Services::MistralEngine: ../../docker/services/mistral-engine.yaml
+  OS::TripleO::Services::MistralExecutor: ../../docker/services/mistral-executor.yaml
   # NOTE: This is needed because of upgrades from Ocata to Pike. We
   # deploy the initial environment with Ocata templates, and
   # overcloud-resource-registry.yaml there doesn't have this Docker
index 7a6724d..1d6d591 100644 (file)
@@ -6,6 +6,7 @@
 resource_registry:
   OS::TripleO::Controller::Net::SoftwareConfig: ../common/net-config-multinode.yaml
   OS::TripleO::Compute::Net::SoftwareConfig: ../common/net-config-multinode.yaml
+  # TODO deploy ceph with ceph-ansible: https://review.openstack.org/#/c/465066/
   OS::TripleO::Services::CephMds: ../../puppet/services/ceph-mds.yaml
   OS::TripleO::Services::CephMon: ../../puppet/services/ceph-mon.yaml
   OS::TripleO::Services::CephOSD: ../../puppet/services/ceph-osd.yaml
@@ -13,10 +14,12 @@ resource_registry:
   OS::TripleO::Services::SwiftProxy: OS::Heat::None
   OS::TripleO::Services::SwiftStorage: OS::Heat::None
   OS::TripleO::Services::SwiftRingBuilder: OS::Heat::None
-  OS::TripleO::Services::ManilaApi: ../../puppet/services/manila-api.yaml
-  OS::TripleO::Services::ManilaScheduler: ../../puppet/services/manila-scheduler.yaml
+  OS::TripleO::Services::ManilaApi: ../../docker/services/manila-api.yaml
+  OS::TripleO::Services::ManilaScheduler: ../../docker/services/manila-scheduler.yaml
+  # NOTE: being containerized here: https://review.openstack.org/#/c/471527/
   OS::TripleO::Services::ManilaShare: ../../puppet/services/manila-share.yaml
   OS::TripleO::Services::ManilaBackendCephFs: ../../puppet/services/manila-backend-cephfs.yaml
+  # TODO: containerize NeutronBgpVpnApi
   OS::TripleO::Services::NeutronBgpVpnApi: ../../puppet/services/neutron-bgpvpn-api.yaml
   # NOTE: This is needed because of upgrades from Ocata to Pike. We
   # deploy the initial environment with Ocata templates, and
diff --git a/common/README b/common/README
new file mode 100644 (file)
index 0000000..6a52311
--- /dev/null
@@ -0,0 +1 @@
+This will contain some common templates but it needs to be added to the RPM spec first
index 4d9d40d..1321167 100755 (executable)
@@ -208,6 +208,13 @@ def mp_puppet_config((config_volume, puppet_tags, manifest, config_image, volume
             done
             rsync -a -R --delay-updates --delete-after $rsync_srcs /var/lib/config-data/${NAME}
 
+            # Also make a copy of files modified during puppet run
+            # This is useful for debugging
+            mkdir -p /var/lib/config-data/puppet-generated/${NAME}
+            rsync -a -R -0 --delay-updates --delete-after \
+                          --files-from=<(find $rsync_srcs -newer /etc/ssh/ssh_known_hosts -print0) \
+                          / /var/lib/config-data/puppet-generated/${NAME}
+
             # Write a checksum of the config-data dir, this is used as a
             # salt to trigger container restart when the config changes
             tar cf - /var/lib/config-data/${NAME} | md5sum | awk '{print $1}' > /var/lib/config-data/${NAME}.md5sum
index 4ee1996..26eb10e 100644 (file)
@@ -130,10 +130,12 @@ outputs:
           with_items:
             - /var/log/containers/cinder
             - /var/lib/cinder
-        #FIXME: all of this should be conditional on the CinderEnableIscsiBackend value being set to true
+        - name: cinder_enable_iscsi_backend fact
+          set_fact:
+            cinder_enable_iscsi_backend: {get_param: CinderEnableIscsiBackend}
         - name: cinder create LVM volume group dd
           command:
-            list_join: 
+            list_join:
             - ''
             - - 'dd if=/dev/zero of=/var/lib/cinder/cinder-volumes bs=1 count=0 seek='
               - str_replace:
@@ -143,6 +145,7 @@ outputs:
               - 'M'
           args:
             creates: /var/lib/cinder/cinder-volumes
+          when: cinder_enable_iscsi_backend
         - name: cinder create LVM volume group
           shell: |
             if ! losetup /dev/loop2; then
@@ -157,6 +160,7 @@ outputs:
           args:
             executable: /bin/bash
             creates: /dev/loop2
+          when: cinder_enable_iscsi_backend
       upgrade_tasks:
         - name: Stop and disable cinder_volume service
           tags: step2
index 7354898..6c58a58 100644 (file)
@@ -55,7 +55,11 @@ outputs:
     description: Role data for the collectd role.
     value:
       service_name: {get_attr: [CollectdBase, role_data, service_name]}
-      config_settings: {get_attr: [CollectdBase, role_data, config_settings]}
+      config_settings:
+        map_merge:
+          - get_attr: [CollectdBase, role_data, config_settings]
+          - tripleo::profile::base::metrics::collectd::enable_file_logging: true
+            collectd::plugin::logfile::log_file: /var/log/collectd/collectd.log
       step_config: &step_config
         get_attr: [CollectdBase, role_data, step_config]
       service_config_settings: {get_attr: [CollectdBase, role_data, service_config_settings]}
@@ -71,6 +75,10 @@ outputs:
       kolla_config:
         /var/lib/kolla/config_files/collectd.json:
           command: /usr/sbin/collectd -f
+          permissions:
+            - path: /var/log/collectd
+              owner: collectd:collectd
+              recurse: true
       docker_config:
         step_3:
           collectd:
@@ -84,11 +92,17 @@ outputs:
                 -
                   - /var/run/docker.sock:/var/run/docker.sock:rw
                   - /var/lib/kolla/config_files/collectd.json:/var/lib/kolla/config_files/config.json:ro
-                  - /var/lib/config-data/collectd/etc/collectd/:/etc/collectd/:ro
+                  - /var/lib/config-data/collectd/etc/collectd.conf:/etc/collectd.conf:ro
+                  - /var/lib/config-data/collectd/etc/collectd.d:/etc/collectd.d:ro
+                  - /var/log/containers/collectd:/var/log/collectd:rw
             environment:
               - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
+      host_prep_tasks:
+        - name: create persistent logs directory
+          file:
+            path: /var/log/containers/collectd
+            state: directory
       upgrade_tasks:
         - name: Stop and disable collectd service
           tags: step2
           service: name=collectd.service state=stopped enabled=no
-
index 973d999..d104853 100644 (file)
@@ -3,19 +3,64 @@ heat_template_version: pike
 description: >
   Contains a static list of common things necessary for containers
 
+parameters:
+
+  # Required parameters
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+
+
+  EnableInternalTLS:
+    type: boolean
+    default: false
+  InternalTLSCAFile:
+    default: '/etc/ipa/ca.crt'
+    type: string
+    description: Specifies the default CA cert to use if TLS is used for
+                 services in the internal network.
+
+conditions:
+
+  internal_tls_enabled: {equals: [{get_param: EnableInternalTLS}, true]}
+
 outputs:
   volumes:
     description: Common volumes for the containers.
     value:
-      - /etc/hosts:/etc/hosts:ro
-      - /etc/localtime:/etc/localtime:ro
-      # required for bootstrap_host_exec
-      - /etc/puppet:/etc/puppet:ro
-      # OpenSSL trusted CAs
-      - /etc/pki/ca-trust/extracted:/etc/pki/ca-trust/extracted:ro
-      - /etc/pki/tls/certs/ca-bundle.crt:/etc/pki/tls/certs/ca-bundle.crt:ro
-      - /etc/pki/tls/certs/ca-bundle.trust.crt:/etc/pki/tls/certs/ca-bundle.trust.crt:ro
-      - /etc/pki/tls/cert.pem:/etc/pki/tls/cert.pem:ro
-      # Syslog socket
-      - /dev/log:/dev/log
-      - /etc/ssh/ssh_known_hosts:/etc/ssh/ssh_known_hosts:ro
+      list_concat:
+        - - /etc/hosts:/etc/hosts:ro
+          - /etc/localtime:/etc/localtime:ro
+          # required for bootstrap_host_exec
+          - /etc/puppet:/etc/puppet:ro
+          # OpenSSL trusted CAs
+          - /etc/pki/ca-trust/extracted:/etc/pki/ca-trust/extracted:ro
+          - /etc/pki/tls/certs/ca-bundle.crt:/etc/pki/tls/certs/ca-bundle.crt:ro
+          - /etc/pki/tls/certs/ca-bundle.trust.crt:/etc/pki/tls/certs/ca-bundle.trust.crt:ro
+          - /etc/pki/tls/cert.pem:/etc/pki/tls/cert.pem:ro
+          # Syslog socket
+          - /dev/log:/dev/log
+          - /etc/ssh/ssh_known_hosts:/etc/ssh/ssh_known_hosts:ro
+        - if:
+          - internal_tls_enabled
+          - - {get_param: InternalTLSCAFile}
+          - null
diff --git a/docker/services/database/mysql-client.yaml b/docker/services/database/mysql-client.yaml
new file mode 100644 (file)
index 0000000..b0ad376
--- /dev/null
@@ -0,0 +1,66 @@
+heat_template_version: pike
+
+description: >
+  Configuration for containerized MySQL clients
+
+parameters:
+  DockerNamespace:
+    description: namespace
+    default: 'tripleoupstream'
+    type: string
+  DockerMysqlImage:
+    description: image
+    default: 'centos-binary-mariadb:latest'
+    type: string
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  EnableInternalTLS:
+    type: boolean
+    default: false
+  InternalTLSCAFile:
+    default: '/etc/ipa/ca.crt'
+    type: string
+    description: Specifies the default CA cert to use if TLS is used for
+                 services in the internal network.
+
+outputs:
+  role_data:
+    description: Role for setting mysql client parameters
+    value:
+      service_name: mysql_client
+      config_settings:
+        tripleo::profile::base::database::mysql::client::mysql_client_bind_address: {get_param: [ServiceNetMap, MysqlNetwork]}
+        tripleo::profile::base::database::mysql::client::enable_ssl: {get_param: EnableInternalTLS}
+        tripleo::profile::base::database::mysql::client::ssl_ca: {get_param: InternalTLSCAFile}
+      # BEGIN DOCKER SETTINGS #
+      step_config: ""
+      puppet_config:
+        config_volume: mysql_client
+        puppet_tags: file # set this even though file is the default
+        step_config: "include ::tripleo::profile::base::database::mysql::client"
+        config_image:
+          list_join:
+            - '/'
+            - [ {get_param: DockerNamespace}, {get_param: DockerMysqlImage} ]
+      # no need for a docker config, this service only generates configuration files
+      docker_config: {}
diff --git a/docker/services/ec2-api.yaml b/docker/services/ec2-api.yaml
new file mode 100644 (file)
index 0000000..bc3654b
--- /dev/null
@@ -0,0 +1,153 @@
+heat_template_version: pike
+
+description: >
+  OpenStack containerized EC2 API service
+
+parameters:
+  DockerNamespace:
+    description: namespace
+    default: 'tripleoupstream'
+    type: string
+  DockerEc2ApiImage:
+    description: image
+    default: 'centos-binary-ec2-api:latest'
+    type: string
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+
+resources:
+
+  ContainersCommon:
+    type: ./containers-common.yaml
+
+  Ec2ApiPuppetBase:
+      type: ../../puppet/services/ec2-api.yaml
+      properties:
+        EndpointMap: {get_param: EndpointMap}
+        ServiceNetMap: {get_param: ServiceNetMap}
+        DefaultPasswords: {get_param: DefaultPasswords}
+        RoleName: {get_param: RoleName}
+        RoleParameters: {get_param: RoleParameters}
+
+outputs:
+  role_data:
+    description: Role data for the EC2 API role.
+    value:
+      service_name: {get_attr: [Ec2ApiPuppetBase, role_data, service_name]}
+      config_settings: {get_attr: [Ec2ApiPuppetBase, role_data, config_settings]}
+      step_config: &step_config
+        get_attr: [Ec2ApiPuppetBase, role_data, step_config]
+      service_config_settings: {get_attr: [Ec2ApiPuppetBase, role_data, service_config_settings]}
+      # BEGIN DOCKER SETTINGS
+      puppet_config:
+        config_volume: ec2api
+        puppet_tags: ec2api_api_paste_ini,ec2api_config
+        step_config: *step_config
+        config_image: &ec2_api_image
+          list_join:
+            - '/'
+            - [ {get_param: DockerNamespace}, {get_param: DockerEc2ApiImage} ]
+      kolla_config:
+        /var/lib/kolla/config_files/ec2_api.json:
+          command: /usr/bin/ec2-api
+          permissions:
+            - path: /var/log/ec2api
+              owner: ec2api:ec2api
+              recurse: true
+        /var/lib/kolla/config_files/ec2_api_metadata.json:
+          command: /usr/bin/ec2-api-metadata
+          permissions:
+            - path: /var/log/ec2api # default log dir for metadata service as well
+              owner: ec2api:ec2api
+              recurse: true
+      docker_config:
+        # db sync runs before permissions set by kolla_config
+        step_2:
+          ec2_api_init_logs:
+            image: *ec2_api_image
+            privileged: false
+            user: root
+            volumes:
+              - /var/log/containers/ec2_api:/var/log/ec2api
+              # mount ec2_api_metadata to "ec2api-metadata" only here to fix
+              # permissions of both directories in one go
+              - /var/log/containers/ec2_api_metadata:/var/log/ec2api-metadata
+            command: ['/bin/bash', '-c', 'chown -R ec2api:ec2api /var/log/ec2api /var/log/ec2api-metadata']
+        step_3:
+          ec2_api_db_sync:
+            image: *ec2_api_image
+            net: host
+            detach: false
+            privileged: false
+            user: root
+            volumes:
+              list_concat:
+                - {get_attr: [ContainersCommon, volumes]}
+                -
+                  - /var/lib/config-data/ec2_api/etc/ec2api/:/etc/ec2api/:ro
+                  - /var/log/containers/ec2_api:/var/log/ec2api
+            command: "/usr/bin/bootstrap_host_exec ec2_api su ec2api -s /bin/bash -c '/usr/bin/ec2-api-manage db_sync'"
+        step_4:
+          ec2_api:
+            image: *ec2_api_image
+            net: host
+            privileged: false
+            restart: always
+            volumes:
+              list_concat:
+                - {get_attr: [ContainersCommon, volumes]}
+                -
+                  - /var/lib/kolla/config_files/ec2_api.json:/var/lib/kolla/config_files/config.json:ro
+                  - /var/lib/config-data/ec2_api/etc/ec2api/:/etc/ec2api/:ro
+                  - /var/log/containers/ec2_api:/var/log/ec2api
+            environment:
+              - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
+          ec2_api_metadata:
+            image: *ec2_api_image
+            net: host
+            privileged: false
+            restart: always
+            volumes:
+              list_concat:
+                - {get_attr: [ContainersCommon, volumes]}
+                -
+                  - /var/lib/kolla/config_files/ec2_api_metadata.json:/var/lib/kolla/config_files/config.json:ro
+                  - /var/lib/config-data/ec2_api/etc/ec2api/:/etc/ec2api/:ro
+                  - /var/log/containers/ec2_api_metadata:/var/log/ec2api
+            environment:
+              - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
+      host_prep_tasks:
+        - name: create persistent log directories
+          file:
+            path: /var/log/containers/{{ item }}
+            state: directory
+          with_items:
+            - ec2_api
+            - ec2_api_metadata
+      upgrade_tasks:
+        - name: Stop and disable EC2-API services
+          tags: step2
+          service: name={{ item }} state=stopped enabled=no
+          with_items:
+            - openstack-ec2-api
+            - openstack-ec2-api-metadata
index a32176a..1c8aa5b 100644 (file)
@@ -61,6 +61,7 @@ outputs:
       config_settings:
         map_merge:
           - get_attr: [IronicApiBase, role_data, config_settings]
+          - apache::default_vhost: false
       step_config: &step_config
         get_attr: [IronicApiBase, role_data, step_config]
       service_config_settings: {get_attr: [IronicApiBase, role_data, service_config_settings]}
@@ -75,7 +76,7 @@ outputs:
             - [ {get_param: DockerNamespace}, {get_param: DockerIronicConfigImage} ]
       kolla_config:
         /var/lib/kolla/config_files/ironic_api.json:
-          command: /usr/bin/ironic-api
+          command: /usr/sbin/httpd -DFOREGROUND
           permissions:
             - path: /var/log/ironic
               owner: ironic:ironic
@@ -113,7 +114,7 @@ outputs:
             start_order: 10
             image: *ironic_image
             net: host
-            privileged: false
+            user: root
             restart: always
             volumes:
               list_concat:
@@ -121,6 +122,10 @@ outputs:
                 -
                   - /var/lib/kolla/config_files/ironic_api.json:/var/lib/kolla/config_files/config.json:ro
                   - /var/lib/config-data/ironic/etc/ironic:/etc/ironic:ro
+                  - /var/lib/config-data/ironic/etc/httpd/conf/:/etc/httpd/conf/:ro
+                  - /var/lib/config-data/ironic/etc/httpd/conf.d/:/etc/httpd/conf.d/:ro
+                  - /var/lib/config-data/ironic/etc/httpd/conf.modules.d/:/etc/httpd/conf.modules.d/:ro
+                  - /var/lib/config-data/ironic/var/www/:/var/www/:ro
                   - /var/log/containers/ironic:/var/log/ironic
             environment:
               - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
index 47d0f57..62fdaaf 100644 (file)
@@ -14,7 +14,8 @@ parameters:
     type: string
   DockerManilaConfigImage:
     description: image
-    default: 'centos-binary-manila-base:latest'
+    default: 'centos-binary-manila-api:latest'
+    type: string
   EndpointMap:
     default: {}
     description: Mapping of service endpoint -> protocol. Typically set
@@ -40,6 +41,9 @@ parameters:
 
 resources:
 
+  ContainersCommon:
+    type: ./containers-common.yaml
+
   ManilaApiPuppetBase:
     type: ../../puppet/services/manila-api.yaml
     properties:
@@ -73,20 +77,28 @@ outputs:
               owner: manila:manila
               recurse: true
       docker_config:
-        step_3:
-          manila_api_db_sync:
-            user: root
+        step_2:
+          manila_init_logs:
             image: &manila_api_image
               list_join:
                 - '/'
                 - [ {get_param: DockerNamespace}, {get_param: DockerManilaApiImage} ]
+            user: root
+            volumes:
+              - /var/log/containers/manila:/var/log/manila
+            command: ['/bin/bash', '-c', 'mkdir -p /var/log/httpd; chown -R manila:manila /var/log/manila']
+        step_3:
+          manila_api_db_sync:
+            user: root
+            image: *manila_api_image
             net: host
             detach: false
             volumes:
-              - /var/lib/config-data/manila/etc/manila/:/etc/manila:ro
-              - /etc/hosts:/etc/hosts:ro
-              - /etc/localtime:/etc/localtime:ro
-              - logs:/var/log
+              list_concat:
+                - {get_attr: [ContainersCommon, volumes]}
+                -
+                  - /var/lib/config-data/manila/etc/manila/:/etc/manila/:ro
+                  - /var/log/containers/manila:/var/log/manila
             command: "/usr/bin/bootstrap_host_exec manila_api su manila -s /bin/bash -c '/usr/bin/manila-manage db sync'"
         step_4:
           manila_api:
@@ -94,11 +106,12 @@ outputs:
             net: host
             restart: always
             volumes:
-              - /var/lib/kolla/config_files/manila_api.json:/var/lib/kolla/config_files/config.json:ro
-              - /var/lib/config-data/manila/etc/manila/:/etc/manila/:ro
-              - /etc/hosts:/etc/hosts:ro
-              - /etc/localtime:/etc/localtime:ro
-              - /var/log/containers/manila:/var/log/manila
+              list_concat:
+                - {get_attr: [ContainersCommon, volumes]}
+                -
+                  - /var/lib/kolla/config_files/manila_api.json:/var/lib/kolla/config_files/config.json:ro
+                  - /var/lib/config-data/manila/etc/manila/:/etc/manila/:ro
+                  - /var/log/containers/manila:/var/log/manila
             environment:
               - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
       host_prep_tasks:
diff --git a/docker/services/pacemaker/cinder-backup.yaml b/docker/services/pacemaker/cinder-backup.yaml
new file mode 100644 (file)
index 0000000..7cac9d4
--- /dev/null
@@ -0,0 +1,152 @@
+heat_template_version: pike
+
+description: >
+  OpenStack containerized Cinder Backup service
+
+parameters:
+  DockerNamespace:
+    description: namespace
+    default: 'tripleoupstream'
+    type: string
+  DockerCinderBackupImage:
+    description: image
+    default: 'centos-binary-cinder-backup:latest'
+    type: string
+  # we configure all cinder services in the same cinder base container
+  DockerCinderConfigImage:
+    description: image
+    default: 'centos-binary-cinder-api:latest'
+    type: string
+  CinderBackupBackend:
+    default: swift
+    description: The short name of the Cinder Backup backend to use.
+    type: string
+    constraints:
+    - allowed_values: ['swift', 'ceph']
+  CinderBackupRbdPoolName:
+    default: backups
+    type: string
+  CephClientUserName:
+    default: openstack
+    type: string
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+
+
+resources:
+
+  CinderBackupBase:
+    type: ../../../puppet/services/cinder-backup.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
+      ServiceNetMap: {get_param: ServiceNetMap}
+      DefaultPasswords: {get_param: DefaultPasswords}
+      RoleName: {get_param: RoleName}
+      RoleParameters: {get_param: RoleParameters}
+      CinderBackupBackend: {get_param: CinderBackupBackend}
+      CinderBackupRbdPoolName: {get_param: CinderBackupRbdPoolName}
+      CephClientUserName: {get_param: CephClientUserName}
+
+outputs:
+  role_data:
+    description: Role data for the Cinder Backup role.
+    value:
+      service_name: {get_attr: [CinderBackupBase, role_data, service_name]}
+      config_settings:
+        map_merge:
+          - get_attr: [CinderBackupBase, role_data, config_settings]
+          - tripleo::profile::pacemaker::cinder::backup_bundle::cinder_backup_docker_image: &cinder_backup_image
+              list_join:
+                - '/'
+                - [ {get_param: DockerNamespace}, {get_param: DockerCinderBackupImage} ]
+            cinder::backup::manage_service: false
+            cinder::backup::enabled: false
+      step_config: ""
+      service_config_settings: {get_attr: [CinderBackupBase, role_data, service_config_settings]}
+      # BEGIN DOCKER SETTINGS
+      puppet_config:
+        config_volume: cinder
+        puppet_tags: cinder_config,file,concat,file_line
+        step_config: {get_attr: [CinderBackupBase, role_data, step_config]}
+        config_image:
+          list_join:
+            - '/'
+            - [ {get_param: DockerNamespace}, {get_param: DockerCinderConfigImage} ]
+      kolla_config:
+        /var/lib/kolla/config_files/cinder_backup.json:
+          command: /usr/bin/cinder-backup --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf
+          permissions:
+            - path: /var/lib/cinder
+              owner: cinder:cinder
+              recurse: true
+            - path: /var/log/cinder
+              owner: cinder:cinder
+              recurse: true
+      docker_config:
+        step_3:
+          cinder_backup_init_logs:
+            start_order: 0
+            image: *cinder_backup_image
+            privileged: false
+            user: root
+            volumes:
+              - /var/log/containers/cinder:/var/log/cinder
+            command: ['/bin/bash', '-c', 'chown -R cinder:cinder /var/log/cinder']
+        step_5:
+          cinder_backup_init_bundle:
+            start_order: 1
+            detach: false
+            net: host
+            user: root
+            command:
+              - '/bin/bash'
+              - '-c'
+              - str_replace:
+                  template:
+                    list_join:
+                      - '; '
+                      - - "cp -a /tmp/puppet-etc/* /etc/puppet; echo '{\"step\": 5}' > /etc/puppet/hieradata/docker.json"
+                        - "FACTER_uuid=docker puppet apply --tags file_line,concat,augeas,TAGS --debug -v -e 'CONFIG'"
+                  params:
+                    TAGS: 'pacemaker::resource::bundle,pacemaker::property,pacemaker::constraint::location'
+                    CONFIG: 'include ::tripleo::profile::base::pacemaker;include ::tripleo::profile::pacemaker::cinder::backup_bundle'
+            image: *cinder_backup_image
+            volumes:
+              - /etc/hosts:/etc/hosts:ro
+              - /etc/localtime:/etc/localtime:ro
+              - /etc/puppet:/tmp/puppet-etc:ro
+              - /usr/share/openstack-puppet/modules:/usr/share/openstack-puppet/modules:ro
+              - /etc/corosync/corosync.conf:/etc/corosync/corosync.conf:ro
+              - /dev/shm:/dev/shm:rw
+      host_prep_tasks:
+        - name: create persistent directories
+          file:
+            path: "{{ item }}"
+            state: directory
+          with_items:
+            - /var/lib/cinder
+            - /var/log/containers/cinder
+      upgrade_tasks:
+        - name: Stop and disable cinder_backup service
+          tags: step2
+          service: name=openstack-cinder-backup state=stopped enabled=no
diff --git a/docker/services/pacemaker/cinder-volume.yaml b/docker/services/pacemaker/cinder-volume.yaml
new file mode 100644 (file)
index 0000000..987ebaf
--- /dev/null
@@ -0,0 +1,170 @@
+heat_template_version: pike
+
+description: >
+  OpenStack containerized Cinder Volume service
+
+parameters:
+  DockerNamespace:
+    description: namespace
+    default: 'tripleoupstream'
+    type: string
+  DockerCinderVolumeImage:
+    description: image
+    default: 'centos-binary-cinder-volume:latest'
+    type: string
+  # we configure all cinder services in the same cinder base container
+  DockerCinderConfigImage:
+    description: image
+    default: 'centos-binary-cinder-api:latest'
+    type: string
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+  # custom parameters for the Cinder volume role
+  CinderEnableIscsiBackend:
+    default: true
+    description: Whether to enable or not the Iscsi backend for Cinder
+    type: boolean
+  CinderLVMLoopDeviceSize:
+    default: 10280
+    description: The size of the loopback file used by the cinder LVM driver.
+    type: number
+
+resources:
+
+  CinderBase:
+    type: ../../../puppet/services/cinder-volume.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
+      ServiceNetMap: {get_param: ServiceNetMap}
+      DefaultPasswords: {get_param: DefaultPasswords}
+      RoleName: {get_param: RoleName}
+      RoleParameters: {get_param: RoleParameters}
+
+outputs:
+  role_data:
+    description: Role data for the Cinder Volume role.
+    value:
+      service_name: {get_attr: [CinderBase, role_data, service_name]}
+      config_settings:
+        map_merge:
+          - get_attr: [CinderBase, role_data, config_settings]
+          - tripleo::profile::pacemaker::cinder::volume_bundle::cinder_volume_docker_image: &cinder_volume_image
+              list_join:
+                - '/'
+                - [ {get_param: DockerNamespace}, {get_param: DockerCinderVolumeImage} ]
+            cinder::volume::manage_service: false
+            cinder::volume::enabled: false
+            cinder::host: hostgroup
+      step_config: ""
+      service_config_settings: {get_attr: [CinderBase, role_data, service_config_settings]}
+      # BEGIN DOCKER SETTINGS
+      puppet_config:
+        config_volume: cinder
+        puppet_tags: cinder_config,file,concat,file_line
+        step_config: {get_attr: [CinderBase, role_data, step_config]}
+        config_image:
+          list_join:
+            - '/'
+            - [ {get_param: DockerNamespace}, {get_param: DockerCinderConfigImage} ]
+      kolla_config:
+        /var/lib/kolla/config_files/cinder_volume.json:
+          command: /usr/bin/cinder-volume --config-file /usr/share/cinder/cinder-dist.conf --config-file /etc/cinder/cinder.conf
+          permissions:
+            - path: /var/log/cinder
+              owner: cinder:cinder
+              recurse: true
+      docker_config:
+        step_3:
+          cinder_volume_init_logs:
+            start_order: 0
+            image: *cinder_volume_image
+            privileged: false
+            user: root
+            volumes:
+              - /var/log/containers/cinder:/var/log/cinder
+            command: ['/bin/bash', '-c', 'chown -R cinder:cinder /var/log/cinder']
+        step_5:
+          cinder_volume_init_bundle:
+            start_order: 0
+            detach: false
+            net: host
+            user: root
+            command:
+              - '/bin/bash'
+              - '-c'
+              - str_replace:
+                  template:
+                    list_join:
+                      - '; '
+                      - - "cp -a /tmp/puppet-etc/* /etc/puppet; echo '{\"step\": 5}' > /etc/puppet/hieradata/docker.json"
+                        - "FACTER_uuid=docker puppet apply --tags file_line,concat,augeas,TAGS --debug -v -e 'CONFIG'"
+                  params:
+                    TAGS: 'pacemaker::resource::bundle,pacemaker::property,pacemaker::constraint::location'
+                    CONFIG: 'include ::tripleo::profile::base::pacemaker;include ::tripleo::profile::pacemaker::cinder::volume_bundle'
+            image: *cinder_volume_image
+            volumes:
+              - /etc/hosts:/etc/hosts:ro
+              - /etc/localtime:/etc/localtime:ro
+              - /etc/puppet:/tmp/puppet-etc:ro
+              - /usr/share/openstack-puppet/modules:/usr/share/openstack-puppet/modules:ro
+              - /etc/corosync/corosync.conf:/etc/corosync/corosync.conf:ro
+              - /dev/shm:/dev/shm:rw
+      host_prep_tasks:
+        - name: create persistent directories
+          file:
+            path: "{{ item }}"
+            state: directory
+          with_items:
+            - /var/log/containers/cinder
+            - /var/lib/cinder
+        #FIXME: all of this should be conditional on the CinderEnableIscsiBackend value being set to true
+        - name: cinder create LVM volume group dd
+          command:
+            list_join:
+            - ''
+            - - 'dd if=/dev/zero of=/var/lib/cinder/cinder-volumes bs=1 count=0 seek='
+              - str_replace:
+                  template: VALUE
+                  params:
+                    VALUE: {get_param: CinderLVMLoopDeviceSize}
+              - 'M'
+          args:
+            creates: /var/lib/cinder/cinder-volumes
+        - name: cinder create LVM volume group
+          shell: |
+            if ! losetup /dev/loop2; then
+              losetup /dev/loop2 /var/lib/cinder/cinder-volumes
+            fi
+            if ! pvdisplay | grep cinder-volumes; then
+              pvcreate /dev/loop2
+            fi
+            if ! vgdisplay | grep cinder-volumes; then
+              vgcreate cinder-volumes /dev/loop2
+            fi
+          args:
+            executable: /bin/bash
+            creates: /dev/loop2
+      upgrade_tasks:
+        - name: Stop and disable cinder_volume service
+          tags: step2
+          service: name=openstack-cinder-volume state=stopped enabled=no
index e6bdf15..db6daf9 100644 (file)
@@ -104,7 +104,11 @@ outputs:
             - [ {get_param: DockerNamespace}, {get_param: DockerSensuClientImage} ]
       kolla_config:
         /var/lib/kolla/config_files/sensu-client.json:
-          command: /usr/bin/sensu-client -d /etc/sensu/conf.d/
+          command: /usr/bin/sensu-client -d /etc/sensu/conf.d/ -l /var/log/sensu/sensu-client.log
+          permissions:
+            - path: /var/log/sensu
+              owner: sensu:sensu
+              recurse: true
       docker_config:
         step_3:
           sensu_client:
@@ -123,8 +127,14 @@ outputs:
                   - /var/run/docker.sock:/var/run/docker.sock:rw
                   - /var/lib/kolla/config_files/sensu-client.json:/var/lib/kolla/config_files/config.json:ro
                   - /var/lib/config-data/sensu/etc/sensu/:/etc/sensu/:ro
+                  - /var/log/containers/sensu:/var/log/sensu:rw
             environment:
               - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
+      host_prep_tasks:
+        - name: create persistent logs directory
+          file:
+            path: /var/log/containers/sensu
+            state: directory
       upgrade_tasks:
         - name: Stop and disable sensu-client service
           tags: step2
diff --git a/docker/services/services.yaml b/docker/services/services.yaml
deleted file mode 100644 (file)
index 2ad3b63..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-heat_template_version: pike
-
-description: >
-  Utility stack to convert an array of services into a set of combined
-  role configs.
-
-parameters:
-  Services:
-    default: []
-    description: |
-        List nested stack service templates.
-    type: comma_delimited_list
-  ServiceNetMap:
-    default: {}
-    description: Mapping of service_name -> network name. Typically set
-                 via parameter_defaults in the resource registry.  This
-                 mapping overrides those in ServiceNetMapDefaults.
-    type: json
-  EndpointMap:
-    default: {}
-    description: Mapping of service endpoint -> protocol. Typically set
-                 via parameter_defaults in the resource registry.
-    type: json
-  DefaultPasswords:
-    default: {}
-    description: Mapping of service -> default password. Used to help
-                 pass top level passwords managed by Heat into services.
-    type: json
-  RoleName:
-    default: ''
-    description: Role name on which the service is applied
-    type: string
-  RoleParameters:
-    default: {}
-    description: Parameters specific to the role
-    type: json
-
-resources:
-
-  PuppetServices:
-    type: ../../puppet/services/services.yaml
-    properties:
-      Services: {get_param: Services}
-      ServiceNetMap: {get_param: ServiceNetMap}
-      EndpointMap: {get_param: EndpointMap}
-      DefaultPasswords: {get_param: DefaultPasswords}
-      RoleName: {get_param: RoleName}
-      RoleParameters: {get_param: RoleParameters}
-
-  ServiceChain:
-    type: OS::Heat::ResourceChain
-    properties:
-      resources: {get_param: Services}
-      concurrent: true
-      resource_properties:
-        ServiceNetMap: {get_param: ServiceNetMap}
-        EndpointMap: {get_param: EndpointMap}
-        DefaultPasswords: {get_param: DefaultPasswords}
-        RoleName: {get_param: RoleName}
-        RoleParameters: {get_param: RoleParameters}
-
-outputs:
-  role_data:
-    description: Combined Role data for this set of services.
-    value:
-      service_names:
-        {get_attr: [PuppetServices, role_data, service_names]}
-      monitoring_subscriptions:
-        {get_attr: [PuppetServices, role_data, monitoring_subscriptions]}
-      logging_sources:
-        {get_attr: [PuppetServices, role_data, logging_sources]}
-      logging_groups:
-        {get_attr: [PuppetServices, role_data, logging_groups]}
-      service_config_settings:
-        {get_attr: [PuppetServices, role_data, service_config_settings]}
-      config_settings:
-        {get_attr: [PuppetServices, role_data, config_settings]}
-      global_config_settings:
-        {get_attr: [PuppetServices, role_data, global_config_settings]}
-      step_config:
-        {get_attr: [ServiceChain, role_data, step_config]}
-      puppet_config: {get_attr: [ServiceChain, role_data, puppet_config]}
-      kolla_config:
-        map_merge: {get_attr: [ServiceChain, role_data, kolla_config]}
-      docker_config:
-        {get_attr: [ServiceChain, role_data, docker_config]}
-      docker_puppet_tasks:
-        {get_attr: [ServiceChain, role_data, docker_puppet_tasks]}
-      host_prep_tasks:
-        yaql:
-          # Note we use distinct() here to filter any identical tasks
-          expression: $.data.where($ != null).select($.get('host_prep_tasks')).where($ != null).flatten().distinct()
-          data: {get_attr: [ServiceChain, role_data]}
-      upgrade_tasks:
-        yaql:
-          # Note we use distinct() here to filter any identical tasks, e.g yum update for all services
-          expression: $.data.where($ != null).select($.get('upgrade_tasks')).where($ != null).flatten().distinct()
-          data: {get_attr: [ServiceChain, role_data]}
-      upgrade_batch_tasks:
-        yaql:
-          # Note we use distinct() here to filter any identical tasks, e.g yum update for all services
-          expression: $.data.where($ != null).select($.get('upgrade_batch_tasks')).where($ != null).flatten().distinct()
-          data: {get_attr: [ServiceChain, role_data]}
-      service_metadata_settings:
-        get_attr: [PuppetServices, role_data, service_metadata_settings]
index dfd1589..83ecbbe 100644 (file)
@@ -1,3 +1,7 @@
+# *************************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/storage/cinder-netapp-config.yaml
+# instead.
+# *************************************************************************************
 # A Heat environment file which can be used to enable a
 # a Cinder NetApp backend, configured via puppet
 resource_registry:
index 2740664..3ca0469 100644 (file)
@@ -35,13 +35,11 @@ resource_registry:
   OS::TripleO::PostDeploySteps: ../docker/post.yaml
   OS::TripleO::PostUpgradeSteps: ../docker/post-upgrade.yaml
 
-  OS::TripleO::Services: ../docker/services/services.yaml
-
 parameter_defaults:
-  # Defaults to 'tripleoupstream'.  Specify a local docker registry
-  # Example: 192.168.24.1:8787/tripleoupstream
-  DockerNamespace: tripleoupstream
-  DockerNamespaceIsRegistry: false
+  # To specify a local docker registry, enable these
+  # where 192.168.24.1 is the host running docker-distribution
+  #DockerNamespace: 192.168.24.1:8787/tripleoupstream
+  #DockerNamespaceIsRegistry: true
 
   ComputeServices:
     - OS::TripleO::Services::CACerts
index 5de0c8d..03713e8 100644 (file)
@@ -2,10 +2,11 @@ resource_registry:
   # This can be used when you don't want to run puppet on the host,
   # e.g atomic, but it has been replaced with OS::TripleO::Services::Docker
   # OS::TripleO::NodeUserData: ../docker/firstboot/setup_docker_host.yaml
-  OS::TripleO::Services::Docker: ../puppet/services/docker.yaml
   # The compute node still needs extra initialization steps
   OS::TripleO::Compute::NodeUserData: ../docker/firstboot/setup_docker_host.yaml
 
+  OS::TripleO::Services::Docker: ../puppet/services/docker.yaml
+
   #NOTE (dprince) add roles to be docker enabled as we support them
   OS::TripleO::Services::NovaLibvirt: ../docker/services/nova-libvirt.yaml
   OS::TripleO::Services::ComputeNeutronOvsAgent: ../docker/services/neutron-ovs-agent.yaml
@@ -29,6 +30,7 @@ resource_registry:
   OS::TripleO::Services::NeutronDhcpAgent: ../docker/services/neutron-dhcp.yaml
   OS::TripleO::Services::NeutronL3Agent: ../docker/services/neutron-l3.yaml
   OS::TripleO::Services::MySQL: ../docker/services/database/mysql.yaml
+  OS::TripleO::Services::MySQLClient: ../docker/services/database/mysql-client.yaml
   OS::TripleO::Services::RabbitMQ: ../docker/services/rabbitmq.yaml
   OS::TripleO::Services::MongoDb: ../docker/services/database/mongodb.yaml
   OS::TripleO::Services::Redis: ../docker/services/database/redis.yaml
@@ -51,16 +53,15 @@ resource_registry:
   OS::TripleO::Services::Horizon: ../docker/services/horizon.yaml
   OS::TripleO::Services::Iscsid: ../docker/services/iscsid.yaml
   OS::TripleO::Services::Multipathd: ../docker/services/multipathd.yaml
-  OS::TripleO::Services::CinderApi: ../docker/services/cinder-api.yaml
-  OS::TripleO::Services::CinderScheduler: ../docker/services/cinder-scheduler.yaml
-  OS::TripleO::Services::CinderBackup: ../docker/services/cinder-backup.yaml
-  OS::TripleO::Services::CinderVolume: ../docker/services/cinder-volume.yaml
+  # FIXME: Had to remove these to unblock containers CI. They should be put back when fixed.
+  # OS::TripleO::Services::CinderApi: ../docker/services/cinder-api.yaml
+  # OS::TripleO::Services::CinderScheduler: ../docker/services/cinder-scheduler.yaml
+  # OS::TripleO::Services::CinderBackup: ../docker/services/cinder-backup.yaml
+  # OS::TripleO::Services::CinderVolume: ../docker/services/cinder-volume.yaml
 
   OS::TripleO::PostDeploySteps: ../docker/post.yaml
   OS::TripleO::PostUpgradeSteps: ../docker/post-upgrade.yaml
 
-  OS::TripleO::Services: ../docker/services/services.yaml
-
 parameter_defaults:
   # To specify a local docker registry, enable these
   # where 192.168.24.1 is the host running docker-distribution
index 481459c..175e1fd 100644 (file)
@@ -1,3 +1,6 @@
+# ********************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/ssl/enable-tls.yaml instead.
+# ********************************************************************************
 # Use this environment to pass in certificates for SSL deployments.
 # For these values to take effect, one of the tls-endpoints-*.yaml environments
 # must also be used.
index b4908c1..95d2de9 100644 (file)
@@ -1,3 +1,7 @@
+# **************************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/ssl/inject-trust-anchor-hiera.yaml
+# instead.
+# **************************************************************************************
 parameter_defaults:
   CAMap:
     first-ca-name:
index 3ecb0d2..1b0f706 100644 (file)
@@ -1,3 +1,7 @@
+# ********************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/ssl/inject-trust-anchor.yaml
+# instead.
+# ********************************************************************************
 parameter_defaults:
   SSLRootCertificate: |
     The contents of your root CA certificate go here
diff --git a/environments/networking/neutron-midonet.yaml b/environments/networking/neutron-midonet.yaml
new file mode 100644 (file)
index 0000000..ad8da8c
--- /dev/null
@@ -0,0 +1,66 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable the Neutron MidoNet Services
+# description: |
+#   A Heat environment that can be used to deploy MidoNet Services
+parameter_defaults:
+  # Native Transport Port
+  # Type: string
+  CassandraClientPort: 9042
+
+  # The port for the Thrift RPC service, which is used for client connections
+  # Type: string
+  CassandraClientPortThrift: 9160
+
+  # The SSL port for encrypted communication. Unused unless enabled in encryption_options
+  # Type: string
+  CassandraSslStoragePort: 7001
+
+  # The Cassandra port for inter-node communication
+  # Type: string
+  CassandraStoragePort: 7000
+
+  # Name of the tunnel zone used to tunnel packages
+  # Type: string
+  TunnelZoneName: tunnelzone_tripleo
+
+  # Type of the tunnels on the overlay. Choose between `gre` and `vxlan`
+  # Type: string
+  TunnelZoneType: vxlan
+
+  # ******************************************************
+  # Static parameters - these are values that must be
+  # included in the environment but should not be changed.
+  # ******************************************************
+  # Whether enable Cassandra cluster on Controller
+  # Type: boolean
+  EnableCassandraOnController: True
+
+  # Whether enable Zookeeper cluster on Controller
+  # Type: boolean
+  EnableZookeeperOnController: True
+
+  # The core plugin for Neutron. The value should be the entrypoint to be loaded
+  # from neutron.core_plugins namespace.
+  # Type: string
+  NeutronCorePlugin: midonet.neutron.plugin_v1.MidonetPluginV2
+
+  # If True, DHCP provide metadata route to VM.
+  # Type: boolean
+  NeutronEnableIsolatedMetadata: True
+
+  # *********************
+  # End static parameters
+  # *********************
+resource_registry:
+  OS::TripleO::AllNodesExtraConfig: ../../puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml
+  OS::TripleO::Controller::Net::SoftwareConfig: ../../net-config-linux-bridge.yaml
+  OS::TripleO::Services::ComputeNeutronCorePlugin: ../../puppet/services/neutron-compute-plugin-midonet.yaml
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronCorePlugin: OS::TripleO::Services::NeutronCorePluginMidonet
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
index c120d0b..64cea2a 100644 (file)
@@ -1,3 +1,7 @@
+# ******************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/networking/neutron-midonet
+# instead.
+# ******************************************************************************
 # A Heat environment that can be used to deploy MidoNet Services
 resource_registry:
   OS::TripleO::AllNodesExtraConfig: ../puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml
diff --git a/environments/neutron-ml2-ovn-ha.yaml b/environments/neutron-ml2-ovn-ha.yaml
new file mode 100644 (file)
index 0000000..c592d57
--- /dev/null
@@ -0,0 +1,24 @@
+# A Heat environment file which can be used to enable OVN
+# extensions, configured via puppet
+resource_registry:
+  OS::TripleO::Services::NeutronCorePlugin: OS::TripleO::Services::NeutronCorePluginML2OVN
+  OS::TripleO::Services::ComputeNeutronCorePlugin: ../puppet/services/neutron-compute-plugin-ovn.yaml
+  OS::TripleO::Services::OVNDBs: ../puppet/services/pacemaker/ovn-dbs.yaml
+# Disabling Neutron services that overlap with OVN
+  OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+  OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronMetadataAgent: OS::Heat::None
+  OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None
+  OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+
+parameter_defaults:
+  NeutronMechanismDrivers: ovn
+  OVNVifType: ovs
+  OVNNeutronSyncMode: log
+  OVNQosDriver: ovn-qos
+  OVNTunnelEncapType: geneve
+  NeutronEnableDHCPAgent: false
+  NeutronTypeDrivers: 'geneve,vxlan,vlan,flat'
+  NeutronNetworkType: 'geneve'
+  NeutronServicePlugins: 'qos,ovn-router'
+  NeutronVniRanges: ['1:65536', ]
index 5f8b02a..2f577c2 100644 (file)
@@ -1,3 +1,7 @@
+# ******************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/storage/ceph-external.yaml
+# instead.
+# ******************************************************************************
 # A Heat environment file which can be used to enable the
 # use of an externally managed Ceph cluster.
 resource_registry:
diff --git a/environments/services-docker/ec2-api.yaml b/environments/services-docker/ec2-api.yaml
new file mode 100644 (file)
index 0000000..24cbb03
--- /dev/null
@@ -0,0 +1,2 @@
+resource_registry:
+  OS::TripleO::Services::Ec2Api: ../../docker/services/ec2-api.yaml
index b131738..b81b026 100644 (file)
@@ -1,5 +1,6 @@
 resource_registry:
   OS::TripleO::Services::IronicApi: ../../puppet/services/ironic-api.yaml
   OS::TripleO::Services::IronicConductor: ../../puppet/services/ironic-conductor.yaml
-  OS::TripleO::Services::IronicPxe: ../../puppet/services/ironic-pxe.yaml
   OS::TripleO::Services::NovaIronic: ../../puppet/services/nova-ironic.yaml
+parameter_defaults:
+  NovaSchedulerDiscoverHostsInCellsInterval: 15
diff --git a/environments/ssl/enable-tls.yaml b/environments/ssl/enable-tls.yaml
new file mode 100644 (file)
index 0000000..c8ed2bd
--- /dev/null
@@ -0,0 +1,41 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable SSL on OpenStack Public Endpoints
+# description: |
+#   Use this environment to pass in certificates for SSL deployments.
+#   For these values to take effect, one of the tls-endpoints-*.yaml environments
+#   must also be used.
+parameter_defaults:
+  # The content of the SSL certificate (without Key) in PEM format.
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  SSLCertificate: |
+    The contents of your certificate go here
+
+  # The content of an SSL intermediate CA certificate in PEM format.
+  # Type: string
+  SSLIntermediateCertificate: ''
+
+  # The content of the SSL Key in PEM format.
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  SSLKey: |
+    The contents of the private key go here
+
+  # ******************************************************
+  # Static parameters - these are values that must be
+  # included in the environment but should not be changed.
+  # ******************************************************
+  # The filepath of the certificate as it will be stored in the controller.
+  # Type: string
+  DeployedSSLCertificatePath: /etc/pki/tls/private/overcloud_endpoint.pem
+
+  # *********************
+  # End static parameters
+  # *********************
+resource_registry:
+  OS::TripleO::NodeTLSData: ../../puppet/extraconfig/tls/tls-cert-inject.yaml
diff --git a/environments/ssl/inject-trust-anchor-hiera.yaml b/environments/ssl/inject-trust-anchor-hiera.yaml
new file mode 100644 (file)
index 0000000..db3f267
--- /dev/null
@@ -0,0 +1,22 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Inject SSL Trust Anchor on Overcloud Nodes
+# description: |
+#   When using an SSL certificate signed by a CA that is not in the default
+#   list of CAs, this environment allows adding a custom CA certificate to
+#   the overcloud nodes.
+parameter_defaults:
+  # Map containing the CA certs and information needed for deploying them.
+  # Type: json
+  CAMap:
+    first-ca-name:
+      content: |
+        The content of the CA cert goes here
+    second-ca-name:
+      content: |
+        The content of the CA cert goes here
+
diff --git a/environments/ssl/inject-trust-anchor.yaml b/environments/ssl/inject-trust-anchor.yaml
new file mode 100644 (file)
index 0000000..521a419
--- /dev/null
@@ -0,0 +1,20 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Inject SSL Trust Anchor on Overcloud Nodes
+# description: |
+#   When using an SSL certificate signed by a CA that is not in the default
+#   list of CAs, this environment allows adding a custom CA certificate to
+#   the overcloud nodes.
+parameter_defaults:
+  # The content of a CA's SSL certificate file in PEM format. This is evaluated on the client side.
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  SSLRootCertificate: |
+    The contents of your certificate go here
+
+resource_registry:
+  OS::TripleO::NodeTLSCAData: ../../puppet/extraconfig/tls/ca-inject.yaml
diff --git a/environments/ssl/tls-endpoints-public-dns.yaml b/environments/ssl/tls-endpoints-public-dns.yaml
new file mode 100644 (file)
index 0000000..216afec
--- /dev/null
@@ -0,0 +1,131 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Deploy Public SSL Endpoints as DNS Names
+# description: |
+#   Use this environment when deploying an SSL-enabled overcloud where the public
+#   endpoint is a DNS name.
+parameter_defaults:
+  # Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry.
+  # Type: json
+  EndpointMap:
+    AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhPublic: {protocol: 'https', port: '13042', host: 'CLOUDNAME'}
+    BarbicanAdmin: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+    BarbicanInternal: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+    BarbicanPublic: {protocol: 'https', port: '13311', host: 'CLOUDNAME'}
+    CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerPublic: {protocol: 'https', port: '13777', host: 'CLOUDNAME'}
+    CephRgwAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    CephRgwInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    CephRgwPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+    CinderAdmin: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+    CinderInternal: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+    CinderPublic: {protocol: 'https', port: '13776', host: 'CLOUDNAME'}
+    CongressAdmin: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+    CongressInternal: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+    CongressPublic: {protocol: 'https', port: '13789', host: 'CLOUDNAME'}
+    ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    Ec2ApiAdmin: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+    Ec2ApiInternal: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+    Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'CLOUDNAME'}
+    GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+    GnocchiAdmin: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiInternal: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiPublic: {protocol: 'https', port: '13041', host: 'CLOUDNAME'}
+    HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
+    HeatCfnAdmin: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+    HeatCfnInternal: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+    HeatCfnPublic: {protocol: 'https', port: '13005', host: 'CLOUDNAME'}
+    HorizonPublic: {protocol: 'https', port: '443', host: 'CLOUDNAME'}
+    IronicAdmin: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+    IronicInternal: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+    IronicPublic: {protocol: 'https', port: '13385', host: 'CLOUDNAME'}
+    IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+    IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+    IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'CLOUDNAME'}
+    KeystoneAdmin: {protocol: 'http', port: '35357', host: 'IP_ADDRESS'}
+    KeystoneInternal: {protocol: 'http', port: '5000', host: 'IP_ADDRESS'}
+    KeystonePublic: {protocol: 'https', port: '13000', host: 'CLOUDNAME'}
+    ManilaAdmin: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+    ManilaInternal: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+    ManilaPublic: {protocol: 'https', port: '13786', host: 'CLOUDNAME'}
+    MistralAdmin: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+    MistralInternal: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+    MistralPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+    MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'IP_ADDRESS'}
+    NeutronAdmin: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+    NeutronInternal: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+    NeutronPublic: {protocol: 'https', port: '13696', host: 'CLOUDNAME'}
+    NovaAdmin: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+    NovaInternal: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+    NovaPublic: {protocol: 'https', port: '13774', host: 'CLOUDNAME'}
+    NovaPlacementAdmin: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+    NovaPlacementInternal: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+    NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'CLOUDNAME'}
+    NovaVNCProxyAdmin: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+    NovaVNCProxyInternal: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+    NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'CLOUDNAME'}
+    OctaviaAdmin: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaInternal: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaPublic: {protocol: 'https', port: '13876', host: 'CLOUDNAME'}
+    PankoAdmin: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+    PankoInternal: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+    PankoPublic: {protocol: 'https', port: '13779', host: 'CLOUDNAME'}
+    SaharaAdmin: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+    SaharaInternal: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+    SaharaPublic: {protocol: 'https', port: '13386', host: 'CLOUDNAME'}
+    SwiftAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    SwiftInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    SwiftPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+    TackerAdmin: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+    TackerInternal: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+    TackerPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+    ZaqarAdmin: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+    ZaqarInternal: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+    ZaqarPublic: {protocol: 'https', port: '13888', host: 'CLOUDNAME'}
+    ZaqarWebSocketAdmin: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+    ZaqarWebSocketInternal: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+    ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+
diff --git a/environments/ssl/tls-endpoints-public-ip.yaml b/environments/ssl/tls-endpoints-public-ip.yaml
new file mode 100644 (file)
index 0000000..d216ab7
--- /dev/null
@@ -0,0 +1,131 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Deploy Public SSL Endpoints as IP Addresses
+# description: |
+#   Use this environment when deploying an SSL-enabled overcloud where the public
+#   endpoint is an IP address.
+parameter_defaults:
+  # Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry.
+  # Type: json
+  EndpointMap:
+    AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+    AodhPublic: {protocol: 'https', port: '13042', host: 'IP_ADDRESS'}
+    BarbicanAdmin: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+    BarbicanInternal: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+    BarbicanPublic: {protocol: 'https', port: '13311', host: 'IP_ADDRESS'}
+    CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerPublic: {protocol: 'https', port: '13777', host: 'IP_ADDRESS'}
+    CephRgwAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    CephRgwInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    CephRgwPublic: {protocol: 'https', port: '13808', host: 'IP_ADDRESS'}
+    CinderAdmin: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+    CinderInternal: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+    CinderPublic: {protocol: 'https', port: '13776', host: 'IP_ADDRESS'}
+    CongressAdmin: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+    CongressInternal: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+    CongressPublic: {protocol: 'https', port: '13789', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    Ec2ApiAdmin: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+    Ec2ApiInternal: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+    Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'IP_ADDRESS'}
+    GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlancePublic: {protocol: 'https', port: '13292', host: 'IP_ADDRESS'}
+    GnocchiAdmin: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiInternal: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+    GnocchiPublic: {protocol: 'https', port: '13041', host: 'IP_ADDRESS'}
+    HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatPublic: {protocol: 'https', port: '13004', host: 'IP_ADDRESS'}
+    HeatCfnAdmin: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+    HeatCfnInternal: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+    HeatCfnPublic: {protocol: 'https', port: '13005', host: 'IP_ADDRESS'}
+    HorizonPublic: {protocol: 'https', port: '443', host: 'IP_ADDRESS'}
+    IronicAdmin: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+    IronicInternal: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+    IronicPublic: {protocol: 'https', port: '13385', host: 'IP_ADDRESS'}
+    IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+    IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+    IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'IP_ADDRESS'}
+    KeystoneAdmin: {protocol: 'http', port: '35357', host: 'IP_ADDRESS'}
+    KeystoneInternal: {protocol: 'http', port: '5000', host: 'IP_ADDRESS'}
+    KeystonePublic: {protocol: 'https', port: '13000', host: 'IP_ADDRESS'}
+    ManilaAdmin: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+    ManilaInternal: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+    ManilaPublic: {protocol: 'https', port: '13786', host: 'IP_ADDRESS'}
+    MistralAdmin: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+    MistralInternal: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+    MistralPublic: {protocol: 'https', port: '13989', host: 'IP_ADDRESS'}
+    MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'IP_ADDRESS'}
+    NeutronAdmin: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+    NeutronInternal: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+    NeutronPublic: {protocol: 'https', port: '13696', host: 'IP_ADDRESS'}
+    NovaAdmin: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+    NovaInternal: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+    NovaPublic: {protocol: 'https', port: '13774', host: 'IP_ADDRESS'}
+    NovaPlacementAdmin: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+    NovaPlacementInternal: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+    NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'IP_ADDRESS'}
+    NovaVNCProxyAdmin: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+    NovaVNCProxyInternal: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+    NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'IP_ADDRESS'}
+    OctaviaAdmin: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaInternal: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaPublic: {protocol: 'https', port: '13876', host: 'IP_ADDRESS'}
+    PankoAdmin: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+    PankoInternal: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+    PankoPublic: {protocol: 'https', port: '13779', host: 'IP_ADDRESS'}
+    SaharaAdmin: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+    SaharaInternal: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+    SaharaPublic: {protocol: 'https', port: '13386', host: 'IP_ADDRESS'}
+    SwiftAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    SwiftInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    SwiftPublic: {protocol: 'https', port: '13808', host: 'IP_ADDRESS'}
+    TackerAdmin: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+    TackerInternal: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+    TackerPublic: {protocol: 'https', port: '13989', host: 'IP_ADDRESS'}
+    ZaqarAdmin: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+    ZaqarInternal: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+    ZaqarPublic: {protocol: 'https', port: '13888', host: 'IP_ADDRESS'}
+    ZaqarWebSocketAdmin: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+    ZaqarWebSocketInternal: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+    ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'IP_ADDRESS'}
+
diff --git a/environments/ssl/tls-everywhere-endpoints-dns.yaml b/environments/ssl/tls-everywhere-endpoints-dns.yaml
new file mode 100644 (file)
index 0000000..63157dd
--- /dev/null
@@ -0,0 +1,131 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Deploy All SSL Endpoints as DNS Names
+# description: |
+#   Use this environment when deploying an overcloud where all the endpoints are
+#   DNS names and there's TLS in all endpoint types.
+parameter_defaults:
+  # Mapping of service endpoint -> protocol. Typically set via parameter_defaults in the resource registry.
+  # Type: json
+  EndpointMap:
+    AodhAdmin: {protocol: 'https', port: '8042', host: 'CLOUDNAME'}
+    AodhInternal: {protocol: 'https', port: '8042', host: 'CLOUDNAME'}
+    AodhPublic: {protocol: 'https', port: '13042', host: 'CLOUDNAME'}
+    BarbicanAdmin: {protocol: 'https', port: '9311', host: 'CLOUDNAME'}
+    BarbicanInternal: {protocol: 'https', port: '9311', host: 'CLOUDNAME'}
+    BarbicanPublic: {protocol: 'https', port: '13311', host: 'CLOUDNAME'}
+    CeilometerAdmin: {protocol: 'https', port: '8777', host: 'CLOUDNAME'}
+    CeilometerInternal: {protocol: 'https', port: '8777', host: 'CLOUDNAME'}
+    CeilometerPublic: {protocol: 'https', port: '13777', host: 'CLOUDNAME'}
+    CephRgwAdmin: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+    CephRgwInternal: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+    CephRgwPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+    CinderAdmin: {protocol: 'https', port: '8776', host: 'CLOUDNAME'}
+    CinderInternal: {protocol: 'https', port: '8776', host: 'CLOUDNAME'}
+    CinderPublic: {protocol: 'https', port: '13776', host: 'CLOUDNAME'}
+    CongressAdmin: {protocol: 'https', port: '1789', host: 'CLOUDNAME'}
+    CongressInternal: {protocol: 'https', port: '1789', host: 'CLOUDNAME'}
+    CongressPublic: {protocol: 'https', port: '13789', host: 'CLOUDNAME'}
+    ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+    host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+    ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+    ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+    Ec2ApiAdmin: {protocol: 'https', port: '8788', host: 'CLOUDNAME'}
+    Ec2ApiInternal: {protocol: 'https', port: '8788', host: 'CLOUDNAME'}
+    Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'CLOUDNAME'}
+    GlanceAdmin: {protocol: 'https', port: '9292', host: 'CLOUDNAME'}
+    GlanceInternal: {protocol: 'https', port: '9292', host: 'CLOUDNAME'}
+    GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+    GnocchiAdmin: {protocol: 'https', port: '8041', host: 'CLOUDNAME'}
+    GnocchiInternal: {protocol: 'https', port: '8041', host: 'CLOUDNAME'}
+    GnocchiPublic: {protocol: 'https', port: '13041', host: 'CLOUDNAME'}
+    HeatAdmin: {protocol: 'https', port: '8004', host: 'CLOUDNAME'}
+    HeatInternal: {protocol: 'https', port: '8004', host: 'CLOUDNAME'}
+    HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
+    HeatCfnAdmin: {protocol: 'https', port: '8000', host: 'CLOUDNAME'}
+    HeatCfnInternal: {protocol: 'https', port: '8000', host: 'CLOUDNAME'}
+    HeatCfnPublic: {protocol: 'https', port: '13005', host: 'CLOUDNAME'}
+    HorizonPublic: {protocol: 'https', port: '443', host: 'CLOUDNAME'}
+    IronicAdmin: {protocol: 'https', port: '6385', host: 'CLOUDNAME'}
+    IronicInternal: {protocol: 'https', port: '6385', host: 'CLOUDNAME'}
+    IronicPublic: {protocol: 'https', port: '13385', host: 'CLOUDNAME'}
+    IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'CLOUDNAME'}
+    IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'CLOUDNAME'}
+    IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'CLOUDNAME'}
+    KeystoneAdmin: {protocol: 'https', port: '35357', host: 'CLOUDNAME'}
+    KeystoneInternal: {protocol: 'https', port: '5000', host: 'CLOUDNAME'}
+    KeystonePublic: {protocol: 'https', port: '13000', host: 'CLOUDNAME'}
+    ManilaAdmin: {protocol: 'https', port: '8786', host: 'CLOUDNAME'}
+    ManilaInternal: {protocol: 'https', port: '8786', host: 'CLOUDNAME'}
+    ManilaPublic: {protocol: 'https', port: '13786', host: 'CLOUDNAME'}
+    MistralAdmin: {protocol: 'https', port: '8989', host: 'CLOUDNAME'}
+    MistralInternal: {protocol: 'https', port: '8989', host: 'CLOUDNAME'}
+    MistralPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+    MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'CLOUDNAME'}
+    NeutronAdmin: {protocol: 'https', port: '9696', host: 'CLOUDNAME'}
+    NeutronInternal: {protocol: 'https', port: '9696', host: 'CLOUDNAME'}
+    NeutronPublic: {protocol: 'https', port: '13696', host: 'CLOUDNAME'}
+    NovaAdmin: {protocol: 'https', port: '8774', host: 'CLOUDNAME'}
+    NovaInternal: {protocol: 'https', port: '8774', host: 'CLOUDNAME'}
+    NovaPublic: {protocol: 'https', port: '13774', host: 'CLOUDNAME'}
+    NovaPlacementAdmin: {protocol: 'https', port: '8778', host: 'CLOUDNAME'}
+    NovaPlacementInternal: {protocol: 'https', port: '8778', host: 'CLOUDNAME'}
+    NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'CLOUDNAME'}
+    NovaVNCProxyAdmin: {protocol: 'https', port: '6080', host: 'CLOUDNAME'}
+    NovaVNCProxyInternal: {protocol: 'https', port: '6080', host: 'CLOUDNAME'}
+    NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'CLOUDNAME'}
+    OctaviaAdmin: {protocol: 'https', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaInternal: {protocol: 'https', port: '9876', host: 'IP_ADDRESS'}
+    OctaviaPublic: {protocol: 'https', port: '13876', host: 'CLOUDNAME'}
+    PankoAdmin: {protocol: 'https', port: '8779', host: 'CLOUDNAME'}
+    PankoInternal: {protocol: 'https', port: '8779', host: 'CLOUDNAME'}
+    PankoPublic: {protocol: 'https', port: '13779', host: 'CLOUDNAME'}
+    SaharaAdmin: {protocol: 'https', port: '8386', host: 'CLOUDNAME'}
+    SaharaInternal: {protocol: 'https', port: '8386', host: 'CLOUDNAME'}
+    SaharaPublic: {protocol: 'https', port: '13386', host: 'CLOUDNAME'}
+    SwiftAdmin: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+    SwiftInternal: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+    SwiftPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+    TackerAdmin: {protocol: 'https', port: '9890', host: 'CLOUDNAME'}
+    TackerInternal: {protocol: 'https', port: '9890', host: 'CLOUDNAME'}
+    TackerPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+    ZaqarAdmin: {protocol: 'https', port: '8888', host: 'CLOUDNAME'}
+    ZaqarInternal: {protocol: 'https', port: '8888', host: 'CLOUDNAME'}
+    ZaqarPublic: {protocol: 'https', port: '13888', host: 'CLOUDNAME'}
+    ZaqarWebSocketAdmin: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+    ZaqarWebSocketInternal: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+    ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+
diff --git a/environments/storage/cinder-netapp-config.yaml b/environments/storage/cinder-netapp-config.yaml
new file mode 100644 (file)
index 0000000..4cdba09
--- /dev/null
@@ -0,0 +1,119 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable the Cinder NetApp Backend
+# description: |
+#   A Heat environment file which can be used to enable a
+#   a Cinder NetApp backend, configured via puppet
+parameter_defaults:
+  # 
+  # Type: string
+  CinderNetappBackendName: tripleo_netapp
+
+  # 
+  # Type: string
+  CinderNetappControllerIps: ''
+
+  # 
+  # Type: string
+  CinderNetappCopyOffloadToolPath: ''
+
+  # 
+  # Type: string
+  CinderNetappEseriesHostType: linux_dm_mp
+
+  # 
+  # Type: string
+  CinderNetappHostType: ''
+
+  # 
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  CinderNetappLogin: <None>
+
+  # 
+  # Type: string
+  CinderNetappNfsMountOptions: ''
+
+  # 
+  # Type: string
+  CinderNetappNfsShares: ''
+
+  # 
+  # Type: string
+  CinderNetappNfsSharesConfig: /etc/cinder/shares.conf
+
+  # 
+  # Type: string
+  CinderNetappPartnerBackendName: ''
+
+  # 
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  CinderNetappPassword: <None>
+
+  # 
+  # Type: string
+  CinderNetappSaPassword: ''
+
+  # 
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  CinderNetappServerHostname: <None>
+
+  # 
+  # Type: string
+  CinderNetappServerPort: 80
+
+  # 
+  # Type: string
+  CinderNetappSizeMultiplier: 1.2
+
+  # 
+  # Type: string
+  CinderNetappStorageFamily: ontap_cluster
+
+  # 
+  # Type: string
+  CinderNetappStoragePools: ''
+
+  # 
+  # Type: string
+  CinderNetappStorageProtocol: nfs
+
+  # 
+  # Type: string
+  CinderNetappTransportType: http
+
+  # 
+  # Type: string
+  CinderNetappVfiler: ''
+
+  # 
+  # Type: string
+  CinderNetappVolumeList: ''
+
+  # 
+  # Type: string
+  CinderNetappVserver: ''
+
+  # 
+  # Type: string
+  CinderNetappWebservicePath: /devmgr/v2
+
+  # ******************************************************
+  # Static parameters - these are values that must be
+  # included in the environment but should not be changed.
+  # ******************************************************
+  # 
+  # Type: boolean
+  CinderEnableNetappBackend: True
+
+  # *********************
+  # End static parameters
+  # *********************
+resource_registry:
+  OS::TripleO::ControllerExtraConfigPre: ../../puppet/extraconfig/pre_deploy/controller/cinder-netapp.yaml
diff --git a/environments/storage/cinder-nfs.yaml b/environments/storage/cinder-nfs.yaml
new file mode 100644 (file)
index 0000000..2de3e78
--- /dev/null
@@ -0,0 +1,27 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable Cinder NFS Backend
+# description: |
+#   Configure and include this environment to enable the use of an NFS
+#   share as the backend for Cinder.
+parameter_defaults:
+  # Whether to enable or not the Iscsi backend for Cinder
+  # Type: boolean
+  CinderEnableIscsiBackend: False
+
+  # Whether to enable or not the NFS backend for Cinder
+  # Type: boolean
+  CinderEnableNfsBackend: True
+
+  # Mount options for NFS mounts used by Cinder NFS backend. Effective when CinderEnableNfsBackend is true.
+  # Type: string
+  CinderNfsMountOptions: ''
+
+  # NFS servers used by Cinder NFS backend. Effective when CinderEnableNfsBackend is true.
+  # Type: comma_delimited_list
+  CinderNfsServers: 192.168.122.1:/export/cinder
+
diff --git a/environments/storage/enable-ceph.yaml b/environments/storage/enable-ceph.yaml
new file mode 100644 (file)
index 0000000..c629f74
--- /dev/null
@@ -0,0 +1,35 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable Ceph Storage Backend
+# description: |
+#   Include this environment to enable Ceph as the backend for
+#   Cinder, Nova, Gnocchi, and Glance.
+parameter_defaults:
+  # The short name of the Cinder Backup backend to use.
+  # Type: string
+  CinderBackupBackend: rbd
+
+  # Whether to enable or not the Iscsi backend for Cinder
+  # Type: boolean
+  CinderEnableIscsiBackend: False
+
+  # Whether to enable or not the Rbd backend for Cinder
+  # Type: boolean
+  CinderEnableRbdBackend: True
+
+  # The short name of the Glance backend to use. Should be one of swift, rbd, or file
+  # Type: string
+  GlanceBackend: rbd
+
+  # The short name of the Gnocchi backend to use. Should be one of swift, rbd, or file
+  # Type: string
+  GnocchiBackend: rbd
+
+  # Whether to enable or not the Rbd backend for Nova
+  # Type: boolean
+  NovaEnableRbdBackend: True
+
diff --git a/environments/storage/external-ceph.yaml b/environments/storage/external-ceph.yaml
new file mode 100644 (file)
index 0000000..f1c9d51
--- /dev/null
@@ -0,0 +1,78 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Deploy Using an External Ceph Cluster
+# description: |
+#   A Heat environment file which can be used to enable the
+#   use of an externally managed Ceph cluster.
+parameter_defaults:
+  # The Ceph admin client key. Can be created with ceph-authtool --gen-print-key.
+  # Type: string
+  CephAdminKey: ''
+
+  # The Ceph client key. Can be created with ceph-authtool --gen-print-key. Currently only used for external Ceph deployments to create the openstack user keyring.
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  CephClientKey: <None>
+
+  # 
+  # Type: string
+  CephClientUserName: openstack
+
+  # The Ceph cluster FSID. Must be a UUID.
+  # Mandatory. This parameter must be set by the user.
+  # Type: string
+  CephClusterFSID: <None>
+
+  # List of externally managed Ceph Mon Host IPs. Only used for external Ceph deployments.
+  # Type: string
+  CephExternalMonHost: ''
+
+  # Whether to enable or not the Iscsi backend for Cinder
+  # Type: boolean
+  CinderEnableIscsiBackend: False
+
+  # Whether to enable or not the Rbd backend for Cinder
+  # Type: boolean
+  CinderEnableRbdBackend: True
+
+  # 
+  # Type: string
+  CinderRbdPoolName: volumes
+
+  # The short name of the Glance backend to use. Should be one of swift, rbd, or file
+  # Type: string
+  GlanceBackend: rbd
+
+  # 
+  # Type: string
+  GlanceRbdPoolName: images
+
+  # The short name of the Gnocchi backend to use. Should be one of swift, rbd, or file
+  # Type: string
+  GnocchiBackend: rbd
+
+  # 
+  # Type: string
+  GnocchiRbdPoolName: metrics
+
+  # Whether to enable or not the Rbd backend for Nova
+  # Type: boolean
+  NovaEnableRbdBackend: True
+
+  # 
+  # Type: string
+  NovaRbdPoolName: vms
+
+  # The default features enabled when creating a block device image. Only applies to format 2 images. Set to '1' for Jewel clients using older Ceph servers.
+  # Type: string
+  RbdDefaultFeatures: ''
+
+resource_registry:
+  OS::TripleO::Services::CephClient: OS::Heat::None
+  OS::TripleO::Services::CephExternal: ../../puppet/services/ceph-external.yaml
+  OS::TripleO::Services::CephMon: OS::Heat::None
+  OS::TripleO::Services::CephOSD: OS::Heat::None
diff --git a/environments/storage/glance-nfs.yaml b/environments/storage/glance-nfs.yaml
new file mode 100644 (file)
index 0000000..3c13930
--- /dev/null
@@ -0,0 +1,34 @@
+# *******************************************************************
+# This file was created automatically by the sample environment
+# generator. Developers should use `tox -e genconfig` to update it.
+# Users are recommended to make changes to a copy of the file instead
+# of the original, if any customizations are needed.
+# *******************************************************************
+# title: Enable Glance NFS Backend
+# description: |
+#   Configure and include this environment to enable the use of an NFS
+#   share as the backend for Glance.
+parameter_defaults:
+  # NFS mount options for image storage (when GlanceNfsEnabled is true)
+  # Type: string
+  GlanceNfsOptions: intr,context=system_u:object_r:glance_var_lib_t:s0
+
+  # NFS share to mount for image storage (when GlanceNfsEnabled is true)
+  # Type: string
+  GlanceNfsShare: ''
+
+  # ******************************************************
+  # Static parameters - these are values that must be
+  # included in the environment but should not be changed.
+  # ******************************************************
+  # The short name of the Glance backend to use. Should be one of swift, rbd, or file
+  # Type: string
+  GlanceBackend: file
+
+  # When using GlanceBackend 'file', mount NFS share for image storage.
+  # Type: boolean
+  GlanceNfsEnabled: True
+
+  # *********************
+  # End static parameters
+  # *********************
index 92b696b..83b3249 100644 (file)
@@ -1,3 +1,7 @@
+# *************************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/ssl/tls-endpoints-public-dns.yaml
+# instead.
+# *************************************************************************************
 # Use this environment when deploying an SSL-enabled overcloud where the public
 # endpoint is a DNS name.
 parameter_defaults:
index c879ff9..8e50297 100644 (file)
@@ -1,3 +1,7 @@
+# *************************************************************************************
+# DEPRECATED: Use tripleo-heat-templates/environments/ssl/tls-endpoints-public-ip.yaml
+# instead.
+# *************************************************************************************
 # Use this environment when deploying an SSL-enabled overcloud where the public
 # endpoint is an IP address.
 parameter_defaults:
index 7a2716d..559d81d 100644 (file)
@@ -18,3 +18,5 @@ parameter_defaults:
   HeatConvergenceEngine: false
   HeatMaxResourcesPerStack: -1
   HeatMaxJsonBodySize: 2097152
+  IronicInspectorInterface: br-ctlplane
+  IronicInspectorIpRange: '192.168.24.100,192.168.24.200'
index f17a073..d1dd5d1 100755 (executable)
@@ -11,7 +11,7 @@ function log_debug {
 }
 
 function is_bootstrap_node {
-  if [ "$(hiera -c /etc/puppet/hiera.yaml bootstrap_nodeid)" = "$(facter hostname)" ]; then
+  if [ "$(hiera -c /etc/puppet/hiera.yaml bootstrap_nodeid | tr '[:upper:]' '[:lower:]')" = "$(facter hostname | tr '[:upper:]' '[:lower:]')" ]; then
     log_debug "Node is bootstrap"
     echo "true"
   fi
index cb9cc5b..0c4a792 100755 (executable)
@@ -49,7 +49,7 @@ fi
 # of packages to update (the check for -z "$update_identifier" guarantees that this
 # is run only on overcloud stack update -i)
 if [[ "$pacemaker_status" == "active" && \
-        "$(hiera -c /etc/puppet/hiera.yaml pacemaker_short_bootstrap_node_name)" == "$(facter hostname)" ]] ; then \
+        "$(hiera -c /etc/puppet/hiera.yaml pacemaker_short_bootstrap_node_name | tr '[:upper:]' '[:lower:]')" == "$(facter hostname | tr '[:upper:]' '[:lower:]')" ]] ; then \
     # OCF scripts don't cope with -eu
     echo "Verifying if we need to fix up any IPv6 VIPs"
     set +eu
index f92f9a1..95b4745 100644 (file)
@@ -4,19 +4,14 @@ description: >
 parameters:
   BondInterfaceOvsOptions:
     default: ''
-    description: 'The ovs_options string for the bond interface. Set things like
-
-      lacp=active and/or bond_mode=balance-slb using this option.
-
-      '
+    description: The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
-      description: 'The balance-tcp bond mode is known to cause packet loss and
-
+      description: The balance-tcp bond mode is known to cause packet loss and
         should not be used in BondInterfaceOvsOptions.
-
-        '
   ControlPlaneIp:
     default: ''
     description: IP address/subnet on the ctlplane network
index 97177c4..9683456 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 5456c2c..3ad6d65 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 607d346..095c497 100644 (file)
@@ -32,8 +32,9 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
   ExternalNetworkVlanID:
     default: 10
index 448d4e2..8fff137 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 8ac5cda..4901f94 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 2579648..33c6fa6 100644 (file)
@@ -34,16 +34,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: bond_mode=active-backup
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index e4b3012..100821b 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: bond_mode=active-backup
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: 'The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.'
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
       description: 'The balance-tcp bond mode is known to cause packet loss and
-
-        should not be used in BondInterfaceOvsOptions.
-
-        '
+        should not be used in BondInterfaceOvsOptions.'
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 6371ceb..0ede081 100644 (file)
@@ -32,16 +32,14 @@ parameters:
     type: string
   BondInterfaceOvsOptions:
     default: ''
-    description: The ovs_options string for the bond interface. Set things like lacp=active and/or bond_mode=balance-slb using
-      this option.
+    description: The ovs_options or bonding_options string for the bond
+      interface. Set things like lacp=active and/or bond_mode=balance-slb
+      for OVS bonds or like mode=4 for Linux bonds using this option.
     type: string
     constraints:
     - allowed_pattern: ^((?!balance.tcp).)*$
-      description: 'The balance-tcp bond mode is known to cause packet loss and
-
+      description: The balance-tcp bond mode is known to cause packet loss and
         should not be used in BondInterfaceOvsOptions.
-
-        '
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
index 8fe2d27..864da24 100755 (executable)
@@ -110,7 +110,7 @@ EOF_CAT
 }
 
 if [ -n '$network_config' ]; then
-    if [ -z "${disable_configure_safe_defaults:-''}" ]; then
+    if [ -z "${disable_configure_safe_defaults:-}" ]; then
         trap configure_safe_defaults EXIT
     fi
 
index d3d8cbd..ba8e556 100644 (file)
@@ -42,7 +42,7 @@ parameters:
       CinderApiNetwork: internal_api
       CinderIscsiNetwork: storage
       CongressApiNetwork: internal_api
-      GlanceApiNetwork: storage
+      GlanceApiNetwork: internal_api
       IronicApiNetwork: ctlplane
       IronicNetwork: ctlplane
       IronicInspectorNetwork: ctlplane
index 71afd08..b1a3529 100644 (file)
@@ -108,7 +108,7 @@ resource_registry:
   OS::TripleO::UpgradeConfig: puppet/upgrade_config.yaml
 
   # services
-  OS::TripleO::Services: puppet/services/services.yaml
+  OS::TripleO::Services: services.yaml
   OS::TripleO::Services::Apache: puppet/services/apache.yaml
   OS::TripleO::Services::CACerts: puppet/services/ca-certs.yaml
   OS::TripleO::Services::CephMds: OS::Heat::None
@@ -239,6 +239,7 @@ resource_registry:
   OS::TripleO::Services::MistralExecutor: OS::Heat::None
   OS::TripleO::Services::IronicApi: OS::Heat::None
   OS::TripleO::Services::IronicConductor: OS::Heat::None
+  OS::TripleO::Services::IronicInspector: OS::Heat::None
   OS::TripleO::Services::NovaIronic: OS::Heat::None
   OS::TripleO::Services::TripleoPackages: puppet/services/tripleo-packages.yaml
   OS::TripleO::Services::TripleoFirewall: puppet/services/tripleo-firewall.yaml
index 3244b25..b2aa08c 100644 (file)
@@ -101,8 +101,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   ServerMetadata:
     default: {}
     description: >
index baafe03..b128445 100644 (file)
@@ -12,10 +12,8 @@ parameters:
     type: string
   cloud_name_ctlplane:
     type: string
-  # FIXME(shardy) this can be comma_delimited_list when
-  # https://bugs.launchpad.net/heat/+bug/1617019 is fixed
   enabled_services:
-    type: string
+    type: comma_delimited_list
   controller_ips:
     type: comma_delimited_list
   logging_groups:
@@ -118,7 +116,10 @@ resources:
            map_merge:
               - tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: logging_sources}
               - tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: logging_groups}
-              - enabled_services: {get_param: enabled_services}
+              - enabled_services:
+                  yaql:
+                    expression: $.data.distinct()
+                    data: {get_param: enabled_services}
               # This writes out a mapping of service_name_enabled: 'true'
               # For any services not enabled, hiera foo_enabled will
               # return nil, as it's undefined
@@ -129,8 +130,7 @@ resources:
                       # https://bugs.launchpad.net/heat/+bug/1617203
                       SERVICE_enabled: 'true'
                     for_each:
-                      SERVICE:
-                        str_split: [',', {get_param: enabled_services}]
+                      SERVICE: {get_param: enabled_services}
               # Dynamically generate per-service network data
               # This works as follows (outer->inner functions)
               # yaql - filters services where no mapping exists in ServiceNetMap
@@ -150,8 +150,7 @@ resources:
                               template:
                                 SERVICE_network: SERVICE_network
                               for_each:
-                                SERVICE:
-                                  str_split: [',', {get_param: enabled_services}]
+                                SERVICE: {get_param: enabled_services}
                         - values: {get_param: ServiceNetMap}
               # Keystone doesn't provide separate entries for the public
               # and admin endpoints, so we need to add them here manually
@@ -203,8 +202,7 @@ resources:
                                   template:
                                     SERVICE_vip: SERVICE_network
                                   for_each:
-                                    SERVICE:
-                                      str_split: [',', {get_param: enabled_services}]
+                                    SERVICE: {get_param: enabled_services}
                             - values: {get_param: ServiceNetMap}
                         - values: {get_param: NetVipMap}
               - keystone_admin_api_vip:
index df756b4..40b2ca5 100644 (file)
@@ -69,8 +69,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   BlockStorageServerMetadata:
     default: {}
     description: >
index 363bf43..78d66fa 100644 (file)
@@ -75,8 +75,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   CephStorageServerMetadata:
     default: {}
     description: >
index 650d47f..12c4445 100644 (file)
@@ -37,7 +37,7 @@ parameters:
     type: string
   NeutronPublicInterface:
     default: nic1
-    description: A port to add to the NeutronPhysicalBridge.
+    description: Which interface to add to the NeutronPhysicalBridge.
     type: string
   NodeIndex:
     type: number
@@ -90,8 +90,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   NovaComputeServerMetadata:
     default: {}
     description: >
index d7ef433..1036ffb 100644 (file)
@@ -58,9 +58,13 @@ parameters:
     type: string
     constraints:
       - custom_constraint: nova.keypair
+  NeutronPhysicalBridge:
+    default: 'br-ex'
+    description: An OVS bridge to create for accessing external networks.
+    type: string
   NeutronPublicInterface:
     default: nic1
-    description: What interface to bridge onto br-ex for network nodes.
+    description: Which interface to add to the NeutronPhysicalBridge.
     type: string
   ServiceNetMap:
     default: {}
@@ -104,8 +108,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   ControllerServerMetadata:
     default: {}
     description: >
@@ -460,7 +464,7 @@ resources:
           - {get_param: NetworkDeploymentActions}
           - []
       input_values:
-        bridge_name: br-ex
+        bridge_name: {get_param: NeutronPhysicalBridge}
         interface_name: {get_param: NeutronPublicInterface}
 
   # Resource for site-specific injection of root certificate
index 4e1ad89..e4d20b4 100644 (file)
@@ -10,16 +10,20 @@ if [ -n "$artifact_urls" ]; then
   for URL in $(echo $artifact_urls | sed -e "s| |\n|g" | sort -u); do
     curl --globoff -o $TMP_DATA/file_data "$URL"
     if file -b $TMP_DATA/file_data | grep RPM &>/dev/null; then
-      yum install -y $TMP_DATA/file_data
+      mv $TMP_DATA/file_data $TMP_DATA/file_data.rpm
+      yum install -y $TMP_DATA/file_data.rpm
+      rm $TMP_DATA/file_data.rpm
     elif file -b $TMP_DATA/file_data | grep 'gzip compressed data' &>/dev/null; then
       pushd /
       tar xvzf $TMP_DATA/file_data
       popd
     else
-      echo "ERROR: Unsupported file format."
+      echo "ERROR: Unsupported file format: $URL"
       exit 1
     fi
-    rm $TMP_DATA/file_data
+    if [ -f $TMP_DATA/file_data ]; then
+      rm $TMP_DATA/file_data
+    fi
   done
 else
   echo "No artifact_urls was set. Skipping..."
index 07576a5..6a5f2d2 100644 (file)
@@ -69,8 +69,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   SwiftStorageServerMetadata:
     default: {}
     description: >
index f56ceac..8b6be86 100644 (file)
@@ -28,9 +28,13 @@ parameters:
     constraints:
       - custom_constraint: nova.keypair
 {% endif %}
+  NeutronPhysicalBridge:
+    default: 'br-ex'
+    description: An OVS bridge to create for accessing tenant networks.
+    type: string
   NeutronPublicInterface:
     default: nic1
-    description: What interface to bridge onto br-ex for network nodes.
+    description: Which interface to add to the NeutronPhysicalBridge.
     type: string
   ServiceNetMap:
     default: {}
@@ -85,8 +89,8 @@ parameters:
     default: 'localdomain'
     type: string
     description: >
-      The DNS domain used for the hosts. This should match the dhcp_domain
-      configured in the Undercloud neutron. Defaults to localdomain.
+      The DNS domain used for the hosts. This must match the
+      overcloud_domain_name configured on the undercloud.
   {{role}}ServerMetadata:
     default: {}
     description: >
@@ -199,7 +203,7 @@ conditions:
 
 resources:
   {{role}}:
-    type: OS::TripleO::{{role.name}}Server
+    type: OS::TripleO::{{role}}Server
     metadata:
       os-collect-config:
         command: {get_param: ConfigCommand}
@@ -439,7 +443,7 @@ resources:
       server: {get_resource: {{role}}}
       actions: {get_param: NetworkDeploymentActions}
       input_values:
-        bridge_name: br-ex
+        bridge_name: {get_param: NeutronPhysicalBridge}
         interface_name: {get_param: NeutronPublicInterface}
       actions:
         if:
index 2bde903..882ba29 100644 (file)
@@ -118,6 +118,16 @@ outputs:
                   template: "%{hiera('cloud_name_NETWORK')}"
                   params:
                     NETWORK: {get_param: [ServiceNetMap, MysqlNetwork]}
+              dnsnames:
+                - str_replace:
+                    template: "%{hiera('cloud_name_NETWORK')}"
+                    params:
+                      NETWORK: {get_param: [ServiceNetMap, MysqlNetwork]}
+                - str_replace:
+                    template:
+                      "%{hiera('fqdn_$NETWORK')}"
+                    params:
+                      $NETWORK: {get_param: [ServiceNetMap, MysqlNetwork]}
               principal:
                 str_replace:
                   template: "mysql/%{hiera('cloud_name_NETWORK')}"
@@ -132,6 +142,9 @@ outputs:
             - service: mysql
               network: {get_param: [ServiceNetMap, MysqlNetwork]}
               type: vip
+            - service: mysql
+              network: {get_param: [ServiceNetMap, MysqlNetwork]}
+              type: node
           - null
       upgrade_tasks:
         - name: Check for galera root password
index df406a8..9567a73 100644 (file)
@@ -52,3 +52,23 @@ outputs:
                   - 26379
       step_config: |
         include ::tripleo::profile::base::database::redis
+      upgrade_tasks:
+        - name: Check if redis is deployed
+          command: systemctl is-enabled redis
+          tags: common
+          ignore_errors: True
+          register: redis_enabled
+        - name: "PreUpgrade step0,validation: Check if redis is running"
+          shell: >
+            /usr/bin/systemctl show 'redis' --property ActiveState |
+            grep '\bactive\b'
+          when: redis_enabled.rc == 0
+          tags: step0,validation
+        - name: Stop redis service
+          tags: step1
+          when: redis_enabled.rc == 0
+          service: name=redis state=stopped
+        - name: Install redis package if it was disabled
+          tags: step3
+          yum: name=redis state=latest
+          when: redis_enabled.rc != 0
index 092d072..1f97b8b 100644 (file)
@@ -89,7 +89,6 @@ outputs:
           horizon::cache_backend: django.core.cache.backends.memcached.MemcachedCache
           horizon::django_session_engine: 'django.contrib.sessions.backends.cache'
           horizon::vhost_extra_params:
-            add_listen: false
             priority: 10
             access_log_format: '%a %l %u %t \"%r\" %>s %b \"%%{}{Referer}i\" \"%%{}{User-Agent}i\"'
             options: ['FollowSymLinks','MultiViews']
index 945033a..0e8eacf 100644 (file)
@@ -43,8 +43,21 @@ parameters:
       e.g. { ironic-context_is_admin: { key: context_is_admin, value: 'role:admin' } }
     default: {}
     type: json
+  EnableInternalTLS:
+    type: boolean
+    default: false
 
 resources:
+  ApacheServiceBase:
+    type: ./apache.yaml
+    properties:
+      ServiceNetMap: {get_param: ServiceNetMap}
+      DefaultPasswords: {get_param: DefaultPasswords}
+      EndpointMap: {get_param: EndpointMap}
+      RoleName: {get_param: RoleName}
+      RoleParameters: {get_param: RoleParameters}
+      EnableInternalTLS: {get_param: EnableInternalTLS}
+
   IronicBase:
     type: ./ironic-base.yaml
     properties:
@@ -63,6 +76,7 @@ outputs:
       config_settings:
         map_merge:
           - get_attr: [IronicBase, role_data, config_settings]
+          - get_attr: [ApacheServiceBase, role_data, config_settings]
           - ironic::api::authtoken::password: {get_param: IronicPassword}
             ironic::api::authtoken::project_name: 'service'
             ironic::api::authtoken::user_domain_name: 'Default'
@@ -80,7 +94,17 @@ outputs:
             ironic::api::port: {get_param: [EndpointMap, IronicInternal, port]}
             # This is used to build links in responses
             ironic::api::public_endpoint: {get_param: [EndpointMap, IronicPublic, uri_no_suffix]}
+            ironic::api::service_name: 'httpd'
             ironic::policy::policies: {get_param: IronicApiPolicies}
+            ironic::wsgi::apache::bind_host: {get_param: [ServiceNetMap, IronicApiNetwork]}
+            ironic::wsgi::apache::port: {get_param: [EndpointMap, IronicInternal, port]}
+            ironic::wsgi::apache::servername:
+              str_replace:
+                template:
+                  "%{hiera('fqdn_$NETWORK')}"
+                params:
+                  $NETWORK: {get_param: [ServiceNetMap, IronicApiNetwork]}
+            ironic::wsgi::apache::ssl: {get_param: EnableInternalTLS}
             tripleo.ironic_api.firewall_rules:
               '133 ironic api':
                 dport:
@@ -106,6 +130,9 @@ outputs:
             - '%'
             - "%{hiera('mysql_bind_host')}"
       upgrade_tasks:
-        - name: Stop ironic_api service
+        - name: Stop ironic_api service (before httpd support)
+          tags: step1
+          service: name=openstack-ironic-api state=stopped enabled=no
+        - name: Stop ironic_api service (running under httpd)
           tags: step1
-          service: name=openstack-ironic-api state=stopped
+          service: name=httpd state=stopped
diff --git a/puppet/services/ironic-inspector.yaml b/puppet/services/ironic-inspector.yaml
new file mode 100644 (file)
index 0000000..e8537a2
--- /dev/null
@@ -0,0 +1,151 @@
+heat_template_version: ocata
+
+description: >
+  OpenStack Ironic Inspector configured with Puppet (EXPERIMENTAL)
+
+parameters:
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  MonitoringSubscriptionIronicInspector:
+    default: 'overcloud-ironic-inspector'
+    type: string
+  KeystoneRegion:
+    type: string
+    default: 'regionOne'
+    description: Keystone region for endpoint
+  Debug:
+    default: ''
+    description: Set to True to enable debugging on all services.
+    type: string
+  IronicInspectorInterface:
+    default: br-ex
+    description: |
+      Network interface on which inspection dnsmasq will listen. Should allow
+      access to untagged traffic from nodes booted for inspection. The default
+      value only makes sense if you don't modify any networking configuration.
+    type: string
+  IronicInspectorIPXEEnabled:
+    default: true
+    description: Whether to use iPXE for inspection.
+    type: boolean
+  IronicInspectorIpRange:
+    description: |
+        Temporary IP range that will be given to nodes during the inspection
+        process. This should not overlap with any range that Neutron's DHCP
+        gives away, but it has to be routeable back to ironic-inspector API.
+        This option has no meaningful defaults, and thus is required.
+    type: string
+  IronicInspectorUseSwift:
+    default: true
+    description: Whether to use Swift for storing introspection data.
+    type: boolean
+  IronicIPXEPort:
+    default: 8088
+    description: Port to use for serving images when iPXE is used.
+    type: string
+  IronicPassword:
+    description: The password for the Ironic service and db account, used by the Ironic services
+    type: string
+    hidden: true
+
+conditions:
+  enable_ipxe: {equals : [{get_param: IronicInspectorIPXEEnabled}, true]}
+  use_swift: {equals : [{get_param: IronicInspectorUseSwift}, true]}
+
+outputs:
+  role_data:
+    description: Role data for the Ironic Inspector role.
+    value:
+      service_name: ironic_inspector
+      monitoring_subscription: {get_param: MonitoringSubscriptionIronicInspector}
+      config_settings:
+        map_merge:
+          - ironic::inspector::listen_address: {get_param: [ServiceNetMap, IronicInspectorNetwork]}
+            ironic::inspector::dnsmasq_local_ip: {get_param: [ServiceNetMap, IronicInspectorNetwork]}
+            ironic::inspector::dnsmasq_ip_range: {get_param: IronicInspectorIpRange}
+            ironic::inspector::dnsmasq_interface: {get_param: IronicInspectorInterface}
+            ironic::inspector::debug: {get_param: Debug}
+            ironic::inspector::authtoken::auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
+            ironic::inspector::authtoken::auth_url: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix]}
+            ironic::inspector::authtoken::username: 'ironic'
+            ironic::inspector::authtoken::password: {get_param: IronicPassword}
+            ironic::inspector::authtoken::project_name: 'service'
+            ironic::inspector::authtoken::user_domain_name: 'Default'
+            ironic::inspector::authtoken::project_domain_name: 'Default'
+            tripleo.ironic_inspector.firewall_rules:
+              '137 ironic-inspector':
+                dport:
+                  - 5050
+            ironic::inspector::ironic_username: 'ironic'
+            ironic::inspector::ironic_password: {get_param: IronicPassword}
+            ironic::inspector::ironic_tenant_name: 'service'
+            ironic::inspector::ironic_auth_url: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix]}
+            ironic::inspector::ironic_max_retries: 6
+            ironic::inspector::ironic_retry_interval: 10
+            ironic::inspector::ironic_user_domain_name: 'Default'
+            ironic::inspector::ironic_project_domain_name: 'Default'
+            ironic::inspector::http_port: {get_param: IronicIPXEPort}
+            ironic::inspector::db::database_connection:
+              list_join:
+                - ''
+                - - {get_param: [EndpointMap, MysqlInternal, protocol]}
+                  - '://ironic-inspector:'
+                  - {get_param: IronicPassword}
+                  - '@'
+                  - {get_param: [EndpointMap, MysqlInternal, host]}
+                  - '/ironic-inspector'
+                  - '?read_default_file=/etc/my.cnf.d/tripleo.cnf&read_default_group=tripleo'
+          -
+            if:
+            - enable_ipxe
+            - ironic::inspector::pxe_transfer_protocol: 'http'
+            - {}
+          -
+            if:
+            - use_swift
+            - ironic::inspector::store_data: 'swift'
+              ironic::inspector::swift_username: 'ironic'
+              ironic::inspector::swift_password: {get_param: IronicPassword}
+              ironic::inspector::swift_tenant_name: 'service'
+              ironic::inspector::swift_auth_url: {get_param: [EndpointMap, KeystoneInternal, uri_no_suffix]}
+              ironic::inspector::swift_user_domain_name: 'Default'
+              ironic::inspector::swift_project_domain_name: 'Default'
+            - {}
+      step_config: |
+        include ::tripleo::profile::base::ironic_inspector
+      service_config_settings:
+        keystone:
+          ironic::keystone::auth_inspector::tenant: 'service'
+          ironic::keystone::auth_inspector::public_url: {get_param: [EndpointMap, IronicInspectorPublic, uri]}
+          ironic::keystone::auth_inspector::internal_url: {get_param: [EndpointMap, IronicInspectorInternal, uri]}
+          ironic::keystone::auth_inspector::admin_url: {get_param: [EndpointMap, IronicInspectorAdmin, uri]}
+          ironic::keystone::auth_inspector::password: {get_param: IronicPassword}
+          ironic::keystone::auth_inspector::region: {get_param: KeystoneRegion}
+        mysql:
+          ironic::inspector::db::mysql::password: {get_param: IronicPassword}
+          ironic::inspector::db::mysql::user: ironic-inspector
+          ironic::inspector::db::mysql::host: {get_param: [EndpointMap, MysqlInternal, host_nobrackets]}
+          ironic::inspector::db::mysql::dbname: ironic-inspector
+          ironic::inspector::db::mysql::allowed_hosts:
+            - '%'
+            - "%{hiera('mysql_bind_host')}"
index af49401..60d194b 100644 (file)
@@ -122,6 +122,10 @@ parameters:
   KeystoneFernetKeys:
     type: json
     description: Mapping containing keystone's fernet keys and their paths.
+  KeystoneFernetMaxActiveKeys:
+    type: number
+    description: The maximum active keys in the keystone fernet key repository.
+    default: 5
   ManageKeystoneFernetKeys:
     type: boolean
     default: true
@@ -258,6 +262,7 @@ outputs:
             keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
             keystone::token_provider: {get_param: KeystoneTokenProvider}
             keystone::enable_fernet_setup: {if: [keystone_fernet_tokens, true, false]}
+            keystone::fernet_max_active_keys: {get_param: KeystoneFernetMaxActiveKeys}
             keystone::enable_proxy_headers_parsing: true
             keystone::enable_credential_setup: true
             keystone::credential_keys:
index 835edf0..fe2f294 100644 (file)
@@ -210,7 +210,7 @@ outputs:
           register: bootstrap_node
         - name: set is_bootstrap_node fact
           tags: common
-          set_fact: is_bootstrap_node={{bootstrap_node.stdout == ansible_hostname}}
+          set_fact: is_bootstrap_node={{bootstrap_node.stdout|lower == ansible_hostname|lower}}
         - name: Extra migration for nova tripleo/+bug/1656791
           tags: step0,pre-upgrade
           when: is_bootstrap_node
index 5da6d43..72a1fce 100644 (file)
@@ -45,6 +45,14 @@ parameters:
     default:
       tag: openstack.nova.scheduler
       path: /var/log/nova/nova-scheduler.log
+  NovaSchedulerDiscoverHostsInCellsInterval:
+    type: number
+    default: -1
+    description: >
+      This value controls how often (in seconds) the scheduler should
+      attempt to discover new hosts that have been added to cells.
+      The default value of -1 disables the periodic task completely.
+      It is recommended to set this parameter for deployments using Ironic.
 
 resources:
   NovaBase:
@@ -71,6 +79,7 @@ outputs:
           - nova::ram_allocation_ratio: '1.0'
             nova::scheduler::filter::scheduler_available_filters: {get_param: NovaSchedulerAvailableFilters}
             nova::scheduler::filter::scheduler_default_filters: {get_param: NovaSchedulerDefaultFilters}
+            nova::scheduler::discover_hosts_in_cells_interval: {get_param: NovaSchedulerDiscoverHostsInCellsInterval}
       step_config: |
         include tripleo::profile::base::nova::scheduler
       upgrade_tasks:
index 20c38d8..df234c7 100644 (file)
@@ -44,6 +44,7 @@ outputs:
           ovn::northbound::port: {get_param: OVNNorthboundServerPort}
           ovn::southbound::port: {get_param: OVNSouthboundServerPort}
           ovn::northd::dbs_listen_ip: {get_param: [ServiceNetMap, OvnDbsNetwork]}
+          tripleo::haproxy::ovn_dbs_manage_lb: true
           tripleo.ovn_dbs.firewall_rules:
             '121 OVN DB server ports':
               proto: 'tcp'
index d8e942d..0a7659e 100644 (file)
@@ -27,6 +27,11 @@ parameters:
     description: Mapping of service endpoint -> protocol. Typically set
                  via parameter_defaults in the resource registry.
     type: json
+  InternalTLSCAFile:
+    default: '/etc/ipa/ca.crt'
+    type: string
+    description: Specifies the default CA cert to use if TLS is used for
+                 services in the internal network.
 
 resources:
 
@@ -61,6 +66,8 @@ outputs:
             # internal_api_subnet - > IP/CIDR
             tripleo::profile::pacemaker::database::mysql::gmcast_listen_addr:
               get_param: [ServiceNetMap, MysqlNetwork]
+            tripleo::profile::pacemaker::database::mysql::ca_file:
+              get_param: InternalTLSCAFile
       step_config: |
         include ::tripleo::profile::pacemaker::database::mysql
       metadata_settings:
diff --git a/puppet/services/pacemaker/ovn-dbs.yaml b/puppet/services/pacemaker/ovn-dbs.yaml
new file mode 100644 (file)
index 0000000..1cbb476
--- /dev/null
@@ -0,0 +1,61 @@
+heat_template_version: ocata
+
+description: >
+  OVN databases configured with puppet in HA mode
+
+parameters:
+  ServiceNetMap:
+    default: {}
+    description: Mapping of service_name -> network name. Typically set
+                 via parameter_defaults in the resource registry.  This
+                 mapping overrides those in ServiceNetMapDefaults.
+    type: json
+  DefaultPasswords:
+    default: {}
+    type: json
+  RoleName:
+    default: ''
+    description: Role name on which the service is applied
+    type: string
+  RoleParameters:
+    default: {}
+    description: Parameters specific to the role
+    type: json
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  OVNNorthboundServerPort:
+    description: Port of the OVN Northbound DB server
+    type: number
+    default: 6641
+  OVNSouthboundServerPort:
+    description: Port of the OVN Southbound DB server
+    type: number
+    default: 6642
+
+resources:
+
+  OVNDBsBase:
+    type: ../ovn-dbs.yaml
+    properties:
+      ServiceNetMap: {get_param: ServiceNetMap}
+      DefaultPasswords: {get_param: DefaultPasswords}
+      EndpointMap: {get_param: EndpointMap}
+      RoleName: {get_param: RoleName}
+      RoleParameters: {get_param: RoleParameters}
+
+outputs:
+  role_data:
+    description: Role data for the OVN northd service
+    value:
+      service_name: ovn_dbs
+      config_settings:
+        map_merge:
+          - get_attr: [OVNDBsBase, role_data, config_settings]
+          - tripleo::haproxy::ovn_dbs_manage_lb: false
+            tripleo::profile::pacemaker::ovn_northd::nb_db_port: {get_param: OVNNorthboundServerPort}
+            tripleo::profile::pacemaker::ovn_northd::sb_db_port: {get_param: OVNSouthboundServerPort}
+      step_config: |
+        include ::tripleo::profile::pacemaker::ovn_northd
diff --git a/releasenotes/notes/baremetal-cell-hosts-cd5cf5aa8a33643c.yaml b/releasenotes/notes/baremetal-cell-hosts-cd5cf5aa8a33643c.yaml
new file mode 100644 (file)
index 0000000..98ba86d
--- /dev/null
@@ -0,0 +1,6 @@
+---
+fixes:
+  - |
+    When ``environments/services/ironic.yaml`` is used, enable periodic task
+    in nova-scheduler to automatically discover new nodes. Otherwise a user
+    has to run nova management command on controllers each time.
diff --git a/releasenotes/notes/baremetal-role-34cb48cc30d7bdb4.yaml b/releasenotes/notes/baremetal-role-34cb48cc30d7bdb4.yaml
new file mode 100644 (file)
index 0000000..5117642
--- /dev/null
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    Add an example role ``roles/IronicConductor.yaml`` for a node with only
+    ironic-conductor and its (i)PXE service.
diff --git a/releasenotes/notes/fix-glance-api-network-4f9d7c20475a5994.yaml b/releasenotes/notes/fix-glance-api-network-4f9d7c20475a5994.yaml
new file mode 100644 (file)
index 0000000..18474cf
--- /dev/null
@@ -0,0 +1,3 @@
+---
+fixes:
+  - Incorrect network used for Glance API service.
diff --git a/releasenotes/notes/fix-rpm-deploy-artifact-urls-03d5694073ad159d.yaml b/releasenotes/notes/fix-rpm-deploy-artifact-urls-03d5694073ad159d.yaml
new file mode 100644 (file)
index 0000000..25016e8
--- /dev/null
@@ -0,0 +1,4 @@
+---
+fixes:
+  - |
+    Fix support for RPMs to be installed via DeployArtifactURLs. LP#1697102
diff --git a/releasenotes/notes/ironic-inspector-43441782bdf0f84e.yaml b/releasenotes/notes/ironic-inspector-43441782bdf0f84e.yaml
new file mode 100644 (file)
index 0000000..1fbdd1f
--- /dev/null
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    Add basic support for **ironic-inspector** in the overcloud. It is highly
+    experimental and is not yet recommended for production use.
diff --git a/releasenotes/notes/max-active-fernet-keys-f960f08838a75eee.yaml b/releasenotes/notes/max-active-fernet-keys-f960f08838a75eee.yaml
new file mode 100644 (file)
index 0000000..4c10753
--- /dev/null
@@ -0,0 +1,5 @@
+---
+features:
+  - KeystoneFernetMaxActiveKeys was introduced as a parameter to the keystone
+    profile. It sets the max_active_keys value of the keystone.conf file and
+    will subsequently be used by mistral to purge the keys in a mistral task.
diff --git a/releasenotes/notes/ovn-ha-c0139ac519680872.yaml b/releasenotes/notes/ovn-ha-c0139ac519680872.yaml
new file mode 100644 (file)
index 0000000..d36f836
--- /dev/null
@@ -0,0 +1,3 @@
+---
+features:
+  - Support HA for OVN db servers and ovn-northd using Pacemaker.
diff --git a/roles/IronicConductor.yaml b/roles/IronicConductor.yaml
new file mode 100644 (file)
index 0000000..8a29b33
--- /dev/null
@@ -0,0 +1,21 @@
+###############################################################################
+# Role: IronicConductor                                                       #
+###############################################################################
+- name: IronicConductor
+  description: |
+    Ironic Conductor node role
+  HostnameFormatDefault: '%stackname%-ironic-%index%'
+  ServicesDefault:
+    - OS::TripleO::Services::AuditD
+    - OS::TripleO::Services::CACerts
+    - OS::TripleO::Services::Collectd
+    - OS::TripleO::Services::FluentdClient
+    - OS::TripleO::Services::IronicConductor
+    - OS::TripleO::Services::Kernel
+    - OS::TripleO::Services::MySQLClient
+    - OS::TripleO::Services::Ntp
+    - OS::TripleO::Services::SensuClient
+    - OS::TripleO::Services::Snmp
+    - OS::TripleO::Services::Timezone
+    - OS::TripleO::Services::TripleoFirewall
+    - OS::TripleO::Services::TripleoPackages
index 50083ce..783df91 100644 (file)
@@ -21,6 +21,7 @@
     - OS::TripleO::Services::HeatEngine
     - OS::TripleO::Services::IronicApi
     - OS::TripleO::Services::IronicConductor
+    - OS::TripleO::Services::IronicInspector
     - OS::TripleO::Services::IronicPxe
     - OS::TripleO::Services::Iscsid
     - OS::TripleO::Services::Keystone
index 71e9810..32e94f9 100644 (file)
@@ -19,10 +19,15 @@ target to do this::
           ``tripleo-heat-templates`` project.
 
 If a new sample environment is needed, it should be added to the
-``sample-env-generator/sample-environments.yaml`` file.  The existing
-entries in the file can be used as examples, and a more detailed
+appropriate file in the ``sample-env-generator/`` directory.  The existing
+entries in the files can be used as examples, and a more detailed
 explanation of the different available keys is below:
 
+Top-level:
+- **environments**: This is the top-level key in the file.  All other keys
+  below should appear in a list of dictionaries that define environments.
+
+Environment-specific:
 - **name**: the output file will be this name + .yaml, in the
   ``environments`` directory.
 - **title**: a human-readable title for the environment.
@@ -52,6 +57,12 @@ explanation of the different available keys is below:
 - **resource_registry**: Many environments also need to pass
   resource_registry entries when they are used.  This can be used
   to specify that in the configuration file.
+- **children**: For environments that share a lot of common values but may
+  need minor variations for different use cases, sample environment entries
+  can be nested.  ``children`` takes a list of environments with the same
+  structure as the top-level ``environments`` key.  The main difference is
+  that all keys are optional, and any that are omitted will be inherited from
+  the parent environment definition.
 
 Some behavioral notes:
 
diff --git a/sample-env-generator/networking.yaml b/sample-env-generator/networking.yaml
new file mode 100644 (file)
index 0000000..ea7042b
--- /dev/null
@@ -0,0 +1,32 @@
+environments:
+  -
+    name: networking/neutron-midonet
+    title: Enable the Neutron MidoNet Services
+    description: A Heat environment that can be used to deploy MidoNet Services
+    files:
+      puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml:
+        parameters: all
+      puppet/services/neutron-base.yaml:
+        parameters:
+          - NeutronCorePlugin
+      puppet/services/neutron-dhcp.yaml:
+        parameters:
+          - NeutronEnableIsolatedMetadata
+    sample_values:
+      NeutronCorePlugin: 'midonet.neutron.plugin_v1.MidonetPluginV2'
+      NeutronEnableIsolatedMetadata: true
+      EnableZookeeperOnController: true
+      EnableCassandraOnController: true
+    static:
+      - NeutronCorePlugin
+      - NeutronEnableIsolatedMetadata
+      - EnableZookeeperOnController
+      - EnableCassandraOnController
+    resource_registry:
+      OS::TripleO::AllNodesExtraConfig: ../../puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml
+      OS::TripleO::Controller::Net::SoftwareConfig: ../../net-config-linux-bridge.yaml
+      OS::TripleO::Services::NeutronL3Agent: OS::Heat::None
+      OS::TripleO::Services::NeutronOvsAgent: OS::Heat::None
+      OS::TripleO::Services::ComputeNeutronOvsAgent: OS::Heat::None
+      OS::TripleO::Services::NeutronCorePlugin: OS::TripleO::Services::NeutronCorePluginMidonet
+      OS::TripleO::Services::ComputeNeutronCorePlugin: ../../puppet/services/neutron-compute-plugin-midonet.yaml
diff --git a/sample-env-generator/ssl.yaml b/sample-env-generator/ssl.yaml
new file mode 100644 (file)
index 0000000..6963e84
--- /dev/null
@@ -0,0 +1,459 @@
+environments:
+  -
+    name: ssl/enable-tls
+    title: Enable SSL on OpenStack Public Endpoints
+    description: |
+      Use this environment to pass in certificates for SSL deployments.
+      For these values to take effect, one of the tls-endpoints-*.yaml environments
+      must also be used.
+    files:
+      puppet/extraconfig/tls/tls-cert-inject.yaml:
+        parameters: all
+    static:
+      # This should probably be private, but for testing static params I'm
+      # setting it as such for now.
+      - DeployedSSLCertificatePath
+    sample_values:
+      SSLCertificate: |-
+        |
+            The contents of your certificate go here
+      SSLKey: |-
+        |
+            The contents of the private key go here
+    resource_registry:
+      OS::TripleO::NodeTLSData: ../../puppet/extraconfig/tls/tls-cert-inject.yaml
+  - name: ssl/inject-trust-anchor
+    title: Inject SSL Trust Anchor on Overcloud Nodes
+    description: |
+      When using an SSL certificate signed by a CA that is not in the default
+      list of CAs, this environment allows adding a custom CA certificate to
+      the overcloud nodes.
+    files:
+      puppet/extraconfig/tls/ca-inject.yaml:
+        parameters:
+          - SSLRootCertificate
+    sample_values:
+      SSLRootCertificate: |-
+        |
+            The contents of your certificate go here
+    resource_registry:
+      OS::TripleO::NodeTLSCAData: ../../puppet/extraconfig/tls/ca-inject.yaml
+    children:
+      - name: ssl/inject-trust-anchor-hiera
+        files:
+          puppet/services/ca-certs.yaml:
+            parameters:
+              - CAMap
+        # Need to clear this so we don't inherit the parent registry
+        resource_registry: {}
+        sample_values:
+          CAMap:  |-2
+
+                first-ca-name:
+                  content: |
+                    The content of the CA cert goes here
+                second-ca-name:
+                  content: |
+                    The content of the CA cert goes here
+  -
+    name: ssl/tls-endpoints-public-ip
+    title: Deploy Public SSL Endpoints as IP Addresses
+    description: |
+      Use this environment when deploying an SSL-enabled overcloud where the public
+      endpoint is an IP address.
+    files:
+      network/endpoints/endpoint_map.yaml:
+        parameters:
+          - EndpointMap
+    sample_values:
+      # NOTE(bnemec): This is a bit odd, but it's the only way I've found that
+      # works.  The |-2 tells YAML to strip two spaces off the indentation of
+      # the value, which because it's indented six spaces gets us to the four
+      # that we actually want.  Note that zero is not a valid value here, so
+      # two seemed like the most sane option.
+      EndpointMap: |-2
+
+            AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+            AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+            AodhPublic: {protocol: 'https', port: '13042', host: 'IP_ADDRESS'}
+            BarbicanAdmin: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+            BarbicanInternal: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+            BarbicanPublic: {protocol: 'https', port: '13311', host: 'IP_ADDRESS'}
+            CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+            CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+            CeilometerPublic: {protocol: 'https', port: '13777', host: 'IP_ADDRESS'}
+            CephRgwAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            CephRgwInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            CephRgwPublic: {protocol: 'https', port: '13808', host: 'IP_ADDRESS'}
+            CinderAdmin: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+            CinderInternal: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+            CinderPublic: {protocol: 'https', port: '13776', host: 'IP_ADDRESS'}
+            CongressAdmin: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+            CongressInternal: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+            CongressPublic: {protocol: 'https', port: '13789', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            Ec2ApiAdmin: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+            Ec2ApiInternal: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+            Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'IP_ADDRESS'}
+            GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+            GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+            GlancePublic: {protocol: 'https', port: '13292', host: 'IP_ADDRESS'}
+            GnocchiAdmin: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+            GnocchiInternal: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+            GnocchiPublic: {protocol: 'https', port: '13041', host: 'IP_ADDRESS'}
+            HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+            HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+            HeatPublic: {protocol: 'https', port: '13004', host: 'IP_ADDRESS'}
+            HeatCfnAdmin: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+            HeatCfnInternal: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+            HeatCfnPublic: {protocol: 'https', port: '13005', host: 'IP_ADDRESS'}
+            HorizonPublic: {protocol: 'https', port: '443', host: 'IP_ADDRESS'}
+            IronicAdmin: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+            IronicInternal: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+            IronicPublic: {protocol: 'https', port: '13385', host: 'IP_ADDRESS'}
+            IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+            IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+            IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'IP_ADDRESS'}
+            KeystoneAdmin: {protocol: 'http', port: '35357', host: 'IP_ADDRESS'}
+            KeystoneInternal: {protocol: 'http', port: '5000', host: 'IP_ADDRESS'}
+            KeystonePublic: {protocol: 'https', port: '13000', host: 'IP_ADDRESS'}
+            ManilaAdmin: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+            ManilaInternal: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+            ManilaPublic: {protocol: 'https', port: '13786', host: 'IP_ADDRESS'}
+            MistralAdmin: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+            MistralInternal: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+            MistralPublic: {protocol: 'https', port: '13989', host: 'IP_ADDRESS'}
+            MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'IP_ADDRESS'}
+            NeutronAdmin: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+            NeutronInternal: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+            NeutronPublic: {protocol: 'https', port: '13696', host: 'IP_ADDRESS'}
+            NovaAdmin: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+            NovaInternal: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+            NovaPublic: {protocol: 'https', port: '13774', host: 'IP_ADDRESS'}
+            NovaPlacementAdmin: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+            NovaPlacementInternal: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+            NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'IP_ADDRESS'}
+            NovaVNCProxyAdmin: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+            NovaVNCProxyInternal: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+            NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'IP_ADDRESS'}
+            OctaviaAdmin: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaInternal: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaPublic: {protocol: 'https', port: '13876', host: 'IP_ADDRESS'}
+            PankoAdmin: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+            PankoInternal: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+            PankoPublic: {protocol: 'https', port: '13779', host: 'IP_ADDRESS'}
+            SaharaAdmin: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+            SaharaInternal: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+            SaharaPublic: {protocol: 'https', port: '13386', host: 'IP_ADDRESS'}
+            SwiftAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            SwiftInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            SwiftPublic: {protocol: 'https', port: '13808', host: 'IP_ADDRESS'}
+            TackerAdmin: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+            TackerInternal: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+            TackerPublic: {protocol: 'https', port: '13989', host: 'IP_ADDRESS'}
+            ZaqarAdmin: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+            ZaqarInternal: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+            ZaqarPublic: {protocol: 'https', port: '13888', host: 'IP_ADDRESS'}
+            ZaqarWebSocketAdmin: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+            ZaqarWebSocketInternal: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+            ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'IP_ADDRESS'}
+  -
+    name: ssl/tls-endpoints-public-dns
+    title: Deploy Public SSL Endpoints as DNS Names
+    description: |
+      Use this environment when deploying an SSL-enabled overcloud where the public
+      endpoint is a DNS name.
+    files:
+      network/endpoints/endpoint_map.yaml:
+        parameters:
+          - EndpointMap
+    sample_values:
+      # NOTE(bnemec): This is a bit odd, but it's the only way I've found that
+      # works.  The |-2 tells YAML to strip two spaces off the indentation of
+      # the value, which because it's indented six spaces gets us to the four
+      # that we actually want.  Note that zero is not a valid value here, so
+      # two seemed like the most sane option.
+      EndpointMap: |-2
+
+            AodhAdmin: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+            AodhInternal: {protocol: 'http', port: '8042', host: 'IP_ADDRESS'}
+            AodhPublic: {protocol: 'https', port: '13042', host: 'CLOUDNAME'}
+            BarbicanAdmin: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+            BarbicanInternal: {protocol: 'http', port: '9311', host: 'IP_ADDRESS'}
+            BarbicanPublic: {protocol: 'https', port: '13311', host: 'CLOUDNAME'}
+            CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+            CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+            CeilometerPublic: {protocol: 'https', port: '13777', host: 'CLOUDNAME'}
+            CephRgwAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            CephRgwInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            CephRgwPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+            CinderAdmin: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+            CinderInternal: {protocol: 'http', port: '8776', host: 'IP_ADDRESS'}
+            CinderPublic: {protocol: 'https', port: '13776', host: 'CLOUDNAME'}
+            CongressAdmin: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+            CongressInternal: {protocol: 'http', port: '1789', host: 'IP_ADDRESS'}
+            CongressPublic: {protocol: 'https', port: '13789', host: 'CLOUDNAME'}
+            ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            Ec2ApiAdmin: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+            Ec2ApiInternal: {protocol: 'http', port: '8788', host: 'IP_ADDRESS'}
+            Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'CLOUDNAME'}
+            GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+            GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+            GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+            GnocchiAdmin: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+            GnocchiInternal: {protocol: 'http', port: '8041', host: 'IP_ADDRESS'}
+            GnocchiPublic: {protocol: 'https', port: '13041', host: 'CLOUDNAME'}
+            HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+            HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+            HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
+            HeatCfnAdmin: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+            HeatCfnInternal: {protocol: 'http', port: '8000', host: 'IP_ADDRESS'}
+            HeatCfnPublic: {protocol: 'https', port: '13005', host: 'CLOUDNAME'}
+            HorizonPublic: {protocol: 'https', port: '443', host: 'CLOUDNAME'}
+            IronicAdmin: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+            IronicInternal: {protocol: 'http', port: '6385', host: 'IP_ADDRESS'}
+            IronicPublic: {protocol: 'https', port: '13385', host: 'CLOUDNAME'}
+            IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+            IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'IP_ADDRESS'}
+            IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'CLOUDNAME'}
+            KeystoneAdmin: {protocol: 'http', port: '35357', host: 'IP_ADDRESS'}
+            KeystoneInternal: {protocol: 'http', port: '5000', host: 'IP_ADDRESS'}
+            KeystonePublic: {protocol: 'https', port: '13000', host: 'CLOUDNAME'}
+            ManilaAdmin: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+            ManilaInternal: {protocol: 'http', port: '8786', host: 'IP_ADDRESS'}
+            ManilaPublic: {protocol: 'https', port: '13786', host: 'CLOUDNAME'}
+            MistralAdmin: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+            MistralInternal: {protocol: 'http', port: '8989', host: 'IP_ADDRESS'}
+            MistralPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+            MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'IP_ADDRESS'}
+            NeutronAdmin: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+            NeutronInternal: {protocol: 'http', port: '9696', host: 'IP_ADDRESS'}
+            NeutronPublic: {protocol: 'https', port: '13696', host: 'CLOUDNAME'}
+            NovaAdmin: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+            NovaInternal: {protocol: 'http', port: '8774', host: 'IP_ADDRESS'}
+            NovaPublic: {protocol: 'https', port: '13774', host: 'CLOUDNAME'}
+            NovaPlacementAdmin: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+            NovaPlacementInternal: {protocol: 'http', port: '8778', host: 'IP_ADDRESS'}
+            NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'CLOUDNAME'}
+            NovaVNCProxyAdmin: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+            NovaVNCProxyInternal: {protocol: 'http', port: '6080', host: 'IP_ADDRESS'}
+            NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'CLOUDNAME'}
+            OctaviaAdmin: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaInternal: {protocol: 'http', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaPublic: {protocol: 'https', port: '13876', host: 'CLOUDNAME'}
+            PankoAdmin: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+            PankoInternal: {protocol: 'http', port: '8779', host: 'IP_ADDRESS'}
+            PankoPublic: {protocol: 'https', port: '13779', host: 'CLOUDNAME'}
+            SaharaAdmin: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+            SaharaInternal: {protocol: 'http', port: '8386', host: 'IP_ADDRESS'}
+            SaharaPublic: {protocol: 'https', port: '13386', host: 'CLOUDNAME'}
+            SwiftAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            SwiftInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            SwiftPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+            TackerAdmin: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+            TackerInternal: {protocol: 'http', port: '9890', host: 'IP_ADDRESS'}
+            TackerPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+            ZaqarAdmin: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+            ZaqarInternal: {protocol: 'http', port: '8888', host: 'IP_ADDRESS'}
+            ZaqarPublic: {protocol: 'https', port: '13888', host: 'CLOUDNAME'}
+            ZaqarWebSocketAdmin: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+            ZaqarWebSocketInternal: {protocol: 'ws', port: '9000', host: 'IP_ADDRESS'}
+            ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+  -
+    name: ssl/tls-everywhere-endpoints-dns
+    title: Deploy All SSL Endpoints as DNS Names
+    description: |
+      Use this environment when deploying an overcloud where all the endpoints are
+      DNS names and there's TLS in all endpoint types.
+    files:
+      network/endpoints/endpoint_map.yaml:
+        parameters:
+          - EndpointMap
+    sample_values:
+      # NOTE(bnemec): This is a bit odd, but it's the only way I've found that
+      # works.  The |-2 tells YAML to strip two spaces off the indentation of
+      # the value, which because it's indented six spaces gets us to the four
+      # that we actually want.  Note that zero is not a valid value here, so
+      # two seemed like the most sane option.
+      EndpointMap: |-2
+
+            AodhAdmin: {protocol: 'https', port: '8042', host: 'CLOUDNAME'}
+            AodhInternal: {protocol: 'https', port: '8042', host: 'CLOUDNAME'}
+            AodhPublic: {protocol: 'https', port: '13042', host: 'CLOUDNAME'}
+            BarbicanAdmin: {protocol: 'https', port: '9311', host: 'CLOUDNAME'}
+            BarbicanInternal: {protocol: 'https', port: '9311', host: 'CLOUDNAME'}
+            BarbicanPublic: {protocol: 'https', port: '13311', host: 'CLOUDNAME'}
+            CeilometerAdmin: {protocol: 'https', port: '8777', host: 'CLOUDNAME'}
+            CeilometerInternal: {protocol: 'https', port: '8777', host: 'CLOUDNAME'}
+            CeilometerPublic: {protocol: 'https', port: '13777', host: 'CLOUDNAME'}
+            CephRgwAdmin: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+            CephRgwInternal: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+            CephRgwPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+            CinderAdmin: {protocol: 'https', port: '8776', host: 'CLOUDNAME'}
+            CinderInternal: {protocol: 'https', port: '8776', host: 'CLOUDNAME'}
+            CinderPublic: {protocol: 'https', port: '13776', host: 'CLOUDNAME'}
+            CongressAdmin: {protocol: 'https', port: '1789', host: 'CLOUDNAME'}
+            CongressInternal: {protocol: 'https', port: '1789', host: 'CLOUDNAME'}
+            CongressPublic: {protocol: 'https', port: '13789', host: 'CLOUDNAME'}
+            ContrailAnalyticsApiAdmin: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiInternal: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsApiPublic: {protocol: 'http', port: '8081', host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpAdmin: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpInternal: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorHttpPublic: {protocol: 'http', port: '8089',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshAdmin: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshInternal: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsCollectorSandeshPublic: {protocol: 'http', port: '8086',
+            host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpAdmin: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpInternal: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsHttpPublic: {protocol: 'http', port: '8090', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisAdmin: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisInternal: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailAnalyticsRedisPublic: {protocol: 'http', port: '6379', host: 'IP_ADDRESS'}
+            ContrailConfigAdmin: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigInternal: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailConfigPublic: {protocol: 'http', port: '8082', host: 'IP_ADDRESS'}
+            ContrailDiscoveryAdmin: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryInternal: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailDiscoveryPublic: {protocol: 'http', port: '5998', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpAdmin: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpInternal: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpPublic: {protocol: 'http', port: '8080', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsAdmin: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsInternal: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            ContrailWebuiHttpsPublic: {protocol: 'http', port: '8143', host: 'IP_ADDRESS'}
+            Ec2ApiAdmin: {protocol: 'https', port: '8788', host: 'CLOUDNAME'}
+            Ec2ApiInternal: {protocol: 'https', port: '8788', host: 'CLOUDNAME'}
+            Ec2ApiPublic: {protocol: 'https', port: '13788', host: 'CLOUDNAME'}
+            GlanceAdmin: {protocol: 'https', port: '9292', host: 'CLOUDNAME'}
+            GlanceInternal: {protocol: 'https', port: '9292', host: 'CLOUDNAME'}
+            GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+            GnocchiAdmin: {protocol: 'https', port: '8041', host: 'CLOUDNAME'}
+            GnocchiInternal: {protocol: 'https', port: '8041', host: 'CLOUDNAME'}
+            GnocchiPublic: {protocol: 'https', port: '13041', host: 'CLOUDNAME'}
+            HeatAdmin: {protocol: 'https', port: '8004', host: 'CLOUDNAME'}
+            HeatInternal: {protocol: 'https', port: '8004', host: 'CLOUDNAME'}
+            HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
+            HeatCfnAdmin: {protocol: 'https', port: '8000', host: 'CLOUDNAME'}
+            HeatCfnInternal: {protocol: 'https', port: '8000', host: 'CLOUDNAME'}
+            HeatCfnPublic: {protocol: 'https', port: '13005', host: 'CLOUDNAME'}
+            HorizonPublic: {protocol: 'https', port: '443', host: 'CLOUDNAME'}
+            IronicAdmin: {protocol: 'https', port: '6385', host: 'CLOUDNAME'}
+            IronicInternal: {protocol: 'https', port: '6385', host: 'CLOUDNAME'}
+            IronicPublic: {protocol: 'https', port: '13385', host: 'CLOUDNAME'}
+            IronicInspectorAdmin: {protocol: 'http', port: '5050', host: 'CLOUDNAME'}
+            IronicInspectorInternal: {protocol: 'http', port: '5050', host: 'CLOUDNAME'}
+            IronicInspectorPublic: {protocol: 'https', port: '13050', host: 'CLOUDNAME'}
+            KeystoneAdmin: {protocol: 'https', port: '35357', host: 'CLOUDNAME'}
+            KeystoneInternal: {protocol: 'https', port: '5000', host: 'CLOUDNAME'}
+            KeystonePublic: {protocol: 'https', port: '13000', host: 'CLOUDNAME'}
+            ManilaAdmin: {protocol: 'https', port: '8786', host: 'CLOUDNAME'}
+            ManilaInternal: {protocol: 'https', port: '8786', host: 'CLOUDNAME'}
+            ManilaPublic: {protocol: 'https', port: '13786', host: 'CLOUDNAME'}
+            MistralAdmin: {protocol: 'https', port: '8989', host: 'CLOUDNAME'}
+            MistralInternal: {protocol: 'https', port: '8989', host: 'CLOUDNAME'}
+            MistralPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+            MysqlInternal: {protocol: 'mysql+pymysql', port: '3306', host: 'CLOUDNAME'}
+            NeutronAdmin: {protocol: 'https', port: '9696', host: 'CLOUDNAME'}
+            NeutronInternal: {protocol: 'https', port: '9696', host: 'CLOUDNAME'}
+            NeutronPublic: {protocol: 'https', port: '13696', host: 'CLOUDNAME'}
+            NovaAdmin: {protocol: 'https', port: '8774', host: 'CLOUDNAME'}
+            NovaInternal: {protocol: 'https', port: '8774', host: 'CLOUDNAME'}
+            NovaPublic: {protocol: 'https', port: '13774', host: 'CLOUDNAME'}
+            NovaPlacementAdmin: {protocol: 'https', port: '8778', host: 'CLOUDNAME'}
+            NovaPlacementInternal: {protocol: 'https', port: '8778', host: 'CLOUDNAME'}
+            NovaPlacementPublic: {protocol: 'https', port: '13778', host: 'CLOUDNAME'}
+            NovaVNCProxyAdmin: {protocol: 'https', port: '6080', host: 'CLOUDNAME'}
+            NovaVNCProxyInternal: {protocol: 'https', port: '6080', host: 'CLOUDNAME'}
+            NovaVNCProxyPublic: {protocol: 'https', port: '13080', host: 'CLOUDNAME'}
+            OctaviaAdmin: {protocol: 'https', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaInternal: {protocol: 'https', port: '9876', host: 'IP_ADDRESS'}
+            OctaviaPublic: {protocol: 'https', port: '13876', host: 'CLOUDNAME'}
+            PankoAdmin: {protocol: 'https', port: '8779', host: 'CLOUDNAME'}
+            PankoInternal: {protocol: 'https', port: '8779', host: 'CLOUDNAME'}
+            PankoPublic: {protocol: 'https', port: '13779', host: 'CLOUDNAME'}
+            SaharaAdmin: {protocol: 'https', port: '8386', host: 'CLOUDNAME'}
+            SaharaInternal: {protocol: 'https', port: '8386', host: 'CLOUDNAME'}
+            SaharaPublic: {protocol: 'https', port: '13386', host: 'CLOUDNAME'}
+            SwiftAdmin: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+            SwiftInternal: {protocol: 'https', port: '8080', host: 'CLOUDNAME'}
+            SwiftPublic: {protocol: 'https', port: '13808', host: 'CLOUDNAME'}
+            TackerAdmin: {protocol: 'https', port: '9890', host: 'CLOUDNAME'}
+            TackerInternal: {protocol: 'https', port: '9890', host: 'CLOUDNAME'}
+            TackerPublic: {protocol: 'https', port: '13989', host: 'CLOUDNAME'}
+            ZaqarAdmin: {protocol: 'https', port: '8888', host: 'CLOUDNAME'}
+            ZaqarInternal: {protocol: 'https', port: '8888', host: 'CLOUDNAME'}
+            ZaqarPublic: {protocol: 'https', port: '13888', host: 'CLOUDNAME'}
+            ZaqarWebSocketAdmin: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+            ZaqarWebSocketInternal: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
+            ZaqarWebSocketPublic: {protocol: 'wss', port: '9000', host: 'CLOUDNAME'}
diff --git a/sample-env-generator/storage.yaml b/sample-env-generator/storage.yaml
new file mode 100644 (file)
index 0000000..aa0385c
--- /dev/null
@@ -0,0 +1,133 @@
+environments:
+  -
+    name: storage/enable-ceph
+    title: Enable Ceph Storage Backend
+    files:
+      puppet/services/cinder-volume.yaml:
+        parameters:
+          - CinderEnableIscsiBackend
+          - CinderEnableRbdBackend
+      puppet/services/cinder-backup.yaml:
+        parameters:
+          - CinderBackupBackend
+      puppet/services/nova-compute.yaml:
+        parameters:
+          - NovaEnableRbdBackend
+      puppet/services/glance-api.yaml:
+        parameters:
+          - GlanceBackend
+      puppet/services/gnocchi-api.yaml:
+        parameters:
+          - GnocchiBackend
+    sample_values:
+      CinderEnableIscsiBackend: False
+      CinderEnableRbdBackend: True
+      CinderBackupBackend: rbd
+      NovaEnableRbdBackend: True
+      GlanceBackend: rbd
+      GnocchiBackend: rbd
+    description: |
+      Include this environment to enable Ceph as the backend for
+      Cinder, Nova, Gnocchi, and Glance.
+  -
+    name: storage/cinder-nfs
+    title: Enable Cinder NFS Backend
+    files:
+      puppet/services/cinder-volume.yaml:
+        parameters:
+          - CinderNfsMountOptions
+          - CinderNfsServers
+          - CinderEnableNfsBackend
+          - CinderEnableIscsiBackend
+    sample_values:
+      CinderEnableNfsBackend: True
+      CinderEnableIscsiBackend: False
+      CinderNfsServers: '192.168.122.1:/export/cinder'
+    description: |
+      Configure and include this environment to enable the use of an NFS
+      share as the backend for Cinder.
+  -
+    name: storage/glance-nfs
+    title: Enable Glance NFS Backend
+    files:
+      puppet/services/glance-api.yaml:
+        parameters:
+          - GlanceBackend
+          - GlanceNfsEnabled
+          - GlanceNfsShare
+          - GlanceNfsOptions
+    sample_values:
+      GlanceBackend: file
+      GlanceNfsEnabled: True
+    static:
+      - GlanceBackend
+      - GlanceNfsEnabled
+    description: |
+      Configure and include this environment to enable the use of an NFS
+      share as the backend for Glance.
+  -
+    name: storage/external-ceph
+    title: Deploy Using an External Ceph Cluster
+    files:
+      puppet/services/nova-compute.yaml:
+        parameters:
+          - NovaRbdPoolName
+          - NovaEnableRbdBackend
+          - CephClientUserName
+      puppet/services/cinder-volume.yaml:
+        parameters:
+          - CinderRbdPoolName
+          - CinderEnableIscsiBackend
+          - CinderEnableRbdBackend
+      puppet/services/glance-api.yaml:
+        parameters:
+          - GlanceRbdPoolName
+          - GlanceBackend
+      puppet/services/gnocchi-api.yaml:
+        parameters:
+          - GnocchiBackend
+      puppet/services/gnocchi-base.yaml:
+        parameters:
+          - GnocchiRbdPoolName
+      puppet/services/ceph-external.yaml:
+        parameters:
+          - CephClusterFSID
+          - CephClientKey
+          - CephExternalMonHost
+          - RbdDefaultFeatures
+      puppet/services/ceph-base.yaml:
+        parameters:
+          - CephAdminKey
+    sample_values:
+      CinderEnableIscsiBackend: False
+      CinderEnableRbdBackend: True
+      NovaEnableRbdBackend: True
+      GlanceBackend: rbd
+      GnocchiBackend: rbd
+      NovaRbdPoolName: vms
+      CinderRbdPoolName: volumes
+      GlanceRbdPoolName: images
+      GnocchiRbdPoolName: metrics
+      CephClientUserName: openstack
+      CephAdminKey: ''
+    description: |
+       A Heat environment file which can be used to enable the
+       use of an externally managed Ceph cluster.
+    resource_registry:
+      OS::TripleO::Services::CephExternal: ../../puppet/services/ceph-external.yaml
+      OS::TripleO::Services::CephMon: OS::Heat::None
+      OS::TripleO::Services::CephClient: OS::Heat::None
+      OS::TripleO::Services::CephOSD: OS::Heat::None
+  -
+    name: storage/cinder-netapp-config
+    title: Enable the Cinder NetApp Backend
+    description: |
+      A Heat environment file which can be used to enable a
+      a Cinder NetApp backend, configured via puppet
+    files:
+      puppet/services/cinder-backend-netapp.yaml:
+        parameters: all
+    static:
+      - CinderEnableNetappBackend
+    resource_registry:
+      OS::TripleO::ControllerExtraConfigPre: ../../puppet/extraconfig/pre_deploy/controller/cinder-netapp.yaml
similarity index 88%
rename from puppet/services/services.yaml
rename to services.yaml
index 0e7b6d2..724727b 100644 (file)
@@ -1,3 +1,4 @@
+#FIXME move into common when specfile adds it
 heat_template_version: pike
 
 description: >
@@ -127,3 +128,17 @@ outputs:
           expression: $.data.where($ != null).select($.get('upgrade_batch_tasks')).where($ != null).flatten().distinct()
           data: {get_attr: [ServiceChain, role_data]}
       service_metadata_settings: {get_attr: [ServiceServerMetadataHook, metadata]}
+
+      # Keys to support docker/services
+      puppet_config: {get_attr: [ServiceChain, role_data, puppet_config]}
+      kolla_config:
+        map_merge: {get_attr: [ServiceChain, role_data, kolla_config]}
+      docker_config:
+        {get_attr: [ServiceChain, role_data, docker_config]}
+      docker_puppet_tasks:
+        {get_attr: [ServiceChain, role_data, docker_puppet_tasks]}
+      host_prep_tasks:
+        yaql:
+          # Note we use distinct() here to filter any identical tasks
+          expression: $.data.where($ != null).select($.get('host_prep_tasks')).where($ != null).flatten().distinct()
+          data: {get_attr: [ServiceChain, role_data]}
index df5af85..8113635 100644 (file)
@@ -7,11 +7,11 @@ six>=1.9.0 # MIT
 sphinx!=1.6.1,>=1.5.1 # BSD
 oslosphinx>=4.7.0 # Apache-2.0
 reno!=2.3.1,>=1.8.0 # Apache-2.0
-coverage>=4.0,!=4.4  # Apache-2.0
-fixtures>=3.0.0  # Apache-2.0/BSD
-python-subunit>=0.0.18  # Apache-2.0/BSD
-testrepository>=0.0.18  # Apache-2.0/BSD
-testscenarios>=0.4  # Apache-2.0/BSD
-testtools>=1.4.0  # MIT
-mock>=2.0  # BSD
-oslotest>=1.10.0  # Apache-2.0
+coverage!=4.4,>=4.0 # Apache-2.0
+fixtures>=3.0.0 # Apache-2.0/BSD
+python-subunit>=0.0.18 # Apache-2.0/BSD
+testrepository>=0.0.18 # Apache-2.0/BSD
+testscenarios>=0.4 # Apache-2.0/BSD
+testtools>=1.4.0 # MIT
+mock>=2.0 # BSD
+oslotest>=1.10.0 # Apache-2.0
index 92d76d2..ff215fb 100755 (executable)
@@ -20,7 +20,14 @@ import yaml
 required_params = ['EndpointMap', 'ServiceNetMap', 'DefaultPasswords',
                    'RoleName', 'RoleParameters']
 
+# NOTE(bnemec): The duplication in this list is intentional.  For the
+# transition to generated environments we have two copies of these files,
+# so they need to be listed twice.  Once the deprecated version can be removed
+# the duplicate entries can be as well.
 envs_containing_endpoint_map = ['tls-endpoints-public-dns.yaml',
+                                'tls-endpoints-public-ip.yaml',
+                                'tls-everywhere-endpoints-dns.yaml',
+                                'tls-endpoints-public-dns.yaml',
                                 'tls-endpoints-public-ip.yaml',
                                 'tls-everywhere-endpoints-dns.yaml']
 ENDPOINT_MAP_FILE = 'endpoint_map.yaml'
@@ -219,12 +226,10 @@ def validate(filename):
 
         # qdr aliases rabbitmq service to provide alternative messaging backend
         if (filename.startswith('./puppet/services/') and
-                filename not in ['./puppet/services/services.yaml',
-                                 './puppet/services/qdr.yaml']):
+                filename not in ['./puppet/services/qdr.yaml']):
             retval = validate_service(filename, tpl)
 
-        if (filename.startswith('./docker/services/') and
-                filename != './docker/services/services.yaml'):
+        if filename.startswith('./docker/services/'):
             retval = validate_docker_service(filename, tpl)
 
         if filename.endswith('hyperconverged-ceph.yaml'):
@@ -294,9 +299,9 @@ if base_endpoint_map and \
         else:
             print("%s matches base endpoint map" % env_endpoint_map['file'])
 else:
-    print("ERROR: Can't validate endpoint maps since a file is missing. "
-          "If you meant to delete one of these files you should update this "
-          "tool as well.")
+    print("ERROR: Did not find expected number of environments containing the "
+          "EndpointMap parameter.  If you meant to add or remove one of these "
+          "environments then you also need to update this tool.")
     if not base_endpoint_map:
         failed_files.append(ENDPOINT_MAP_FILE)
     if len(env_endpoint_maps) != len(envs_containing_endpoint_map):
diff --git a/tox.ini b/tox.ini
index 74f1b5f..c87bf7b 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -31,4 +31,4 @@ commands = python setup.py test --coverage --coverage-package-name=tripleo_heat_
 [testenv:genconfig]
 commands =
            python ./tools/process-templates.py
-           python ./tripleo_heat_templates/environment_generator.py sample-env-generator/sample-environments.yaml
+           python ./tripleo_heat_templates/environment_generator.py sample-env-generator/
index e2f4872..876dd85 100755 (executable)
@@ -22,7 +22,7 @@ import yaml
 
 _PARAM_FORMAT = u"""  # %(description)s
   %(mandatory)s# Type: %(type)s
-  %(name)s: %(default)s
+  %(name)s:%(default)s
 """
 _STATIC_MESSAGE_START = (
     '  # ******************************************************\n'
@@ -44,7 +44,14 @@ _FILE_HEADER = (
     )
 # Certain parameter names can't be changed, but shouldn't be shown because
 # they are never intended for direct user input.
-_PRIVATE_OVERRIDES = ['server', 'servers', 'NodeIndex']
+_PRIVATE_OVERRIDES = ['server', 'servers', 'NodeIndex', 'DefaultPasswords']
+# Hidden params are not included by default when the 'all' option is used,
+# but can be explicitly included by referencing them in sample_defaults or
+# static.  This allows us to generate sample environments using them when
+# necessary, but they won't be improperly included by accident.
+_HIDDEN_PARAMS = ['EndpointMap', 'RoleName', 'RoleParameters',
+                  'ServiceNetMap',
+                  ]
 
 
 def _create_output_dir(target_file):
@@ -61,9 +68,12 @@ def _generate_environment(input_env, parent_env=None):
     if parent_env is None:
         parent_env = {}
     env = dict(parent_env)
+    env.pop('children', None)
     env.update(input_env)
     parameter_defaults = {}
     param_names = []
+    sample_values = env.get('sample_values', {})
+    static_names = env.get('static', [])
     for template_file, template_data in env['files'].items():
         with open(template_file) as f:
             f_data = yaml.safe_load(f)
@@ -71,6 +81,10 @@ def _generate_environment(input_env, parent_env=None):
             parameter_defaults.update(f_params)
             if template_data['parameters'] == 'all':
                 new_names = [k for k, v in f_params.items()]
+                for hidden in _HIDDEN_PARAMS:
+                    if (hidden not in (static_names + sample_values.keys()) and
+                            hidden in new_names):
+                        new_names.remove(hidden)
             else:
                 new_names = template_data['parameters']
             missing_params = [name for name in new_names
@@ -82,7 +96,6 @@ def _generate_environment(input_env, parent_env=None):
                                     env['name']))
             param_names += new_names
 
-    static_names = env.get('static', [])
     static_defaults = {k: v for k, v in parameter_defaults.items()
                        if k in param_names and
                        k in static_names
@@ -93,7 +106,8 @@ def _generate_environment(input_env, parent_env=None):
                           not k.startswith('_') and
                           k not in static_names
                           }
-    for k, v in env.get('sample_values', {}).items():
+
+    for k, v in sample_values.items():
         if k in parameter_defaults:
             parameter_defaults[k]['sample'] = v
         if k in static_defaults:
@@ -108,17 +122,18 @@ def _generate_environment(input_env, parent_env=None):
             default = '<None>'
         if value.get('sample') is not None:
             default = value['sample']
+        # We ultimately cast this to str for output anyway
+        default = str(default)
         if default == '':
             default = "''"
-        try:
-            # If the default value is something like %index%, yaml won't
-            # parse the output correctly unless we wrap it in quotes.
-            # However, not all default values can be wrapped so we need to
-            # do it conditionally.
-            if default.startswith('%'):
-                default = "'%s'" % default
-        except AttributeError:
-            pass
+        # If the default value is something like %index%, yaml won't
+        # parse the output correctly unless we wrap it in quotes.
+        # However, not all default values can be wrapped so we need to
+        # do it conditionally.
+        if default.startswith('%'):
+            default = "'%s'" % default
+        if not default.startswith('\n'):
+            default = ' ' + default
 
         values = {'name': name,
                   'type': value['type'],
@@ -165,24 +180,32 @@ def _generate_environment(input_env, parent_env=None):
         _generate_environment(e, env)
 
 
-def generate_environments(config_file):
-    with open(config_file) as f:
-        config = yaml.safe_load(f)
-    for env in config['environments']:
-        _generate_environment(env)
+def generate_environments(config_path):
+    if os.path.isdir(config_path):
+        config_files = os.listdir(config_path)
+        config_files = [os.path.join(config_path, i) for i in config_files
+                        if os.path.splitext(i)[1] == '.yaml']
+    else:
+        config_files = [config_path]
+    for config_file in config_files:
+        print('Reading environment definitions from %s' % config_file)
+        with open(config_file) as f:
+            config = yaml.safe_load(f)
+        for env in config['environments']:
+            _generate_environment(env)
 
 
 def usage(exit_code=1):
-    print('Usage: %s <filename.yaml>' % sys.argv[0])
+    print('Usage: %s [<filename.yaml> | <directory>]' % sys.argv[0])
     sys.exit(exit_code)
 
 
 def main():
     try:
-        config_file = sys.argv[1]
+        config_path = sys.argv[1]
     except IndexError:
         usage()
-    generate_environments(config_file)
+    generate_environments(config_path)
 
 
 if __name__ == '__main__':
index d0a622d..94d13c7 100644 (file)
@@ -34,6 +34,10 @@ parameters:
     default: 42
     description: Bar description
     type: number
+  EndpointMap:
+    default: {}
+    description: Parameter that should not be included by default
+    type: json
 resources:
   # None
 '''
@@ -85,6 +89,7 @@ class GeneratorTestCase(base.BaseTestCase):
         ('basic',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -111,6 +116,7 @@ parameter_defaults:
         ('basic-one-param',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -134,6 +140,7 @@ parameter_defaults:
         ('basic-static-param',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -169,6 +176,7 @@ parameter_defaults:
         ('basic-static-param-sample',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -207,6 +215,7 @@ parameter_defaults:
         ('basic-private',
          {'template': basic_private_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -229,6 +238,7 @@ parameter_defaults:
         ('mandatory',
          {'template': mandatory_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -252,6 +262,7 @@ parameter_defaults:
         ('basic-sample',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -280,6 +291,7 @@ parameter_defaults:
         ('basic-resource-registry',
          {'template': basic_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -305,11 +317,48 @@ parameter_defaults:
 
 resource_registry:
   OS::TripleO::FakeResource: fake-filename.yaml
+''',
+          }),
+        ('basic-hidden',
+         {'template': basic_template,
+          'exception': None,
+          'nested_output': '',
+          'input_file': '''environments:
+  -
+    name: basic
+    title: Basic Environment
+    description: Basic description
+    files:
+      foo.yaml:
+        parameters: all
+    sample_values:
+      EndpointMap: |-2
+
+            foo: bar
+''',
+          'expected_output': '''# title: Basic Environment
+# description: |
+#   Basic description
+parameter_defaults:
+  # Bar description
+  # Type: number
+  BarParam: 42
+
+  # Parameter that should not be included by default
+  # Type: json
+  EndpointMap:
+    foo: bar
+
+  # Foo description
+  # Type: string
+  FooParam: foo
+
 ''',
           }),
         ('missing-param',
          {'template': basic_template,
           'exception': RuntimeError,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -325,6 +374,7 @@ resource_registry:
         ('percent-index',
          {'template': index_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -342,11 +392,51 @@ parameter_defaults:
   # Type: string
   FooParam: '%index%'
 
+''',
+          }),
+        ('nested',
+         {'template': multiline_template,
+          'exception': None,
+          'input_file': '''environments:
+  -
+    name: basic
+    title: Basic Environment
+    description: Basic description
+    files:
+      foo.yaml:
+        parameters: all
+    children:
+      - name: nested
+        title: Nested Environment
+        description: Nested description
+        sample_values:
+          FooParam: bar
+''',
+          'expected_output': '''# title: Basic Environment
+# description: |
+#   Basic description
+parameter_defaults:
+  # Parameter with
+  # multi-line description
+  # Type: string
+  FooParam: ''
+
+''',
+          'nested_output': '''# title: Nested Environment
+# description: |
+#   Nested description
+parameter_defaults:
+  # Parameter with
+  # multi-line description
+  # Type: string
+  FooParam: bar
+
 ''',
           }),
         ('multi-line-desc',
          {'template': multiline_template,
           'exception': None,
+          'nested_output': '',
           'input_file': '''environments:
   -
     name: basic
@@ -381,7 +471,14 @@ parameter_defaults:
         fake_output = open(fake_output_path, 'w')
         with mock.patch('tripleo_heat_templates.environment_generator.open',
                         create=True) as mock_open:
-            mock_open.side_effect = [fake_input, fake_template, fake_output]
+            mock_se = [fake_input, fake_template, fake_output]
+            if self.nested_output:
+                _, fake_nested_output_path = tempfile.mkstemp()
+                fake_nested_output = open(fake_nested_output_path, 'w')
+                fake_template2 = io.StringIO(six.text_type(self.template))
+                mock_se = [fake_input, fake_template, fake_output,
+                           fake_template2, fake_nested_output]
+            mock_open.side_effect = mock_se
             if not self.exception:
                 environment_generator.generate_environments('ignored.yaml')
             else:
@@ -392,5 +489,10 @@ parameter_defaults:
         expected = environment_generator._FILE_HEADER + self.expected_output
         with open(fake_output_path) as f:
             self.assertEqual(expected, f.read())
+        if self.nested_output:
+            with open(fake_nested_output_path) as f:
+                expected = (environment_generator._FILE_HEADER +
+                            self.nested_output)
+                self.assertEqual(expected, f.read())
 
 GeneratorTestCase.generate_scenarios()