Merge "Validate NTP servers"
[apex-tripleo-heat-templates.git] / overcloud.j2.yaml
index f93c19a..54092fa 100644 (file)
@@ -1,4 +1,12 @@
-{% set primary_role_name = roles[0].name -%}
+{%- set primary_role = [roles[0]] -%}
+{%- for role in roles -%}
+  {%- if 'primary' in role.tags and 'controller' in role.tags -%}
+    {%- set _ = primary_role.pop() -%}
+    {%- set _ = primary_role.append(role) -%}
+  {%- endif -%}
+{%- endfor -%}
+{%- set primary_role_name = primary_role[0].name -%}
+# primary role is: {{primary_role_name}}
 heat_template_version: ocata
 
 description: >
@@ -43,7 +51,9 @@ parameters:
     type: string
   ControlFixedIPs:
     default: []
-    description: Should be used for arbitrary ips.
+    description: >
+        Control the IP allocation for the ControlVirtualIP port. E.g.
+        [{'ip_address':'1.2.3.4'}]
     type: json
   InternalApiVirtualFixedIPs:
     default: []
@@ -114,6 +124,11 @@ parameters:
     description: What interface to add to the HypervisorNeutronPhysicalBridge.
     type: string
 
+  NodeCreateBatchSize:
+    default: 30
+    description: Maxiumum batch size for creating nodes
+    type: number
+
   # Jinja loop for Role in role_data.yaml
 {% for role in roles %}
   # Parameters generated for {{role.name}} Role
@@ -243,6 +258,22 @@ resources:
       NetIpMap: {get_attr: [VipMap, net_ip_map]}
       ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
 
+  EndpointMapData:
+    type: OS::Heat::Value
+    properties:
+      type: json
+      value: {get_attr: [EndpointMap, endpoint_map]}
+
+  SshKnownHostsConfig:
+    type: OS::TripleO::Ssh::KnownHostsConfig
+    properties:
+      known_hosts:
+        list_join:
+          - ''
+          {% for role in roles %}
+          - {get_attr: [{{role.name}}, known_hosts_entry]}
+          {% endfor %}
+
   # Jinja loop for Role in roles_data.yaml
 {% for role in roles %}
   # Resources generated for {{role.name}} Role
@@ -255,6 +286,18 @@ resources:
       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
       DefaultPasswords: {get_attr: [DefaultPasswords, passwords]}
 
+  # Filter any null/None service_names which may be present due to mapping
+  # of services to OS::Heat::None
+  {{role.name}}ServiceNames:
+    type: OS::Heat::Value
+    depends_on: {{role.name}}ServiceChain
+    properties:
+      type: comma_delimited_list
+      value:
+        yaql:
+          expression: coalesce($.data, []).where($ != null)
+          data: {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
+
   {{role.name}}HostsDeployment:
     type: OS::Heat::StructuredDeployments
     properties:
@@ -262,6 +305,13 @@ resources:
       config: {get_attr: [hostsConfig, config_id]}
       servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
 
+  {{role.name}}SshKnownHostsDeployment:
+    type: OS::Heat::StructuredDeployments
+    properties:
+      name: {{role.name}}SshKnownHostsDeployment
+      config: {get_resource: SshKnownHostsConfig}
+      servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
+
   {{role.name}}AllNodesDeployment:
     type: OS::Heat::StructuredDeployments
     depends_on:
@@ -305,7 +355,7 @@ resources:
       StorageMgmtIpList: {get_attr: [{{role.name}}, storage_mgmt_ip_address]}
       TenantIpList: {get_attr: [{{role.name}}, tenant_ip_address]}
       ManagementIpList: {get_attr: [{{role.name}}, management_ip_address]}
-      EnabledServices: {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
+      EnabledServices: {get_attr: [{{role.name}}ServiceNames, value]}
       ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
       ServiceHostnameList: {get_attr: [{{role.name}}, hostname]}
       NetworkHostnameMap:
@@ -321,6 +371,9 @@ resources:
   {{role.name}}:
     type: OS::Heat::ResourceGroup
     depends_on: Networks
+    update_policy:
+      batch_create:
+        max_batch_size: {get_param: NodeCreateBatchSize}
     properties:
       count: {get_param: {{role.name}}Count}
       removal_policies: {get_param: {{role.name}}RemovalPolicies}
@@ -361,8 +414,8 @@ resources:
                         {% for r in roles %}
                           - get_attr: [{{r.name}}ServiceChain, role_data, service_config_settings]
                         {% endfor %}
-                    services: {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
-          ServiceNames: {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
+                    services: {get_attr: [{{role.name}}ServiceNames, value]}
+          ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]}
           MonitoringSubscriptions: {get_attr: [{{role.name}}ServiceChain, role_data, monitoring_subscriptions]}
           ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChain, role_data, service_metadata_settings]}
 {% endfor %}
@@ -380,7 +433,7 @@ resources:
         -
 {% for role in roles %}
           - list_join:
-            - "\n"
+            - ""
             - {get_attr: [{{role.name}}, hosts_entry]}
 {% endfor %}
 
@@ -396,7 +449,7 @@ resources:
         list_join:
           - ','
 {% for role in roles %}
-          - {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
+          - {get_attr: [{{role.name}}ServiceNames, value]}
 {% endfor %}
       logging_groups:
         yaql:
@@ -561,12 +614,24 @@ resources:
       PingTestIps:
         list_join:
         - ' '
-        - - {get_attr: [{{primary_role_name}}, resource.0.external_ip_address]}
-          - {get_attr: [{{primary_role_name}}, resource.0.internal_api_ip_address]}
-          - {get_attr: [{{primary_role_name}}, resource.0.storage_ip_address]}
-          - {get_attr: [{{primary_role_name}}, resource.0.storage_mgmt_ip_address]}
-          - {get_attr: [{{primary_role_name}}, resource.0.tenant_ip_address]}
-          - {get_attr: [{{primary_role_name}}, resource.0.management_ip_address]}
+        - - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, external_ip_address]}
+          - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, internal_api_ip_address]}
+          - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, storage_ip_address]}
+          - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, storage_mgmt_ip_address]}
+          - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, tenant_ip_address]}
+          - yaql:
+              expression: coalesce($.data, []).first(null)
+              data: {get_attr: [{{primary_role_name}}, management_ip_address]}
 
   UpdateWorkflow:
     type: OS::TripleO::Tasks::UpdateWorkflow
@@ -598,9 +663,9 @@ resources:
         {{role.name}}: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
 {% endfor %}
 
-  # Upgrade steps for all roles
-  AllNodesUpgradeSteps:
-    type: OS::TripleO::UpgradeSteps
+  # Post deployment steps for all roles
+  AllNodesDeploySteps:
+    type: OS::TripleO::PostDeploySteps
     depends_on:
 {% for role in roles %}
       - {{role.name}}AllNodesDeployment
@@ -610,20 +675,7 @@ resources:
 {% for role in roles %}
         {{role.name}}: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
 {% endfor %}
-      role_data:
-{% for role in roles %}
-        {{role.name}}: {get_attr: [{{role.name}}ServiceChain, role_data]}
-{% endfor %}
-
-  # Post deployment steps for all roles
-  AllNodesDeploySteps:
-    type: OS::TripleO::PostDeploySteps
-    depends_on: AllNodesUpgradeSteps
-    properties:
-      servers:
-{% for role in roles %}
-        {{role.name}}: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
-{% endfor %}
+      EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
       role_data:
 {% for role in roles %}
         {{role.name}}: {get_attr: [{{role.name}}ServiceChain, role_data]}
@@ -635,7 +687,7 @@ outputs:
     value: true
   KeystoneURL:
     description: URL for the Overcloud Keystone service
-    value: {get_attr: [EndpointMap, endpoint_map, KeystonePublic, uri]}
+    value: {get_attr: [EndpointMapData, value, KeystonePublic, uri]}
   KeystoneAdminVip:
     description: Keystone Admin VIP endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
@@ -644,7 +696,7 @@ outputs:
       Mapping of the resources with the needed info for their endpoints.
       This includes the protocol used, the IP, port and also a full
       representation of the URI.
-    value: {get_attr: [EndpointMap, endpoint_map]}
+    value: {get_attr: [EndpointMapData, value]}
   HostsEntry:
     description: |
       The content that should be appended to your /etc/hosts if you want to get
@@ -659,11 +711,17 @@ outputs:
     description: The services enabled on each role
     value:
 {% for role in roles %}
-      {{role.name}}: {get_attr: [{{role.name}}ServiceChain, role_data, service_names]}
+      {{role.name}}: {get_attr: [{{role.name}}ServiceNames, value]}
 {% endfor %}
   RoleData:
     description: The configuration data associated with each role
     value:
 {% for role in roles %}
       {{role.name}}: {get_attr: [{{role.name}}ServiceChain, role_data]}
+{% endfor %}
+  RoleNetIpMap:
+    description: Mapping of each network to a list of IPs for each role
+    value:
+{% for role in roles %}
+      {{role.name}}: {get_attr: [{{role.name}}IpListMap, net_ip_map]}
 {% endfor %}