[baremetal] Add two interfaces to the opnfv vm 93/63193/3
authorManuel Buil <mbuil@suse.com>
Fri, 5 Oct 2018 07:52:06 +0000 (09:52 +0200)
committerManuel Buil <mbuil@suse.com>
Mon, 15 Oct 2018 15:57:32 +0000 (15:57 +0000)
opnfv vm requires connectivity to two physical interfaces of the host.
These interfaces are:
 1 - admin, where DHCP requests will arrive from blades to do PXE boot
 2 - mgmt, which connects to the mgmt of the blades to do the ansible
   configuration

To achive this, it is required:
 1 - Two libvirt networks that connect to two different linux bridges.
   The important physical interfaces are connected to them. The
   interfaces name is fetched from the idf
 2 - Two templates representing the new libvirt networks
   (net-mgmt.xml.j2 and net-admin.xml.j2)
 3 - Two interfaces defined in vm.xml.j2

Change-Id: I9037aa36802cfde44717b9394bab79b22d7dfaab
Signed-off-by: Manuel Buil <mbuil@suse.com>
xci/infra/bifrost/playbooks/xci-setup-nodes.yml
xci/playbooks/roles/create-nodes/defaults/main.yml
xci/playbooks/roles/create-nodes/tasks/create_vm.yml
xci/playbooks/roles/create-nodes/tasks/main.yml
xci/playbooks/roles/create-nodes/tasks/prepare_libvirt.yml
xci/playbooks/roles/create-nodes/templates/net-admin.xml.j2 [new file with mode: 0644]
xci/playbooks/roles/create-nodes/templates/net-mgmt.xml.j2 [new file with mode: 0644]
xci/playbooks/roles/create-nodes/templates/vm.xml.j2

index 9c9c101..aaa5099 100644 (file)
         port: 22
         connect_timeout: 10
         timeout: 180
+    # No ansible module for brctl found
+    - name: Add pxe interface to the bridge
+      shell: "brctl addif {{ item.bridge }} {{ item.interface }}"
+      become: true
+      when: baremetal | bool == true
+      with_items:
+        - { bridge: "{{ network_bridge_admin }}", interface: "{{ network_interface_admin }}" }
+        - { bridge: "{{ network_bridge_mgmt }}", interface: "{{ network_interface_mgmt }}" }
+
     - name: Load distribution variables
       include_vars:
         file: "{{ xci_path }}/xci/var/{{ ansible_os_family }}.yml"
index 6ac266a..b03f138 100644 (file)
@@ -9,11 +9,12 @@ vm_default_groups: "{{ lookup('env', 'DEFAULT_HOST_GROUPS').split() | default(['
 vm_disk_cache: unsafe
 node_names: "{{ lookup('env', 'NODE_NAMES').split() }}"
 
-# NOTE(pas-ha) name and default are chosen to be the same
-# as in 'bifrost-ironic-install' role
-network_interface: "virbr0"
-# NOTE(pas-ha) these correspond to settings for the libvirt network created by default
-vm_network: "{{ lookup('env', 'VM_NET_BRIDGE') | default('default', true) }}"
+network_bridge_admin: 'br-admin'
+network_bridge_mgmt: 'br-mgmt'
+
+vm_network_admin: "{{ lookup('env', 'VM_NET_BRIDGE') | default('admin', true) }}"
+vm_network_mgmt: "{{ lookup('env', 'VM_NET_BRIDGE_MGMT') | default('mgmt', true) }}"
+
 node_network_netmask: "255.255.255.0"
 
 node_storage_pool: "{{ lookup('env', 'LIBVIRT_STORAGE_POOL') | default('default', true) }}"
@@ -25,3 +26,5 @@ vm_emulator: "/usr/bin/qemu-system-x86_64"
 vm_libvirt_uri: "{{ lookup('env', 'LIBVIRT_CONNECT_URI') | default('qemu:///system', true) }}"
 
 opnfv_image_path: "/var/lib/libvirt/images"
+
+libvirt_networks: "{{ (baremetal | bool) | ternary([vm_network_admin,vm_network_mgmt],[vm_network_admin]) }}"
index 4afb71c..bca5b48 100644 (file)
@@ -35,7 +35,7 @@
         path: "{{ opnfv_image_path }}/{{ vm_name }}.qcow2"
       register: _vm_volume_prepared
 
-    - name: Resize opnfv VM image to {{ item.disks[0].disk_capacity }}
+    - name: Resize opnfv VM image to {{ item.1.disks[0].disk_capacity }}
       command: "qemu-img resize {{ opnfv_image_path }}/opnfv.qcow2 {{ item.1.disks[0].disk_capacity }}"
       when:
         - vm_name == 'opnfv'
index 64857d8..18bc987 100644 (file)
@@ -10,6 +10,8 @@
     name: "{{ required_packages }}"
 
 - include_tasks: prepare_libvirt.yml
+  with_items: "{{ libvirt_networks }}"
+
 - include_tasks: download_opnfvimage.yml
 
 - name: create placeholder var for vm entries in JSON format
index 3f49e75..faf19a6 100644 (file)
 # with the default 192.168.122/0/24 network
 - name: destroy libvirt network
   virt_net:
-    name: "{{ vm_network }}"
+    name: "{{ item }}"
+    state: absent
+    uri: "{{ vm_libvirt_uri }}"
+
+# Ubuntu creates a default network when installing libvirt.
+# This network uses the 192.168.122.0/24 range and thus
+# conflicts with our admin network
+- name: destroy libvirt network
+  virt_net:
+    name: "default"
     state: absent
     uri: "{{ vm_libvirt_uri }}"
 
 - name: ensure libvirt network is present
   virt_net:
-    name: "{{ vm_network }}"
+    name: "{{ item }}"
     state: present
-    xml: "{{ lookup('template', 'net.xml.j2') }}"
+    xml: "{{ lookup('template', 'net-'+item+'.xml.j2') }}"
     uri: "{{ vm_libvirt_uri }}"
 
 - name: find facts on libvirt networks
     command: facts
     uri: "{{ vm_libvirt_uri }}"
 
-# NOTE(pas-ha) yet another place where non-local libvirt will not work
 - name: "Delete network interface if virtual network is not active"
-  command: ip link del {{ ansible_libvirt_networks[vm_network].bridge }}
+  command: ip link del {{ ansible_libvirt_networks[item].bridge }}
   when:
-    - ansible_libvirt_networks[vm_network].state != 'active'
+    - ansible_libvirt_networks[item].state != 'active'
     - vm_libvirt_uri == 'qemu:///system'
   ignore_errors: yes
 
 - name: set libvirt network to autostart
   virt_net:
-    name: "{{ vm_network }}"
+    name: "{{ item }}"
     autostart: yes
     uri: "{{ vm_libvirt_uri }}"
 
 - name: ensure libvirt network is running
   virt_net:
-    name: "{{ vm_network }}"
+    name: "{{ item }}"
     state: active
     uri: "{{ vm_libvirt_uri }}"
 
 - name: get libvirt network status
   virt_net:
-    name: "{{ vm_network }}"
+    name: "{{ item }}"
     command: status
     uri: "{{ vm_libvirt_uri }}"
   register: test_vm_net_status
diff --git a/xci/playbooks/roles/create-nodes/templates/net-admin.xml.j2 b/xci/playbooks/roles/create-nodes/templates/net-admin.xml.j2
new file mode 100644 (file)
index 0000000..aedbbeb
--- /dev/null
@@ -0,0 +1,14 @@
+<network>
+  <name>{{ item }}</name>
+  <forward mode='nat'>
+    <nat>
+      <port start='1024' end='65535'/>
+    </nat>
+  </forward>
+  <bridge name='br-{{ item }}' stp='on' delay='0'/>
+  <ip address='{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.admin.interface].gateway }}' netmask='255.255.255.0'>
+     <dhcp>
+       <host mac="{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.admin.interface].mac_address }}" ip="{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.admin.interface].address }}"/>
+     </dhcp>
+  </ip>
+</network>
diff --git a/xci/playbooks/roles/create-nodes/templates/net-mgmt.xml.j2 b/xci/playbooks/roles/create-nodes/templates/net-mgmt.xml.j2
new file mode 100644 (file)
index 0000000..4a9964c
--- /dev/null
@@ -0,0 +1,11 @@
+<network>
+  <name>{{ item }}</name>
+  <forward mode='route'>
+  </forward>
+  <bridge name='br-{{ item }}' stp='on' delay='0'/>
+  <ip address='{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.mgmt.interface].gateway }}' netmask='255.255.255.0'>
+     <dhcp>
+       <host mac="{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.mgmt.interface].mac_address }}" ip="{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.mgmt.interface].address }}"/>
+     </dhcp>
+  </ip>
+</network>
index e4e41ed..6061fc5 100644 (file)
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
     </controller>
     <interface type='network'>
-      <source network='{{ vm_network }}'/>
+      <source network='{{ vm_network_admin }}'/>
       <model type='{{ vm_nic }}'/>
+      {%- if vm_name == 'opnfv' -%}
       <mac address='{{ item.1.interfaces[opnfv_vm_idf.net_config.admin.interface].mac_address }}'/>
+      {%- else -%}
+      <mac address='{{ item.1.interfaces[idf.net_config.admin.interface].mac_address }}'/>
+      {%- endif -%}
     </interface>
+    {%- if baremetal | bool -%}
+    <interface type='network'>
+      <source network='{{ vm_network_mgmt }}'/>
+      <model type='{{ vm_nic }}'/>
+      <mac address='{{ item.1.interfaces[opnfv_vm_idf.net_config.mgmt.interface].mac_address }}'/>
+    </interface>
+    {%- endif -%}
     <input type='mouse' bus='ps2'/>
     <graphics type='vnc' port='-1' autoport='yes'/>
     <video>