From 487e0617d6ac59620cfc0e8efaf2ae2f910307e8 Mon Sep 17 00:00:00 2001
From: Steven Hardy <shardy@redhat.com>
Date: Thu, 3 May 2018 11:22:30 +0100
Subject: [PATCH] Decouple OpenShiftGlusterDisks from openshift-master.yaml

In the event you have different disks in nodes assigned to each role
you may need to pass role specific parameters, e.g like:

parameter_defaults:
  OpenShiftMasterParameters:
    OpenShiftGlusterDisks:
      - /dev/vdc
  OpenShiftWorkerParameters:
    OpenShiftGlusterDisks:
      - /dev/vdd

To enable that we create an inventory file per role, and pass the directory
of files to ansible.

Change-Id: I8b4d8698405ffb004b081e1f097f300216edfa77
---
 extraconfig/services/openshift-cns.yaml    |  56 +++++++++
 extraconfig/services/openshift-master.yaml | 126 ++++++---------------
 extraconfig/services/openshift-worker.yaml |  40 +++++++
 3 files changed, 133 insertions(+), 89 deletions(-)

diff --git a/extraconfig/services/openshift-cns.yaml b/extraconfig/services/openshift-cns.yaml
index 70cb0e838d..7e63d47d9a 100644
--- a/extraconfig/services/openshift-cns.yaml
+++ b/extraconfig/services/openshift-cns.yaml
@@ -82,3 +82,59 @@ outputs:
           with_items: {get_attr: [RoleParametersValue, value, OpenShiftGlusterDisks]}
       upgrade_tasks: []
       step_config: ''
+      external_deploy_tasks:
+        - name: openshift_cns step 1 Generate Inventory
+          when: step == '1'
+          block:
+            - name: create openshift temp dirs
+              file:
+                path: "{{item}}"
+                state: directory
+              with_items:
+                - "{{playbook_dir}}/openshift/inventory"
+
+            - name: set openshift global vars fact
+              set_fact:
+                openshift_gluster_disks: {get_attr: [RoleParametersValue, value, OpenShiftGlusterDisks]}
+
+            - name: generate openshift inventory for openshift_glusterfs service
+              lineinfile:
+                path: "{{playbook_dir}}/openshift/inventory/openshift_glusterfs.ini"
+                create: true
+                line: "[openshift_glusterfs:children]"
+                insertbefore: BOF
+
+            - name: generate openshift inventory for openshift_glusterfs service
+              lineinfile:
+                path: "{{playbook_dir}}/openshift/inventory/openshift_glusterfs.ini"
+                insertafter: "[openshift_glusterfs:children]"
+                line:
+                  str_replace:
+                    template: ROLENAME
+                    params:
+                      ROLENAME: {get_param: RoleName}
+
+            - name: generate openshift inventory for Role
+              copy:
+                dest:
+                  str_replace:
+                    template: "{{playbook_dir}}/openshift/inventory/ROLENAME_openshift_glusterfs.yml"
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                content:
+                  str_replace:
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                    template: |
+                      glusterfs:
+                        hosts:
+                          {% for host in groups['ROLENAME'] | default([]) -%}
+                          {{ hostvars.raw_get(host)['ansible_hostname'] }}:
+                            glusterfs_ip: {{hostvars.raw_get(host)['storage_ip']}}
+                            glusterfs_devices:
+                              {{openshift_gluster_disks | to_nice_yaml() | indent(8) }}
+                            ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
+                            ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
+                            ansible_become: true
+                            openshift_schedulable: true
+                          {% endfor %}
diff --git a/extraconfig/services/openshift-master.yaml b/extraconfig/services/openshift-master.yaml
index 7dac2936ec..4f726c5fbd 100644
--- a/extraconfig/services/openshift-master.yaml
+++ b/extraconfig/services/openshift-master.yaml
@@ -48,28 +48,6 @@ parameters:
     default: {}
     description: OpenShift node vars specific for the worker nodes
     type: json
-  OpenShiftGlusterDisks:
-    default:
-      - /dev/vdb
-      - /dev/vdc
-      - /dev/vdd
-    description: List of disks for openshift_glusterfs service to use
-    type: comma_delimited_list
-    tags:
-      - role_specific
-
-resources:
-  RoleParametersValue:
-    type: OS::Heat::Value
-    properties:
-      type: json
-      value:
-        map_replace:
-          - map_replace:
-            - OpenShiftGlusterDisks: OpenShiftGlusterDisks
-            - values: {get_param: [RoleParameters]}
-          - values:
-              OpenShiftGlusterDisks: {get_param: OpenShiftGlusterDisks}
 
 outputs:
   role_data:
@@ -97,83 +75,53 @@ outputs:
                 path: "{{item}}"
                 state: directory
               with_items:
-                - "{{playbook_dir}}/openshift"
+                - "{{playbook_dir}}/openshift/inventory"
 
             - name: set openshift global vars fact
               set_fact:
                 openshift_global_vars: {get_param: OpenShiftGlobalVariables}
                 openshift_master_node_vars: {get_param: OpenShiftMasterNodeVars}
                 openshift_worker_node_vars: {get_param: OpenShiftWorkerNodeVars}
-                openshift_gluster_disks: {get_attr: [RoleParametersValue, value, OpenShiftGlusterDisks]}
 
-            - name: generate openshift inventory
+            - name: generate openshift inventory for openshift_master service
               copy:
-                dest: "{{playbook_dir}}/openshift/inventory.yml"
-                content: |
-                  masters:
-                    hosts:
-                      {% for host in groups['openshift_master'] -%}
-                      {{ hostvars.raw_get(host)['ansible_hostname'] }}:
-                        ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
-                        ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
-                        ansible_become: true
-                        etcd_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_public_ip: {{hostvars.raw_get(host)['external_ip'] | default(hostvars.raw_get(host)['ctlplane_ip'])}}
-                        openshift_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_public_hostname: {{hostvars.raw_get(host)['external_ip'] | default(hostvars.raw_get(host)['ctlplane_ip'])}}
-                        {% if openshift_master_node_vars -%}
-                        {{openshift_master_node_vars | to_nice_yaml() | indent(6)}}
-                        {%- endif %}
+                dest:
+                  str_replace:
+                    template: "{{playbook_dir}}/openshift/inventory/ROLENAME_openshift_master.yml"
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                content:
+                  str_replace:
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                    template: |
+                      masters:
+                        hosts:
+                          {% for host in groups['ROLENAME'] -%}
+                          {{ hostvars.raw_get(host)['ansible_hostname'] }}:
+                            ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
+                            ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
+                            ansible_become: true
+                            etcd_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_public_ip: {{hostvars.raw_get(host)['external_ip'] | default(hostvars.raw_get(host)['ctlplane_ip'])}}
+                            openshift_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_public_hostname: {{hostvars.raw_get(host)['external_ip'] | default(hostvars.raw_get(host)['ctlplane_ip'])}}
+                            {% if openshift_master_node_vars -%}
+                            {{openshift_master_node_vars | to_nice_yaml() | indent(6)}}
+                            {%- endif %}
 
-                      {% endfor %}
+                          {% endfor %}
 
-                  nodes:
-                    hosts:
-                      {% for host in groups['openshift_worker'] -%}
-                      {{ hostvars.raw_get(host)['ansible_hostname'] }}:
-                        ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
-                        ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
-                        ansible_become: true
-                        etcd_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_public_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_public_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
-                        openshift_schedulable: true
-                        openshift_node_labels:
-                          region: 'infra'
-                          zone: 'default'
-                        {% if openshift_worker_node_vars -%}
-                        {{openshift_worker_node_vars | to_nice_yaml() | indent(6)}}
-                        {%- endif %}
+                      etcd:
+                        children:
+                          masters: {}
 
-                      {% endfor %}
-
-                  {% if groups['openshift_glusterfs'] | default([]) %}
-                  glusterfs:
-                    hosts:
-                      {% for host in groups['openshift_glusterfs'] | default([]) -%}
-                      {{ hostvars.raw_get(host)['ansible_hostname'] }}:
-                        glusterfs_ip: {{hostvars.raw_get(host)['storage_ip']}}
-                        glusterfs_devices:
-                          {{openshift_gluster_disks | to_nice_yaml() | indent(8) }}
-                        ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
-                        ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
-                        ansible_become: true
-                        openshift_schedulable: true
-                      {% endfor %}
-                  {% endif %}
-
-                  etcd:
-                    children:
-                      masters: {}
-
-                  OSEv3:
-                    children:
-                      masters: {}
-                      nodes: {}
-                      {% if groups['openshift_glusterfs'] | default([]) %}glusterfs: {}{% endif %}
+                      OSEv3:
+                        children:
+                          masters: {}
+                          nodes: {}
+                          {% if groups['openshift_glusterfs'] | default([]) %}glusterfs: {}{% endif %}
 
             - name: generate openshift global defaults
               copy:
@@ -248,7 +196,7 @@ outputs:
                   {%- else -%}
                   ANSIBLE_HOST_KEY_CHECKING=False
                   ansible-playbook
-                  -i '{{playbook_dir}}/openshift/inventory.yml'
+                  -i '{{playbook_dir}}/openshift/inventory'
                   --extra-vars '@{{playbook_dir}}/openshift/global_defaults.yml'
                   --extra-vars '@{{playbook_dir}}/openshift/global_vars.yml'
                   '{{playbook_dir}}/openshift/playbook.yml'
diff --git a/extraconfig/services/openshift-worker.yaml b/extraconfig/services/openshift-worker.yaml
index 38d12c78b6..9482c984fb 100644
--- a/extraconfig/services/openshift-worker.yaml
+++ b/extraconfig/services/openshift-worker.yaml
@@ -52,3 +52,43 @@ outputs:
             dport: '30000-32767'
       upgrade_tasks: []
       step_config: ''
+      external_deploy_tasks:
+        - name: openshift_worker step 1
+          when: step == '1'
+          block:
+            - name: create openshift temp dirs
+              file:
+                path: "{{item}}"
+                state: directory
+              with_items:
+                - "{{playbook_dir}}/openshift/inventory"
+
+            - name: generate openshift inventory for openshift_worker service
+              copy:
+                dest:
+                  str_replace:
+                    template: "{{playbook_dir}}/openshift/inventory/ROLENAME_openshift_worker.yml"
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                content:
+                  str_replace:
+                    params:
+                      ROLENAME: {get_param: RoleName}
+                    template: |
+                      nodes:
+                        hosts:
+                          {% for host in groups['ROLENAME'] -%}
+                          {{ hostvars.raw_get(host)['ansible_hostname'] }}:
+                            ansible_user: {{ hostvars.raw_get(host)['ansible_user'] | default(hostvars.raw_get(host)['ansible_ssh_user']) | default('root') }}
+                            ansible_host: {{ hostvars.raw_get(host)['ansible_host'] | default(host) }}
+                            ansible_become: true
+                            etcd_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_public_ip: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_public_hostname: {{hostvars.raw_get(host)['ctlplane_ip']}}
+                            openshift_schedulable: true
+                            openshift_node_labels:
+                              region: 'infra'
+                              zone: 'default'
+                          {% endfor %}