Configure CaaS SR-IOV and provider networks
[ta/infra-ansible.git] / roles / baremetal_provision / tasks / ironic_nodes_deploy.yml
index cb5ba95..1aaef95 100644 (file)
     in_interface: "{{ networking['infra_internal']['interface'] }}"
   when:
     - installation_phase == "provisioning-started"
+    - not virtual_env
+  run_once: true
 
 - name: Power off nodes
   environment:
     OS_AUTH_TOKEN: "fake-token"
     IRONIC_URL: "{{ ironic_service_adminurl }}"
-  command: "/usr/bin/ironic node-set-power-state {{item.uuid}} off"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
+  command: "/usr/bin/ironic node-set-power-state {{baremetal_ironic_node_id.uuid}} off"
   when:
     - not virtual_env
     - installation_phase == "provisioning-started"
   retries: 5
   delay: 10
-  loop_control:
-    label: "{{ item.name }}"
 
 - name: Power off nodes
-  command: "openstack --os-cloud default baremetal node power off {{item.uuid}}"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
+  command: "openstack --os-cloud default baremetal node power off {{baremetal_ironic_node_id.uuid}}"
   when:
     - not virtual_env
     - installation_phase != "provisioning-started"
   retries: 5
   delay: 10
-  loop_control:
-    label: "{{ item.name }}"
 
 - name: Ensure nodes are powered off
   environment:
     auth:
     auth_type: 'None'
     ironic_url: "{{ ironic_service_adminurl }}"
-    nodes_details: "{{ baremetal_ironic_nodes_ids }}"
+    nodes_details:
+      - "{{ baremetal_ironic_node_id }}"
     power_state: 'power off'
   until: power_pending_list | length == 0
   retries: 30
   delay: 6
   when:
-    - not virtual_env and baremetal_ironic_nodes_ids | length > 0
+    - not virtual_env
     - installation_phase == "provisioning-started"
-  no_log: True
+  #no_log: True
 
 - name: Ensure nodes are powered off
   os_node_power_check:
     cloud: default
     auth_type: password
     ironic_url: "{{ ironic_service_adminurl }}"
-    nodes_details: "{{ baremetal_ironic_nodes_ids }}"
+    nodes_details:
+      - "{{ baremetal_ironic_node_id }}"
     power_state: 'power off'
     endpoint_type: internal
   until: power_pending_list | length == 0
   retries: 30
   delay: 6
   when:
-    - not virtual_env and baremetal_ironic_nodes_ids | length > 0
+    - not virtual_env
     - installation_phase != "provisioning-started"
-  no_log: True
+  #no_log: True
 
 # Sleep to make sure power is off
 - name: Sleep for 15 seconds
   pause:
     seconds: 15
-  when: not virtual_env and baremetal_ironic_nodes_ids | length > 0
+  when: not virtual_env
 
 - name: Create config-drive directories for all nodes
   file:
-    path: "/var/lib/ironic/confdrive/{{item.name}}/openstack/latest/"
+    path: "/var/lib/ironic/confdrive/{{baremetal_ironic_node_id.name}}/openstack/latest/"
     state: "directory"
     owner: "ironic"
     group: "ironic"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
-  loop_control:
-    label: "{{ item.name }}"
+    mode: "0775"
 
 - name: Generate config-drive files
   config_template:
-    src: "{{ item[1].src }}"
-    dest: "/var/lib/ironic/confdrive/{{item[0].name}}/openstack/latest/{{ item[1].dest }}"
+    src: "{{item.src}}"
+    dest: "/var/lib/ironic/confdrive/{{baremetal_ironic_node_id.name}}/openstack/latest/{{item.dest}}"
     owner: "ironic"
     group: "ironic"
     mode: "0644"
-    config_type: "{{ item[1].config_type }}"
-  with_nested: 
-    - "{{ baremetal_ironic_nodes_ids }}"
+    config_type: "{{item.config_type}}"
+  with_items:
     - "{{ config_drive_templates }}"
-  loop_control:
-    label: "{{ item[0].name }}"
 
 - name: Stat config-drive files to check if they exists
   stat:
-    path: "/var/lib/ironic/confdrive/{{ item.name }}.base64"
+    path: "/var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64"
   register: confdrive_stat
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
 
 - name: Prepare Config-drive ISO file
   shell: |
     # Generated ISO
-    genisoimage -o /var/lib/ironic/confdrive/{{ item.item.name }}.iso -ldots -allow-lowercase -allow-multidot -l -publisher 'ironicclient-configdrive 0.1' -quiet -J -r -V config-2 /var/lib/ironic/confdrive/{{ item.item.name }}
+    genisoimage -o /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.iso -ldots -allow-lowercase -allow-multidot -l -publisher 'ironicclient-configdrive 0.1' -quiet -J -r -V config-2 /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}
     # Zip it!
-    gzip /var/lib/ironic/confdrive/{{ item.item.name }}.iso
+    gzip /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.iso
     # Encode it to base64
-    base64 -w 0 /var/lib/ironic/confdrive/{{ item.item.name }}.iso.gz > /var/lib/ironic/confdrive/{{ item.item.name }}.base64
-  when: not item.stat.exists
-  with_items: "{{confdrive_stat.results}}"
+    base64 -w 0 /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.iso.gz > /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64
+    chown ironic:ironic /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.iso.gz
+    chown ironic:ironic /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64
+    chmod o+r /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.iso.gz
+    chmod o+r /var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64
+  when: not confdrive_stat.stat.exists
 
 - name: Remove os_net_config temp files
   file:
-    dest: "/tmp/{{item.name}}_config.yaml"
+    dest: "/tmp/{{baremetal_ironic_node_id.name}}_config.yaml"
     state: absent
-  with_items: "{{ baremetal_ironic_nodes }}"
-  loop_control:
-    label: "{{ item.name }}"
 
 - name: Calculate md5sum of Golden image
   stat:
     path: "/opt/images/guest-image.img"
     get_md5: yes
   register: golden_img_md5sum
-  when: baremetal_ironic_nodes_ids | length > 0
+  run_once: true
 
 - name: Enable traffic on infra_internal
   iptables:
     in_interface: "{{ networking['infra_internal']['interface'] }}"
   when:
     - installation_phase == "provisioning-started"
+    - not virtual_env
+  run_once: true
+
+- set_fact:
+    initiator_host: "{{ lookup('file', '/etc/hostname') }}"
+
+- set_fact:
+    initiator_host_ip: "{{ hostvars[initiator_host]['networking']['infra_internal']['ip'] }}"
 
 - name: Configure Baremetal deployment
   environment:
     auth:
     auth_type: 'None'
     ironic_url: "{{ ironic_service_adminurl }}"
-    uuid: "{{item.uuid}}"
+    uuid: "{{baremetal_ironic_node_id.uuid}}"
     deploy: False
     state: present
     power: absent
     maintenance: False
     instance_info:
       root_gb: 10
-      image_source: "http://{{ansible_host}}:{{golden_image_http_port}}/guest-image.img"
+      image_source: "http://{{initiator_host_ip}}:{{golden_image_http_port}}/guest-image.img"
       image_checksum: "{{golden_img_md5sum.stat.md5}}"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
-  loop_control:
-    label: "{{ item.name }}"
   when:
     - installation_phase == "provisioning-started"
 
     cloud: default
     endpoint_type: internal
     auth_type: password
-    uuid: "{{item.uuid}}"
+    uuid: "{{baremetal_ironic_node_id.uuid}}"
     deploy: False
     state: present
     power: absent
     maintenance: False
     instance_info:
       root_gb: 10
-      image_source: "http://{{ansible_host}}:{{golden_image_http_port}}/guest-image.img"
+      image_source: "http://{{initiator_host_ip}}:{{golden_image_http_port}}/guest-image.img"
       image_checksum: "{{golden_img_md5sum.stat.md5}}"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
-  loop_control:
-    label: "{{ item.name }}"
   when:
     - installation_phase != "provisioning-started"
 
     ironic_url: "{{ ironic_service_adminurl }}"
     deploy: True
     power: present
-    config_drive: "{{lookup('file', '/var/lib/ironic/confdrive/{{ item.name }}.base64')}}"
-    uuid: "{{item.uuid}}"
+    config_drive: "{{lookup('file', '/var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64')}}"
+    uuid: "{{baremetal_ironic_node_id.uuid}}"
     instance_info:
       root_gb: 10
-      image_source: "http://{{ansible_host}}:{{golden_image_http_port}}/guest-image.img"
+      image_source: "http://{{initiator_host_ip}}:{{golden_image_http_port}}/guest-image.img"
       image_checksum: "{{golden_img_md5sum.stat.md5}}"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
-  loop_control:
-    label: "{{ item.name }}"
   when:
     - installation_phase == "provisioning-started"
 
     auth_type: password
     deploy: True
     power: present
-    config_drive: "{{lookup('file', '/var/lib/ironic/confdrive/{{ item.name }}.base64')}}"
-    uuid: "{{item.uuid}}"
+    config_drive: "{{lookup('file', '/var/lib/ironic/confdrive/{{ baremetal_ironic_node_id.name }}.base64')}}"
+    uuid: "{{baremetal_ironic_node_id.uuid}}"
     instance_info:
       root_gb: 10
-      image_source: "http://{{ansible_host}}:{{golden_image_http_port}}/guest-image.img"
+      image_source: "http://{{initiator_host_ip}}:{{golden_image_http_port}}/guest-image.img"
       image_checksum: "{{golden_img_md5sum.stat.md5}}"
-  with_items: "{{ baremetal_ironic_nodes_ids }}"
-  loop_control:
-    label: "{{ item.name }}"
   when:
     - installation_phase != "provisioning-started"
 
     auth:
     auth_type: 'None'
     ironic_url: "{{ ironic_service_adminurl }}"
-    nodes_details: "{{baremetal_ironic_nodes_ids}}"
+    nodes_details:
+      - "{{baremetal_ironic_node_id}}"
   register: baremetal_ironic_node_provisionin_results
   until: provision_pending_list | length == 0
   retries: 360
     cloud: default
     endpoint_type: internal
     auth_type: password
-    nodes_details: "{{baremetal_ironic_nodes_ids}}"
+    nodes_details:
+      - "{{baremetal_ironic_node_id}}"
   register: baremetal_ironic_node_provisionin_results
   until: provision_pending_list | length == 0
   retries: 360
     - installation_phase != "provisioning-started"
     - baremetal_ironic_node_provisionin_results['ansible_facts']['provision_failed_list'] | length > 0
 
+- set_fact:
+    net_conn_details: "{{ ironic_node_details.driver_info.power.os_net_config | json_query('network_config[*].addresses[0].ip_netmask') |  ipaddr('address') }}"
+  when: ironic_node_details.driver_info.power.os_net_config.network_config[0].type != 'ovs_bridge'
+  no_log: True
+
+- set_fact:
+    net_conn_details: "{{ ironic_node_details.driver_info.power.os_net_config | json_query('network_config[*].members[*].addresses[0].ip_netmask')|first | ipaddr('address') }}"
+  when: ironic_node_details.driver_info.power.os_net_config.network_config[0].type == 'ovs_bridge'
+  no_log: True
+
 # JanneS: until looping is a fix for the problem in wait_for module; it does not catch socket error in recv if peer closes the connection.
 - name: Verify remote node ssh ports active. Waiting for 60mins max.
   wait_for:
-     host: "{{ item.node_ip[0] }}"
+     host: "{{ net_conn_details[0] }}"
      port: 22
      search_regex: OpenSSH
      sleep: 5
   register: remote_success
   until: remote_success | success
   retries: 3
-  with_items: "{{net_conn_details}}"
 
 - name: Wait for remote node ssh login. Waiting for 10mins max.
-  become: "{{ ansible_env.SUDO_USER }}"
-  local_action: shell ssh -oBatchMode=yes -4 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {{ item.node_ip[0] }} "echo success"
+  become: "{{ users.admin_user_name }}"
+  local_action: shell ssh -oBatchMode=yes -4 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {{ net_conn_details[0] }} "echo success"
   register: user_enabled
-  with_items: "{{net_conn_details}}"
   until: user_enabled.stdout.find("success") != -1
   retries: 90
   delay: 10
-
-- name: Set Ironic maintenance mode to all nodes.
-  os_ironic_node:
-    cloud: default
-    endpoint_type: internal
-    auth_type: password
-    uuid: "{{item.name}}"
-    maintenance: True
-    deploy: False
-  with_items: "{{ baremetal_ironic_nodes }}"
-  loop_control:
-    label: "{{ item.name }}"
-  when:
-    - installation_phase != "provisioning-started"
-
-- name: Set Ironic maintenance mode to all nodes.
-  environment:
-    OS_AUTH_TOKEN: "fake-token"
-    IRONIC_URL: "{{ ironic_service_adminurl }}"
-  os_ironic_node:
-    auth:
-    auth_type: 'None'
-    ironic_url: "{{ ironic_service_adminurl }}"
-    uuid: "{{item.name}}"
-    maintenance: True
-    deploy: False
-  with_items: "{{ baremetal_ironic_nodes }}"
-  loop_control:
-    label: "{{ item.name }}"
-  when:
-    - installation_phase == "provisioning-started"