[baremetal] idf for opnfv_vm and update the pdf 87/60787/19
authorManuel Buil <mbuil@suse.com>
Thu, 9 Aug 2018 13:53:40 +0000 (15:53 +0200)
committerManuel Buil <mbuil@suse.com>
Fri, 28 Sep 2018 15:47:00 +0000 (17:47 +0200)
Physical hardware PODs provide a pdf and a idf to describe hardware and other
information (e.g. what is the purpose for each interface). To reuse the
same code for opnfv vm and also become consistent, we should also describe
the opnfv vm with an idf and a pdf. This patch simplifies what needs to
be done for baremetal, especially for this (future) patch:

https://gerrit.opnfv.org/gerrit/#/c/60797/11

As we add an idf, we should update dynamic_inventory and how we create
the opnfv vm. Obviously, he opnfv_vm.yml gets removed.

Change-Id: I930728474631fc214e4a9adc8581e0c16d230176
Signed-off-by: Manuel Buil <mbuil@suse.com>
xci/infra/bifrost/playbooks/xci-create-virtual.yml
xci/playbooks/dynamic_inventory.py
xci/playbooks/roles/create-vm-nodes/tasks/create_vm.yml
xci/playbooks/roles/create-vm-nodes/tasks/main.yml
xci/playbooks/roles/create-vm-nodes/templates/net.xml.j2
xci/playbooks/roles/create-vm-nodes/templates/vm.xml.j2
xci/var/opnfv_vm_idf.yml [new file with mode: 0644]
xci/var/opnfv_vm_pdf.yml [moved from xci/var/opnfv_vm.yml with 64% similarity]

index bc40d10..381c4fd 100644 (file)
@@ -14,7 +14,8 @@
   vars_files:
     - "{{ pdf_file }}"
     - "{{ idf_file }}"
-    - "{{ xci_path }}/xci/var/opnfv_vm.yml"
+    - "{{ xci_path }}/xci/var/opnfv_vm_pdf.yml"
+    - "{{ xci_path }}/xci/var/opnfv_vm_idf.yml"
     - "{{ xci_path }}/xci/var/opnfv.yml"
   pre_tasks:
     - name: Load distribution variables
index f6e9339..7f60f94 100755 (executable)
@@ -76,6 +76,8 @@ class XCIInventory(object):
     def read_pdf_idf(self):
         pdf_file = os.environ['PDF']
         idf_file = os.environ['IDF']
+        opnfv_file = os.path.dirname(os.path.realpath(__file__)) + "/../var/opnfv_vm_pdf.yml"
+        opnfv_idf_file = os.path.dirname(os.path.realpath(__file__)) + "/../var/opnfv_vm_idf.yml"
         nodes = []
         host_networks = {}
 
@@ -93,6 +95,21 @@ class XCIInventory(object):
                 print(e)
                 sys.exit(1)
 
+        with open(opnfv_file) as f:
+            try:
+                opnfv_pdf = yaml.safe_load(f)
+            except yaml.YAMLError as e:
+                print(e)
+                sys.exit(1)
+
+        with open(opnfv_idf_file) as f:
+            try:
+                opnfv_idf = yaml.safe_load(f)
+            except yaml.YAMLError as e:
+                print(e)
+                sys.exit(1)
+
+
         valid_host = (host for host in idf['xci']['installers'][self.installer]['nodes_roles'] \
                       if host in idf['xci']['flavors'][self.flavor] \
                       and host != 'opnfv')
@@ -119,10 +136,33 @@ class XCIInventory(object):
                 if 'dns' in ndata.keys():
                     host_networks[hostname][network]['dns'] = str(ndata['dns'])
 
+                # Get also vlan and mac_address from pdf
+                host_networks[hostname][network]['mac_address'] = str(pdf_host_info['interfaces'][int(network_interface_num)]['mac_address'])
+                host_networks[hostname][network]['vlan'] = str(pdf_host_info['interfaces'][int(network_interface_num)]['vlan'])
+
+            # Get also vlan and mac_address from opnfv_pdf
+            mgmt_idf_index = int(opnfv_idf['opnfv_vm_idf']['net_config']['mgmt']['interface'])
+            opnfv_mgmt = opnfv_pdf['opnfv_vm_pdf']['interfaces'][mgmt_idf_index]
+            admin_idf_index = int(opnfv_idf['opnfv_vm_idf']['net_config']['admin']['interface'])
+            opnfv_public = opnfv_pdf['opnfv_vm_pdf']['interfaces'][admin_idf_index]
+            self.opnfv_networks['opnfv']['mgmt']['mac_address'] = str(opnfv_mgmt['mac_address'])
+            self.opnfv_networks['opnfv']['mgmt']['vlan'] = str(opnfv_mgmt['vlan'])
+            self.opnfv_networks['opnfv']['public']['mac_address'] = str(opnfv_public['mac_address'])
+            self.opnfv_networks['opnfv']['public']['vlan'] = str(opnfv_public['vlan'])
+
+            # Add the interfaces from idf
+
+
             host_networks.update(self.opnfv_networks)
 
             self.add_groupvar('all', 'host_info', host_networks)
 
+        if 'deployment_host_interfaces' in idf['xci']['installers'][self.installer]['network']:
+            mgmt_idf_index = int(opnfv_idf['opnfv_vm_idf']['net_config']['mgmt']['interface'])
+            admin_idf_index = int(opnfv_idf['opnfv_vm_idf']['net_config']['admin']['interface'])
+            self.add_hostvar('deployment_host', 'network_interface_admin', idf['xci']['installers'][self.installer]['network']['deployment_host_interfaces'][admin_idf_index])
+            self.add_hostvar('deployment_host', 'network_interface_mgmt', idf['xci']['installers'][self.installer]['network']['deployment_host_interfaces'][mgmt_idf_index])
+
         # Now add the additional groups
         for parent in idf['xci']['installers'][self.installer]['groups'].keys():
             map(lambda x: self.add_group(x, parent), idf['xci']['installers'][self.installer]['groups'][parent])
index 700c6c7..df019c8 100644 (file)
       command: get_xml
     register: vm_xml
 
+  - name: Fetch the index for admin network
+    set_fact:
+      admin_index: "{{ (vm_name == 'opnfv') | ternary(opnfv_vm_idf.net_config.admin.interface, idf.net_config.admin.interface) | int }}"
+
   - name: Fetch the ip
     set_fact:
-      vm_ip: "{%- for interface in item.1.interfaces %}{%- if 'native' in (interface.vlan | string) %}{{ interface.address }}{%- endif %}{%- endfor %}"
+      vm_ip: "{{ item.1.interfaces[admin_index | int].address }}"
 
   # Assumes there is only a single NIC per VM
   - name: get MAC from vm XML
index c1cee6d..64857d8 100644 (file)
@@ -18,7 +18,7 @@
 
 # First we create the opnfv_vm
 - include_tasks: create_vm.yml
-  with_indexed_items: "{{ [opnfv_vm] + nodes }}"
+  with_indexed_items: "{{ [opnfv_vm_pdf] + nodes }}"
 
 - name: Start the opnfv vm
   virt: 
index 3c08217..7e372ff 100644 (file)
@@ -6,13 +6,9 @@
     </nat>
   </forward>
   <bridge name='{{ network_interface }}' stp='on' delay='0'/>
-  <ip address='{{ nodes[0].remote_management.address.split(':')[0] }}' netmask='{{ node_network_netmask }}'>
+  <ip address='{{ opnfv_vm_pdf.interfaces[opnfv_vm_idf.net_config.admin.interface].gateway }}' netmask='{{ node_network_netmask }}'>
      <dhcp>
-      {%- for interface in opnfv_vm.interfaces %}
-       {%-   if 'native' in (interface.vlan | string) %}
-       <host mac="{{ interface.mac_address }}" ip="{{ interface.address }}"/>
-       {%-   endif %}
-       {%- endfor %}
+       <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>
index 5c235f5..e4e41ed 100644 (file)
     <controller type='ide' index='0'>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
     </controller>
-    {% set native_interfaces = [] %}
-    {%- for interface in item.1.interfaces %}
-    {%-   if 'native' in (interface.vlan | string) %}
-    {%-     set _ = native_interfaces.append(interface) %}
-    {%-   endif %}
-    {%- endfor %}
-    {%- for interface in native_interfaces -%}
     <interface type='network'>
       <source network='{{ vm_network }}'/>
       <model type='{{ vm_nic }}'/>
-      <mac address='{{ interface.mac_address }}'/>
+      <mac address='{{ item.1.interfaces[opnfv_vm_idf.net_config.admin.interface].mac_address }}'/>
     </interface>
-    {% endfor -%}
     <input type='mouse' bus='ps2'/>
     <graphics type='vnc' port='-1' autoport='yes'/>
     <video>
diff --git a/xci/var/opnfv_vm_idf.yml b/xci/var/opnfv_vm_idf.yml
new file mode 100644 (file)
index 0000000..fa64728
--- /dev/null
@@ -0,0 +1,19 @@
+---
+##############################################################################
+# Copyright (c) 2017 Ericsson AB and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+opnfv_vm_idf:
+  version: 0.1
+  net_config: &net_config
+    admin:
+      interface: 0
+      network: 192.168.122.0
+      mask: 24
+    mgmt:
+      interface: 1
+      network: 172.29.236.0
+      mask: 22
similarity index 64%
rename from xci/var/opnfv_vm.yml
rename to xci/var/opnfv_vm_pdf.yml
index 17f5038..5137138 100644 (file)
@@ -6,7 +6,7 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-opnfv_vm:
+opnfv_vm_pdf:
   name: opnfv
   node: &nodeparams
     type: virtual
@@ -36,32 +36,18 @@ opnfv_vm:
     name: nic1
     speed:
     features:
-    vlan: 10
+    vlan: native
   interface_common_nic2: &interface_common_nic2
     name: nic2
     speed:
     features:
-    vlan: 20
-  interface_common_nic3: &interface_common_nic3
-    name: nic3
-    speed:
-    features:
     vlan: native
-  interface_common_nic4: &interface_common_nic4
-    name: nic4
-    speed:
-    features:
-    vlan: 30
   interfaces:
-    - mac_address: "52:54:00:33:82:d0"
-      address: 172.29.236.10
-      <<: *interface_common_nic1
-    - mac_address: "52:54:00:33:82:d0"
-      address: 172.29.244.10
-      <<: *interface_common_nic2
-    - mac_address: "52:54:00:33:82:d0"
-      address: 192.168.122.2
-      <<: *interface_common_nic3
-    - mac_address: "52:54:00:33:82:d0"
-      address: 172.29.240.10
-      <<: *interface_common_nic4
+   - mac_address: "52:54:00:33:82:d0"
+     address: 192.168.122.2
+     gateway: 192.168.122.1
+     <<: *interface_common_nic1
+   - mac_address: "52:54:00:33:82:d1"
+     address: 172.29.236.10
+     gateway: 172.29.236.1
+     <<: *interface_common_nic2