Merge "Align template defaults with the client"
authorJenkins <jenkins@review.openstack.org>
Wed, 6 Jan 2016 09:04:18 +0000 (09:04 +0000)
committerGerrit Code Review <review@openstack.org>
Wed, 6 Jan 2016 09:04:18 +0000 (09:04 +0000)
71 files changed:
docker/README-containers.md
docker/compute-post.yaml
docker/generate_json_config.sh [deleted file]
environments/docker-network-isolation.yaml [new file with mode: 0644]
environments/docker-network.yaml [new file with mode: 0644]
environments/docker.yaml [moved from environments/docker-rdo.yaml with 93% similarity]
environments/enable-tls.yaml
environments/external-loadbalancer-vip.yaml
environments/ips-from-pool.yaml [new file with mode: 0644]
environments/network-isolation.yaml
environments/network-management.yaml [new file with mode: 0644]
environments/neutron-midonet.yaml [new file with mode: 0644]
extraconfig/tasks/pacemaker_resource_restart.sh
extraconfig/tasks/yum_update.sh
net-config-bond.yaml
net-config-bridge.yaml
net-config-noop.yaml
network/config/bond-with-vlans/README.md
network/config/bond-with-vlans/ceph-storage.yaml
network/config/bond-with-vlans/cinder-storage.yaml
network/config/bond-with-vlans/compute.yaml
network/config/bond-with-vlans/controller-no-external.yaml
network/config/bond-with-vlans/controller.yaml
network/config/bond-with-vlans/swift-storage.yaml
network/config/multiple-nics/README.md
network/config/multiple-nics/ceph-storage.yaml
network/config/multiple-nics/cinder-storage.yaml
network/config/multiple-nics/compute.yaml
network/config/multiple-nics/controller.yaml
network/config/multiple-nics/swift-storage.yaml
network/config/single-nic-vlans/README.md
network/config/single-nic-vlans/ceph-storage.yaml
network/config/single-nic-vlans/cinder-storage.yaml
network/config/single-nic-vlans/compute.yaml
network/config/single-nic-vlans/controller-no-external.yaml
network/config/single-nic-vlans/controller.yaml
network/config/single-nic-vlans/swift-storage.yaml
network/management.yaml [new file with mode: 0644]
network/networks.yaml
network/ports/ctlplane_vip.yaml
network/ports/external.yaml
network/ports/external_from_pool.yaml [new file with mode: 0644]
network/ports/from_service.yaml [new file with mode: 0644]
network/ports/internal_api.yaml
network/ports/internal_api_from_pool.yaml [new file with mode: 0644]
network/ports/management.yaml [new file with mode: 0644]
network/ports/net_ip_list_map.yaml
network/ports/net_ip_map.yaml
network/ports/net_ip_subnet_map.yaml
network/ports/net_vip_map_external.yaml
network/ports/noop.yaml
network/ports/storage.yaml
network/ports/storage_from_pool.yaml [new file with mode: 0644]
network/ports/storage_mgmt.yaml
network/ports/storage_mgmt_from_pool.yaml [new file with mode: 0644]
network/ports/tenant.yaml
network/ports/tenant_from_pool.yaml [new file with mode: 0644]
network/ports/vip.yaml
overcloud-resource-registry-puppet.yaml
overcloud.yaml
puppet/all-nodes-config.yaml
puppet/ceph-storage.yaml
puppet/cinder-storage.yaml
puppet/compute.yaml
puppet/controller.yaml
puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml [new file with mode: 0644]
puppet/hieradata/controller.yaml
puppet/manifests/overcloud_compute.pp
puppet/manifests/overcloud_controller.pp
puppet/manifests/overcloud_controller_pacemaker.pp
puppet/swift-storage.yaml

index 17990b5..ff062a9 100644 (file)
@@ -22,7 +22,12 @@ https://github.com/openstack/tripleo-common/blob/master/scripts/tripleo.sh
 
 Create the Overcloud:
 ```
-$ openstack overcloud deploy --templates=tripleo-heat-templates -e tripleo-heat-templates/environments/docker-rdo.yaml --libvirt-type=qemu
+$ openstack overcloud deploy --templates=tripleo-heat-templates -e tripleo-heat-templates/environments/docker.yaml -e tripleo-heat-templates/environments/docker-network.yaml --libvirt-type=qemu
+```
+
+Using Network Isolation in the Overcloud:
+```
+$ openstack overcloud deploy --templates=tripleo-heat-templates -e tripleo-heat-templates/environments/docker.yaml -e tripleo-heat-templates/environments/docker-network-isolation.yaml --libvirt-type=qemu
 ```
 
 Source the overcloudrc and then you can use the overcloud.
index a6607fd..8f786f7 100644 (file)
@@ -1,5 +1,4 @@
-heat_template_version: 2015-04-30
-
+heat_template_version: 2015-10-15
 description: >
   OpenStack compute node post deployment for Docker.
 
@@ -26,6 +25,26 @@ parameters:
     type: string
   DockerOpenvswitchDBImage:
     type: string
+  LibvirtConfig:
+    type: string
+    default: "/etc/libvirt/libvirtd.conf"
+  NovaConfig:
+    type: string
+    default: "/etc/nova/nova.conf"
+  NeutronOpenvswitchAgentConfig:
+    type: string
+    default: "/etc/neutron/neutron.conf,/etc/neutron/plugins/ml2/ml2_conf.ini"
+  NeutronAgentConfig:
+    type: string
+    default: "/etc/neutron/neutron.conf,/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini"
+  NeutronAgentPluginVolume:
+    type: string
+    description: The neutron agent plugin to mount into the neutron-agents container
+    default: "/var/lib/etc-data/neutron/plugins/ml2/openvswitch_agent.ini:/var/lib/kolla/config_files/ovs_neutron_plugin.ini:ro"
+  NeutronAgentOvsVolume:
+    type: string
+    description: The neutron agent ovs agents to mount into the neutron-agents container
+    default: " "
 
 resources:
 
@@ -74,9 +93,70 @@ resources:
     type: OS::Heat::SoftwareConfig
     properties:
       group: script
-      outputs:
-      - name: result
-      config: {get_file: ./generate_json_config.sh}
+      inputs:
+      - name: libvirt_config
+      - name: nova_config
+      - name: neutron_openvswitch_agent_config
+      - name: neutron_agent_config
+      config: |
+        #!/bin/python
+        import json
+        import os
+
+        data = {}
+        file_perms = '600'
+        libvirt_perms = '644'
+
+        libvirt_config = os.getenv('libvirt_config').split(',')
+        nova_config = os.getenv('nova_config').split(',')
+        neutron_openvswitch_agent_config = os.getenv('neutron_openvswitch_agent_config').split(',')
+        neutron_agent_config = os.getenv('neutron_agent_config').split(',')
+
+        # Command, Config_files, Owner, Perms
+        services = {'nova-libvirt': ['/usr/sbin/libvirtd', libvirt_config, 'root', libvirt_perms],
+                    'nova-compute': ['/usr/bin/nova-compute', nova_config, 'nova', file_perms],
+                    'neutron-openvswitch-agent': ['/usr/bin/neutron-openvswitch-agent', neutron_openvswitch_agent_config, 'neutron', file_perms],
+                    'neutron-agent': ['/usr/bin/neutron-openvswitch-agent', neutron_agent_config, 'neutron', file_perms],
+                    'ovs-vswitchd': ['/usr/sbin/ovs-vswitchd unix:/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --log-file=/var/log/openvswitch/ovs-vswitchd.log'],
+                    'ovsdb-server': ['/usr/sbin/ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/run/openvswitch/db.sock --log-file=/var/log/openvswitch/ovsdb-server.log']
+                   }
+
+
+        def build_config_files(config, owner, perms):
+            config_source = '/var/lib/kolla/config_files/'
+            config_files_dict = {}
+            source = os.path.basename(config)
+            dest = config
+            config_files_dict.update({'source': config_source + source,
+                                      'dest': dest,
+                                      'owner': owner,
+                                      'perm': perms})
+            return config_files_dict
+
+
+        for service in services:
+            if service != 'ovs-vswitchd' and service != 'ovsdb-server':
+                command = services.get(service)[0]
+                config_files = services.get(service)[1]
+                owner = services.get(service)[2]
+                perms = services.get(service)[3]
+                config_files_list = []
+                for config_file in config_files:
+                    if service == 'nova-libvirt':
+                        command = command + ' --config ' + config_file
+                    else:
+                        command = command + ' --config-file ' + config_file
+                    data['command'] = command
+                    config_files_dict = build_config_files(config_file, owner, perms)
+                    config_files_list.append(config_files_dict)
+                data['config_files'] = config_files_list
+            else:
+                data['command'] = services.get(service)[0]
+                data['config_files'] = []
+
+            json_config_dir = '/var/lib/etc-data/json-config/'
+            with open(json_config_dir + service + '.json', 'w') as json_file:
+                json.dump(data, json_file, sort_keys=True, indent=4, separators=(',', ': '))
 
   CopyJsonDeployment:
     type: OS::Heat::SoftwareDeployments
@@ -84,6 +164,11 @@ resources:
     properties:
       config: {get_resource: CopyJsonConfig}
       servers:  {get_param: servers}
+      input_values:
+        libvirt_config: {get_param: LibvirtConfig}
+        nova_config: {get_param: NovaConfig}
+        neutron_openvswitch_agent_config: {get_param: NeutronOpenvswitchAgentConfig}
+        neutron_agent_config: {get_param: NeutronAgentConfig}
 
   NovaComputeContainersDeploymentOVS:
     type: OS::Heat::StructuredDeployments
@@ -118,12 +203,12 @@ resources:
             list_join:
             - '/'
             - [ {get_param: DockerNamespace}, {get_param: DockerOpenvswitchDBImage} ]
-          container_name: ovs-db-server
+          container_name: ovsdb-server
           net: host
           restart: always
           volumes:
            - /run:/run
-           - /var/lib/etc-data/json-config/ovs-dbserver.json:/var/lib/kolla/config_files/config.json
+           - /var/lib/etc-data/json-config/ovsdb-server.json:/var/lib/kolla/config_files/config.json
           environment:
            - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
 
@@ -234,11 +319,15 @@ resources:
           privileged: true
           restart: always
           volumes:
-           - /run:/run
-           - /lib/modules:/lib/modules:ro
-           - /var/lib/etc-data/json-config/neutron-agent.json:/var/lib/kolla/config_files/config.json
-           - /var/lib/etc-data/neutron/plugins/ml2/openvswitch_agent.ini:/var/lib/kolla/config_files/ovs_neutron_plugin.ini:ro
-           - /var/lib/etc-data/neutron/neutron.conf:/var/lib/kolla/config_files/neutron.conf:ro
+            str_split:
+              - ","
+              - list_join:
+                 - ","
+                 - [ "/run:/run", "/lib/modules:/lib/modules:ro",
+                     "/var/lib/etc-data/json-config/neutron-agent.json:/var/lib/kolla/config_files/config.json",
+                     "/var/lib/etc-data/neutron/neutron.conf:/var/lib/kolla/config_files/neutron.conf:ro",
+                     {get_param: NeutronAgentPluginVolume},
+                     {get_param: NeutronAgentOvsVolume} ]
           environment:
            - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
           volumes_from:
diff --git a/docker/generate_json_config.sh b/docker/generate_json_config.sh
deleted file mode 100644 (file)
index 5cf4922..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/bash
-
-KOLLA_DEST=/var/lib/kolla/config_files
-JSON_DEST=/var/lib/etc-data/json-config
-
-# For more config file generation, simply define a new SERVICE_DATA_
-# prefixed variable. The command string is quoted to include config-file
-# arguments. Note that the variable name following SERVICE_DATA_ will be
-# the filename the JSON config is written to.
-
-# [EXAMPLE]: SERVICE_DATA_<SERVICE_NAME>=(<command> <source> <dest> <owner> <perms>)
-
-SERVICE_DATA_NOVA_LIBVIRT=("/usr/sbin/libvirtd" libvirtd.conf /etc/libvirt/libvirtd.conf root 0644)
-SERVICE_DATA_NOVA_COMPUTE=("/usr/bin/nova-compute" nova.conf /etc/nova/nova.conf nova 0600)
-SERVICE_DATA_NEUTRON_OPENVSWITCH_AGENT=("/usr/bin/neutron-openvswitch-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini" neutron.conf /etc/neutron/neutron.conf neutron 0600 ml2_conf.ini /etc/neutron/plugins/ml2/ml2_conf.ini neutron 0600)
-SERVICE_DATA_NEUTRON_AGENT=("/usr/bin/neutron-openvswitch-agent --config-file /usr/share/neutron/neutron-dist.conf --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini" neutron.conf /etc/neutron/neutron.conf neutron 0600 ovs_neutron_plugin.ini /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini neutron 0600)
-SERVICE_DATA_OVS_VSWITCHD=("/usr/sbin/ovs-vswitchd unix:/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --log-file=/var/log/openvswitch/ovs-vswitchd.log")
-SERVICE_DATA_OVS_DBSERVER=("/usr/sbin/ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/run/openvswitch/db.sock --log-file=/var/log/openvswitch/ovsdb-server.log")
-
-function create_json_header() {
-    local command=$1
-
-    echo "\
-{
-    \"command\": \"${command[@]}\","
-
-}
-
-function create_config_file_header() {
-    echo "    \"config_files\": ["
-}
-
-function create_config_file_block() {
-    local source=$KOLLA_DEST/$1
-    local dest=$2
-    local owner=$3
-    local perm=$4
-
-    printf "\
-\t{
-\t    \"source\": \"$source\",
-\t    \"dest\": \"$dest\",
-\t    \"owner\": \"$owner\",
-\t    \"perm\": \"$perm\"
-\t}"
-}
-
-function add_trailing_comma() {
-    printf ", \n"
-}
-
-function create_config_file_trailer() {
-    echo -e "\n    ]"
-}
-
-function create_json_trailer() {
-    echo "}"
-}
-
-function create_json_data() {
-    local config_data=$1
-    shift
-
-    create_json_header "$config_data"
-    create_config_file_header
-    while [ "$1" ]; do
-        create_config_file_block "$@"
-        shift 4
-        if [ "$1" ]; then
-            add_trailing_comma
-        fi
-    done
-    create_config_file_trailer
-    create_json_trailer
-}
-
-function write_json_data() {
-
-    local name=$1[@]
-    local service_data=("${!name}")
-
-    local service_name=${1#SERVICE_DATA_} # chop SERVICE_DATA_ prefix
-    service_name=${service_name//_/-}     # switch underscore to dash
-    service_name=${service_name,,}        # change to lowercase
-
-    echo "Creating JSON file ${service_name}"
-    create_json_data "${service_data[@]}" > "$JSON_DEST/$service_name.json"
-}
-
-function process_configs() {
-    for service in ${!SERVICE_DATA_*}; do
-        write_json_data "${service}"
-    done
-}
-
-process_configs
diff --git a/environments/docker-network-isolation.yaml b/environments/docker-network-isolation.yaml
new file mode 100644 (file)
index 0000000..257d03d
--- /dev/null
@@ -0,0 +1,4 @@
+parameter_defaults:
+  NeutronAgentConfig: "/etc/neutron/neutron.conf,/etc/neutron/plugins/openvswitch/openvswitch_agent.ini"
+  NeutronAgentPluginVolume: "/var/lib/etc-data/neutron/plugins/ml2/openvswitch_agent.ini:/var/lib/kolla/config_files/openvswitch_agent.ini:ro"
+  NeutronAgentOvsVolume: "/var/lib/etc-data/neutron/conf.d/neutron-openvswitch-agent:/etc/neutron/conf.d/neutron-openvswitch-agent:ro"
diff --git a/environments/docker-network.yaml b/environments/docker-network.yaml
new file mode 100644 (file)
index 0000000..f10ec38
--- /dev/null
@@ -0,0 +1,2 @@
+resource_registry:
+  OS::TripleO::Compute::Net::SoftwareConfig: ../net-config-bridge.yaml
similarity index 93%
rename from environments/docker-rdo.yaml
rename to environments/docker.yaml
index 66824fe..6376b74 100644 (file)
@@ -2,7 +2,6 @@ resource_registry:
   # Docker container with heat agents for containerized compute node.
   OS::TripleO::ComputePostDeployment: ../docker/compute-post.yaml
   OS::TripleO::NodeUserData: ../docker/firstboot/install_docker_agents.yaml
-  OS::TripleO::Compute::Net::SoftwareConfig: ../net-config-bridge.yaml
 
 parameters:
   NovaImage: atomic-image
index 5c2506e..bc4d1be 100644 (file)
@@ -4,6 +4,38 @@ parameter_defaults:
   SSLIntermediateCertificate: ''
   SSLKey: |
     The contents of the private key go here
+  EndpointMap:
+    CeilometerAdmin: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerInternal: {protocol: 'http', port: '8777', host: 'IP_ADDRESS'}
+    CeilometerPublic: {protocol: 'https', port: '13777', 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'}
+    GlanceAdmin: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlanceInternal: {protocol: 'http', port: '9292', host: 'IP_ADDRESS'}
+    GlancePublic: {protocol: 'https', port: '13292', host: 'CLOUDNAME'}
+    GlanceRegistryAdmin: {protocol: 'http', port: '9191', host: 'IP_ADDRESS'}
+    GlanceRegistryInternal: {protocol: 'http', port: '9191', host: 'IP_ADDRESS'}
+    GlanceRegistryPublic: {protocol: 'https', port: '9191', host: 'IP_ADDRESS'} # Not set on the loadbalancer yet.
+    HeatAdmin: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatInternal: {protocol: 'http', port: '8004', host: 'IP_ADDRESS'}
+    HeatPublic: {protocol: 'https', port: '13004', host: 'CLOUDNAME'}
+    HorizonPublic: {protocol: 'https', port: '443', 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'}
+    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'}
+    NovaEC2Admin: {protocol: 'http', port: '8773', host: 'IP_ADDRESS'}
+    NovaEC2Internal: {protocol: 'http', port: '8773', host: 'IP_ADDRESS'}
+    NovaEC2Public: {protocol: 'https', port: '13773', 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'}
 
 resource_registry:
   OS::TripleO::NodeTLSData: ../puppet/extraconfig/tls/tls-cert-inject.yaml
index 47d5bd9..1cf5982 100644 (file)
@@ -1,14 +1,37 @@
 resource_registry:
   OS::TripleO::Network::Ports::NetVipMap: ../network/ports/net_vip_map_external.yaml
+  OS::TripleO::Network::Ports::ExternalVipPort: ../network/ports/noop.yaml
+  OS::TripleO::Network::Ports::InternalApiVipPort: ../network/ports/noop.yaml
+  OS::TripleO::Network::Ports::StorageVipPort: ../network/ports/noop.yaml
+  OS::TripleO::Network::Ports::StorageMgmtVipPort: ../network/ports/noop.yaml
+  OS::TripleO::Network::Ports::RedisVipPort: ../network/ports/from_service.yaml
+  OS::TripleO::Controller::Ports::ExternalPort: ../network/ports/external_from_pool.yaml
+  OS::TripleO::Controller::Ports::InternalApiPort: ../network/ports/internal_api_from_pool.yaml
+  OS::TripleO::Controller::Ports::StoragePort: ../network/ports/storage_from_pool.yaml
+  OS::TripleO::Controller::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_from_pool.yaml
+  OS::TripleO::Controller::Ports::TenantPort: ../network/ports/tenant_from_pool.yaml
 
 parameter_defaults:
   # When using an external loadbalancer set the following in parameter_defaults
   # to control your VIPs (currently one per network)
   # NOTE: we will eventually move to one VIP per service
   #
-  # ControlNetworkVip:
-  # ExternalNetworkVip:
-  # InternalApiNetworkVip:
-  # StorageNetworkVip:
-  # StorageMgmtNetworkVip:
-  EnableLoadBalancer: false
\ No newline at end of file
+  ControlPlaneIP: 192.0.2.251
+  ExternalNetworkVip: 10.0.0.251
+  InternalApiNetworkVip: 172.16.2.251
+  StorageNetworkVip: 172.16.1.251
+  StorageMgmtNetworkVip: 172.16.3.251
+  ServiceVips:
+    redis: 172.16.2.252
+  ControllerIPs:
+    external:
+    - 10.0.0.253
+    internal_api:
+    - 172.16.2.253
+    storage:
+    - 172.16.1.253
+    storage_mgmt:
+    - 172.16.3.253
+    tenant:
+    - 172.16.0.253
+  EnableLoadBalancer: false
diff --git a/environments/ips-from-pool.yaml b/environments/ips-from-pool.yaml
new file mode 100644 (file)
index 0000000..8c27fe4
--- /dev/null
@@ -0,0 +1,20 @@
+resource_registry:
+  OS::TripleO::Controller::Ports::ExternalPort: ../network/ports/external_from_pool.yaml
+  OS::TripleO::Controller::Ports::InternalApiPort: ../network/ports/internal_api_from_pool.yaml
+  OS::TripleO::Controller::Ports::StoragePort: ../network/ports/storage_from_pool.yaml
+  OS::TripleO::Controller::Ports::StorageMgmtPort: ../network/ports/storage_mgmt_from_pool.yaml
+  OS::TripleO::Controller::Ports::TenantPort: ../network/ports/tenant_from_pool.yaml
+
+parameter_defaults:
+  ControllerIPs:
+    # Each controller will get an IP from the lists below, first controller, first IP
+    external:
+    - 10.0.0.251
+    internal_api:
+    - 172.16.2.251
+    storage:
+    - 172.16.1.251
+    storage_mgmt:
+    - 172.16.3.251
+    tenant:
+    - 172.16.0.251
index 937931d..87fc22f 100644 (file)
@@ -1,12 +1,23 @@
 # Enable the creation of Neutron networks for isolated Overcloud
 # traffic and configure each role to assign ports (related
 # to that role) on these networks.
+# Many networks are disabled by default because they are not used
+# in a typical configuration. Override via parameter_defaults.
 resource_registry:
   OS::TripleO::Network::External: ../network/external.yaml
   OS::TripleO::Network::InternalApi: ../network/internal_api.yaml
   OS::TripleO::Network::StorageMgmt: ../network/storage_mgmt.yaml
   OS::TripleO::Network::Storage: ../network/storage.yaml
   OS::TripleO::Network::Tenant: ../network/tenant.yaml
+  # Management network is optional and disabled by default
+  OS::TripleO::Network::Management: ../network/noop.yaml
+
+  # Port assignments for the VIPs
+  OS::TripleO::Network::Ports::ExternalVipPort: ../network/ports/external.yaml
+  OS::TripleO::Network::Ports::InternalApiVipPort: ../network/ports/internal_api.yaml
+  OS::TripleO::Network::Ports::StorageVipPort: ../network/ports/storage.yaml
+  OS::TripleO::Network::Ports::StorageMgmtVipPort: ../network/ports/storage_mgmt.yaml
+  OS::TripleO::Network::Ports::RedisVipPort: ../network/ports/vip.yaml
 
   # Port assignments for the controller role
   OS::TripleO::Controller::Ports::ExternalPort: ../network/ports/external.yaml
@@ -14,25 +25,39 @@ resource_registry:
   OS::TripleO::Controller::Ports::StoragePort: ../network/ports/storage.yaml
   OS::TripleO::Controller::Ports::StorageMgmtPort: ../network/ports/storage_mgmt.yaml
   OS::TripleO::Controller::Ports::TenantPort: ../network/ports/tenant.yaml
+  OS::TripleO::Controller::Ports::ManagementPort: ../network/ports/noop.yaml
 
   # Port assignments for the compute role
+  OS::TripleO::Compute::Ports::ExternalPort: ../network/ports/noop.yaml
   OS::TripleO::Compute::Ports::InternalApiPort: ../network/ports/internal_api.yaml
   OS::TripleO::Compute::Ports::StoragePort: ../network/ports/storage.yaml
+  OS::TripleO::Compute::Ports::StorageMgmtPort: ../network/ports/noop.yaml
   OS::TripleO::Compute::Ports::TenantPort: ../network/ports/tenant.yaml
+  OS::TripleO::Compute::Ports::ManagementPort: ../network/ports/noop.yaml
 
   # Port assignments for the ceph storage role
+  OS::TripleO::CephStorage::Ports::ExternalPort: ../network/ports/noop.yaml
+  OS::TripleO::CephStorage::Ports::InternalApiPort: ../network/ports/noop.yaml
   OS::TripleO::CephStorage::Ports::StoragePort: ../network/ports/storage.yaml
   OS::TripleO::CephStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt.yaml
+  OS::TripleO::CephStorage::Ports::TenantPort: ../network/ports/noop.yaml
+  OS::TripleO::CephStorage::Ports::ManagementPort: ../network/ports/noop.yaml
 
   # Port assignments for the swift storage role
+  OS::TripleO::SwiftStorage::Ports::ExternalPort: ../network/ports/noop.yaml
   OS::TripleO::SwiftStorage::Ports::InternalApiPort: ../network/ports/internal_api.yaml
   OS::TripleO::SwiftStorage::Ports::StoragePort: ../network/ports/storage.yaml
   OS::TripleO::SwiftStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt.yaml
+  OS::TripleO::SwiftStorage::Ports::TenantPort: ../network/ports/noop.yaml
+  OS::TripleO::SwiftStorage::Ports::ManagementPort: ../network/ports/noop.yaml
 
   # Port assignments for the block storage role
+  OS::TripleO::BlockStorage::Ports::ExternalPort: ../network/ports/noop.yaml
   OS::TripleO::BlockStorage::Ports::InternalApiPort: ../network/ports/internal_api.yaml
   OS::TripleO::BlockStorage::Ports::StoragePort: ../network/ports/storage.yaml
   OS::TripleO::BlockStorage::Ports::StorageMgmtPort: ../network/ports/storage_mgmt.yaml
+  OS::TripleO::BlockStorage::Ports::TenantPort: ../network/ports/noop.yaml
+  OS::TripleO::BlockStorage::Ports::ManagementPort: ../network/ports/noop.yaml
 
   # Port assignments for service virtual IPs for the controller role
   OS::TripleO::Controller::Ports::RedisVipPort: ../network/ports/vip.yaml
diff --git a/environments/network-management.yaml b/environments/network-management.yaml
new file mode 100644 (file)
index 0000000..2f0cff8
--- /dev/null
@@ -0,0 +1,24 @@
+# Enable the creation of a system management network. This
+# creates a Neutron network for isolated Overcloud
+# system management traffic and configures each role to
+# assign a port (related to that role) on that network.
+# Note that the basic sample NIC configuration templates
+# do not include the management network, see the
+# single-nic-vlans-mgmt templates for an example.
+resource_registry:
+  OS::TripleO::Network::Management: ../network/management.yaml
+
+  # Port assignments for the controller role
+  OS::TripleO::Controller::Ports::ManagementPort: ../network/ports/management.yaml
+
+  # Port assignments for the compute role
+  OS::TripleO::Compute::Ports::ManagementPort: ../network/ports/management.yaml
+
+  # Port assignments for the ceph storage role
+  OS::TripleO::CephStorage::Ports::ManagementPort: ../network/ports/management.yaml
+
+  # Port assignments for the swift storage role
+  OS::TripleO::SwiftStorage::Ports::ManagementPort: ../network/ports/management.yaml
+
+  # Port assignments for the block storage role
+  OS::TripleO::BlockStorage::Ports::ManagementPort: ../network/ports/management.yaml
diff --git a/environments/neutron-midonet.yaml b/environments/neutron-midonet.yaml
new file mode 100644 (file)
index 0000000..726852a
--- /dev/null
@@ -0,0 +1,20 @@
+# 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
+  OS::TripleO::Controller::Net::SoftwareConfig: ../net-config-linux-bridge.yaml # We have to avoid any ovs bridge. MidoNet is incompatible with its datapath
+
+parameter_defaults:
+  EnableZookeeperOnController: true
+  EnableCassandraOnController: true
+  NeutronCorePlugin: 'midonet.neutron.plugin_v1.MidonetPluginV2' # Overriding default core_plugin in Neutron. Don't touch it
+  NeutronEnableIsolatedMetadata: true  # MidoNet 1.9 needs this one to work. Don't change it
+  NeutronEnableL3Agent: false
+  NeutronEnableOVSAgent: false
+
+  # Other available options for MidoNet Services
+  # TunnelZoneName: 'tunnelname'
+  # TunnelZoneType: 'gre'
+  # CassandraStoragePort: 7000
+  # CassandraSslStoragePort: 7009
+  # CassandraClientPort: 9042
+  # CassandraClientPortThrift: 9160
index ad3c370..4e8b20f 100755 (executable)
@@ -41,6 +41,12 @@ if [ "$pacemaker_status" = "active" -a \
      "$(hiera bootstrap_nodeid)" = "$(facter hostname)" -a \
      "$(hiera update_identifier)" != "nil" ]; then
 
+    #ensure neutron constraints like
+    #https://review.openstack.org/#/c/245093/
+    if  pcs constraint order show  | grep "start neutron-server-clone then start neutron-ovs-cleanup-clone"; then
+        pcs constraint remove order-neutron-server-clone-neutron-ovs-cleanup-clone-mandatory
+    fi
+
     pcs resource disable httpd
     check_resource httpd stopped 300
     pcs resource disable openstack-keystone
index e32369e..2d6b8cc 100755 (executable)
@@ -24,6 +24,7 @@ update_identifier=${update_identifier//[^a-zA-Z0-9-_]/}
 # seconds to wait for this node to rejoin the cluster after update
 cluster_start_timeout=600
 galera_sync_timeout=360
+cluster_settle_timeout=1800
 
 timestamp_file="$timestamp_dir/$update_identifier"
 if [[ -a "$timestamp_file" ]]; then
@@ -128,7 +129,10 @@ openstack-nova-scheduler"
     pcs -f $pacemaker_dumpfile resource update mongod op stop timeout=100s
 
     echo "Applying new Pacemaker config"
-    pcs cluster cib-push $pacemaker_dumpfile
+    if ! pcs cluster cib-push $pacemaker_dumpfile; then
+        echo "ERROR failed to apply new pacemaker config"
+        exit 1
+    fi
 
     echo "Pacemaker running, stopping cluster node and doing full package update"
     node_count=$(pcs status xml | grep -o "<nodes_configured.*/>" | grep -o 'number="[0-9]*"' | grep -o "[0-9]*")
@@ -188,6 +192,12 @@ if [[ "$pacemaker_status" == "active" ]] ; then
         fi
     done
 
+    echo "Waiting for pacemaker cluster to settle"
+    if ! timeout -k 10 $cluster_settle_timeout crm_resource --wait; then
+        echo "ERROR timed out while waiting for the cluster to settle"
+        exit 1
+    fi
+
     pcs status
 
 else
index 797df4b..b624563 100644 (file)
@@ -28,6 +28,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet:
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
 
 resources:
   OsNetConfigImpl:
index ad16ef0..4f7a19d 100644 (file)
@@ -28,6 +28,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet:
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
 
 resources:
   OsNetConfigImpl:
index 30de584..94c492c 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet:
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
 
 resources:
   OsNetConfigImpl:
index 98879b4..afe7177 100644 (file)
@@ -3,10 +3,9 @@ Vlans on a bonded pair of NICs for each Overcloud role.
 
 There are two versions of the controller role template, one with
 an external network interface, and another without. If the
-external network interface is not configured the ctlplane address
+external network interface is not configured, the ctlplane address
 ranges will be used for external (public) network traffic.
 
-
 Configuration
 -------------
 
@@ -20,8 +19,31 @@ something like this:
     OS::TripleO::ObjectStorage::Net::SoftwareConfig: network/config/bond-with-vlans/swift-storage.yaml
     OS::TripleO::CephStorage::Net::SoftwareConfig: network/config/bond-with-vlans/ceph-storage.yaml
 
+Or use this Heat environment file:
+
+  environments/net-bond-with-vlans.yaml
+
 Configuration with no External Network
 --------------------------------------
+
 Same as above except set the following value for the controller role:
 
     OS::TripleO::Controller::Net::SoftwareConfig: network/config/bond-with-vlans/controller-no-external.yaml
+
+Configuration with System Management Network
+--------------------------------------------
+
+To enable the optional System Management network, create a Heat environment
+that looks something like this:
+
+  resource\_registry:
+    OS::TripleO::Network::Management: ../network/management.yaml
+    OS::TripleO::Controller::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::Compute::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::CephStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::SwiftStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::BlockStorage::Ports::ManagementPort: ../network/ports/management.yaml
+
+Or use this Heat environment file:
+
+  environments/network-management.yaml
index 620d1f7..93db866 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: ''
     description: The ovs_options string for the bond interface. Set things like
@@ -42,6 +46,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -114,6 +122,14 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index f4c6de8..bea98c1 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: ''
     description: The ovs_options string for the bond interface. Set things like
@@ -46,6 +50,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -125,6 +133,14 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 8cb3705..774bf02 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: ''
     description: The ovs_options string for the bond interface. Set things like
@@ -46,6 +50,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -125,6 +133,14 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: TenantIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 22579e8..375d40b 100644 (file)
@@ -25,6 +25,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: ''
     description: The ovs_options string for the bond interface. Set things like
@@ -50,6 +54,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -66,6 +74,7 @@ resources:
             -
               type: ovs_bridge
               name: {get_input: bridge_name}
+              use_dhcp: true
               members:
                 -
                   type: ovs_bond
@@ -107,6 +116,14 @@ resources:
                   addresses:
                   -
                     ip_netmask: {get_param: TenantIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index eb4399e..d3627ea 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: 'bond_mode=active-backup'
     description: The ovs_options string for the bond interface. Set things like
@@ -54,6 +58,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -119,7 +127,7 @@ resources:
                       ip_netmask: {get_param: ExternalIpSubnet}
                   routes:
                     -
-                      ip_netmask: 0.0.0.0/0
+                      default: true
                       next_hop: {get_param: ExternalInterfaceDefaultRoute}
                 -
                   type: vlan
@@ -149,6 +157,14 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: TenantIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index f6b2a69..de9121e 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   BondInterfaceOvsOptions:
     default: ''
     description: The ovs_options string for the bond interface. Set things like
@@ -46,6 +50,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -125,6 +133,14 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  device: bond1
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 3d81f0b..0d8a0f0 100644 (file)
@@ -19,3 +19,21 @@ something like this:
 Or use this Heat environment file:
 
   environments/net-multiple-nics.yaml
+
+Configuration with System Management Network
+--------------------------------------------
+
+To enable the optional System Management network, create a Heat environment
+that looks something like this:
+
+  resource\_registry:
+    OS::TripleO::Network::Management: ../network/management.yaml
+    OS::TripleO::Controller::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::Compute::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::CephStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::SwiftStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::BlockStorage::Ports::ManagementPort: ../network/ports/management.yaml
+
+Or use this Heat environment file:
+
+  environments/network-management.yaml
index 7d650f4..a2a6b40 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -49,6 +53,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -58,12 +66,12 @@ parameters:
     description: The subnet CIDR of the control plane network.
     type: string
   ControlPlaneDefaultRoute: # Override this via parameter_defaults
-    description: The subnet CIDR of the control plane network.
+    description: The default route of the control plane network.
     type: string
   DnsServers: # Override this via parameter_defaults
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
-    type: json
+    type: comma_delimited_list
   EC2MetadataIp: # Override this via parameter_defaults
     description: The IP address of the EC2 metadata server.
     type: string
@@ -109,6 +117,14 @@ resources:
               addresses:
                 -
                   ip_netmask: {get_param: StorageMgmtIpSubnet}
+            # Uncomment when including environments/network-management.yaml
+            #-
+            #  type: interface
+            #  name: nic7
+            #  use_dhcp: false
+            #  addresses:
+            #    -
+            #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index fdb6c9d..06b4b83 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -49,6 +53,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -58,12 +66,12 @@ parameters:
     description: The subnet CIDR of the control plane network.
     type: string
   ControlPlaneDefaultRoute: # Override this via parameter_defaults
-    description: The subnet CIDR of the control plane network.
+    description: The default route of the control plane network.
     type: string
   DnsServers: # Override this via parameter_defaults
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
-    type: json
+    type: comma_delimited_list
   EC2MetadataIp: # Override this via parameter_defaults
     description: The IP address of the EC2 metadata server.
     type: string
@@ -116,6 +124,14 @@ resources:
               addresses:
                 -
                   ip_netmask: {get_param: InternalApiIpSubnet}
+            # Uncomment when including environments/network-management.yaml
+            #-
+            #  type: interface
+            #  name: nic7
+            #  use_dhcp: false
+            #  addresses:
+            #    -
+            #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 0032a28..97eef52 100644 (file)
@@ -29,6 +29,14 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
+  ExternalNetworkVlanID:
+    default: 10
+    description: Vlan ID for the external network traffic.
+    type: number
   InternalApiNetworkVlanID:
     default: 20
     description: Vlan ID for the internal_api network traffic.
@@ -37,21 +45,33 @@ parameters:
     default: 30
     description: Vlan ID for the storage network traffic.
     type: number
+  StorageMgmtNetworkVlanID:
+    default: 40
+    description: Vlan ID for the storage mgmt network traffic.
+    type: number
   TenantNetworkVlanID:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
+  ExternalInterfaceDefaultRoute:
+    default: '10.0.0.1'
+    description: default route for the external network
+    type: string
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
     type: string
   ControlPlaneDefaultRoute: # Override this via parameter_defaults
-    description: The subnet CIDR of the control plane network.
+    description: The default route of the control plane network.
     type: string
   DnsServers: # Override this via parameter_defaults
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
-    type: json
+    type: comma_delimited_list
   EC2MetadataIp: # Override this via parameter_defaults
     description: The IP address of the EC2 metadata server.
     type: string
@@ -112,6 +132,14 @@ resources:
                   use_dhcp: false
                   # force the MAC address of the bridge to this interface
                   primary: true
+            # Uncomment when including environments/network-management.yaml
+            #-
+            #  type: interface
+            #  name: nic7
+            #  use_dhcp: false
+            #  addresses:
+            #    -
+            #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 63f53a1..32851cf 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -49,6 +53,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -58,12 +66,12 @@ parameters:
     description: The subnet CIDR of the control plane network.
     type: string
   ControlPlaneDefaultRoute: # Override this via parameter_defaults
-    description: The subnet CIDR of the control plane network.
+    description: The default route of the control plane network.
     type: string
   DnsServers: # Override this via parameter_defaults
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
-    type: json
+    type: comma_delimited_list
   EC2MetadataIp: # Override this via parameter_defaults
     description: The IP address of the EC2 metadata server.
     type: string
@@ -131,13 +139,14 @@ resources:
             -
               type: ovs_bridge
               name: {get_input: bridge_name}
+              dns_servers: {get_param: DnsServers}
               use_dhcp: false
               addresses:
                 -
                   ip_netmask: {get_param: ExternalIpSubnet}
               routes:
                 -
-                  ip_netmask: 0.0.0.0/0
+                  default: true
                   next_hop: {get_param: ExternalInterfaceDefaultRoute}
               members:
                 -
@@ -145,6 +154,14 @@ resources:
                   name: nic6
                   # force the MAC address of the bridge to this interface
                   primary: true
+            # Uncomment when including environments/network-management.yaml
+            #-
+            #  type: interface
+            #  name: nic7
+            #  use_dhcp: false
+            #  addresses:
+            #    -
+            #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 00e4f35..4d5a7b9 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -49,6 +53,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -58,12 +66,12 @@ parameters:
     description: The subnet CIDR of the control plane network.
     type: string
   ControlPlaneDefaultRoute: # Override this via parameter_defaults
-    description: The subnet CIDR of the control plane network.
+    description: The default route of the control plane network.
     type: string
   DnsServers: # Override this via parameter_defaults
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
-    type: json
+    type: comma_delimited_list
   EC2MetadataIp: # Override this via parameter_defaults
     description: The IP address of the EC2 metadata server.
     type: string
@@ -116,6 +124,14 @@ resources:
               addresses:
                 -
                   ip_netmask: {get_param: InternalApiIpSubnet}
+            # Uncomment when including environments/network-management.yaml
+            #-
+            #  type: interface
+            #  name: nic7
+            #  use_dhcp: false
+            #  addresses:
+            #    -
+            #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 6f12865..f9c2e51 100644 (file)
@@ -1,9 +1,9 @@
 This directory contains Heat templates to help configure
-Vlans on a single NICs for each Overcloud role.
+Vlans on a single NIC for each Overcloud role.
 
 There are two versions of the controller role template, one with
 an external network interface, and another without. If the
-external network interface is not configured the ctlplane address
+external network interface is not configured, the ctlplane address
 ranges will be used for external (public) network traffic.
 
 Configuration
@@ -23,9 +23,27 @@ Or use this Heat environment file:
 
   environments/net-single-nic-with-vlans.yaml
 
-
 Configuration with no External Network
 --------------------------------------
+
 Same as above except set the following value for the controller role:
 
     OS::TripleO::Controller::Net::SoftwareConfig: network/config/single-nic-vlans/controller-no-external.yaml
+
+Configuration with System Management Network
+--------------------------------------------
+
+To enable the optional System Management network, create a Heat environment
+that looks something like this:
+
+  resource\_registry:
+    OS::TripleO::Network::Management: ../network/management.yaml
+    OS::TripleO::Controller::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::Compute::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::CephStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::SwiftStorage::Ports::ManagementPort: ../network/ports/management.yaml
+    OS::TripleO::BlockStorage::Ports::ManagementPort: ../network/ports/management.yaml
+
+Or use this Heat environment file:
+
+  environments/network-management.yaml
index 5148c52..80bc32d 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   StorageNetworkVlanID:
     default: 30
     description: Vlan ID for the storage network traffic.
@@ -37,6 +41,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -97,6 +105,13 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index e79a9f4..e509443 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   InternalApiNetworkVlanID:
     default: 20
     description: Vlan ID for the internal_api network traffic.
@@ -41,6 +45,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -107,6 +115,13 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 4e93b31..8cf6825 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   InternalApiNetworkVlanID:
     default: 20
     description: Vlan ID for the internal_api network traffic.
@@ -41,6 +45,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -107,6 +115,13 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: TenantIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index faf9e9c..eb5e1e5 100644 (file)
@@ -25,6 +25,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -45,6 +49,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -92,6 +100,13 @@ resources:
                   addresses:
                   -
                     ip_netmask: {get_param: TenantIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 3c536d6..3b22b36 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   ExternalNetworkVlanID:
     default: 10
     description: Vlan ID for the external network traffic.
@@ -49,6 +53,10 @@ parameters:
     default: 50
     description: Vlan ID for the tenant network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ExternalInterfaceDefaultRoute:
     default: '10.0.0.1'
     description: default route for the external network
@@ -129,6 +137,12 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: TenantIpSubnet}
+                #-  # Uncomment when including environments/network-management.yaml
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
index 83b3304..efc0339 100644 (file)
@@ -29,6 +29,10 @@ parameters:
     default: ''
     description: IP address/subnet on the tenant network
     type: string
+  ManagementIpSubnet: # Only populated when including environments/network-management.yaml
+    default: ''
+    description: IP address/subnet on the management network
+    type: string
   InternalApiNetworkVlanID:
     default: 20
     description: Vlan ID for the internal_api network traffic.
@@ -41,6 +45,10 @@ parameters:
     default: 40
     description: Vlan ID for the storage mgmt network traffic.
     type: number
+  ManagementNetworkVlanID:
+    default: 60
+    description: Vlan ID for the management network traffic.
+    type: number
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -107,6 +115,13 @@ resources:
                   addresses:
                     -
                       ip_netmask: {get_param: StorageMgmtIpSubnet}
+                # Uncomment when including environments/network-management.yaml
+                #-
+                #  type: vlan
+                #  vlan_id: {get_param: ManagementNetworkVlanID}
+                #  addresses:
+                #    -
+                #      ip_netmask: {get_param: ManagementIpSubnet}
 
 outputs:
   OS::stack_id:
diff --git a/network/management.yaml b/network/management.yaml
new file mode 100644 (file)
index 0000000..9bfaafa
--- /dev/null
@@ -0,0 +1,64 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Management network. System administration, SSH, DNS, NTP, etc. This network
+  would usually be the default gateway for the non-controller nodes.
+
+parameters:
+  # the defaults here work for static IP assignment (IPAM) only
+  ManagementNetCidr:
+    default: '10.0.1.0/24'
+    description: Cidr for the management network.
+    type: string
+  ManagementNetValueSpecs:
+    default: {'provider:physical_network': 'management', 'provider:network_type': 'flat'}
+    description: Value specs for the management network.
+    type: string
+  ManagementNetAdminStateUp:
+    default: false
+    description: This admin state of of the network.
+    type: boolean
+  ManagementNetEnableDHCP:
+    default: false
+    description: Whether to enable DHCP on the associated subnet.
+    type: boolean
+  ManagementNetShared:
+    default: false
+    description: Whether this network is shared across all tenants.
+    type: boolean
+  ManagementNetName:
+    default: management
+    description: The name of the management network.
+    type: string
+  ManagementSubnetName:
+    default: management_subnet
+    description: The name of the management subnet in Neutron.
+    type: string
+  ManagementAllocationPools:
+    default: [{'start': '10.0.1.4', 'end': '10.0.1.250'}]
+    description: Ip allocation pool range for the management network.
+    type: json
+
+resources:
+  ManagementNetwork:
+    type: OS::Neutron::Net
+    properties:
+      admin_state_up: {get_param: ManagementNetAdminStateUp}
+      name: {get_param: ManagementNetName}
+      shared: {get_param: ManagementNetShared}
+      value_specs: {get_param: ManagementNetValueSpecs}
+
+  ManagementSubnet:
+    type: OS::Neutron::Subnet
+    properties:
+      cidr: {get_param: ManagementNetCidr}
+      enable_dhcp: {get_param: ManagementNetEnableDHCP}
+      name: {get_param: ManagementSubnetName}
+      network: {get_resource: ManagementNetwork}
+      allocation_pools: {get_param: ManagementAllocationPools}
+
+outputs:
+  OS::stack_id:
+    description: Neutron management network
+    value: {get_resource: ManagementNetwork}
+
index 6618af3..ab50ae1 100644 (file)
@@ -18,3 +18,6 @@ resources:
 
   TenantNetwork:
     type: OS::TripleO::Network::Tenant
+
+  ManagementNetwork:
+    type: OS::TripleO::Network::Management
index ab6b18f..7a7043b 100644 (file)
@@ -5,6 +5,10 @@ description: >
   The IP address will be chosen automatically if FixedIPs is empty.
 
 parameters:
+  ServiceName: # Here for compatibility with from_service.yaml
+    description: Name of the service to lookup
+    default: ''
+    type: string
   NetworkName:
     description: # Here for compatibility with isolated networks
     default: ctlplane
index 4180a22..7624eb9 100644 (file)
@@ -27,6 +27,12 @@ parameters:
         [{'ip_address':'1.2.3.4'}]
     default: []
     type: json
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    type: number
 
 resources:
 
diff --git a/network/ports/external_from_pool.yaml b/network/ports/external_from_pool.yaml
new file mode 100644 (file)
index 0000000..8e9dc7c
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a network mapped list of IPs
+
+parameters:
+  ExternalNetName:
+    description: Name of the external network
+    default: external
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with noop.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  IPPool:
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex:
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
+  ExternalNetCidr:
+    default: '10.0.0.0/24'
+    description: Cidr for the external network.
+    type: string
+
+outputs:
+  ip_address:
+    description: external network IP
+    value: {get_param: [IPPool, {get_param: ExternalNetName}, {get_param: NodeIndex}]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the external network IP
+    value:
+      list_join:
+      - ''
+      - - {get_param: [IPPool, {get_param: ExternalNetName}, {get_param: NodeIndex}]}
+        - '/'
+        - {get_param: [ExternalNetCidr, -2]}
+        - {get_param: [ExternalNetCidr, -1]}
diff --git a/network/ports/from_service.yaml b/network/ports/from_service.yaml
new file mode 100644 (file)
index 0000000..6b669f4
--- /dev/null
@@ -0,0 +1,34 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a service mapped list of IPs
+
+parameters:
+  ServiceName:
+    description: Name of the service to lookup
+    default: ''
+    type: string
+  NetworkName: # Here for compatability with ctlplane_vip.yaml
+    description: Name of the network where the VIP will be created
+    default: ctlplane
+    type: string
+  PortName: # Here for compatability with ctlplane_vip.yaml
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with ctlplane_vip.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  ControlPlaneNetwork: # Here for compatability with ctlplane_vip.yaml
+    description: The name of the undercloud Neutron control plane
+    default: ctlplane
+    type: string
+  ServiceVips:
+    default: {}
+    type: json
+
+outputs:
+  ip_address:
+    description: network IP
+    value: {get_param: [ServiceVips, {get_param: ServiceName}]}
index 01cdfe9..f84e8f7 100644 (file)
@@ -22,6 +22,12 @@ parameters:
         [{'ip_address':'1.2.3.4'}]
     default: []
     type: json
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    type: number
 
 resources:
 
diff --git a/network/ports/internal_api_from_pool.yaml b/network/ports/internal_api_from_pool.yaml
new file mode 100644 (file)
index 0000000..b98e1fb
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a network mapped list of IPs
+
+parameters:
+  InternalApiNetName:
+    description: Name of the internal API network
+    default: internal_api
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with noop.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  IPPool:
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex:
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
+  InternalApiNetCidr:
+    default: '172.16.2.0/24'
+    description: Cidr for the internal API network.
+    type: string
+
+outputs:
+  ip_address:
+    description: internal API network IP
+    value: {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the internal API network IP
+    value:
+      list_join:
+      - ''
+      - - {get_param: [IPPool, {get_param: InternalApiNetName}, {get_param: NodeIndex}]}
+        - '/'
+        - {get_param: [InternalApiNetCidr, -2]}
+        - {get_param: [InternalApiNetCidr, -1]}
diff --git a/network/ports/management.yaml b/network/ports/management.yaml
new file mode 100644 (file)
index 0000000..1d15ca6
--- /dev/null
@@ -0,0 +1,42 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Creates a port on the management network. The IP address will be chosen
+  automatically if FixedIPs is empty.
+
+parameters:
+  ManagementNetName:
+    description: Name of the management neutron network
+    default: management
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatibility with noop.yaml
+    description: IP address on the control plane
+    type: string
+
+resources:
+
+  ManagementPort:
+    type: OS::Neutron::Port
+    properties:
+      network: {get_param: ManagementNetName}
+      name: {get_param: PortName}
+      replacement_policy: AUTO
+
+outputs:
+  ip_address:
+    description: management network IP
+    value: {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the management network IP
+    value:
+          list_join:
+            - ''
+            - - {get_attr: [ManagementPort, fixed_ips, 0, ip_address]}
+              - '/'
+              - {get_attr: [ManagementPort, subnets, 0, cidr, -2]}
+              - {get_attr: [ManagementPort, subnets, 0, cidr, -1]}
index 257d3f9..32272bd 100644 (file)
@@ -19,6 +19,9 @@ parameters:
   TenantIpList:
     default: []
     type: comma_delimited_list
+  ManagementIpList:
+    default: []
+    type: comma_delimited_list
 
 outputs:
   net_ip_map:
@@ -32,3 +35,4 @@ outputs:
       storage: {get_param: StorageIpList}
       storage_mgmt: {get_param: StorageMgmtIpList}
       tenant: {get_param: TenantIpList}
+      management: {get_param: ManagementIpList}
index 7aaed16..c638602 100644 (file)
@@ -19,6 +19,9 @@ parameters:
   TenantIp:
     default: ''
     type: string
+  ManagementIp:
+    default: ''
+    type: string
 
 outputs:
   net_ip_map:
@@ -32,3 +35,4 @@ outputs:
       storage: {get_param: StorageIp}
       storage_mgmt: {get_param: StorageMgmtIp}
       tenant: {get_param: TenantIp}
+      management: {get_param: ManagementIp}
index cf59adb..2f933ea 100644 (file)
@@ -19,6 +19,9 @@ parameters:
   TenantIpSubnet:
     default: ''
     type: string
+  ManagementIpSubnet:
+    default: ''
+    type: string
   ControlPlaneSubnetCidr: # Override this via parameter_defaults
     default: '24'
     description: The subnet CIDR of the control plane network.
@@ -41,3 +44,4 @@ outputs:
       storage: {get_param: StorageIpSubnet}
       storage_mgmt: {get_param: StorageMgmtIpSubnet}
       tenant: {get_param: TenantIpSubnet}
+      management: {get_param: ManagementIpSubnet}
index 36426b3..23e1f99 100644 (file)
@@ -2,7 +2,7 @@ heat_template_version: 2015-04-30
 
 parameters:
   # Set these via parameter defaults to configure external VIPs
-  ControlNetworkVip:
+  ControlPlaneIP:
     default: ''
     type: string
   ExternalNetworkVip:
@@ -43,7 +43,7 @@ outputs:
       A Hash containing a mapping of network names to assigned IPs
       for a specific machine.
     value:
-      ctlplane: {get_param: ControlNetworkVip}
+      ctlplane: {get_param: ControlPlaneIP}
       external: {get_param: ExternalNetworkVip}
       internal_api: {get_param: InternalApiNetworkVip}
       storage: {get_param: StorageNetworkVip}
index 028624f..ac946cd 100644 (file)
@@ -4,6 +4,10 @@ description: >
   Returns the control plane port (provisioning network) as the ip_address.
 
 parameters:
+  ServiceName: # Here for compatibility with from_service.yaml
+    description: Name of the service to lookup
+    default: ''
+    type: string
   ControlPlaneIP:
     description: IP address on the control plane
     type: string
@@ -27,6 +31,14 @@ parameters:
     default: '24'
     description: The subnet CIDR of the control plane network.
     type: string
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
 
 outputs:
   ip_address:
index 1d2384c..a07e5a4 100644 (file)
@@ -22,6 +22,12 @@ parameters:
         [{'ip_address':'1.2.3.4'}]
     default: []
     type: json
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    type: number
 
 resources:
 
diff --git a/network/ports/storage_from_pool.yaml b/network/ports/storage_from_pool.yaml
new file mode 100644 (file)
index 0000000..668bc6f
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a network mapped list of IPs
+
+parameters:
+  StorageNetName:
+    description: Name of the storage network
+    default: storage
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with noop.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  IPPool:
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex:
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
+  StorageNetCidr:
+    default: '172.16.1.0/24'
+    description: Cidr for the storage network.
+    type: string
+
+outputs:
+  ip_address:
+    description: storage network IP
+    value: {get_param: [IPPool, {get_param: StorageNetName}, {get_param: NodeIndex}]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the storage network IP
+    value:
+      list_join:
+      - ''
+      - - {get_param: [IPPool, {get_param: StorageNetName}, {get_param: NodeIndex}]}
+        - '/'
+        - {get_param: [StorageNetCidr, -2]}
+        - {get_param: [StorageNetCidr, -1]}
index f10e358..4890bf5 100644 (file)
@@ -22,6 +22,12 @@ parameters:
         [{'ip_address':'1.2.3.4'}]
     default: []
     type: json
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    type: number
 
 resources:
 
diff --git a/network/ports/storage_mgmt_from_pool.yaml b/network/ports/storage_mgmt_from_pool.yaml
new file mode 100644 (file)
index 0000000..bea8710
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a network mapped list of IPs
+
+parameters:
+  StorageMgmtNetName:
+    description: Name of the storage MGMT network
+    default: storage_mgmt
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with noop.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  IPPool:
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex:
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
+  StorageMgmtNetCidr:
+    default: '172.16.3.0/24'
+    description: Cidr for the storage MGMT network.
+    type: string
+
+outputs:
+  ip_address:
+    description: storage MGMT network IP
+    value: {get_param: [IPPool, {get_param: StorageMgmtNetName}, {get_param: NodeIndex}]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the storage MGMT network IP
+    value:
+      list_join:
+      - ''
+      - - {get_param: [IPPool, {get_param: StorageMgmtNetName}, {get_param: NodeIndex}]}
+        - '/'
+        - {get_param: [StorageMgmtNetCidr, -2]}
+        - {get_param: [StorageMgmtNetCidr, -1]}
index ccdc57e..86c58f2 100644 (file)
@@ -22,6 +22,12 @@ parameters:
         [{'ip_address':'1.2.3.4'}]
     default: []
     type: json
+  IPPool: # Here for compatibility with from_pool.yaml
+    default: {}
+    type: json
+  NodeIndex: # Here for compatibility with from_pool.yaml
+    default: 0
+    type: number
 
 resources:
 
diff --git a/network/ports/tenant_from_pool.yaml b/network/ports/tenant_from_pool.yaml
new file mode 100644 (file)
index 0000000..29303bb
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+
+description: >
+  Returns an IP from a network mapped list of IPs
+
+parameters:
+  TenantNetName:
+    description: Name of the tenant network
+    default: tenant
+    type: string
+  PortName:
+    description: Name of the port
+    default: ''
+    type: string
+  ControlPlaneIP: # Here for compatability with noop.yaml
+    description: IP address on the control plane
+    default: ''
+    type: string
+  IPPool:
+    default: {}
+    description: A network mapped list of IPs
+    type: json
+  NodeIndex:
+    default: 0
+    description: Index of the IP to get from Pool
+    type: number
+  TenantNetCidr:
+    default: '172.16.0.0/24'
+    description: Cidr for the tenant network.
+    type: string
+
+outputs:
+  ip_address:
+    description: tenant network IP
+    value: {get_param: [IPPool, {get_param: TenantNetName}, {get_param: NodeIndex}]}
+  ip_subnet:
+    # FIXME: this assumes a 2 digit subnet CIDR (need more heat functions?)
+    description: IP/Subnet CIDR for the tenant network IP
+    value:
+      list_join:
+      - ''
+      - - {get_param: [IPPool, {get_param: TenantNetName}, {get_param: NodeIndex}]}
+        - '/'
+        - {get_param: [TenantNetCidr, -2]}
+        - {get_param: [TenantNetCidr, -1]}
index ab6cd2c..9bb6cde 100644 (file)
@@ -5,6 +5,10 @@ description: >
   The IP address will be chosen automatically if FixedIPs is empty.
 
 parameters:
+  ServiceName: # Here for compatibility with from_service.yaml
+    description: Name of the service to lookup
+    default: ''
+    type: string
   NetworkName:
     description: Name of the network where the VIP will be created
     default: internal_api
index 77368d0..888a3c8 100644 (file)
@@ -61,40 +61,59 @@ resource_registry:
   OS::TripleO::Network::StorageMgmt: network/noop.yaml
   OS::TripleO::Network::Storage: network/noop.yaml
   OS::TripleO::Network::Tenant: network/noop.yaml
+  OS::TripleO::Network::Management: network/noop.yaml
 
   OS::TripleO::Network::Ports::NetVipMap: network/ports/net_ip_map.yaml
   OS::TripleO::Network::Ports::NetIpMap: network/ports/net_ip_map.yaml
   OS::TripleO::Network::Ports::NetIpSubnetMap: network/ports/net_ip_subnet_map.yaml
   OS::TripleO::Network::Ports::NetIpListMap: network/ports/net_ip_list_map.yaml
 
+  # Port assignments for the VIPs
+  OS::TripleO::Network::Ports::ExternalVipPort: network/ports/noop.yaml
+  OS::TripleO::Network::Ports::InternalApiVipPort: network/ports/noop.yaml
+  OS::TripleO::Network::Ports::StorageVipPort: network/ports/noop.yaml
+  OS::TripleO::Network::Ports::StorageMgmtVipPort: network/ports/noop.yaml
+  OS::TripleO::Network::Ports::RedisVipPort: network/ports/ctlplane_vip.yaml
+
   # Port assignments for the controller role
   OS::TripleO::Controller::Ports::ExternalPort: network/ports/noop.yaml
   OS::TripleO::Controller::Ports::InternalApiPort: network/ports/noop.yaml
   OS::TripleO::Controller::Ports::StoragePort: network/ports/noop.yaml
   OS::TripleO::Controller::Ports::StorageMgmtPort: network/ports/noop.yaml
   OS::TripleO::Controller::Ports::TenantPort: network/ports/noop.yaml
+  OS::TripleO::Controller::Ports::ManagementPort: network/ports/noop.yaml
 
   # Port assignments for the compute role
+  OS::TripleO::Compute::Ports::ExternalPort: network/ports/noop.yaml
   OS::TripleO::Compute::Ports::InternalApiPort: network/ports/noop.yaml
   OS::TripleO::Compute::Ports::StoragePort: network/ports/noop.yaml
+  OS::TripleO::Compute::Ports::StorageMgmtPort: network/ports/noop.yaml
   OS::TripleO::Compute::Ports::TenantPort: network/ports/noop.yaml
+  OS::TripleO::Compute::Ports::ManagementPort: network/ports/noop.yaml
 
   # Port assignments for the ceph storage role
+  OS::TripleO::CephStorage::Ports::ExternalPort: network/ports/noop.yaml
+  OS::TripleO::CephStorage::Ports::InternalApiPort: network/ports/noop.yaml
   OS::TripleO::CephStorage::Ports::StoragePort: network/ports/noop.yaml
   OS::TripleO::CephStorage::Ports::StorageMgmtPort: network/ports/noop.yaml
+  OS::TripleO::CephStorage::Ports::TenantPort: network/ports/noop.yaml
+  OS::TripleO::CephStorage::Ports::ManagementPort: network/ports/noop.yaml
 
   # Port assignments for the swift storage role
+  OS::TripleO::SwiftStorage::Ports::ExternalPort: network/ports/noop.yaml
   OS::TripleO::SwiftStorage::Ports::InternalApiPort: network/ports/noop.yaml
   OS::TripleO::SwiftStorage::Ports::StoragePort: network/ports/noop.yaml
   OS::TripleO::SwiftStorage::Ports::StorageMgmtPort: network/ports/noop.yaml
+  OS::TripleO::SwiftStorage::Ports::TenantPort: network/ports/noop.yaml
+  OS::TripleO::SwiftStorage::Ports::ManagementPort: network/ports/noop.yaml
 
   # Port assignments for the block storage role
+  OS::TripleO::BlockStorage::Ports::ExternalPort: network/ports/noop.yaml
   OS::TripleO::BlockStorage::Ports::InternalApiPort: network/ports/noop.yaml
   OS::TripleO::BlockStorage::Ports::StoragePort: network/ports/noop.yaml
   OS::TripleO::BlockStorage::Ports::StorageMgmtPort: network/ports/noop.yaml
-
-  # Port assignments for service virtual IPs for the controller role
-  OS::TripleO::Controller::Ports::RedisVipPort: network/ports/ctlplane_vip.yaml
+  OS::TripleO::BlockStorage::Ports::TenantPort: network/ports/noop.yaml
+  OS::TripleO::BlockStorage::Ports::ManagementPort: network/ports/noop.yaml
 
   # Service Endpoint Mappings
   OS::TripleO::Endpoint: network/endpoints/endpoint.yaml
index 28016e3..738dcfb 100644 (file)
@@ -13,7 +13,6 @@ parameters:
 
   # Common parameters (not specific to a role)
   AdminPassword:
-    default: unset
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
@@ -22,12 +21,10 @@ parameters:
     description: The ceilometer backend type.
     type: string
   CeilometerMeteringSecret:
-    default: unset
     description: Secret shared by the ceilometer services.
     type: string
     hidden: true
   CeilometerPassword:
-    default: unset
     description: The password for the ceilometer service account.
     type: string
     hidden: true
@@ -138,7 +135,6 @@ parameters:
     description: The tenant network type for Neutron.
     type: comma_delimited_list
   NeutronPassword:
-    default: unset
     description: The password for the neutron service account, used by neutron agents.
     type: string
     hidden: true
@@ -169,7 +165,6 @@ parameters:
     description: Whether to configure Neutron Distributed Virtual Routers
     type: string
   NeutronMetadataProxySharedSecret:
-    default: 'unset'
     description: Shared secret to prevent spoofing
     type: string
     hidden: true
@@ -225,7 +220,6 @@ parameters:
     default: 1
     description: The number of neutron dhcp agents to schedule per network
   NovaPassword:
-    default: unset
     description: The password for the nova service account, used by nova-api.
     type: string
     hidden: true
@@ -277,7 +271,6 @@ parameters:
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
@@ -296,7 +289,6 @@ parameters:
 
   # Controller-specific params
   AdminToken:
-    default: unset
     description: The keystone auth secret.
     type: string
     hidden: true
@@ -317,7 +309,6 @@ parameters:
       CinderEnableNfsBackend is true.
     type: comma_delimited_list
   CinderPassword:
-    default: unset
     description: The password for the cinder service account, used by cinder-api.
     type: string
     hidden: true
@@ -419,7 +410,6 @@ parameters:
     type: string
     default: noop
   GlancePassword:
-    default: unset
     description: The password for the glance service account, used by the glance services.
     type: string
     hidden: true
@@ -431,14 +421,12 @@ parameters:
     constraints:
     - allowed_values: ['swift', 'file', 'rbd']
   HeatPassword:
-    default: unset
     description: The password for the Heat service account, used by the Heat services.
     type: string
     hidden: true
   HeatStackDomainAdminPassword:
     description: Password for heat_domain_admin user.
     type: string
-    default: ''
     hidden: true
   InstanceNameTemplate:
     default: 'instance-%08x'
@@ -518,12 +506,10 @@ parameters:
         This should be int_public when a VLAN is being used.
     type: string
   SwiftHashSuffix:
-    default: unset
     description: A random string to be used as a salt when hashing to determine mappings in the ring.
     type: string
     hidden: true
   SwiftPassword:
-    default: unset
     description: The password for the swift service account, used by the swift proxy services.
     type: string
     hidden: true
@@ -1143,6 +1129,7 @@ resources:
       StorageIpList: {get_attr: [Controller, storage_ip_address]}
       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
+      ManagementIpList: {get_attr: [Controller, management_ip_address]}
 
   allNodesConfig:
     type: OS::TripleO::AllNodes::SoftwareConfig
@@ -1205,17 +1192,18 @@ resources:
 
   RedisVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::RedisVipPort
+    type: OS::TripleO::Network::Ports::RedisVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
       PortName: redis_virtual_ip
       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
+      ServiceName: redis
 
   # The public VIP is on the External net, falls back to ctlplane
   PublicVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::ExternalPort
+    type: OS::TripleO::Network::Ports::ExternalVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
@@ -1224,21 +1212,21 @@ resources:
 
   InternalApiVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::InternalApiPort
+    type: OS::TripleO::Network::Ports::InternalApiVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: internal_api_virtual_ip
 
   StorageVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::StoragePort
+    type: OS::TripleO::Network::Ports::StorageVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: storage_virtual_ip
 
   StorageMgmtVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::StorageMgmtPort
+    type: OS::TripleO::Network::Ports::StorageMgmtVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: storage_management_virtual_ip
@@ -1251,7 +1239,7 @@ resources:
       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
-      # No tenant VIP required
+      # No tenant or management VIP required
 
   VipConfig:
     type: OS::TripleO::VipConfig
@@ -1544,7 +1532,7 @@ outputs:
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
   HostsEntry:
     description: |
-      The content that should be appended to your /etc/hosts if you want do get
+      The content that should be appended to your /etc/hosts if you want to get
       hostname-based access to the deployed nodes (useful for testing without
       setting up a DNS).
     value: {get_attr: [allNodesConfig, hosts_entries]}
index 895ddc3..9dd4368 100644 (file)
@@ -261,7 +261,7 @@ outputs:
       {get_resource: allNodesConfigImpl}
   hosts_entries:
     description: |
-      The content that should be appended to your /etc/hosts if you want do get
+      The content that should be appended to your /etc/hosts if you want to get
       hostname-based access to the deployed nodes (useful for testing without
       setting up a DNS).
     value: {get_attr: [allNodesConfigImpl, config, hosts]}
index b6a1007..ede1263 100644 (file)
@@ -59,6 +59,13 @@ parameters:
     description: >
       Heat action when to apply network configuration changes
     default: ['CREATE']
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
   CloudDomain:
     default: ''
     type: string
@@ -89,6 +96,7 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
       metadata: {get_param: ServerMetadata}
       scheduler_hints: {get_param: SchedulerHints}
 
@@ -112,6 +120,16 @@ resources:
   NodeUserData:
     type: OS::TripleO::NodeUserData
 
+  ExternalPort:
+    type: OS::TripleO::CephStorage::Ports::ExternalPort
+    properties:
+      ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
+
+  InternalApiPort:
+    type: OS::TripleO::CephStorage::Ports::InternalApiPort
+    properties:
+      ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
+
   StoragePort:
     type: OS::TripleO::CephStorage::Ports::StoragePort
     properties:
@@ -122,26 +140,48 @@ resources:
     properties:
       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
 
+  TenantPort:
+    type: OS::TripleO::CephStorage::Ports::TenantPort
+    properties:
+      ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
+
+  ManagementPort:
+    type: OS::TripleO::CephStorage::Ports::ManagementPort
+    properties:
+      ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
+
   NetworkConfig:
     type: OS::TripleO::CephStorage::Net::SoftwareConfig
     properties:
       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
+      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetIpMap:
     type: OS::TripleO::Network::Ports::NetIpMap
     properties:
       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
+      ExternalIp: {get_attr: [ExternalPort, ip_address]}
+      InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetIpSubnetMap:
     type: OS::TripleO::Network::Ports::NetIpSubnetMap
     properties:
       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
+      InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -241,12 +281,24 @@ outputs:
     description: Heat resource handle for the ceph storage server
     value:
       {get_resource: CephStorage}
+  external_ip_address:
+    description: IP address of the server in the external network
+    value: {get_attr: [ExternalPort, ip_address]}
+  internal_api_ip_address:
+    description: IP address of the server in the internal_api network
+    value: {get_attr: [InternalApiPort, ip_address]}
   storage_ip_address:
     description: IP address of the server in the storage network
     value: {get_attr: [StoragePort, ip_address]}
   storage_mgmt_ip_address:
     description: IP address of the server in the storage_mgmt network
     value: {get_attr: [StorageMgmtPort, ip_address]}
+  tenant_ip_address:
+    description: IP address of the server in the tenant network
+    value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   config_identifier:
     description: identifier which changes if the node configuration may need re-applying
     value:
index fc19705..9fdd012 100644 (file)
@@ -17,7 +17,6 @@ parameters:
     description: The size of the loopback file used by the cinder LVM driver.
     type: number
   CinderPassword:
-    default: unset
     description: The password for the cinder service and db account, used by cinder-api.
     type: string
     hidden: true
@@ -70,7 +69,6 @@ parameters:
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
@@ -112,6 +110,13 @@ parameters:
     description: >
       Heat action when to apply network configuration changes
     default: ['CREATE']
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
   CloudDomain:
     default: ''
     type: string
@@ -143,6 +148,7 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
       metadata: {get_param: ServerMetadata}
       scheduler_hints: {get_param: SchedulerHints}
 
@@ -166,6 +172,11 @@ resources:
   NodeUserData:
     type: OS::TripleO::NodeUserData
 
+  ExternalPort:
+    type: OS::TripleO::BlockStorage::Ports::ExternalPort
+    properties:
+      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
+
   InternalApiPort:
     type: OS::TripleO::BlockStorage::Ports::InternalApiPort
     properties:
@@ -181,21 +192,37 @@ resources:
     properties:
       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
 
+  TenantPort:
+    type: OS::TripleO::BlockStorage::Ports::TenantPort
+    properties:
+      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
+
+  ManagementPort:
+    type: OS::TripleO::BlockStorage::Ports::ManagementPort
+    properties:
+      ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
+
   NetworkConfig:
     type: OS::TripleO::BlockStorage::Net::SoftwareConfig
     properties:
       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetIpMap:
     type: OS::TripleO::Network::Ports::NetIpMap
     properties:
       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
+      ExternalIp: {get_attr: [ExternalPort, ip_address]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -316,6 +343,9 @@ outputs:
     description: Heat resource handle for the block storage server
     value:
       {get_resource: BlockStorage}
+  external_ip_address:
+    description: IP address of the server in the external network
+    value: {get_attr: [ExternalPort, ip_address]}
   internal_api_ip_address:
     description: IP address of the server in the internal_api network
     value: {get_attr: [InternalApiPort, ip_address]}
@@ -325,6 +355,12 @@ outputs:
   storage_mgmt_ip_address:
     description: IP address of the server in the storage_mgmt network
     value: {get_attr: [StorageMgmtPort, ip_address]}
+  tenant_ip_address:
+    description: IP address of the server in the tenant network
+    value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   config_identifier:
     description: identifier which changes if the node configuration may need re-applying
     value:
index 10ae4c3..7269d73 100644 (file)
@@ -5,7 +5,6 @@ description: >
 
 parameters:
   AdminPassword:
-    default: unset
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
@@ -16,12 +15,10 @@ parameters:
     constraints:
     - allowed_values: ['', Present]
   CeilometerMeteringSecret:
-    default: unset
     description: Secret shared by the ceilometer services.
     type: string
     hidden: true
   CeilometerPassword:
-    default: unset
     description: The password for the ceilometer service account.
     type: string
     hidden: true
@@ -110,7 +107,6 @@ parameters:
       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
     type: comma_delimited_list
   NeutronPassword:
-    default: unset
     description: The password for the neutron service account, used by neutron agents.
     type: string
     hidden: true
@@ -146,7 +142,6 @@ parameters:
     default: 'False'
     type: string
   NeutronMetadataProxySharedSecret:
-    default: 'unset'
     description: Shared secret to prevent spoofing
     type: string
     hidden: true
@@ -210,7 +205,6 @@ parameters:
     description: Whether to enable or not the Rbd backend for Nova
     type: boolean
   NovaPassword:
-    default: unset
     description: The password for the nova service account, used by nova-api.
     type: string
     hidden: true
@@ -256,7 +250,6 @@ parameters:
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
@@ -288,6 +281,13 @@ parameters:
     description: >
       Heat action when to apply network configuration changes
     default: ['CREATE']
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
   CloudDomain:
     default: ''
     type: string
@@ -321,6 +321,7 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
       metadata: {get_param: ServerMetadata}
       scheduler_hints: {get_param: SchedulerHints}
 
@@ -344,6 +345,11 @@ resources:
   NodeUserData:
     type: OS::TripleO::NodeUserData
 
+  ExternalPort:
+    type: OS::TripleO::Compute::Ports::ExternalPort
+    properties:
+      ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+
   InternalApiPort:
     type: OS::TripleO::Compute::Ports::InternalApiPort
     properties:
@@ -354,26 +360,42 @@ resources:
     properties:
       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
 
+  StorageMgmtPort:
+    type: OS::TripleO::Compute::Ports::StorageMgmtPort
+    properties:
+      ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+
   TenantPort:
     type: OS::TripleO::Compute::Ports::TenantPort
     properties:
       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
 
+  ManagementPort:
+    type: OS::TripleO::Compute::Ports::ManagementPort
+    properties:
+      ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+
   NetIpMap:
     type: OS::TripleO::Network::Ports::NetIpMap
     properties:
       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+      ExternalIp: {get_attr: [ExternalPort, ip_address]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
+      StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetworkConfig:
     type: OS::TripleO::Compute::Net::SoftwareConfig
     properties:
       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
+      StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -404,6 +426,7 @@ resources:
             - common
             - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
             - nova_nuage_data  # Optionally provided by ComputeExtraConfigPre
+            - midonet_data # Optionally provided by AllNodesExtraConfig
           datafiles:
             compute_extraconfig:
               mapped_data: {get_param: NovaComputeExtraConfig}
@@ -620,15 +643,24 @@ outputs:
   ip_address:
     description: IP address of the server in the ctlplane network
     value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
+  external_ip_address:
+    description: IP address of the server in the external network
+    value: {get_attr: [ExternalPort, ip_address]}
   internal_api_ip_address:
     description: IP address of the server in the internal_api network
     value: {get_attr: [InternalApiPort, ip_address]}
   storage_ip_address:
     description: IP address of the server in the storage network
     value: {get_attr: [StoragePort, ip_address]}
+  storage_mgmt_ip_address:
+    description: IP address of the server in the storage_mgmt network
+    value: {get_attr: [StorageMgmtPort, ip_address]}
   tenant_ip_address:
     description: IP address of the server in the tenant network
     value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   hostname:
     description: Hostname of the server
     value: {get_attr: [NovaCompute, name]}
index 9b48cf5..0d5443b 100644 (file)
@@ -10,12 +10,10 @@ parameters:
     type: string
     hidden: true
   AdminPassword:
-    default: unset
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
   AdminToken:
-    default: unset
     description: The keystone auth secret and db password.
     type: string
     hidden: true
@@ -27,18 +25,20 @@ parameters:
     description: The ceilometer backend type.
     type: string
   CeilometerMeteringSecret:
-    default: unset
     description: Secret shared by the ceilometer services.
     type: string
     hidden: true
   CeilometerPassword:
-    default: unset
     description: The password for the ceilometer service  and db account.
     type: string
     hidden: true
   CinderApiVirtualIP:
     type: string
     default: ''
+  CeilometerWorkers:
+    default: 0
+    description: Number of workers for Ceilometer service.
+    type: number
   CinderEnableNfsBackend:
     default: false
     description: Whether to enable or not the NFS backend for Cinder
@@ -72,7 +72,6 @@ parameters:
       CinderEnableNfsBackend is true.
     type: comma_delimited_list
   CinderPassword:
-    default: unset
     description: The password for the cinder service and db account, used by cinder-api.
     type: string
     hidden: true
@@ -81,6 +80,10 @@ parameters:
     description: Contains parameters to configure Cinder backends. Typically
                  set via parameter_defaults in the resource registry.
     type: json
+  CinderWorkers:
+    default: 0
+    description: Number of workers for Cinder service.
+    type: number
   CloudName:
     default: overcloud
     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
@@ -90,6 +93,15 @@ parameters:
     description: |
       Controller specific hiera configuration data to inject into the cluster.
     type: json
+  ControllerIPs:
+    default: {}
+    description: >
+      A network mapped list of IPs to assign to Controllers in the following form:
+      {
+        "internal_api": ["a.b.c.d", "e.f.g.h"],
+        ...
+      }
+    type: json
   ControlVirtualInterface:
     default: 'br-ex'
     description: Interface where virtual ip will be assigned.
@@ -170,7 +182,6 @@ parameters:
     type: string
     default: ''
   GlancePassword:
-    default: unset
     description: The password for the glance service and db account, used by the glance services.
     type: string
     hidden: true
@@ -209,15 +220,17 @@ parameters:
     default: /dev/log
     description: Syslog address where HAproxy will send its log
     type: string
+  GlanceWorkers:
+    default: 0
+    description: Number of workers for Glance service.
+    type: number
   HeatPassword:
-    default: unset
     description: The password for the Heat service and db account, used by the Heat services.
     type: string
     hidden: true
   HeatStackDomainAdminPassword:
     description: Password for heat_domain_admin user.
     type: string
-    default: ''
     hidden: true
   HeatAuthEncryptionKey:
     description: Auth encryption key for heat-engine
@@ -227,6 +240,10 @@ parameters:
     default: '*'
     description: A list of IP/Hostname allowed to connect to horizon
     type: comma_delimited_list
+  HeatWorkers:
+    default: 0
+    description: Number of workers for Heat service.
+    type: number
   HorizonSecret:
     description: Secret key for Django
     type: string
@@ -294,6 +311,10 @@ parameters:
     default: false
     description: Whether IPtables rules should be purged before setting up the new ones.
     type: boolean
+  KeystoneWorkers:
+    default: 0
+    description: Number of workers for Keystone service.
+    type: number
   MysqlClusterUniquePart:
     description: A unique identifier of the MySQL cluster the controller is in.
     type: string
@@ -367,7 +388,6 @@ parameters:
     description: Whether to configure Neutron Distributed Virtual Routers
     type: string
   NeutronMetadataProxySharedSecret:
-    default: 'unset'
     description: Shared secret to prevent spoofing
     type: string
     hidden: true
@@ -429,7 +449,6 @@ parameters:
       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
     type: comma_delimited_list
   NeutronPassword:
-    default: unset
     description: The password for the neutron service and db account, used by neutron agents.
     type: string
     hidden: true
@@ -479,11 +498,23 @@ parameters:
   NovaApiVirtualIP:
     type: string
     default: ''
+  NeutronWorkers:
+    default: 0
+    description: Number of workers for Neutron service.
+    type: number
+  NovaEnableDBPurge:
+    default: true
+    description: |
+        Whether to create cron job for purging soft deleted rows in Nova database.
+    type: boolean
   NovaPassword:
-    default: unset
     description: The password for the nova service and db account, used by nova-api.
     type: string
     hidden: true
+  NovaWorkers:
+    default: 0
+    description: Number of workers for Nova service.
+    type: number
   MongoDbNoJournal:
     default: false
     description: Should MongoDb journaling be disabled
@@ -540,12 +571,10 @@ parameters:
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
   SwiftHashSuffix:
-    default: unset
     description: A random string to be used as a salt when hashing to determine mappings
       in the ring.
     hidden: true
@@ -563,7 +592,6 @@ parameters:
     description: Partition Power to use when building Swift rings
     type: number
   SwiftPassword:
-    default: unset
     description: The password for the swift service account, used by the swift proxy
       services.
     hidden: true
@@ -575,6 +603,10 @@ parameters:
     type: number
     default: 3
     description: How many replicas to use in the swift rings.
+  SwiftWorkers:
+    default: 0
+    description: Number of workers for Swift service.
+    type: number
   VirtualIP: # DEPRECATED: use per service settings instead
     type: string
     default: ''  # Has to be here because of the ignored empty value bug
@@ -630,6 +662,13 @@ parameters:
   NodeIndex:
     type: number
     default: 0
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
   CloudDomain:
     default: ''
     type: string
@@ -661,6 +700,7 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
       metadata: {get_param: ServerMetadata}
       scheduler_hints: {get_param: SchedulerHints}
 
@@ -687,25 +727,40 @@ resources:
   ExternalPort:
     type: OS::TripleO::Controller::Ports::ExternalPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   InternalApiPort:
     type: OS::TripleO::Controller::Ports::InternalApiPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   StoragePort:
     type: OS::TripleO::Controller::Ports::StoragePort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   StorageMgmtPort:
     type: OS::TripleO::Controller::Ports::StorageMgmtPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   TenantPort:
     type: OS::TripleO::Controller::Ports::TenantPort
+    properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
+      ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
+
+  ManagementPort:
+    type: OS::TripleO::Controller::Ports::ManagementPort
     properties:
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
@@ -718,6 +773,7 @@ resources:
       StorageIp: {get_attr: [StoragePort, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetIpSubnetMap:
     type: OS::TripleO::Network::Ports::NetIpSubnetMap
@@ -728,6 +784,7 @@ resources:
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkConfig:
     type: OS::TripleO::Controller::Net::SoftwareConfig
@@ -738,6 +795,7 @@ resources:
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -772,6 +830,14 @@ resources:
       server: {get_resource: Controller}
       input_values:
         bootstack_nodeid: {get_attr: [Controller, name]}
+        ceilometer_workers: {get_param: CeilometerWorkers}
+        cinder_workers: {get_param: CinderWorkers}
+        glance_workers: {get_param: GlanceWorkers}
+        heat_workers: {get_param: HeatWorkers}
+        keystone_workers: {get_param: KeystoneWorkers}
+        nova_workers: {get_param: NovaWorkers}
+        neutron_workers: {get_param: NeutronWorkers}
+        swift_workers: {get_param: SwiftWorkers}
         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
         neutron_enable_l2pop: {get_param: NeutronEnableL2Pop}
         neutron_enable_isolated_metadata: {get_param: NeutronEnableIsolatedMetadata}
@@ -985,6 +1051,7 @@ resources:
               - '/ceilometer'
         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
+        nova_enable_db_purge: {get_param: NovaEnableDBPurge}
         nova_password: {get_param: NovaPassword}
         nova_dsn:
           list_join:
@@ -1079,6 +1146,7 @@ resources:
             - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
             - neutron_nuage_data # Optionally provided by ControllerExtraConfigPre
+            - midonet_data #Optionally provided by AllNodesExtraConfig
           datafiles:
             controller_extraconfig:
               mapped_data: {get_param: ControllerExtraConfig}
@@ -1114,6 +1182,7 @@ resources:
                 swift::storage::all::storage_local_net_ip: {get_input: swift_management_network}
                 swift::swift_hash_suffix: {get_input: swift_hash_suffix}
                 swift::proxy::authtoken::admin_password: {get_input: swift_password}
+                swift::proxy::workers: {get_input: swift_workers}
                 tripleo::ringbuilder::part_power: {get_input: swift_part_power}
                 tripleo::ringbuilder::replicas: {get_input: swift_replicas}
                 tripleo::ringbuilder::min_part_hours: {get_input: swift_min_part_hours}
@@ -1154,6 +1223,7 @@ resources:
                 glance::api::registry_host: {get_input: glance_registry_host}
                 glance::api::keystone_password: {get_input: glance_password}
                 glance::api::debug: {get_input: debug}
+                glance::api::workers: {get_input: glance_workers}
                 glance_notifier_strategy: {get_input: glance_notifier_strategy}
                 glance_log_file: {get_input: glance_log_file}
                 glance_log_file: {get_input: glance_log_file}
@@ -1165,6 +1235,7 @@ resources:
                 glance::registry::identity_uri: {get_input: keystone_identity_uri}
                 glance::registry::debug: {get_input: debug}
                 glance::backend::swift::swift_store_auth_address: {get_input: keystone_auth_uri}
+                glance::registry::workers: {get_input: glance_workers}
                 glance::backend::swift::swift_store_user: service:glance
                 glance::backend::swift::swift_store_key: {get_input: glance_password}
                 glance_backend: {get_input: glance_backend}
@@ -1189,8 +1260,11 @@ resources:
                 heat::identity_uri: {get_input: keystone_identity_uri}
                 heat::keystone_password: {get_input: heat_password}
                 heat::api::bind_host: {get_input: heat_api_network}
+                heat::api::workers: {get_input: heat_workers}
                 heat::api_cloudwatch::bind_host: {get_input: heat_api_network}
+                heat::api_cloudwatch::workers: {get_input: heat_workers}
                 heat::api_cfn::bind_host: {get_input: heat_api_network}
+                heat::api_cfn::workers: {get_input: heat_workers}
                 heat::database_connection: {get_input: heat_dsn}
                 heat::debug: {get_input: debug}
                 heat::db::mysql::password: {get_input: heat_password}
@@ -1219,6 +1293,9 @@ resources:
                 keystone::endpoint::internal_url: {get_input: keystone_internal_url}
                 keystone::endpoint::admin_url: {get_input: keystone_identity_uri}
                 keystone::endpoint::region: {get_input: keystone_region}
+                keystone::admin_workers: {get_input: keystone_workers}
+                keystone::public_workers: {get_input: keystone_workers}
+
                 # MongoDB
                 mongodb::server::bind_ip: {get_input: mongo_db_network}
                 mongodb::server::nojournal: {get_input: mongodb_no_journal}
@@ -1244,6 +1321,7 @@ resources:
                 neutron::server::auth_uri: {get_input: keystone_auth_uri}
                 neutron::server::identity_uri: {get_input: keystone_identity_uri}
                 neutron::server::database_connection: {get_input: neutron_dsn}
+                neutron::server::api_workers: {get_input: neutron_workers}
                 neutron::agents::l3::external_network_bridge: {get_input: neutron_external_network_bridge}
                 neutron::agents::ml2::ovs::enable_tunneling: {get_input: neutron_enable_tunneling}
                 neutron::agents::ml2::ovs::l2_population: {get_input: neutron_enable_l2pop}
@@ -1252,6 +1330,7 @@ resources:
                 neutron::plugins::ml2::flat_networks: {get_input: neutron_flat_networks}
                 neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
                 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
+                neutron::agents::metadata::metadata_workers: {get_input: neutron_workers}
                 neutron_agent_mode: {get_input: neutron_agent_mode}
                 neutron_router_distributed: {get_input: neutron_router_distributed}
                 neutron::core_plugin: {get_input: neutron_core_plugin}
@@ -1322,6 +1401,9 @@ resources:
                 nova::api::api_bind_address: {get_input: nova_api_network}
                 nova::api::metadata_listen: {get_input: nova_metadata_network}
                 nova::api::admin_password: {get_input: nova_password}
+                nova::api::osapi_compute_workers: {get_input: nova_workers}
+                nova::api::ec2_workers: {get_input: nova_workers}
+                nova::api::metadata_workers: {get_input: nova_workers}
                 nova::database_connection: {get_input: nova_dsn}
                 nova::glance_api_servers: {get_input: glance_api_servers}
                 nova::api::neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
@@ -1331,6 +1413,7 @@ resources:
                 nova::network::neutron::neutron_admin_auth_url: {get_input: neutron_admin_auth_url}
                 nova::vncproxy::host: {get_input: nova_api_network}
                 nova::db::mysql::password: {get_input: nova_password}
+                nova_enable_db_purge: {get_input: nova_enable_db_purge}
 
                 # Horizon
                 apache::ip: {get_input: horizon_network}
@@ -1361,12 +1444,7 @@ resources:
                 tripleo::loadbalancer::control_virtual_interface: {get_input: control_virtual_interface}
                 tripleo::loadbalancer::public_virtual_interface: {get_input: public_virtual_interface}
                 tripleo::loadbalancer::haproxy_log_address: {get_input: haproxy_log_address}
-                # NOTE(jaosorior): The service certificate configuration for
-                # HAProxy was left commented because to properly use this, we
-                # need to be able to set up the keystone endpoints. And
-                # currently that is not possible, but is being addressed by
-                # other commits.  A subsequent commit will uncomment this.
-                #tripleo::loadbalancer::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
+                tripleo::loadbalancer::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
                 tripleo::packages::enable_install: {get_input: enable_package_install}
                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
 
@@ -1416,6 +1494,9 @@ outputs:
   tenant_ip_address:
     description: IP address of the server in the tenant network
     value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   hostname:
     description: Hostname of the server
     value: {get_attr: [Controller, name]}
diff --git a/puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml b/puppet/extraconfig/all_nodes/neutron-midonet-all-nodes.yaml
new file mode 100644 (file)
index 0000000..26ce713
--- /dev/null
@@ -0,0 +1,119 @@
+heat_template_version: 2015-10-15
+
+description: Configure hieradata for all MidoNet nodes
+
+parameters:
+  # Parameters passed from the parent template
+  controller_servers:
+    type: json
+  compute_servers:
+    type: json
+  blockstorage_servers:
+    type: json
+  objectstorage_servers:
+    type: json
+  cephstorage_servers:
+    type: json
+
+  EnableZookeeperOnController:
+    label: Enable Zookeeper On Controller
+    description: 'Whether enable Zookeeper cluster on Controller'
+    type: boolean
+    default: false
+  EnableCassandraOnController:
+    label: Enable Cassandra On Controller
+    description: 'Whether enable Cassandra cluster on Controller'
+    type: boolean
+    default: false
+  CassandraStoragePort:
+    label: Cassandra Storage Port
+    description: 'The Cassandra port for inter-node communication'
+    type: string
+    default: '7000'
+  CassandraSslStoragePort:
+    label: Cassandra SSL Storage Port
+    description: 'The SSL port for encrypted communication. Unused unless enabled in encryption_options'
+    type: string
+    default: '7001'
+  CassandraClientPort:
+    label: Cassandra Client Port
+    description: 'Native Transport Port'
+    type: string
+    default: '9042'
+  CassandraClientPortThrift:
+    label: Cassandra Client Thrift Port
+    description: 'The port for the Thrift RPC service, which is used for client connections'
+    type: string
+    default: '9160'
+  TunnelZoneName:
+    label: Name of the Tunnelzone
+    description: 'Name of the tunnel zone used to tunnel packages'
+    type: string
+    default: 'tunnelzone_tripleo'
+  TunnelZoneType:
+    label: Type of the Tunnel
+    description: 'Type of the tunnels on the overlay. Choose between `gre` and `vxlan`'
+    type: string
+    default: 'vxlan'
+
+resources:
+
+  NetworkMidoNetConfig:
+    type: OS::Heat::StructuredConfig
+    properties:
+      group: os-apply-config
+      config:
+        hiera:
+          datafiles:
+            midonet_data:
+              mapped_data:
+                enable_zookeeper_on_controller: {get_param: EnableZookeeperOnController}
+                enable_cassandra_on_controller: {get_param: EnableCassandraOnController}
+                midonet_tunnelzone_name: {get_param: TunnelZoneName}
+                midonet_tunnelzone_type: {get_param: TunnelZoneType}
+                midonet_libvirt_qemu_data: |
+                    user = "root"
+                    group = "root"
+                    cgroup_device_acl = [
+                        "/dev/null", "/dev/full", "/dev/zero",
+                        "/dev/random", "/dev/urandom",
+                        "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
+                        "/dev/rtc","/dev/hpet", "/dev/vfio/vfio",
+                        "/dev/net/tun"
+                    ]
+                tripleo::cluster::cassandra::storage_port: {get_param: CassandraStoragePort}
+                tripleo::cluster::cassandra::ssl_storage_port: {get_param: CassandraSslStoragePort}
+                tripleo::cluster::cassandra::client_port: {get_param: CassandraClientPort}
+                tripleo::cluster::cassandra::client_port_thrift: {get_param: CassandraClientPortThrift}
+                tripleo::loadbalancer::midonet_api: true
+                # Missed Neutron Puppet data
+                neutron::agents::dhcp::interface_driver: 'neutron.agent.linux.interface.MidonetInterfaceDriver'
+                neutron::agents::dhcp::dhcp_driver: 'midonet.neutron.agent.midonet_driver.DhcpNoOpDriver'
+                neutron::plugins::midonet::midonet_api_port: 8081
+                neutron::params::midonet_server_package: 'python-networking-midonet'
+
+                # Make sure the l3 agent does not run
+                l3_agent_service: false
+                neutron::agents::l3::manage_service: false
+                neutron::agents::l3::enabled: false
+
+
+  NetworkMidonetDeploymentControllers:
+    type: OS::Heat::StructuredDeploymentGroup
+    properties:
+      config: {get_resource: NetworkMidoNetConfig}
+      servers: {get_param: controller_servers}
+
+  NetworkMidonetDeploymentComputes:
+    type: OS::Heat::StructuredDeploymentGroup
+    properties:
+      config: {get_resource: NetworkMidoNetConfig}
+      servers: {get_param: compute_servers}
+
+outputs:
+  config_identifier:
+    value:
+      list_join:
+        - ' '
+        - - {get_attr: [NetworkMidonetDeploymentControllers, deploy_stdouts]}
+          - {get_attr: [NetworkMidonetDeploymentComputes, deploy_stdouts]}
index b0e6ae9..c9f3a41 100644 (file)
@@ -77,6 +77,8 @@ nova::notify_on_state_change: 'vm_and_task_state'
 nova::api::default_floating_pool: 'public'
 nova::api::osapi_v3: true
 nova::scheduler::filter::ram_allocation_ratio: '1.0'
+nova::cron::archive_deleted_rows::hour: '*/12'
+nova::cron::archive_deleted_rows::destination: '/dev/null'
 
 # ceilometer
 ceilometer::agent::auth::auth_endpoint_type: 'internalURL'
index e0566ac..79a6abb 100644 (file)
@@ -68,11 +68,19 @@ if hiera('cinder_enable_nfs_backend', false) {
 }
 
 include ::nova::compute::libvirt
+if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+  file {'/etc/libvirt/qemu.conf':
+    ensure  => present,
+    content => hiera('midonet_libvirt_qemu_data')
+  }
+}
 include ::nova::network::neutron
 include ::neutron
 
 # If the value of core plugin is set to 'nuage',
 # include nuage agent,
+# If the value of core plugin is set to 'midonet',
+# include midonet agent,
 # else use the default value of 'ml2'
 if hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
   include ::nuage::vrs
@@ -84,7 +92,20 @@ if hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
     nova_metadata_ip    => hiera('nova_metadata_node_ips'),
     nova_auth_ip        => hiera('keystone_public_api_virtual_ip'),
   }
-} else {
+}
+elsif hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+
+  # TODO(devvesa) provide non-controller ips for these services
+  $zookeeper_node_ips = hiera('neutron_api_node_ips')
+  $cassandra_node_ips = hiera('neutron_api_node_ips')
+
+  class {'::tripleo::network::midonet::agent':
+    zookeeper_servers => $zookeeper_node_ips,
+    cassandra_seeds   => $cassandra_node_ips
+  }
+}
+else {
+
   include ::neutron::plugins::ml2
   include ::neutron::agents::ml2::ovs
 
index 7d3012e..508025c 100644 (file)
@@ -230,13 +230,61 @@ if hiera('step') >= 3 {
   include ::nova::scheduler
   include ::nova::scheduler::filter
 
-  include ::neutron
+  if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+
+    # TODO(devvesa) provide non-controller ips for these services
+    $zookeeper_node_ips = hiera('neutron_api_node_ips')
+    $cassandra_node_ips = hiera('neutron_api_node_ips')
+
+    # Run zookeeper in the controller if configured
+    if hiera('enable_zookeeper_on_controller') {
+      class {'::tripleo::cluster::zookeeper':
+        zookeeper_server_ips => $zookeeper_node_ips,
+        zookeeper_client_ip  => $ipaddress,
+        zookeeper_hostnames  => hiera('controller_node_names')
+      }
+    }
+
+    # Run cassandra in the controller if configured
+    if hiera('enable_cassandra_on_controller') {
+      class {'::tripleo::cluster::cassandra':
+        cassandra_servers => $cassandra_node_ips,
+        cassandra_ip      => $ipaddress
+      }
+    }
+
+    class {'::tripleo::network::midonet::agent':
+      zookeeper_servers => $zookeeper_node_ips,
+      cassandra_seeds   => $cassandra_node_ips
+    }
+
+    class {'::tripleo::network::midonet::api':
+      zookeeper_servers    => $zookeeper_node_ips,
+      vip                  => $ipaddress,
+      keystone_ip          => $ipaddress,
+      keystone_admin_token => hiera('keystone::admin_token'),
+      bind_address         => $ipaddress,
+      admin_password       => hiera('admin_password')
+    }
+
+    # TODO: find a way to get an empty list from hiera
+    class {'::neutron':
+      service_plugins => []
+    }
+
+  }
+  else {
+
+    # ML2 plugin
+    include ::neutron
+  }
+
   include ::neutron::server
   include ::neutron::server::notifications
 
   # If the value of core plugin is set to 'nuage',
-  # include nuage core plugin,
-  # else use the default value of 'ml2'
+  # include nuage core plugin, and it does not
+  # need the l3, dhcp and metadata agents
   if hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
     include ::neutron::plugins::nuage
   } else {
@@ -252,45 +300,57 @@ if hiera('step') >= 3 {
       require => Package['neutron'],
     }
 
-    include ::neutron::plugins::ml2
-    include ::neutron::agents::ml2::ovs
+    # If the value of core plugin is set to 'midonet',
+    # skip all the ML2 configuration
+    if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
 
-    if 'cisco_n1kv' in hiera('neutron::plugins::ml2::mechanism_drivers') {
-      include ::neutron::plugins::ml2::cisco::nexus1000v
-
-      class { '::neutron::agents::n1kv_vem':
-        n1kv_source  => hiera('n1kv_vem_source', undef),
-        n1kv_version => hiera('n1kv_vem_version', undef),
+      class {'::neutron::plugins::midonet':
+        midonet_api_ip    => $ipaddress,
+        keystone_tenant   => hiera('neutron::server::auth_tenant'),
+        keystone_password => hiera('neutron::server::auth_password')
       }
+    } else {
+
+      include ::neutron::plugins::ml2
+      include ::neutron::agents::ml2::ovs
+
+      if 'cisco_n1kv' in hiera('neutron::plugins::ml2::mechanism_drivers') {
+        include ::neutron::plugins::ml2::cisco::nexus1000v
+
+        class { '::neutron::agents::n1kv_vem':
+          n1kv_source  => hiera('n1kv_vem_source', undef),
+          n1kv_version => hiera('n1kv_vem_version', undef),
+        }
 
-      class { '::n1k_vsm':
-        n1kv_source       => hiera('n1kv_vsm_source', undef),
-        n1kv_version      => hiera('n1kv_vsm_version', undef),
-        pacemaker_control => false,
+        class { '::n1k_vsm':
+          n1kv_source       => hiera('n1kv_vsm_source', undef),
+          n1kv_version      => hiera('n1kv_vsm_version', undef),
+          pacemaker_control => false,
+        }
       }
-    }
 
-    if 'cisco_ucsm' in hiera('neutron::plugins::ml2::mechanism_drivers') {
-      include ::neutron::plugins::ml2::cisco::ucsm
-    }
-    if 'cisco_nexus' in hiera('neutron::plugins::ml2::mechanism_drivers') {
-      include ::neutron::plugins::ml2::cisco::nexus
-      include ::neutron::plugins::ml2::cisco::type_nexus_vxlan
-    }
+      if 'cisco_ucsm' in hiera('neutron::plugins::ml2::mechanism_drivers') {
+        include ::neutron::plugins::ml2::cisco::ucsm
+      }
+      if 'cisco_nexus' in hiera('neutron::plugins::ml2::mechanism_drivers') {
+        include ::neutron::plugins::ml2::cisco::nexus
+        include ::neutron::plugins::ml2::cisco::type_nexus_vxlan
+      }
 
-    if hiera('neutron_enable_bigswitch_ml2', false) {
-      include ::neutron::plugins::ml2::bigswitch::restproxy
-    }
-    neutron_l3_agent_config {
-      'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
-    }
-    neutron_dhcp_agent_config {
-      'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
+      if hiera('neutron_enable_bigswitch_ml2', false) {
+        include ::neutron::plugins::ml2::bigswitch::restproxy
+      }
+      neutron_l3_agent_config {
+        'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
+      }
+      neutron_dhcp_agent_config {
+        'DEFAULT/ovs_use_veth': value => hiera('neutron_ovs_use_veth', false);
+      }
+      Service['neutron-server'] -> Service['neutron-ovs-agent-service']
     }
 
     Service['neutron-server'] -> Service['neutron-dhcp-service']
     Service['neutron-server'] -> Service['neutron-l3']
-    Service['neutron-server'] -> Service['neutron-ovs-agent-service']
     Service['neutron-server'] -> Service['neutron-metadata']
   }
 
@@ -488,7 +548,12 @@ if hiera('step') >= 3 {
 } #END STEP 3
 
 if hiera('step') >= 4 {
+  $nova_enable_db_purge = hiera('nova_enable_db_purge', true)
+
   include ::keystone::cron::token_flush
+  if $nova_enable_db_purge {
+    include ::nova::cron::archive_deleted_rows
+  }
 } #END STEP 4
 
 $package_manifest_name = join(['/var/lib/tripleo/installed-packages/overcloud_controller', hiera('step')])
index cf607e5..de6c1b5 100644 (file)
@@ -592,8 +592,54 @@ if hiera('step') >= 3 {
   }
   include ::nova::network::neutron
 
-  # Neutron class definitions
-  include ::neutron
+  if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+
+    # TODO(devvesa) provide non-controller ips for these services
+    $zookeeper_node_ips = hiera('neutron_api_node_ips')
+    $cassandra_node_ips = hiera('neutron_api_node_ips')
+
+    # Run zookeeper in the controller if configured
+    if hiera('enable_zookeeper_on_controller') {
+      class {'::tripleo::cluster::zookeeper':
+        zookeeper_server_ips => $zookeeper_node_ips,
+        zookeeper_client_ip  => $ipaddress,
+        zookeeper_hostnames  => hiera('controller_node_names')
+      }
+    }
+
+    # Run cassandra in the controller if configured
+    if hiera('enable_cassandra_on_controller') {
+      class {'::tripleo::cluster::cassandra':
+        cassandra_servers => $cassandra_node_ips,
+        cassandra_ip      => $ipaddress
+      }
+    }
+
+    class {'::tripleo::network::midonet::agent':
+      zookeeper_servers => $zookeeper_node_ips,
+      cassandra_seeds   => $cassandra_node_ips
+    }
+
+    class {'::tripleo::network::midonet::api':
+      zookeeper_servers    => hiera('neutron_api_node_ips'),
+      vip                  => $public_vip,
+      keystone_ip          => $public_vip,
+      keystone_admin_token => hiera('keystone::admin_token'),
+      bind_address         => $ipaddress,
+      admin_password       => hiera('admin_password')
+    }
+
+    # Configure Neutron
+    class {'::neutron':
+      service_plugins => []
+    }
+
+  }
+  else {
+    # Neutron class definitions
+    include ::neutron
+  }
+
   class { '::neutron::server' :
     sync_db        => $sync_db,
     manage_service => false,
@@ -603,6 +649,13 @@ if hiera('step') >= 3 {
   if  hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
     include ::neutron::plugins::nuage
   }
+  if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+    class {'::neutron::plugins::midonet':
+      midonet_api_ip    => $public_vip,
+      keystone_tenant   => hiera('neutron::server::auth_tenant'),
+      keystone_password => hiera('neutron::server::auth_password')
+    }
+  }
   if hiera('neutron::enable_dhcp_agent',true) {
     class { '::neutron::agents::dhcp' :
       manage_service => false,
@@ -915,7 +968,12 @@ if hiera('step') >= 3 {
 } #END STEP 3
 
 if hiera('step') >= 4 {
-  include ::keystone::cron::token_flush
+    $nova_enable_db_purge = hiera('nova_enable_db_purge', true)
+
+    include ::keystone::cron::token_flush
+    if $nova_enable_db_purge {
+      include ::nova::cron::archive_deleted_rows
+    }
 
   if $pacemaker_master {
 
@@ -1053,15 +1111,32 @@ if hiera('step') >= 4 {
                   Pacemaker::Resource::Service[$::glance::params::api_service_name]],
     }
 
-    # Neutron
-    # NOTE(gfidente): Neutron will try to populate the database with some data
-    # as soon as neutron-server is started; to avoid races we want to make this
-    # happen only on one node, before normal Pacemaker initialization
-    # https://bugzilla.redhat.com/show_bug.cgi?id=1233061
-    exec { '/usr/bin/systemctl start neutron-server && /usr/bin/sleep 5' : } ->
-    pacemaker::resource::service { $::neutron::params::server_service:
-      clone_params => 'interleave=true',
-      require      => Pacemaker::Resource::Service[$::keystone::params::service_name],
+    if hiera('step') == 4 {
+      # Neutron
+      # NOTE(gfidente): Neutron will try to populate the database with some data
+      # as soon as neutron-server is started; to avoid races we want to make this
+      # happen only on one node, before normal Pacemaker initialization
+      # https://bugzilla.redhat.com/show_bug.cgi?id=1233061
+      # NOTE(emilien): we need to run this Exec only at Step 4 otherwise this exec
+      # will try to start the service while it's already started by Pacemaker
+      # It would result to a deployment failure since systemd would return 1 to Puppet
+      # and the overcloud would fail to deploy (6 would be returned).
+      # This conditional prevents from a race condition during the deployment.
+      # https://bugzilla.redhat.com/show_bug.cgi?id=1290582
+      exec { 'neutron-server-systemd-start-sleep' :
+        command => 'systemctl start neutron-server && /usr/bin/sleep 5',
+        path    => '/usr/bin',
+        unless  => '/sbin/pcs resource show neutron-server',
+      } ->
+      pacemaker::resource::service { $::neutron::params::server_service:
+        clone_params => 'interleave=true',
+        require      => Pacemaker::Resource::Service[$::keystone::params::service_name]
+      }
+    } else {
+      pacemaker::resource::service { $::neutron::params::server_service:
+        clone_params => 'interleave=true',
+        require      => Pacemaker::Resource::Service[$::keystone::params::service_name]
+      }
     }
     if hiera('neutron::enable_l3_agent', true) {
       pacemaker::resource::service { $::neutron::params::l3_agent_service:
@@ -1078,6 +1153,11 @@ if hiera('step') >= 4 {
         clone_params => 'interleave=true',
       }
     }
+    if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+      pacemaker::resource::service {'tomcat':
+        clone_params => 'interleave=true',
+      }
+    }
     if hiera('neutron::enable_metadata_agent', true) {
       pacemaker::resource::service { $::neutron::params::metadata_agent_service:
         clone_params => 'interleave=true',
@@ -1128,7 +1208,6 @@ if hiera('step') >= 4 {
       }
     }
 
-    #another chain keystone-->neutron-server-->ovs-agent-->dhcp-->l3
     pacemaker::constraint::base { 'keystone-to-neutron-server-constraint':
       constraint_type => 'order',
       first_resource  => "${::keystone::params::service_name}-clone",
@@ -1204,6 +1283,43 @@ if hiera('step') >= 4 {
                     Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]]
       }
     }
+    if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
+      #midonet-chain chain keystone-->neutron-server-->dhcp-->metadata->tomcat
+      pacemaker::constraint::base { 'neutron-server-to-dhcp-agent-constraint':
+        constraint_type => 'order',
+        first_resource  => "${::neutron::params::server_service}-clone",
+        second_resource => "${::neutron::params::dhcp_agent_service}-clone",
+        first_action    => 'start',
+        second_action   => 'start',
+        require         => [Pacemaker::Resource::Service[$::neutron::params::server_service],
+                            Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service]],
+      }
+      pacemaker::constraint::base { 'neutron-dhcp-agent-to-metadata-agent-constraint':
+        constraint_type => 'order',
+        first_resource  => "${::neutron::params::dhcp_agent_service}-clone",
+        second_resource => "${::neutron::params::metadata_agent_service}-clone",
+        first_action    => 'start',
+        second_action   => 'start',
+        require         => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
+                            Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
+      }
+      pacemaker::constraint::base { 'neutron-metadata-agent-to-tomcat-constraint':
+        constraint_type => 'order',
+        first_resource  => "${::neutron::params::metadata_agent_service}-clone",
+        second_resource => 'tomcat-clone',
+        first_action    => 'start',
+        second_action   => 'start',
+        require         => [Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service],
+                            Pacemaker::Resource::Service['tomcat']],
+      }
+      pacemaker::constraint::colocation { 'neutron-dhcp-agent-to-metadata-agent-colocation':
+        source  => "${::neutron::params::metadata_agent_service}-clone",
+        target  => "${::neutron::params::dhcp_agent_service}-clone",
+        score   => 'INFINITY',
+        require => [Pacemaker::Resource::Service[$::neutron::params::dhcp_agent_service],
+                    Pacemaker::Resource::Service[$::neutron::params::metadata_agent_service]],
+      }
+    }
 
     # Nova
     pacemaker::resource::service { $::nova::params::api_service_name :
index 721dcba..b60664a 100644 (file)
@@ -7,7 +7,6 @@ parameters:
     constraints:
       - custom_constraint: nova.flavor
   HashSuffix:
-    default: unset
     description: A random string to be used as a salt when hashing to determine mappings
       in the ring.
     hidden: true
@@ -40,7 +39,6 @@ parameters:
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
@@ -82,6 +80,13 @@ parameters:
     description: >
       Heat action when to apply network configuration changes
     default: ['CREATE']
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
   CloudDomain:
     default: ''
     type: string
@@ -112,6 +117,7 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
       metadata: {get_param: ServerMetadata}
       scheduler_hints: {get_param: SchedulerHints}
 
@@ -135,6 +141,11 @@ resources:
   NodeUserData:
     type: OS::TripleO::NodeUserData
 
+  ExternalPort:
+    type: OS::TripleO::SwiftStorage::Ports::ExternalPort
+    properties:
+      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
+
   InternalApiPort:
     type: OS::TripleO::SwiftStorage::Ports::InternalApiPort
     properties:
@@ -150,21 +161,37 @@ resources:
     properties:
       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
 
+  TenantPort:
+    type: OS::TripleO::SwiftStorage::Ports::TenantPort
+    properties:
+      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
+
+  ManagementPort:
+    type: OS::TripleO::SwiftStorage::Ports::ManagementPort
+    properties:
+      ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
+
   NetworkConfig:
     type: OS::TripleO::ObjectStorage::Net::SoftwareConfig
     properties:
       ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
+      ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
+      TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetIpMap:
     type: OS::TripleO::Network::Ports::NetIpMap
     properties:
       ControlPlaneIp: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
+      ExternalIp: {get_attr: [ExternalPort, ip_address]}
       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
       StorageIp: {get_attr: [StoragePort, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
+      TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
@@ -283,6 +310,9 @@ outputs:
         template: 'r1z1-IP:%PORT%/d1'
         params:
           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
+  external_ip_address:
+    description: IP address of the server in the external network
+    value: {get_attr: [ExternalPort, ip_address]}
   internal_api_ip_address:
     description: IP address of the server in the internal_api network
     value: {get_attr: [InternalApiPort, ip_address]}
@@ -292,6 +322,12 @@ outputs:
   storage_mgmt_ip_address:
     description: IP address of the server in the storage_mgmt network
     value: {get_attr: [StorageMgmtPort, ip_address]}
+  tenant_ip_address:
+    description: IP address of the server in the tenant network
+    value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   config_identifier:
     description: identifier which changes if the node configuration may need re-applying
     value: