migrating to proposed common network settings file 05/20705/9
authorDan Radez <dradez@redhat.com>
Tue, 19 Jul 2016 17:17:17 +0000 (13:17 -0400)
committerDan Radez <dradez@redhat.com>
Thu, 22 Sep 2016 19:03:58 +0000 (15:03 -0400)
- proposed in genesis
  https://wiki.opnfv.org/display/genesis/Common+Network+Settings

- This patch updates the network_settings files in the config/network dir
  and updates the associated bash, python and python tests relative to
  the new yaml structure and nomenclature used in the proposed settings
  file

JIRA: APEX-262

Change-Id: Ib0dc9d0f21465b38f2a53cff20f71fb9230bfc48
Signed-off-by: Dan Radez <dradez@redhat.com>
23 files changed:
build/Makefile
build/nics-template.yaml.jinja2
build/undercloud.sh
ci/deploy.sh
config/network/network_settings.yaml
config/network/network_settings_v6.yaml
config/network/network_settings_vlans.yaml
lib/common-functions.sh
lib/configure-deps-functions.sh
lib/parse-functions.sh
lib/post-install-functions.sh
lib/python/apex/common/constants.py
lib/python/apex/network_environment.py
lib/python/apex/network_settings.py
lib/python/apex_python_utils.py
lib/undercloud-functions.sh
lib/virtual-setup-functions.sh
tests/config/network_settings_duplicate_nic.yaml [deleted file]
tests/config/network_settings_missing_required_nic.yaml [deleted file]
tests/config/network_settings_nic1_reserved.yaml [deleted file]
tests/config/network_settings_nics_not_specified.yaml [deleted file]
tests/test_apex_network_environment.py
tests/test_apex_network_settings.py

index 7374215..479d09b 100644 (file)
@@ -19,9 +19,6 @@ export RPMODL = $(shell pwd)/noarch/opnfv-apex-$(RPMVERS)-$(shell echo ${RELEASE
 export RPMONO = $(shell pwd)/noarch/opnfv-apex-onos-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
 export RPMSFC = $(shell pwd)/noarch/opnfv-apex-opendaylight-sfc-$(RPMVERS)-$(shell echo ${RELEASE} | tr -d '_-').noarch.rpm
 
-all_networks="admin_network private_network storage_network external_network api_network"
-
-
 
 .PHONY: all
 all: iso
index 0680a26..ee83011 100644 (file)
@@ -85,16 +85,16 @@ resources:
         os_net_config:
           network_config:
             -
-            {%- if vlans['private_network'] is number or vlans['storage_network'] is number or vlans['api_network'] is number or  vlans['public_network'] is number %}
+            {%- if nets['tenant']['nic_mapping'][role]['vlan'] is number or nets['storage']['nic_mapping'][role]['vlan'] is number or nets['api']['nic_mapping'][role]['vlan'] is number or  nets['external'][0]['nic_mapping'][role]['vlan'] is number %}
               type: ovs_bridge
               name: {get_input: bridge_name}
               members:
                 -
                   type: interface
-                  name: {{ nics[role]['admin_network'] }}
+                  name: {{ nets[role]['admin']['members'][0] }}
                   # force the MAC address of the bridge to this interface
                   primary: true
-                {%- if 'public_network' in enabled_networks and vlans['public_network'] is number %}
+                {%- if nets['external'][0]['enabled'] and nets['external'][0]['nic_mapping'][role]['vlan'] is number %}
                 -
                   type: vlan
                   vlan_id: {get_param: ExternalNetworkVlanID}
@@ -106,7 +106,7 @@ resources:
                       default: true
                       next_hop: {get_param: ExternalInterfaceDefaultRoute}
                 {%- endif %}
-                {%- if 'private_network' in enabled_networks and vlans['private_network'] is number %}
+                {%- if nets['tenant']['enabled'] and nets['tenant']['nic_mapping'][role]['vlan'] is number %}
                 -
                   type: vlan
                   vlan_id: {get_param: TenantNetworkVlanID}
@@ -114,7 +114,7 @@ resources:
                     -
                       ip_netmask: {get_param: TenantIpSubnet}
                 {%- endif %}
-                {%- if 'storage_network' in enabled_networks and vlans['storage_network'] is number %}
+                {%- if nets['storage']['enabled'] and nets['storage']['nic_mapping'][role]['vlan'] is number %}
                 -
                   type: vlan
                   vlan_id: {get_param: StorageNetworkVlanID}
@@ -122,7 +122,7 @@ resources:
                     -
                       ip_netmask: {get_param: StorageIpSubnet}
                 {%- endif %}
-                {%- if 'api_network' in enabled_networks and vlans['api_network'] is number %}
+                {%- if nets['api']['enabled'] and nets['api']['nic_mapping'][role]['vlan'] is number %}
                 -
                   type: vlan
                   vlan_id: {get_param: InternalApiNetworkVlanID}
@@ -132,7 +132,7 @@ resources:
                 {%- endif %}
             {%- else %}
               type: interface
-              name: {{ nics[role]['admin_network'] }}
+              name: {{ nets['admin']['nic_mapping'][role]['members'][0] }}
             {%- endif %}
               use_dhcp: false
               dns_servers: {get_param: DnsServers}
@@ -153,7 +153,7 @@ resources:
                   next_hop: {get_param: ControlPlaneDefaultRoute}
                 {%- endif %}
 
-            {%- if 'private_network' in enabled_networks and vlans['private_network'] == 'native' %}
+            {%- if nets['tenant']['enabled'] and nets['tenant']['nic_mapping'][role]['vlan'] == 'native' %}
             {%- if ovs_dpdk_bridge == 'br-phy' and role == 'compute' %}
             -
               type: ovs_bridge
@@ -165,7 +165,7 @@ resources:
               members:
                 -
                   type: interface
-                  name: {{ nics[role]['private_network'] }}
+                  name: {{ nets['tenant']['nic_mapping'][role]['members'][0] }}
                   # force the MAC address of the bridge to this interface
                   primary: true
             -
@@ -175,17 +175,17 @@ resources:
             {%- else %}
             -
               type: interface
-              name: {{ nics[role]['private_network'] }}
+              name: {{ nets['tenant']['nic_mapping'][role]['members'][0] }}
               use_dhcp: false
               addresses:
                 -
                   ip_netmask: {get_param: TenantIpSubnet}
             {%- endif %}
             {%- endif %}
-            {%- if 'public_network' in enabled_networks and external_net_type == 'interface' and vlans['public_network'] == 'native' %}
+            {%- if nets['external'][0]['enabled'] and external_net_type == 'interface' and nets['external'][0]['nic_mapping'][role]['vlan'] == 'native' %}
             -
               type: interface
-              name: {{ nics[role]['public_network'] }}
+              name: {{ nets['external'][0]['nic_mapping'][role]['members'][0] }}
               {%- if role == 'controller' %}
               dns_servers: {get_param: DnsServers}
               {%- endif %}
@@ -200,7 +200,7 @@ resources:
                   {%- endif %}
                   ip_netmask: 0.0.0.0/0
                   next_hop: {get_param: ExternalInterfaceDefaultRoute}
-            {%- elif 'public_network' in enabled_networks  and external_net_type == 'br-ex' and vlans['public_network'] == 'native' %}
+            {%- elif nets['external'][0]['enabled'] and external_net_type == 'br-ex' and nets['external'][0]['nic_mapping'][role]['vlan'] == 'native' %}
             -
               type: ovs_bridge
               name: {get_input: bridge_name}
@@ -208,7 +208,7 @@ resources:
               members:
                 -
                   type: interface
-                  name: {{ nics[role]['public_network'] }}
+                  name: {{ nets['external'][0]['nic_mapping'][role]['members'][0] }}
                   # force the MAC address of the bridge to this interface
                   primary: true
               {%- if role == 'controller' %}
@@ -223,19 +223,19 @@ resources:
                   next_hop: {get_param: ExternalInterfaceDefaultRoute}
               {%- endif %}
             {%- endif %}
-            {%- if 'storage_network' in enabled_networks and vlans['storage_network'] == 'native' %}
+            {%- if nets['storage']['enabled'] and nets['storage']['nic_mapping'][role]['vlan'] == 'native' %}
             -
               type: interface
-              name: {{ nics[role]['storage_network'] }}
+              name: {{ nets['storage']['nic_mapping'][role]['members'][0] }}
               use_dhcp: false
               addresses:
                 -
                   ip_netmask: {get_param: StorageIpSubnet}
             {%- endif %}
-            {%- if 'api_network' in enabled_networks and vlans['api_network'] == 'native' %}
+            {%- if nets['api']['enabled'] and nets['api']['nic_mapping'][role]['vlan'] == 'native' %}
             -
               type: interface
-              name: {{ nics[role]['api_network'] }}
+              name: {{ nets['api']['nic_mapping'][role]['members'][0] }}
               use_dhcp: false
               addresses:
                 -
index a4d008e..3cc5600 100755 (executable)
@@ -62,7 +62,7 @@ LIBGUESTFS_BACKEND=direct virt-customize \
 
 # Add custom IPA to allow kernel params
 wget https://raw.githubusercontent.com/trozet/ironic-python-agent/opnfv_kernel/ironic_python_agent/extensions/image.py
-python3.4 -c 'import py_compile; py_compile.compile("image.py", cfile="image.pyc")'
+python3 -c 'import py_compile; py_compile.compile("image.py", cfile="image.pyc")'
 
 # Add performance image scripts
 LIBGUESTFS_BACKEND=direct virt-customize --upload ../build_perf_image.sh:/home/stack \
index cd90511..24c26d9 100755 (executable)
@@ -42,18 +42,18 @@ DEPLOY_OPTIONS=""
 CONFIG=${CONFIG:-'/var/opt/opnfv'}
 RESOURCES=${RESOURCES:-"$CONFIG/images"}
 LIB=${LIB:-"$CONFIG/lib"}
-OPNFV_NETWORK_TYPES="admin_network private_network public_network storage_network api_network"
+OPNFV_NETWORK_TYPES="admin tenant external storage api"
 
 VM_CPUS=4
 VM_RAM=8
 VM_COMPUTES=1
 
 # Netmap used to map networks to OVS bridge names
-NET_MAP['admin_network']="br-admin"
-NET_MAP['private_network']="br-private"
-NET_MAP['public_network']="br-public"
-NET_MAP['storage_network']="br-storage"
-NET_MAP['api_network']="br-api"
+NET_MAP['admin']="br-admin"
+NET_MAP['tenant']="br-tenant"
+NET_MAP['external']="br-external"
+NET_MAP['storage']="br-storage"
+NET_MAP['api']="br-api"
 ext_net_type="interface"
 ip_address_family=4
 
@@ -174,7 +174,7 @@ parse_cmdline() {
   sleep 2
 
   if [[ ! -z "$NETSETS" && "$net_isolation_enabled" == "FALSE" ]]; then
-    echo -e "${red}INFO: Single flat network requested. Only admin_network settings will be used!${reset}"
+    echo -e "${red}INFO: Single flat network requested. Only admin network settings will be used!${reset}"
   elif [[ -z "$NETSETS" ]]; then
     echo -e "${red}ERROR: You must provide a network_settings file with -n.${reset}"
     exit 1
@@ -247,7 +247,7 @@ main() {
     fi
   fi
   if [[ "${deploy_options_array['sdn_controller']}" == 'onos' ]]; then
-    if ! onos_update_gw_mac ${public_network_cidr} ${public_network_gateway}; then
+    if ! onos_update_gw_mac ${external_cidr} ${external_gateway}; then
       echo -e "${red}ERROR:ONOS Post Install Configuration Failed, Exiting.${reset}"
       exit 1
     else
index f768064..ab9ed96 100644 (file)
 # This configuration file defines Network Environment for a
 # Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
+# for 5 following networks:
 #
 # - admin
-# - private*
-# - public
+# - tenant*
+# - external*
 # - storage*
-#
+# - api*
 # *) optional networks
 #
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
 # Optional networks will be consolidated with the admin network
-# if not explicitely configured.
+# if not explicitly configured.
 #
 # See short description of the networks in the comments below.
 #
+# "admin" is the short name for Control Plane Network.
+# This network should be IPv4 even it is an IPv6 deployment
+# IPv6 does not have PXE boot support.
+# During OPNFV deployment it is used for node provisioning which will require
+# PXE booting as well as running a DHCP server on this network.  Be sure to
+# disable any other DHCP/TFTP server on this network.
+#
+# "tenant" is the network used for tenant traffic.
+#
+# "external" is the network which should have internet or external
+# connectivity.  External OpenStack networks will be configured to egress this
+# network.  There can be multiple external networks, but only one assigned as
+# "public" which OpenStack public API's will register.
+#
+# "storage" is the network for storage I/O.
+#
+# "api" is an optional network for splitting out OpenStack service API
+# communication.  This should be used for IPv6 deployments.
 
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
 
-# Domain name to use for undercloud/overcloud nodes
-domain_name: 'opnfvapex.com'
+#Meta data for the network configuration
+network-config-metadata:
+  title: LF-POD-1 Network config
+  version: 0.1
+  created: Mon Dec 28 2015
+  comment: None
 
-# "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-#
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  compute_interface: nic1
-  controller_interface: nic1
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
+# DNS Settings
+dns-domain: opnfvlf.org
+dns-search: opnfvlf.org
+dns_nameservers:
+  - 8.8.8.8
+  - 8.8.4.4
+# NTP servers
+ntp:
+  - 0.se.pool.ntp.org
+  - 1.se.pool.ntp.org
+# Syslog server
+syslog:
+  server: 10.128.1.24
+  transport: 'tcp'
 
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-#
-private_network:
-  enabled: true
-  vlan: native
-  cidr: 11.0.0.0/24
-  compute_interface: nic2
-  controller_interface: nic2
+networks:                            # Network configurations
+  admin:                             # Admin configuration (pxe and jumpstart),
+    enabled: true
+    installer_vm:                    # Network settings for the Installer VM on admin network
+      nic_type: interface            # Indicates if this VM will be bridged to an interface, or to a bond
+      members:
+        - em1                        # Member Interface to bridge to for installer VM (use multiple values for bond)
+      vlan: native                   # VLAN tag to use for this network on Installer VM, native means none
+      ip: 192.0.2.1                  # IP to assign to Installer VM on this network
+    usable_ip_range:
+      - 192.0.2.11
+      - 192.0.2.99                   # Usable ip range, if empty entire range is usable
+    gateway: 192.0.2.1               # Gateway (only needed when public_network is disabled)
+    cidr: 192.0.2.0/24               # Subnet in CIDR format 192.168.1.0/24
+    dhcp_range:
+      - 192.0.2.2
+      - 192.0.2.10                   # DHCP range for the admin network, if empty it will be automatically provisioned
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic1
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        members:
+          - nic1
+                                     #
+  tenant:                            # Tenant network configuration
+    enabled: true
+    cidr: 11.0.0.0/24                # Subnet in CIDR format 192.168.1.0/24
+    mtu: 64000                       # Tenant network MTU
+    overlay_id_range: 2,65535        # Tenant network Overlay segmentation ID range:
+                                     # VNI, VLAN-ID, etc.
+    segmentation_type: vxlan         # Tenant network segmentation type:
+                                     # vlan, vxlan, gre
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        vlan: native                 # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic2                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: interface
+        vlan: native
+        members:
+          - nic2                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+                                     #
+  external:                          # Can contain 1 or more external networks
+    - public:                        # "public" network will be the network the installer VM attaches to
+      enabled: true
+      mtu: 64000                     # Public network MTU
+      installer_vm:                  # Network settings for the Installer VM on admin network (note only valid on 'public' external network)
+        nic_type: interface          # Indicates if this VM will be bridged to an interface, or to a bond
+        vlan: native
+        members:
+          - em1                      # Member Interface to bridge to for installer VM (use multiple values for bond)
+        ip: 192.168.37.1             # IP to assign to Installer VM on this network
+      cidr: 192.168.37.0/24
+      gateway: 192.168.37.1
+      floating_ip_range:
+        - 192.168.37.200
+        - 192.168.37.220             #Range to allocate to floating IPs for the public network with Neutron
+      usable_ip_range:
+        - 192.168.37.10
+        - 192.168.37.199             # Usable IP range on the public network, usually this is a shared subnet
+      nic_mapping:                   # Mapping of network configuration for Overcloud Nodes
+        compute:                     # Mapping for compute profile (nodes that will be used as Compute nodes)
+          phys_type: interface       # Physical interface type (interface or bond)
+          vlan: native               # VLAN tag to use with this NIC
+          members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+            - nic3
+        controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
+          phys_type: interface
+          vlan: native
+          members:
+            - nic3
+      external_overlay:              # External network to be created in OpenStack by Services tenant
+          name: Public_internet
+          type: flat
+          gateway: 192.168.37.1
+    - private_cloud:                 # another external network
+      enabled: false
+      mtu: 64000
+      installer_vm:                  # Network settings for the Installer VM on admin network (note only valid on 'public' external network)
+        nic_type: interface          # Indicates if this VM will be bridged to an interface, or to a bond
+        vlan: 101
+        members:
+          - em1                      # Member Interface to bridge to for installer VM (use multiple values for bond)
+        ip: 192.168.38.1             # IP to assign to Installer VM on this network
+      cidr: 192.168.38.0/24
+      gateway: 192.168.38.1
+      floating_ip_range:
+        - 192.168.38.200
+        - 192.168.38.220             #Range to allocate to floating IPs for the public network with Neutron
+      usable_ip_range:
+        - 192.168.38.10
+        - 192.168.38.199             # Usable IP range on the public network, usually this is a shared subnet
+      nic_mapping:                   # Mapping of network configuration for Overcloud Nodes
+        compute:                     # Mapping for compute profile (nodes that will be used as Compute nodes)
+          phys_type: interface       # Physical interface type (interface or bond)
+          vlan: 101                  # VLAN tag to use with this NIC
+          members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+            - nic3                   # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+        controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
+          phys_type: interface
+          vlan: 101
+          members:
+            - nic3
+      external_overlay:              # External network to be created in OpenStack by Services tenant
+          name: private_cloud
+          type: vlan
+          segmentation_id: 101
+          gateway: 192.168.38.1
+                                     #
+  storage:                           # Storage network configuration
+    enabled: true
+    cidr: 12.0.0.0/24                # Subnet in CIDR format
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: native                 # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic4                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: native
+        members:
+          - nic4
+                                     #
+  api:                               # API network configuration
+    enabled: false
+    cidr: fd00:fd00:fd00:4000::/64   # Subnet in CIDR format
+    vlan: 13                         # VLAN tag to use for Overcloud hosts on this network
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: native                 # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic5                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: native
+        members:
+          - nic5
 
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  compute_interface: nic3
-  controller_interface: nic3
-  vlan: native
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
+# JOID specific settings
+joid:
 
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  vlan: native
-  cidr: 12.0.0.0/24
-  compute_interface: nic4
-  controller_interface: nic4
+# Compass specific settings
+compass:
 
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  compute_interface: nic4                           #Interface used for this network on the compute node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  controller_interface: nic4                        #Interface used for this network on the controller node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
+# Apex specific settings
+apex:
+  networks:
+    admin:
+      introspection_range:
+        - 192.0.2.100
+        - 192.0.2.120                # Range used for introspection phase (examining nodes)
+# Fuel specific settings
+fuel:
index dd2d066..bfce3ab 100644 (file)
 # This configuration file defines Network Environment for a
 # Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
+# for 5 following networks:
 #
 # - admin
-# - private*
-# - public
+# - tenant*
+# - external*
 # - storage*
 # - api*
-#
 # *) optional networks
 #
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
 # Optional networks will be consolidated with the admin network
-# if not explicitely configured.
+# if not explicitly configured.
 #
 # See short description of the networks in the comments below.
 #
-
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
-
 # "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-# This network must be IPv4 currently.
-domain_name: 'opnfvapex.com'
-
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  compute_interface: nic1
-  controller_interface: nic1
-  vlan: native
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-# This network must be IPv4 currently.
+# This network should be IPv4 even it is an IPv6 deployment
+# IPv6 does not have PXE boot support.
+# During OPNFV deployment it is used for node provisioning which will require
+# PXE booting as well as running a DHCP server on this network.  Be sure to
+# disable any other DHCP/TFTP server on this network.
+#
+# "tenant" is the network used for tenant traffic.
+#
+# "external" is the network which should have internet or external
+# connectivity.  External OpenStack networks will be configured to egress this
+# network.  There can be multiple external networks, but only one assigned as
+# "public" which OpenStack public API's will register.
+#
+# "storage" is the network for storage I/O.
 #
-private_network:
-  enabled: true
-  cidr: 11.0.0.0/24
-  vlan: native
-  cidr: 11.0.0.0/24
-  compute_interface: nic2
-  controller_interface: nic2
+# "api" is an optional network for splitting out OpenStack service API
+# communication.  This should be used for IPv6 deployments.
 
 
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  compute_interface: nic3
-  controller_interface: nic3
-  vlan: native
-  cidr: 2001:db8::/64
-  gateway: 2001:db8::1
-  provisioner_ip: 2001:db8::1
+#Meta data for the network configuration
+network-config-metadata:
+  title: LF-POD-1 Network config
+  version: 0.1
+  created: Mon Dec 28 2015
+  comment: None
 
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  cidr: fd00:fd00:fd00:2000::/64
-  vlan: native
-  compute_interface: nic4
-  controller_interface: nic4
+# DNS Settings
+dns-domain: opnfvlf.org
+dns-search: opnfvlf.org
+dns_nameservers:
+  - 8.8.8.8
+  - 8.8.4.4
+# NTP servers
+ntp:
+  - 0.se.pool.ntp.org
+  - 1.se.pool.ntp.org
+# Syslog server
+syslog:
+  server: 10.128.1.24
+  transport: 'tcp'
 
+networks:                            # Network configurations
+  admin:                             # Admin configuration (pxe and jumpstart),
+    enabled: true
+    installer_vm:                    # Network settings for the Installer VM on admin network
+      nic_type: interface            # Indicates if this VM will be bridged to an interface, or to a bond
+      members:
+        - em1                        # Member Interface to bridge to for installer VM (use multiple values for bond)
+      vlan: native                   # VLAN tag to use for this network on Installer VM, native means none
+      ip: 192.0.2.1                  # IP to assign to Installer VM on this network
+    usable_ip_range:
+      - 192.0.2.11
+      - 192.0.2.99                   # Usable ip range, if empty entire range is usable
+    gateway: 192.0.2.1               # Gateway (only needed when public_network is disabled)
+    cidr: 192.0.2.0/24               # Subnet in CIDR format 192.168.1.0/24
+    dhcp_range:
+      - 192.0.2.2
+      - 192.0.2.10                   # DHCP range for the admin network, if empty it will be automatically provisioned
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic1
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        members:
+          - nic1
+                                     #
+  tenant:                            # Tenant network configuration
+    enabled: true
+    cidr: 11.0.0.0/24                # Subnet in CIDR format 192.168.1.0/24
+    mtu: 64000                       # Tenant network MTU
+    overlay_id_range: 2,65535        # Tenant network Overlay segmentation ID range:
+                                     # VNI, VLAN-ID, etc.
+    segmentation_type: vxlan         # Tenant network segmentation type:
+                                     # vlan, vxlan, gre
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        vlan: native                 # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic2                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: interface
+        vlan: native
+        members:
+          - nic2                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+                                     #
+  external:                          # Can contain 1 or more external networks
+    - public:                        # "public" network will be the network the installer VM attaches to
+      enabled: true
+      mtu: 64000                     # Public network MTU
+      installer_vm:                  # Network settings for the Installer VM on admin network (note only valid on 'public' external network)
+        nic_type: interface          # Indicates if this VM will be bridged to an interface, or to a bond
+        vlan: native
+        members:
+          - em1                      # Member Interface to bridge to for installer VM (use multiple values for bond)
+        ip: 2001:db8::1              # IP to assign to Installer VM on this network
+      cidr: 2001:db8::0/64
+      gateway: 2001:db8::1
+      floating_ip_range:
+          - 2001:db8:0:0:0:0:0:2
+          - 2001:db8:0:0:ffff:ffff:ffff:ffff
+      nic_mapping:                   # Mapping of network configuration for Overcloud Nodes
+        compute:                     # Mapping for compute profile (nodes that will be used as Compute nodes)
+          phys_type: interface       # Physical interface type (interface or bond)
+          vlan: native               # VLAN tag to use with this NIC
+          members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+            - nic3
+        controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
+          phys_type: interface
+          vlan: native
+          members:
+            - nic3
+      external_overlay:              # External network to be created in OpenStack by Services tenant
+          name: Public_internet
+          type: flat
+          gateway: 2001:db8::1
+                                     #
+  storage:                           # Storage network configuration
+    enabled: true
+    cidr: fd00:fd00:fd00:2000::/64   # Subnet in CIDR format
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: native                 # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic4                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: native
+        members:
+          - nic4
+                                     #
+  api:                               # API network configuration
+    enabled: true
+    cidr: fd00:fd00:fd00:4000::/64   # Subnet in CIDR format
+    vlan: 13                         # VLAN tag to use for Overcloud hosts on this network
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: native                     # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic5                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: native
+        members:
+          - nic5
 
-# "api" is an optional network used by internal openstack api services.
-api_network:
-  enabled: true
-  cidr: fd00:fd00:fd00:4000::/64
-  vlan: native
-  compute_interface: nic5
-  controller_interface: nic5
+# JOID specific settings
+joid:
 
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#
-#private_network:
-#  enabled: false                                    #If disabled, underlay traffic will collapse to admin_network
-#  ipv6: true                                        #This flag is only needed if cidr is not provided, and bridged_interface
-#                                                     is used for address auto detection.
-#
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
-#  ipv6: true                                        #This flag is only needed if cidr is not provided, and bridged_interface
-#                                                     is used for address auto detection.
-#
-#api_network:
-#  enabled: false                                    #If disabled, api_network traffic will collapse to admin network
-#  ipv6: true                                        #This flag is only needed if cidr is not provided, and bridged_interface
-#                                                     is used for address auto detection.
-#
-#General behavior description (today's behavior, not necessarily optimal):
-#  - If a network has cidr field defined, no auto detection will be done. All missing fields will be generated according to CIDR.
-#  - If cidr is not specified, bridged_interface field must be specified. IP detection will be done on the system.
-#    In this case, an optional ipv6 field can be specified to indicate what kind of IP discovery takes place.
-#  - It is assumed the supplied cidr has enough address to generate all field today.
-#  - If a field is specified, no auto generation (from cidr) or auto detection (from bridged_interface) will be performed.
-#    It is assumed the value specified is correct.
-#  - Any networks can be specified to be IPv6, but only private, storage and public SHOULD. No check is performed to validate this.
-#
-#Other changes
-# - All IP addresses can now be IPv4 or IPv6, we will detect the correct family and configure accordingly.
-#   Note that if any network is specified to be IPv6, we consider it a IPv6 deployment. IPv6 deployment does require additional
-#   configurations in resulting network environment yaml, such as enabling ipv6 support for NOVA, RABBITMQ, etc.
-#
\ No newline at end of file
+# Compass specific settings
+compass:
+
+# Apex specific settings
+apex:
+  networks:
+    admin:
+      introspection_range:
+        - 192.0.2.100
+        - 192.0.2.120                # Range used for introspection phase (examining nodes)
+# Fuel specific settings
+fuel:
index 40d6183..beeae47 100644 (file)
 # This configuration file defines Network Environment for a
 # Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
+# for 5 following networks:
 #
 # - admin
-# - private*
-# - public
+# - tenant*
+# - external*
 # - storage*
-#
+# - api*
 # *) optional networks
 #
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
 # Optional networks will be consolidated with the admin network
-# if not explicitely configured.
+# if not explicitly configured.
 #
 # See short description of the networks in the comments below.
 #
-
 # "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
+# This network should be IPv4 even it is an IPv6 deployment
+# IPv6 does not have PXE boot support.
+# During OPNFV deployment it is used for node provisioning which will require
+# PXE booting as well as running a DHCP server on this network.  Be sure to
+# disable any other DHCP/TFTP server on this network.
 #
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
+# "tenant" is the network used for tenant traffic.
 #
-private_network:
-  enabled: true
-  vlan: 400
-  cidr: 11.0.0.0/24
-
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
+# "external" is the network which should have internet or external
+# connectivity.  External OpenStack networks will be configured to egress this
+# network.  There can be multiple external networks, but only one assigned as
+# "public" which OpenStack public API's will register.
 #
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  vlan: 500
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
-
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
+# "storage" is the network for storage I/O.
 #
-storage_network:
-  enabled: true
-  vlan: 200
-  cidr: 12.0.0.0/24
+# "api" is an optional network for splitting out OpenStack service API
+# communication.  This should be used for IPv6 deployments.
+
+
+#Meta data for the network configuration
+network-config-metadata:
+  title: LF-POD-1 Network config
+  version: 0.1
+  created: Mon Dec 28 2015
+  comment: None
+
+# DNS Settings
+dns-domain: opnfvlf.org
+dns-search: opnfvlf.org
+dns_nameservers:
+  - 8.8.8.8
+  - 8.8.4.4
+# NTP servers
+ntp:
+  - 0.se.pool.ntp.org
+  - 1.se.pool.ntp.org
+# Syslog server
+syslog:
+  server: 10.128.1.24
+  transport: 'tcp'
+
+networks:                            # Network configurations
+  admin:                             # Admin configuration (pxe and jumpstart),
+    enabled: true
+    installer_vm:                    # Network settings for the Installer VM on admin network
+      nic_type: interface            # Indicates if this VM will be bridged to an interface, or to a bond
+      members:
+        - em1                        # Member Interface to bridge to for installer VM (use multiple values for bond)
+      vlan: native                   # VLAN tag to use for this network on Installer VM, native means none
+      ip: 192.0.2.1                  # IP to assign to Installer VM on this network
+    usable_ip_range:
+      - 192.0.2.11
+      - 192.0.2.99                   # Usable ip range, if empty entire range is usable
+    gateway: 192.0.2.1               # Gateway (only needed when public_network is disabled)
+    cidr: 192.0.2.0/24               # Subnet in CIDR format 192.168.1.0/24
+    dhcp_range:
+      - 192.0.2.2
+      - 192.0.2.10                   # DHCP range for the admin network, if empty it will be automatically provisioned
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic1
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        members:
+          - nic1
+                                     #
+  tenant:                            # Tenant network configuration
+    enabled: true
+    cidr: 11.0.0.0/24                # Subnet in CIDR format 192.168.1.0/24
+    mtu: 64000                       # Tenant network MTU
+    overlay_id_range: 2,65535        # Tenant network Overlay segmentation ID range:
+                                     # VNI, VLAN-ID, etc.
+    segmentation_type: vxlan         # Tenant network segmentation type:
+                                     # vlan, vxlan, gre
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: interface         # Physical interface type (interface or bond)
+        vlan: 401                    # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic1                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: interface
+        vlan: 401
+        members:
+          - nic1                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+                                     #
+  external:                          # Can contain 1 or more external networks
+    - public:                        # "public" network will be the network the installer VM attaches to
+      enabled: true
+      mtu: 64000                     # Public network MTU
+      installer_vm:                  # Network settings for the Installer VM on admin network (note only valid on 'public' external network)
+        nic_type: interface          # Indicates if this VM will be bridged to an interface, or to a bond
+        vlan: 501
+        members:
+          - em1                      # Member Interface to bridge to for installer VM (use multiple values for bond)
+        ip: 192.168.37.12            # IP to assign to Installer VM on this network
+      cidr: 192.168.37.0/24
+      gateway: 192.168.37.1
+      floating_ip_range:
+        - 192.168.37.200
+        - 192.168.37.220             # Range to allocate to floating IPs for the public network with Neutron
+      usable_ip_range:
+        - 192.168.37.10
+        - 192.168.37.199             # Usable IP range on the public network, usually this is a shared subnet
+      nic_mapping:                   # Mapping of network configuration for Overcloud Nodes
+        compute:                     # Mapping for compute profile (nodes that will be used as Compute nodes)
+          phys_type: interface       # Physical interface type (interface or bond)
+          vlan: 501                  # VLAN tag to use with this NIC
+          members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+            - nic1
+        controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
+          phys_type: interface
+          vlan: 501
+          members:
+            - nic1
+      external_overlay:              # External network to be created in OpenStack by Services tenant
+          name: Public_internet
+          type: flat
+          gateway: 192.168.37.1
+    - private_cloud:                 # another external network
+      enabled: false
+      mtu: 64000
+      installer_vm:                  # Network settings for the Installer VM on admin network (note only valid on 'public' external network)
+        nic_type: interface          # Indicates if this VM will be bridged to an interface, or to a bond
+        vlan: 501
+        members:
+          - em1                      # Member Interface to bridge to for installer VM (use multiple values for bond)
+        ip: 192.168.38.12            # IP to assign to Installer VM on this network
+      cidr: 192.168.38.0/24
+      gateway: 192.168.38.1
+      floating_ip_range:
+        - 192.168.38.200
+        - 192.168.38.220             # Range to allocate to floating IPs for the public network with Neutron
+      usable_ip_range:
+        - 192.168.38.10
+        - 192.168.38.199             # Usable IP range on the public network, usually this is a shared subnet
+      nic_mapping:                   # Mapping of network configuration for Overcloud Nodes
+        compute:                     # Mapping for compute profile (nodes that will be used as Compute nodes)
+          phys_type: interface       # Physical interface type (interface or bond)
+          vlan: 502                  # VLAN tag to use with this NIC
+          members:                   # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+            - eth1                   # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+        controller:                  # Mapping for controller profile (nodes that will be used as Controller nodes)
+          phys_type: interface
+          vlan: 502
+          members:
+            - eth1
+      external_overlay:              # External network to be created in OpenStack by Services tenant
+          name: private_cloud
+          type: vlan
+          segmentation_id: 101
+          gateway: 192.168.38.1
+                                     #
+  storage:                           # Storage network configuration
+    enabled: true
+    cidr: 12.0.0.0/24                # Subnet in CIDR format
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: 201                    # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic4                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: 201
+        members:
+          - nic4
+                                     #
+  api:                               # API network configuration
+    enabled: false
+    cidr: fd00:fd00:fd00:4000::/64   # Subnet in CIDR format
+    mtu: 64000                       # Tenant network MTU
+    nic_mapping:                     # Mapping of network configuration for Overcloud Nodes
+      compute:                       # Mapping for compute profile (nodes that will be used as Compute nodes)
+        phys_type: bond              # Physical interface type (interface or bond)
+        vlan: 101                    # VLAN tag to use with this NIC
+        members:                     # Physical NIC members of this mapping (Single value allowed for interface phys_type)
+          - nic5                     # Note, for Apex you may also use the logical nic name (found by nic order), such as "nic1"
+      controller:                    # Mapping for controller profile (nodes that will be used as Controller nodes)
+        phys_type: bond
+        vlan: 101
+        members:
+          - nic5
+
+# JOID specific settings
+joid:
+
+# Compass specific settings
+compass:
 
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
+# Apex specific settings
+apex:
+  networks:
+    admin:
+      introspection_range:
+        - 192.0.2.100
+        - 192.0.2.120                # Range used for introspection phase (examining nodes)
+# Fuel specific settings
+fuel:
index 6941093..ee9ed4e 100644 (file)
@@ -33,12 +33,12 @@ function find_ip {
     af=$2
   fi
 
-  python3.4 -B $LIB/python/apex_python_utils.py find-ip -i $1 -af $af
+  python3 -B $LIB/python/apex_python_utils.py find-ip -i $1 -af $af
 }
 
 ##attach interface to OVS and set the network config correctly
 ##params: bride to attach to, interface to attach, network type (optional)
-##public indicates attaching to a public interface
+##external indicates attaching to a external interface
 function attach_interface_to_ovs {
   local bridge interface
   local if_ip if_mask if_gw if_file ovs_file if_prefix
@@ -79,8 +79,8 @@ function attach_interface_to_ovs {
   if [[ -z "$if_ip" || -z "$if_mask" ]]; then
     echo "ERROR: IPADDR or NETMASK/PREFIX missing for ${interface}"
     return 1
-  elif [[ -z "$if_gw" && "$3" == "public_network" ]]; then
-    echo "ERROR: GATEWAY missing for ${interface}, which is public"
+  elif [[ -z "$if_gw" && "$3" == "external" ]]; then
+    echo "ERROR: GATEWAY missing for ${interface}, which is external"
     return 1
   fi
 
index ffc764b..11bba44 100755 (executable)
@@ -35,11 +35,11 @@ function configure_deps {
 
   # If flat we only use admin network
   if [[ "$net_isolation_enabled" == "FALSE" ]]; then
-    virsh_enabled_networks="admin_network"
-    enabled_network_list="admin_network"
-  # For baremetal we only need to create/attach Undercloud to admin and public
+    virsh_enabled_networks="admin"
+    enabled_network_list="admin"
+  # For baremetal we only need to create/attach Undercloud to admin and external
   elif [ "$virtual" == "FALSE" ]; then
-    virsh_enabled_networks="admin_network public_network"
+    virsh_enabled_networks="admin external"
   else
     virsh_enabled_networks=$enabled_network_list
   fi
@@ -54,7 +54,7 @@ function configure_deps {
     for network in ${enabled_network_list}; do
       echo "${blue}INFO: Creating Virsh Network: $network & OVS Bridge: ${NET_MAP[$network]}${reset}"
       ovs-vsctl list-br | grep "^${NET_MAP[$network]}$" > /dev/null || ovs-vsctl add-br ${NET_MAP[$network]}
-      virsh net-list --all | grep $network > /dev/null || (cat > ${libvirt_dir}/apex-virsh-net.xml && virsh net-define ${libvirt_dir}/apex-virsh-net.xml) << EOF
+      virsh net-list --all | grep " $network " > /dev/null || (cat > ${libvirt_dir}/apex-virsh-net.xml && virsh net-define ${libvirt_dir}/apex-virsh-net.xml) << EOF
 <network>
   <name>$network</name>
   <forward mode='bridge'/>
@@ -62,7 +62,7 @@ function configure_deps {
   <virtualport type='openvswitch'/>
 </network>
 EOF
-      if ! (virsh net-list --all | grep $network > /dev/null); then
+      if ! (virsh net-list --all | grep " $network " > /dev/null); then
           echo "${red}ERROR: unable to create network: ${network}${reset}"
           exit 1;
       fi
@@ -76,7 +76,7 @@ EOF
 
     # bridge interfaces to correct OVS instances for baremetal deployment
     for network in ${enabled_network_list}; do
-      if [[ "$network" != "admin_network" && "$network" != "public_network" ]]; then
+      if [[ "$network" != "admin" && "$network" != "external" ]]; then
         continue
       fi
       this_interface=$(eval echo \${${network}_bridged_interface})
@@ -100,7 +100,7 @@ EOF
        exit 1
       fi
       echo "${blue}INFO: Creating Virsh Network: $network${reset}"
-      virsh net-list --all | grep $network > /dev/null || (cat > ${libvirt_dir}/apex-virsh-net.xml && virsh net-define ${libvirt_dir}/apex-virsh-net.xml) << EOF
+      virsh net-list --all | grep " $network " > /dev/null || (cat > ${libvirt_dir}/apex-virsh-net.xml && virsh net-define ${libvirt_dir}/apex-virsh-net.xml) << EOF
 <network ipv6='yes'>
 <name>$network</name>
 <forward mode='bridge'/>
index ef388f4..ff31bfe 100755 (executable)
@@ -78,7 +78,7 @@ parse_network_settings() {
       echo -e "${red}ERROR: flat network is not supported with ovs-dpdk ${reset}"
       exit 1
     fi
-    if [[ ! $enabled_network_list =~ "private_network" ]]; then
+    if [[ ! $enabled_network_list =~ "tenant" ]]; then
       echo -e "${red}ERROR: tenant network is not enabled for ovs-dpdk ${reset}"
       exit 1
     fi
index 7e7db5c..d21b836 100755 (executable)
@@ -11,9 +11,9 @@
 ##Post configuration after install
 ##params: none
 function configure_post_install {
-  local opnfv_attach_networks ovs_ip ip_range net_cidr tmp_ip af public_network_ipv6
-  public_network_ipv6=False
-  opnfv_attach_networks="admin_network public_network"
+  local opnfv_attach_networks ovs_ip ip_range net_cidr tmp_ip af external_network_ipv6
+  external_network_ipv6=False
+  opnfv_attach_networks="admin external"
 
   echo -e "${blue}INFO: Post Install Configuration Running...${reset}"
 
@@ -46,8 +46,8 @@ EOI
         af=4
       else
         af=6
-        if [ "$network" == "public_network" ]; then
-          public_network_ipv6=True
+        if [ "$network" == "external" ]; then
+          ublic_network_ipv6=True
         fi
         #enable ipv6 on bridge interface
         echo 0 > /proc/sys/net/ipv6/conf/${NET_MAP[$network]}/disable_ipv6
@@ -87,15 +87,15 @@ EOI
 source overcloudrc
 set -o errexit
 echo "Configuring Neutron external network"
-if [[ -n "$public_network_vlan" && "$public_network_vlan" != 'native' ]]; then
-  neutron net-create external  --router:external=True --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') --provider:network_type vlan --provider:segmentation_id ${public_network_vlan} --provider:physical_network datacentre
+if [[ -n "$external_nic_mapping_compute_vlan" && "$external_nic_mapping_compute_vlan" != 'native' ]]; then
+  neutron net-create external  --router:external=True --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') --provider:network_type vlan --provider:segmentation_id ${external_nic_mapping_compute_vlan} --provider:physical_network datacentre
 else
   neutron net-create external --router:external=True --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }')
 fi
-if [ "$public_network_ipv6" == "True" ]; then
-  neutron subnet-create --name external-net --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') external --ip_version 6 --ipv6_ra_mode slaac --ipv6_address_mode slaac --gateway ${public_network_gateway} --allocation-pool start=${public_network_floating_ip_range%%,*},end=${public_network_floating_ip_range##*,} ${public_network_cidr}
+if [ "$external_network_ipv6" == "True" ]; then
+  neutron subnet-create --name external-net --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') external --ip_version 6 --ipv6_ra_mode slaac --ipv6_address_mode slaac --gateway ${external_gateway} --allocation-pool start=${external_floating_ip_range%%,*},end=${external_floating_ip_range##*,} ${external_cidr}
 else
-  neutron subnet-create --name external-net --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') --disable-dhcp external --gateway ${public_network_gateway} --allocation-pool start=${public_network_floating_ip_range%%,*},end=${public_network_floating_ip_range##*,} ${public_network_cidr}
+  neutron subnet-create --name external-net --tenant-id \$(openstack project show service | grep id | awk '{ print \$4 }') --disable-dhcp external --gateway ${external_gateway} --allocation-pool start=${external_floating_ip_range%%,*},end=${external_floating_ip_range##*,} ${external_cidr}
 fi
 
 echo "Removing sahara endpoint and service"
@@ -142,14 +142,14 @@ if [ "${deploy_options_array['congress']}" == 'True' ]; then
 fi
 EOI
 
-  # for virtual, we NAT public network through Undercloud
+  # for virtual, we NAT external network through Undercloud
   # same goes for baremetal if only jumphost has external connectivity
-  if [ "$virtual" == "TRUE" ] || ! test_overcloud_connectivity && [ "$public_network_ipv6" != "True" ]; then
-    if ! configure_undercloud_nat ${public_network_cidr}; then
-      echo -e "${red}ERROR: Unable to NAT undercloud with external net: ${public_network_cidr}${reset}"
+  if [ "$virtual" == "TRUE" ] || ! test_overcloud_connectivity && [ "$external_network_ipv6" != "True" ]; then
+    if ! configure_undercloud_nat ${external_cidr}; then
+      echo -e "${red}ERROR: Unable to NAT undercloud with external net: ${external_cidr}${reset}"
       exit 1
     else
-      echo -e "${blue}INFO: Undercloud VM has been setup to NAT Overcloud public network${reset}"
+      echo -e "${blue}INFO: Undercloud VM has been setup to NAT Overcloud external network${reset}"
     fi
   fi
 
index dfb6267..db0a9fd 100644 (file)
@@ -7,12 +7,15 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-ADMIN_NETWORK = 'admin_network'
-PRIVATE_NETWORK = 'private_network'
-PUBLIC_NETWORK = 'public_network'
-STORAGE_NETWORK = 'storage_network'
-API_NETWORK = 'api_network'
-OPNFV_NETWORK_TYPES = [ADMIN_NETWORK, PRIVATE_NETWORK, PUBLIC_NETWORK,
+ADMIN_NETWORK = 'admin'
+TENANT_NETWORK = 'tenant'
+EXTERNAL_NETWORK = 'external'
+STORAGE_NETWORK = 'storage'
+API_NETWORK = 'api'
+CONTROLLER = 'controller'
+COMPUTE = 'compute'
+
+OPNFV_NETWORK_TYPES = [ADMIN_NETWORK, TENANT_NETWORK, EXTERNAL_NETWORK,
                        STORAGE_NETWORK, API_NETWORK]
 DNS_SERVERS = ["8.8.8.8", "8.8.4.4"]
 COMPUTE = 'compute'
index 15fe873..5cb2d0c 100644 (file)
 import yaml
 import re
 from .common.constants import (
+    CONTROLLER,
+    COMPUTE,
     ADMIN_NETWORK,
-    PRIVATE_NETWORK,
+    TENANT_NETWORK,
     STORAGE_NETWORK,
-    PUBLIC_NETWORK,
+    EXTERNAL_NETWORK,
     API_NETWORK,
     CONTROLLER_PRE,
     COMPUTE_PRE,
@@ -56,6 +58,9 @@ class NetworkEnvironment(dict):
     """
     def __init__(self, net_settings, filename, compute_pre_config=False,
                  controller_pre_config=False):
+        """
+        Create Network Environment according to Network Settings
+        """
         init_dict = {}
         if type(filename) is str:
             with open(filename, 'r') as net_env_fh:
@@ -63,109 +68,102 @@ class NetworkEnvironment(dict):
 
         super().__init__(init_dict)
         try:
-            enabled_networks = net_settings.enabled_network_list
+            enabled_nets = net_settings.enabled_network_list
         except:
             raise NetworkEnvException('Invalid Network Setting object')
 
         self._set_tht_dir()
 
-        enabled_networks = net_settings.get_enabled_networks()
+        nets = net_settings['networks']
 
-        admin_cidr = net_settings[ADMIN_NETWORK]['cidr']
+        admin_cidr = nets[ADMIN_NETWORK]['cidr']
         admin_prefix = str(admin_cidr.prefixlen)
         self[param_def]['ControlPlaneSubnetCidr'] = admin_prefix
         self[param_def]['ControlPlaneDefaultRoute'] = \
-            net_settings[ADMIN_NETWORK]['provisioner_ip']
-        public_cidr = net_settings[PUBLIC_NETWORK]['cidr']
-        self[param_def]['ExternalNetCidr'] = str(public_cidr)
-        if net_settings[PUBLIC_NETWORK]['vlan'] != 'native':
-            self[param_def]['NeutronExternalNetworkBridge'] = '""'
-            self[param_def]['ExternalNetworkVlanID'] = \
-                net_settings[PUBLIC_NETWORK]['vlan']
-        public_range = \
-            net_settings[PUBLIC_NETWORK]['usable_ip_range'].split(',')
-        self[param_def]['ExternalAllocationPools'] = \
-            [{'start':
-              public_range[0],
-              'end': public_range[1]
-              }]
-        self[param_def]['ExternalInterfaceDefaultRoute'] = \
-            net_settings[PUBLIC_NETWORK]['gateway']
+            nets[ADMIN_NETWORK]['installer_vm']['ip']
         self[param_def]['EC2MetadataIp'] = \
-            net_settings[ADMIN_NETWORK]['provisioner_ip']
+            nets[ADMIN_NETWORK]['installer_vm']['ip']
         self[param_def]['DnsServers'] = net_settings['dns_servers']
 
-        if public_cidr.version == 6:
-            postfix = '/external_v6.yaml'
+        if EXTERNAL_NETWORK in enabled_nets:
+            external_cidr = nets[EXTERNAL_NETWORK][0]['cidr']
+            self[param_def]['ExternalNetCidr'] = str(external_cidr)
+            if type(nets[EXTERNAL_NETWORK][0]['installer_vm']['vlan']) is int:
+                self[param_def]['NeutronExternalNetworkBridge'] = '""'
+                self[param_def]['ExternalNetworkVlanID'] = \
+                    nets[EXTERNAL_NETWORK][0]['installer_vm']['vlan']
+            external_range = nets[EXTERNAL_NETWORK][0]['usable_ip_range']
+            self[param_def]['ExternalAllocationPools'] = \
+                [{'start': str(external_range[0]),
+                  'end': str(external_range[1])}]
+            self[param_def]['ExternalInterfaceDefaultRoute'] = \
+                nets[EXTERNAL_NETWORK][0]['gateway']
+
+            if external_cidr.version == 6:
+                postfix = '/external_v6.yaml'
+            else:
+                postfix = '/external.yaml'
         else:
-            postfix = '/external.yaml'
+            postfix = '/noop.yaml'
 
         # apply resource registry update for EXTERNAL_RESOURCES
         self._config_resource_reg(EXTERNAL_RESOURCES, postfix)
 
-        if PRIVATE_NETWORK in enabled_networks:
-            priv_range = net_settings[PRIVATE_NETWORK][
-                'usable_ip_range'].split(',')
+        if TENANT_NETWORK in enabled_nets:
+            tenant_range = nets[TENANT_NETWORK]['usable_ip_range']
             self[param_def]['TenantAllocationPools'] = \
-                [{'start':
-                  priv_range[0],
-                  'end': priv_range[1]
-                  }]
-            priv_cidr = net_settings[PRIVATE_NETWORK]['cidr']
-            self[param_def]['TenantNetCidr'] = str(priv_cidr)
-            if priv_cidr.version == 6:
+                [{'start': str(tenant_range[0]),
+                  'end': str(tenant_range[1])}]
+            tenant_cidr = nets[TENANT_NETWORK]['cidr']
+            self[param_def]['TenantNetCidr'] = str(tenant_cidr)
+            if tenant_cidr.version == 6:
                 postfix = '/tenant_v6.yaml'
             else:
                 postfix = '/tenant.yaml'
-            if net_settings[PRIVATE_NETWORK]['vlan'] != 'native':
-                self[param_def]['TenantNetworkVlanID'] = \
-                    net_settings[PRIVATE_NETWORK]['vlan']
+
+            tenant_vlan = self._get_vlan(nets[TENANT_NETWORK])
+            if type(tenant_vlan) is int:
+                self[param_def]['TenantNetworkVlanID'] = tenant_vlan
         else:
             postfix = '/noop.yaml'
 
         # apply resource registry update for TENANT_RESOURCES
         self._config_resource_reg(TENANT_RESOURCES, postfix)
 
-        if STORAGE_NETWORK in enabled_networks:
-            storage_range = net_settings[STORAGE_NETWORK][
-                'usable_ip_range'].split(',')
+        if STORAGE_NETWORK in enabled_nets:
+            storage_range = nets[STORAGE_NETWORK]['usable_ip_range']
             self[param_def]['StorageAllocationPools'] = \
-                [{'start':
-                  storage_range[0],
-                  'end':
-                  storage_range[1]
-                  }]
-            storage_cidr = net_settings[STORAGE_NETWORK]['cidr']
+                [{'start': str(storage_range[0]),
+                  'end': str(storage_range[1])}]
+            storage_cidr = nets[STORAGE_NETWORK]['cidr']
             self[param_def]['StorageNetCidr'] = str(storage_cidr)
             if storage_cidr.version == 6:
                 postfix = '/storage_v6.yaml'
             else:
                 postfix = '/storage.yaml'
-            if net_settings[STORAGE_NETWORK]['vlan'] != 'native':
-                self[param_def]['StorageNetworkVlanID'] = \
-                    net_settings[STORAGE_NETWORK]['vlan']
+            storage_vlan = self._get_vlan(nets[STORAGE_NETWORK])
+            if type(storage_vlan) is int:
+                self[param_def]['StorageNetworkVlanID'] = storage_vlan
         else:
             postfix = '/noop.yaml'
 
         # apply resource registry update for STORAGE_RESOURCES
         self._config_resource_reg(STORAGE_RESOURCES, postfix)
 
-        if API_NETWORK in enabled_networks:
-            api_range = net_settings[API_NETWORK][
-                'usable_ip_range'].split(',')
+        if API_NETWORK in enabled_nets:
+            api_range = nets[API_NETWORK]['usable_ip_range']
             self[param_def]['InternalApiAllocationPools'] = \
-                [{'start': api_range[0],
-                  'end': api_range[1]
-                  }]
-            api_cidr = net_settings[API_NETWORK]['cidr']
+                [{'start': str(api_range[0]),
+                  'end': str(api_range[1])}]
+            api_cidr = nets[API_NETWORK]['cidr']
             self[param_def]['InternalApiNetCidr'] = str(api_cidr)
             if api_cidr.version == 6:
                 postfix = '/internal_api_v6.yaml'
             else:
                 postfix = '/internal_api.yaml'
-            if net_settings[API_NETWORK]['vlan'] != 'native':
-                self[param_def]['InternalApiNetworkVlanID'] = \
-                    net_settings[API_NETWORK]['vlan']
+            api_vlan = self._get_vlan(nets[API_NETWORK])
+            if type(api_vlan) is int:
+                self[param_def]['InternalApiNetworkVlanID'] = api_vlan
         else:
             postfix = '/noop.yaml'
 
@@ -184,6 +182,14 @@ class NetworkEnvironment(dict):
             for flag in IPV6_FLAGS:
                 self[param_def][flag] = True
 
+    def _get_vlan(self, network):
+        if type(network['nic_mapping'][CONTROLLER]['vlan']) is int:
+            return network['nic_mapping'][CONTROLLER]['vlan']
+        elif type(network['nic_mapping'][COMPUTE]['vlan']) is int:
+            return network['nic_mapping'][COMPUTE]['vlan']
+        else:
+            return 'native'
+
     def _set_tht_dir(self):
         self.tht_dir = None
         for key, prefix in TENANT_RESOURCES.items():
index 8e39afd..1179808 100644 (file)
 import yaml
 import logging
 import ipaddress
+
+from copy import copy
+
 from . import ip_utils
-from .common.utils import str2bool
+from .common import utils
 from .common.constants import (
+    CONTROLLER,
+    COMPUTE,
+    ROLES,
+    DOMAIN_NAME,
+    DNS_SERVERS,
     ADMIN_NETWORK,
-    PRIVATE_NETWORK,
-    PUBLIC_NETWORK,
-    STORAGE_NETWORK,
-    API_NETWORK,
+    EXTERNAL_NETWORK,
     OPNFV_NETWORK_TYPES,
-    DNS_SERVERS,
-    DOMAIN_NAME,
-    ROLES,
-    COMPUTE,
-    CONTROLLER)
+)
 
 
 class NetworkSettings(dict):
@@ -46,7 +47,6 @@ class NetworkSettings(dict):
         else:
             # assume input is a dict to build from
             init_dict = filename
-
         super().__init__(init_dict)
 
         if 'apex' in self:
@@ -69,46 +69,51 @@ class NetworkSettings(dict):
         self.nics_specified = {COMPUTE: False, CONTROLLER: False}
         self._validate_input()
 
+    def get_network(self, network):
+        if network == EXTERNAL_NETWORK and self['networks'][network]:
+            return self['networks'][network][0]
+        else:
+            return self['networks'][network]
+
     def _validate_input(self):
         """
         Validates the network settings file and populates all fields.
 
         NetworkSettingsException will be raised if validation fails.
         """
-        if ADMIN_NETWORK not in self or \
-            not str2bool(self[ADMIN_NETWORK].get(
-                'enabled')):
-            raise NetworkSettingsException("You must enable admin_network "
-                                           "and configure it explicitly or "
-                                           "use auto-detection")
-        if self.network_isolation and \
-            (PUBLIC_NETWORK not in self or not
-                str2bool(self[PUBLIC_NETWORK].get(
-                    'enabled'))):
-            raise NetworkSettingsException("You must enable public_network "
+        if not self['networks'].get(ADMIN_NETWORK, {}).get('enabled', False):
+            raise NetworkSettingsException("You must enable admin network "
                                            "and configure it explicitly or "
                                            "use auto-detection")
 
         for network in OPNFV_NETWORK_TYPES:
-            if network in self:
-                if str2bool(self[network].get('enabled')):
+            if network in self['networks']:
+                _network = self.get_network(network)
+                if _network.get('enabled', True):
                     logging.info("{} enabled".format(network))
                     self._config_required_settings(network)
+                    if network == EXTERNAL_NETWORK:
+                        nicmap = _network['nic_mapping']
+                    else:
+                        nicmap = _network['nic_mapping']
+                    iface = nicmap[CONTROLLER]['members'][0]
                     self._config_ip_range(network=network,
-                                          setting='usable_ip_range',
+                                          interface=iface,
+                                          ip_range='usable_ip_range',
                                           start_offset=21, end_offset=21)
-                    self._config_optional_settings(network)
                     self.enabled_network_list.append(network)
                     self._validate_overcloud_nic_order(network)
+                    # TODO self._config_optional_settings(network)
                 else:
                     logging.info("{} disabled, will collapse with "
-                                 "admin_network".format(network))
+                                 "admin network".format(network))
             else:
                 logging.info("{} is not in specified, will collapse with "
-                             "admin_network".format(network))
+                             "admin network".format(network))
 
+        if 'dns-domain' not in self:
+            self['domain_name'] = DOMAIN_NAME
         self['dns_servers'] = self.get('dns_servers', DNS_SERVERS)
-        self['domain_name'] = self.get('domain_name', DOMAIN_NAME)
 
     def _validate_overcloud_nic_order(self, network):
         """
@@ -116,42 +121,35 @@ class NetworkSettings(dict):
         for network
 
         If nic order is specified in a network for a profile, it should be
-        specified for every network with that profile other than admin_network
+        specified for every network with that profile other than admin network
 
         Duplicate nic names are also not allowed across different networks
 
         :param network: network to detect if nic order present
         :return: None
         """
-
         for role in ROLES:
-            interface = role+'_interface'
-            nic_index = self.get_enabled_networks().index(network) + 1
-            if interface in self[network]:
-                if any(y == self[network][interface] for x, y in
-                       self.nics[role].items()):
-                    raise NetworkSettingsException("Duplicate {} already "
-                                                   "specified for "
-                                                   "another network"
-                                                   .format(self[network]
-                                                           [interface]))
-                self.nics[role][network] = self[network][interface]
+            _network = self.get_network(network)
+            _nicmap = _network.get('nic_mapping', {})
+            _role = _nicmap.get(role, {})
+            interfaces = _role.get('members', [])
+
+            if interfaces:
+                interface = interfaces[0]
+                if type(_role.get('vlan', 'native')) is not int and \
+                   any(y == interface for x, y in self.nics[role].items()):
+                    raise NetworkSettingsException(
+                        "Duplicate {} already specified for "
+                        "another network".format(interface))
+                self.nics[role][network] = interface
                 self.nics_specified[role] = True
                 logging.info("{} nic order specified for network {"
                              "}".format(role, network))
-            elif self.nics_specified[role]:
-                logging.error("{} nic order not specified for network {"
-                              "}".format(role, network))
-                raise NetworkSettingsException("Must specify {} for all "
-                                               "enabled networks (other than "
-                                               " admin) or not specify it for "
-                                               "any".format(interface))
             else:
-                logging.info("{} nic order not specified for network {"
-                             "}. Will use logical default "
-                             "nic{}".format(interface, network, nic_index))
-                self.nics[role][network] = 'nic' + str(nic_index)
-                nic_index += 1
+                raise NetworkSettingsException(
+                    "Interface members are not supplied for {} network "
+                    "for the {} role. Please add nic assignments"
+                    "".format(network, role))
 
     def _config_required_settings(self, network):
         """
@@ -164,85 +162,93 @@ class NetworkSettings(dict):
         given NIC in the system. The resulting config in settings object will
         be an ipaddress.network object, replacing the NIC name.
         """
+        _network = self.get_network(network)
         # if vlan not defined then default it to native
         if network is not ADMIN_NETWORK:
-            if 'vlan' not in self[network]:
-                self[network]['vlan'] = 'native'
+            for role in ROLES:
+                if 'vlan' not in _network['nic_mapping'][role]:
+                    _network['nic_mapping'][role]['vlan'] = 'native'
 
-        cidr = self[network].get('cidr')
-        nic_name = self[network].get('bridged_interface')
+        cidr = _network.get('cidr')
 
         if cidr:
-            cidr = ipaddress.ip_network(self[network]['cidr'])
-            self[network]['cidr'] = cidr
+            cidr = ipaddress.ip_network(_network['cidr'])
+            _network['cidr'] = cidr
             logging.info("{}_cidr: {}".format(network, cidr))
-            return 0
-        elif nic_name:
+        elif 'installer_vm' in _network:
+            ucloud_if_list = _network['installer_vm']['members']
             # If cidr is not specified, we need to know if we should find
             # IPv6 or IPv4 address on the interface
-            if str2bool(self[network].get('ipv6')):
-                address_family = 6
-            else:
-                address_family = 4
-            nic_interface = ip_utils.get_interface(nic_name, address_family)
-            if nic_interface:
-                self[network]['bridged_interface'] = nic_interface
+            ip = ipaddress.ip_address(_network['installer_vm']['ip'])
+            nic_if = ip_utils.get_interface(ucloud_if_list[0], ip.version)
+            if nic_if:
+                ucloud_if_list = [nic_if]
                 logging.info("{}_bridged_interface: {}".
-                             format(network, nic_interface))
-                return 0
+                             format(network, nic_if))
             else:
-                raise NetworkSettingsException("Auto detection failed for {}: "
-                                               "Unable to find valid ip for "
-                                               "interface {}"
-                                               .format(network, nic_name))
+                raise NetworkSettingsException(
+                    "Auto detection failed for {}: Unable to find valid "
+                    "ip for interface {}".format(network, ucloud_if_list[0]))
 
         else:
-            raise NetworkSettingsException("Auto detection failed for {}: "
-                                           "either bridge_interface or cidr "
-                                           "must be specified"
-                                           .format(network))
+            raise NetworkSettingsException(
+                "Auto detection failed for {}: either installer_vm "
+                "members or cidr must be specified".format(network))
 
-    def _config_ip_range(self, network, setting, start_offset=None,
-                         end_offset=None, count=None):
+        # undercloud settings
+        if network == ADMIN_NETWORK:
+            provisioner_ip = _network['installer_vm']['ip']
+            iface = _network['installer_vm']['members'][0]
+            if not provisioner_ip:
+                _network['installer_vm']['ip'] = self._gen_ip(network, 1)
+            self._config_ip_range(network=network, interface=iface,
+                                  ip_range='dhcp_range',
+                                  start_offset=2, count=9)
+            self._config_ip_range(network=network, interface=iface,
+                                  ip_range='introspection_range',
+                                  start_offset=11, count=9)
+        elif network == EXTERNAL_NETWORK:
+            provisioner_ip = _network['installer_vm']['ip']
+            iface = _network['installer_vm']['members'][0]
+            if not provisioner_ip:
+                _network['installer_vm']['ip'] = self._gen_ip(network, 1)
+            self._config_ip_range(network=network, interface=iface,
+                                  ip_range='floating_ip_range',
+                                  end_offset=2, count=20)
+
+            gateway = _network['gateway']
+            interface = _network['installer_vm']['ip']
+            self._config_gateway(network, gateway, interface)
+
+    def _config_ip_range(self, network, ip_range, interface=None,
+                         start_offset=None, end_offset=None, count=None):
         """
         Configures IP range for a given setting.
-
         If the setting is already specified, no change will be made.
-
         The spec for start_offset, end_offset and count are identical to
         ip_utils.get_ip_range.
         """
-        ip_range = self[network].get(setting)
-        interface = self[network].get('bridged_interface')
-
-        if not ip_range:
-            cidr = self[network].get('cidr')
-            ip_range = ip_utils.get_ip_range(start_offset=start_offset,
-                                             end_offset=end_offset,
-                                             count=count,
-                                             cidr=cidr,
-                                             interface=interface)
-            self[network][setting] = ip_range
-
-        logging.info("{}_{}: {}".format(network, setting, ip_range))
-
-    def _config_ip(self, network, setting, offset):
+        _network = self.get_network(network)
+        if ip_range not in _network:
+            cidr = _network.get('cidr')
+            _ip_range = ip_utils.get_ip_range(start_offset=start_offset,
+                                              end_offset=end_offset,
+                                              count=count,
+                                              cidr=cidr,
+                                              interface=interface)
+            _network[ip_range] = _ip_range.split(',')
+
+        logging.info("Config IP Range: {} {}".format(network, ip_range))
+
+    def _gen_ip(self, network, offset):
         """
-        Configures IP for a given setting.
-
-        If the setting is already specified, no change will be made.
-
-        The spec for offset is identical to ip_utils.get_ip
+        Generate and ip offset within the given network
         """
-        ip = self[network].get(setting)
-        interface = self[network].get('bridged_interface')
-
-        if not ip:
-            cidr = self[network].get('cidr')
-            ip = ip_utils.get_ip(offset, cidr, interface)
-            self[network][setting] = ip
-
-        logging.info("{}_{}: {}".format(network, setting, ip))
+        _network = self.get_network(network)
+        cidr = _network.get('cidr')
+        ip = ip_utils.get_ip(offset, cidr)
+        logging.info("Config IP: {} {}".format(network, ip))
+        return ip
 
     def _config_optional_settings(self, network):
         """
@@ -257,42 +263,41 @@ class NetworkSettings(dict):
             - gateway
         """
         if network == ADMIN_NETWORK:
-            self._config_ip(network, 'provisioner_ip', 1)
-            self._config_ip_range(network=network, setting='dhcp_range',
+            self._config_ip(network, None, 'provisioner_ip', 1)
+            self._config_ip_range(network=network,
+                                  ip_range='dhcp_range',
                                   start_offset=2, count=9)
             self._config_ip_range(network=network,
-                                  setting='introspection_range',
+                                  ip_range='introspection_range',
                                   start_offset=11, count=9)
-        elif network == PUBLIC_NETWORK:
-            self._config_ip(network, 'provisioner_ip', 1)
+        elif network == EXTERNAL_NETWORK:
+            self._config_ip(network, None, 'provisioner_ip', 1)
             self._config_ip_range(network=network,
-                                  setting='floating_ip_range',
+                                  ip_range='floating_ip_range',
                                   end_offset=2, count=20)
             self._config_gateway(network)
 
-    def _config_gateway(self, network):
+    def _config_gateway(self, network, gateway, interface):
         """
         Configures gateway setting for a given network.
 
         If cidr is specified, we always use the first address in the address
         space for gateway. Otherwise, we detect the system gateway.
         """
-        gateway = self[network].get('gateway')
-        interface = self[network].get('bridged_interface')
-
+        _network = self.get_network(network)
         if not gateway:
-            cidr = self[network].get('cidr')
+            cidr = _network.get('cidr')
             if cidr:
-                gateway = ip_utils.get_ip(1, cidr)
+                _gateway = ip_utils.get_ip(1, cidr)
             else:
-                gateway = ip_utils.find_gateway(interface)
+                _gateway = ip_utils.find_gateway(interface)
 
-            if gateway:
-                self[network]['gateway'] = gateway
+            if _gateway:
+                _network['gateway'] = _gateway
             else:
                 raise NetworkSettingsException("Failed to set gateway")
 
-        logging.info("{}_gateway: {}".format(network, gateway))
+        logging.info("Config Gateway: {} {}".format(network, gateway))
 
     def dump_bash(self, path=None):
         """
@@ -301,45 +306,50 @@ class NetworkSettings(dict):
         If optional path is provided, bash string will be written to the file
         instead of stdout.
         """
+        def flatten(name, obj, delim=','):
+            """
+            flatten lists to delim separated strings
+            flatten dics to underscored key names and string values
+            """
+            if type(obj) is list:
+                return "{}=\'{}\'\n".format(name,
+                                            delim.join(map(lambda x: str(x),
+                                                           obj)))
+            elif type(obj) is dict:
+                flat_str = ''
+                for k in obj:
+                    flat_str += flatten("{}_{}".format(name, k), obj[k])
+                return flat_str
+            elif type(obj) is str:
+                return "{}='{}'\n".format(name, obj)
+            else:
+                return "{}={}\n".format(name, str(obj))
+
         bash_str = ''
         for network in self.enabled_network_list:
-            for key, value in self[network].items():
-                bash_str += "{}_{}={}\n".format(network, key, value)
-        bash_str += "enabled_network_list='{}'\n" \
-            .format(' '.join(self.enabled_network_list))
-        bash_str += "ip_addr_family={}\n".format(self.get_ip_addr_family())
-        dns_list = ""
-        for dns_server in self['dns_servers']:
-            dns_list = dns_list + "{} ".format(dns_server)
-        dns_list = dns_list.strip()
-        bash_str += "dns_servers=\'{}\'\n".format(dns_list)
-        bash_str += "domain_name=\'{}\'\n".format(self['domain_name'])
+            _network = self.get_network(network)
+            bash_str += flatten(network, _network)
+        bash_str += flatten('enabled_network_list',
+                            self.enabled_network_list, ' ')
+        bash_str += flatten('ip_addr_family', self.get_ip_addr_family())
+        bash_str += flatten('dns_servers', self['dns_servers'], ' ')
+        bash_str += flatten('domain_name', self['dns-domain'], ' ')
         if path:
             with open(path, 'w') as file:
                 file.write(bash_str)
         else:
             print(bash_str)
 
-    def get_ip_addr_family(self):
+    def get_ip_addr_family(self,):
         """
         Returns IP address family for current deployment.
 
         If any enabled network has IPv6 CIDR, the deployment is classified as
         IPv6.
         """
-        for network in self.enabled_network_list:
-            cidr = ipaddress.ip_network(self[network]['cidr'])
-            if cidr.version == 6:
-                return 6
-
-        return 4
-
-    def get_enabled_networks(self):
-        """
-        Getter for enabled network list
-        :return: list of enabled networks
-        """
-        return self.enabled_network_list
+        return max([
+            ipaddress.ip_network(self.get_network(n)['cidr']).version
+            for n in self.enabled_network_list])
 
 
 class NetworkSettingsException(Exception):
index 9d6110b..b67028a 100755 (executable)
@@ -14,8 +14,6 @@ import logging
 import os
 import yaml
 
-from copy import copy
-
 from jinja2 import Environment
 from jinja2 import FileSystemLoader
 
@@ -113,20 +111,11 @@ def build_nic_template(args):
     env = Environment(loader=FileSystemLoader(template_dir), autoescape=True)
     template = env.get_template(template)
 
-    # gather vlan values into a dict
-    net_list = copy(netsets.enabled_network_list)
-    net_list.remove(ADMIN_NETWORK)
-    vlans_vals = map(lambda x: netsets[x]['vlan'], net_list)
-    vlans = dict(zip(net_list, vlans_vals))
-    nics = netsets.nics
-
-    print(template.render(enabled_networks=netsets.enabled_network_list,
+    print(template.render(nets=netsets['networks'],
                           role=args.role,
-                          vlans=vlans,
+                          external_net_af=netsets.get_ip_addr_family(),
                           external_net_type=args.ext_net_type,
-                          external_net_af=args.address_family,
-                          ovs_dpdk_bridge=args.ovs_dpdk_bridge,
-                          nics=nics))
+                          ovs_dpdk_bridge=args.ovs_dpdk_bridge))
 
 
 def get_parser():
@@ -196,8 +185,6 @@ def get_parser():
                               dest='ext_net_type',
                               choices=['interface', 'br-ex'],
                               help='External network type')
-    nic_template.add_argument('-af', '--address-family', type=int, default=4,
-                              dest='address_family', help='IP address family')
     nic_template.add_argument('-d', '--ovs-dpdk-bridge',
                               default=None, dest='ovs_dpdk_bridge',
                               help='OVS DPDK Bridge Name')
index ccf39c0..3c91850 100755 (executable)
@@ -12,9 +12,9 @@
 ##params: none
 function setup_undercloud_vm {
   if ! virsh list --all | grep undercloud > /dev/null; then
-      undercloud_nets="default admin_network"
-      if [[ $enabled_network_list =~ "public_network" ]]; then
-        undercloud_nets+=" public_network"
+      undercloud_nets="default admin"
+      if [[ $enabled_network_list =~ "external" ]]; then
+        undercloud_nets+=" external"
       fi
       define_vm undercloud hd 30 "$undercloud_nets" 4 12288
 
@@ -136,12 +136,12 @@ function configure_undercloud {
       ovs_dpdk_bridge=''
     fi
 
-    if ! controller_nic_template=$(python3.4 -B $LIB/python/apex_python_utils.py nic-template -r controller -s $NETSETS $net_isolation_arg -t $CONFIG/nics-template.yaml.jinja2 -e "br-ex" -af $ip_addr_family); then
+    if ! controller_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r controller -s $NETSETS $net_isolation_arg -t $CONFIG/nics-template.yaml.jinja2 -e "br-ex"); then
       echo -e "${red}ERROR: Failed to generate controller NIC heat template ${reset}"
       exit 1
     fi
 
-    if ! compute_nic_template=$(python3.4 -B $LIB/python/apex_python_utils.py nic-template -r compute -s $NETSETS $net_isolation_arg -t $CONFIG/nics-template.yaml.jinja2 -e $ext_net_type -af $ip_addr_family -d "$ovs_dpdk_bridge"); then
+    if ! compute_nic_template=$(python3 -B $LIB/python/apex_python_utils.py nic-template -r compute -s $NETSETS $net_isolation_arg -t $CONFIG/nics-template.yaml.jinja2 -e $ext_net_type -d "$ovs_dpdk_bridge"); then
       echo -e "${red}ERROR: Failed to generate compute NIC heat template ${reset}"
       exit 1
     fi
@@ -198,12 +198,12 @@ if [[ "$net_isolation_enabled" == "TRUE" ]]; then
   sed -i 's/#inspection_iprange/inspection_iprange/' undercloud.conf
   sed -i 's/#undercloud_debug/undercloud_debug/' undercloud.conf
 
-  openstack-config --set undercloud.conf DEFAULT local_ip ${admin_network_provisioner_ip}/${admin_network_cidr##*/}
-  openstack-config --set undercloud.conf DEFAULT network_gateway ${admin_network_provisioner_ip}
-  openstack-config --set undercloud.conf DEFAULT network_cidr ${admin_network_cidr}
-  openstack-config --set undercloud.conf DEFAULT dhcp_start ${admin_network_dhcp_range%%,*}
-  openstack-config --set undercloud.conf DEFAULT dhcp_end ${admin_network_dhcp_range##*,}
-  openstack-config --set undercloud.conf DEFAULT inspection_iprange ${admin_network_introspection_range}
+  openstack-config --set undercloud.conf DEFAULT local_ip ${admin_installer_vm_ip}/${admin_cidr##*/}
+  openstack-config --set undercloud.conf DEFAULT network_gateway ${admin_installer_vm_ip}
+  openstack-config --set undercloud.conf DEFAULT network_cidr ${admin_cidr}
+  openstack-config --set undercloud.conf DEFAULT dhcp_start ${admin_dhcp_range%%,*}
+  openstack-config --set undercloud.conf DEFAULT dhcp_end ${admin_dhcp_range##*,}
+  openstack-config --set undercloud.conf DEFAULT inspection_iprange ${admin_introspection_range}
   openstack-config --set undercloud.conf DEFAULT undercloud_debug false
   openstack-config --set undercloud.conf DEFAULT undercloud_hostname "undercloud.${domain_name}"
   sudo openstack-config --set /etc/ironic/ironic.conf disk_utils iscsi_verify_attempts 30
@@ -254,22 +254,22 @@ EOI
 
 # configure external network
   ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" << EOI
-if [[ "$public_network_vlan" != "native" ]]; then
-  cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-vlan${public_network_vlan}
-DEVICE=vlan${public_network_vlan}
+if [[ "$external_installer_vm_vlan" != "native" ]]; then
+  cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-vlan${external_installer_vm_vlan}
+DEVICE=vlan${external_installer_vm_vlan}
 ONBOOT=yes
 DEVICETYPE=ovs
 TYPE=OVSIntPort
 BOOTPROTO=static
-IPADDR=${public_network_provisioner_ip}
-PREFIX=${public_network_cidr##*/}
+IPADDR=${external_installer_vm_ip}
+PREFIX=${external_cidr##*/}
 OVS_BRIDGE=br-ctlplane
-OVS_OPTIONS="tag=${public_network_vlan}"
+OVS_OPTIONS="tag=${external_installer_vm_vlan}"
 EOF
-  ifup vlan${public_network_vlan}
+  ifup vlan${external_installer_vm_vlan}
 else
-  if ! ip a s eth2 | grep ${public_network_provisioner_ip} > /dev/null; then
-      ip a a ${public_network_provisioner_ip}/${public_network_cidr##*/} dev eth2
+  if ! ip a s eth2 | grep ${external_installer_vm_ip} > /dev/null; then
+      ip a a ${external_installer_vm_ip}/${external_cidr##*/} dev eth2
       ip link set up dev eth2
   fi
 fi
index 116d19b..8aaa359 100755 (executable)
@@ -51,8 +51,8 @@ EOF
       fi
     fi
     if ! virsh list --all | grep baremetal${i} > /dev/null; then
-      define_vm baremetal${i} network 41 'admin_network' $vcpus $ramsize
-      for n in private_network public_network storage_network api_network; do
+      define_vm baremetal${i} network 41 'admin' $vcpus $ramsize
+      for n in tenant external storage api; do
         if [[ $enabled_network_list =~ $n ]]; then
           echo -n "$n "
           virsh attach-interface --domain baremetal${i} --type network --source $n --model virtio --config
@@ -62,7 +62,7 @@ EOF
       echo "Found baremetal${i} VM, using existing VM"
     fi
     #virsh vol-list default | grep baremetal${i} 2>&1> /dev/null || virsh vol-create-as default baremetal${i}.qcow2 41G --format qcow2
-    mac=$(virsh domiflist baremetal${i} | grep admin_network | awk '{ print $5 }')
+    mac=$(virsh domiflist baremetal${i} | grep admin | awk '{ print $5 }')
 
     cat >> $APEX_TMP_DIR/inventory-virt.yaml << EOF
   node${i}:
diff --git a/tests/config/network_settings_duplicate_nic.yaml b/tests/config/network_settings_duplicate_nic.yaml
deleted file mode 100644 (file)
index 24dd5ca..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-# This configuration file defines Network Environment for a
-# Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
-#
-# - admin
-# - private*
-# - public
-# - storage*
-#
-# *) optional networks
-#
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
-# Optional networks will be consolidated with the admin network
-# if not explicitely configured.
-#
-# See short description of the networks in the comments below.
-#
-
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
-
-# "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-#
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  compute_interface: eth1
-  controller_interface: eth2
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-#
-private_network:
-  enabled: true
-  vlan: native
-  cidr: 11.0.0.0/24
-  compute_interface: enp0s4
-  controller_interface: nic3
-
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  compute_interface: eth1
-  controller_interface: enp0s3
-  vlan: native
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
-
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  vlan: native
-  cidr: 12.0.0.0/24
-  compute_interface: eth5
-  controller_interface: eth6
-
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  compute_interface: nic4                           #Interface used for this network on the compute node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  controller_interface: nic4                        #Interface used for this network on the controller node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
diff --git a/tests/config/network_settings_missing_required_nic.yaml b/tests/config/network_settings_missing_required_nic.yaml
deleted file mode 100644 (file)
index 1888627..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# This configuration file defines Network Environment for a
-# Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
-#
-# - admin
-# - private*
-# - public
-# - storage*
-#
-# *) optional networks
-#
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
-# Optional networks will be consolidated with the admin network
-# if not explicitely configured.
-#
-# See short description of the networks in the comments below.
-#
-
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
-
-# "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-#
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  compute_interface: eth1
-  controller_interface: eth2
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-#
-private_network:
-  enabled: true
-  vlan: native
-  cidr: 11.0.0.0/24
-  compute_interface: enp0s4
-  controller_interface: nic3
-
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  vlan: native
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
-
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  vlan: native
-  cidr: 12.0.0.0/24
-  compute_interface: eth5
-  controller_interface: eth6
-
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  compute_interface: nic4                 #Interface used for this network on the compute node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  controller_interface: nic4              #Interface used for this network on the controller node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
diff --git a/tests/config/network_settings_nic1_reserved.yaml b/tests/config/network_settings_nic1_reserved.yaml
deleted file mode 100644 (file)
index 8abcfc8..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# This configuration file defines Network Environment for a
-# Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
-#
-# - admin
-# - private*
-# - public
-# - storage*
-#
-# *) optional networks
-#
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
-# Optional networks will be consolidated with the admin network
-# if not explicitely configured.
-#
-# See short description of the networks in the comments below.
-#
-
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
-
-# "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-#
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-#
-private_network:
-  enabled: true
-  vlan: native
-  cidr: 11.0.0.0/24
-  compute_interface: enp0s4
-  controller_interface: nic3
-
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  compute_interface: nic1
-  controller_interface: enp0s3
-  vlan: native
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
-
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  vlan: native
-  cidr: 12.0.0.0/24
-  compute_interface: eth5
-  controller_interface: eth6
-
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  overcloud_compute_interface: nic4                 #Interface used for this network on the compute node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  overcloud_controller_interface: nic4              #Interface used for this network on the controller node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
diff --git a/tests/config/network_settings_nics_not_specified.yaml b/tests/config/network_settings_nics_not_specified.yaml
deleted file mode 100644 (file)
index e508943..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-# This configuration file defines Network Environment for a
-# Baremetal Deployment of OPNFV. It contains default values
-# for 4 following networks:
-#
-# - admin
-# - private*
-# - public
-# - storage*
-#
-# *) optional networks
-#
-# Any values missing from this configuration file will be
-# auto-detected by deployment script from the existing network
-# configuration of the jumphost.
-#
-# Optional networks will be consolidated with the admin network
-# if not explicitely configured.
-#
-# See short description of the networks in the comments below.
-#
-
-# DNS Servers for all nodes, comma delimited list
-dns_servers: ["8.8.8.8", "8.8.4.4"]
-
-# "admin" is the short name for Control Plane Network.
-# During OPNFV deployment it is used for node provisioning so
-# PXE boot should be enabled for the related interfaces on all
-# the nodes in the OPNFV cluster. After the deployment this
-# network is used as the OpenStack management network which
-# carries e.g. communication between its internal components.
-#
-admin_network:
-  enabled: true
-  network_type: bridged
-  bridged_interface: ''
-  bond_interfaces: ''
-  usable_ip_range: 192.0.2.11,192.0.2.99
-  gateway: 192.0.2.1
-  provisioner_ip: 192.0.2.1
-  cidr: 192.0.2.0/24
-  dhcp_range: 192.0.2.2,192.0.2.10
-  introspection_range: 192.0.2.100,192.0.2.120
-
-# "private" is an optional network used as underlying physical
-# network for virtual provider and tenant networks created by
-# users. Traffic between virtual machines is carried by this
-# network.
-#
-private_network:
-  enabled: true
-  vlan: native
-  cidr: 11.0.0.0/24
-
-# "public" network is used for external connectivity.
-# The external network provides Internet access for virtual
-# machines. If floating IP range is defined for this network,
-# floating IP addresses can be used for accessing virtual
-# machines from outside of OPNFV cluster. Also external REST
-# API calls use this network.
-#
-public_network:
-  enabled: true
-  network_type: ''
-  bridged_interface: ''
-  vlan: native
-  cidr: 192.168.37.0/24
-  gateway: 192.168.37.1
-  floating_ip_range: 192.168.37.200,192.168.37.220
-  usable_ip_range: 192.168.37.10,192.168.37.199
-  provisioner_ip: 192.168.37.1
-
-# "storage" is an optional network used by storage backends.
-# You can configure this network in order to reduce load on
-# Control Plane Network.
-#
-storage_network:
-  enabled: true
-  vlan: native
-  cidr: 12.0.0.0/24
-
-#admin_network:
-#  enabled: true
-#  network_type: bridged                             #Indicates if this network will be bridged to an interface, or to a bond
-#  bridged_interface: ''                             #Interface to bridge to for installer VM
-#  bond_interfaces: ''                               #Interfaces to create bond with for installer VM
-#  compute_interface: nic4                           #Interface used for this network on the compute node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  controller_interface: nic4                        #Interface used for this network on the controller node.  Can either be logical nic name like "nic1" or real name like "eth1"
-#  vlan: native                                      #VLAN tag to use, native means none
-#  usable_ip_range: 192.0.2.11,192.0.2.99            #Usable ip range, if empty entire range is usable, ex. 192.168.1.10,192.168.1.20
-#  gateway: 192.0.2.1                                #Gateway (only needed when public_network is disabled), if empty it is auto-detected
-#  provisioner_ip: 192.0.2.1                         #installer VM IP, if empty it is the next available IP in the admin subnet
-#  cidr: 192.0.2.0/24                                #subnet in CIDR format 192.168.1.0/24, if empty it will be auto-detected
-#  dhcp_range: 192.0.2.2,192.0.2.10                  #dhcp range for the admin network, if empty it will be automatically provisioned
-#  introspection_range: 192.0.2.100,192.0.2.120      #Range used for introspection phase (examining nodes)
-#private_network:
-#  enabled: false                                    #If disabled, internal api traffic will collapse to admin_network
-#public_network:
-#  enabled: true                                     #If disabled, public_network traffic will collapse to admin network
-#  network_type: ''
-#  bridged_interface: ''
-#  cidr: 192.168.37.0/24
-#  gateway: 192.168.37.1
-#  floating_ip_range: 192.168.37.200,192.168.37.220  #Range to allocate to floating IPs for the public network with Neutron
-#  usable_ip_range: 192.168.37.10,192.168.37.199     #Usable IP range on the public network, usually this is a shared subnet
-#  provisioner_ip: 192.168.37.1
-#storage_network:
-#  enabled: false                                    #If disabled, storage_network traffic will collapse to admin network
index 673368e..7c9b922 100644 (file)
@@ -9,11 +9,14 @@
 
 import ipaddress
 
+from copy import copy
+
 from apex.common.constants import (
-    PUBLIC_NETWORK,
-    PRIVATE_NETWORK,
+    EXTERNAL_NETWORK,
+    TENANT_NETWORK,
     STORAGE_NETWORK,
-    API_NETWORK)
+    API_NETWORK,
+    CONTROLLER)
 from apex.network_settings import NetworkSettings
 from apex.network_environment import (
     NetworkEnvironment,
@@ -33,6 +36,12 @@ class TestNetworkEnvironment(object):
     @classmethod
     def setup_class(klass):
         """This method is run once for each class before any tests are run"""
+        klass.ns = NetworkSettings(
+            '../config/network/network_settings.yaml', True)
+        klass.ns_vlans = NetworkSettings(
+            '../config/network/network_settings_vlans.yaml', True)
+        klass.ns_ipv6 = NetworkSettings(
+            '../config/network/network_settings_v6.yaml', True)
 
     @classmethod
     def teardown_class(klass):
@@ -48,84 +57,108 @@ class TestNetworkEnvironment(object):
         assert_raises(NetworkEnvException, NetworkEnvironment,
                       None, '../build/network-environment.yaml')
 
-    def test_netenv_settings_public_network(self):
-        ns = NetworkSettings('../config/network/network_settings.yaml', True)
+    def test_netenv_settings_external_network_vlans(self):
         # test vlans
-        ns[PUBLIC_NETWORK]['vlan'] = 100
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
+        ne = NetworkEnvironment(self.ns_vlans,
+                                '../build/network-environment.yaml')
         assert_equal(ne['parameter_defaults']['NeutronExternalNetworkBridge'],
                      '""')
-        assert_equal(ne['parameter_defaults']['ExternalNetworkVlanID'], 100)
+        assert_equal(ne['parameter_defaults']['ExternalNetworkVlanID'], 501)
 
+    def test_netenv_settings_external_network_ipv6(self):
         # Test IPv6
-        ns[PUBLIC_NETWORK]['cidr'] = ipaddress.ip_network('::1/128')
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
+        ne = NetworkEnvironment(self.ns_ipv6,
+                                '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(EXTERNAL_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'external_v6.yaml')
 
-    def test_netenv_settings_private_network(self):
-        ns = NetworkSettings('../config/network/network_settings.yaml', True)
-        # test vlans
-        ns[PRIVATE_NETWORK]['vlan'] = 100
+    def test_netenv_settings_external_network_removed(self):
+        ns = copy(self.ns)
+        # Test removing EXTERNAL_NETWORK
+        ns.enabled_network_list.remove(EXTERNAL_NETWORK)
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
-        assert_equal(ne['parameter_defaults']['TenantNetworkVlanID'], 100)
-
-        # Test IPv6
-        ns[PRIVATE_NETWORK]['cidr'] = ipaddress.ip_network('::1/128')
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
-        regstr = ne['resource_registry'][next(iter(TENANT_RESOURCES.keys()))]
-        assert_equal(regstr.split('/')[-1], 'tenant_v6.yaml')
+        regstr = ne['resource_registry'][next(iter(EXTERNAL_RESOURCES.keys()))]
+        assert_equal(regstr.split('/')[-1], 'noop.yaml')
 
-        # Test removing PRIVATE_NETWORK
-        ns.enabled_network_list.remove(PRIVATE_NETWORK)
+    def test_netenv_settings_tenant_network_vlans(self):
+        # test vlans
+        ne = NetworkEnvironment(self.ns_vlans,
+                                '../build/network-environment.yaml')
+        assert_equal(ne['parameter_defaults']['TenantNetworkVlanID'], 401)
+
+# Apex is does not support v6 tenant networks
+# Though there is code that would fire if a
+# v6 cidr was passed in, just uncomment this to
+# cover that code
+#    def test_netenv_settings_tenant_network_v6(self):
+#        # Test IPv6
+#        ne = NetworkEnvironment(self.ns_ipv6,
+#                                '../build/network-environment.yaml')
+#        regstr = ne['resource_registry'][next(iter(TENANT_RESOURCES.keys()))]
+#        assert_equal(regstr.split('/')[-1], 'tenant_v6.yaml')
+
+    def test_netenv_settings_tenant_network_removed(self):
+        ns = copy(self.ns)
+        # Test removing TENANT_NETWORK
+        ns.enabled_network_list.remove(TENANT_NETWORK)
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(TENANT_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'noop.yaml')
 
-    def test_netenv_settings_storage_network(self):
-        ns = NetworkSettings('../config/network/network_settings.yaml', True)
+    def test_netenv_settings_storage_network_vlans(self):
         # test vlans
-        ns[STORAGE_NETWORK]['vlan'] = 100
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
-        assert_equal(ne['parameter_defaults']['StorageNetworkVlanID'], 100)
+        ne = NetworkEnvironment(self.ns_vlans,
+                                '../build/network-environment.yaml')
+        assert_equal(ne['parameter_defaults']['StorageNetworkVlanID'], 201)
 
+    def test_netenv_settings_storage_network_v6(self):
         # Test IPv6
-        ns[STORAGE_NETWORK]['cidr'] = ipaddress.ip_network('::1/128')
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
+        ne = NetworkEnvironment(self.ns_ipv6,
+                                '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(STORAGE_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'storage_v6.yaml')
 
+    def test_netenv_settings_storage_network_removed(self):
+        ns = copy(self.ns)
         # Test removing STORAGE_NETWORK
         ns.enabled_network_list.remove(STORAGE_NETWORK)
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(STORAGE_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'noop.yaml')
 
-    def test_netenv_settings_api_network(self):
-        ns = NetworkSettings('../config/network/network_settings.yaml', True)
+    def test_netenv_settings_api_network_v4(self):
+        ns = copy(self.ns_vlans)
+        ns['networks'][API_NETWORK]['enabled'] = True
+        ns['networks'][API_NETWORK]['cidr'] = '10.11.12.0/24'
+        ns = NetworkSettings(ns, True)
         # test vlans
-        ns.enabled_network_list.append(API_NETWORK)
-        ns[API_NETWORK] = {'vlan': 100,
-                           'cidr': ipaddress.ip_network('10.10.10.0/24'),
-                           'usable_ip_range': '10.10.10.10,10.10.10.100'}
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
-        assert_equal(ne['parameter_defaults']['InternalApiNetworkVlanID'], 100)
+        assert_equal(ne['parameter_defaults']['InternalApiNetworkVlanID'], 101)
 
-        # Test IPv6
-        ns[API_NETWORK]['cidr'] = ipaddress.ip_network('::1/128')
+    def test_netenv_settings_api_network_vlans(self):
+        ns = copy(self.ns_vlans)
+        ns['networks'][API_NETWORK]['enabled'] = True
+        ns = NetworkSettings(ns, True)
+        # test vlans
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
+        assert_equal(ne['parameter_defaults']['InternalApiNetworkVlanID'], 101)
+
+    def test_netenv_settings_api_network_v6(self):
+        # Test IPv6
+        ne = NetworkEnvironment(self.ns_ipv6,
+                                '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(API_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'internal_api_v6.yaml')
 
-        # Test removing API_NETWORK
-        ns.enabled_network_list.remove(API_NETWORK)
+    def test_netenv_settings_api_network_removed(self):
+        ns = copy(self.ns)
+        # API_NETWORK is not in the default network settings file
         ne = NetworkEnvironment(ns, '../build/network-environment.yaml')
         regstr = ne['resource_registry'][next(iter(API_RESOURCES.keys()))]
         assert_equal(regstr.split('/')[-1], 'noop.yaml')
 
     def test_numa_configs(self):
-        ns = NetworkSettings('../config/network/network_settings.yaml', True)
-        ne = NetworkEnvironment(ns, '../build/network-environment.yaml',
+        ne = NetworkEnvironment(self.ns, '../build/network-environment.yaml',
                                 compute_pre_config=True,
                                 controller_pre_config=True)
         assert_is_instance(ne, dict)
index ff61cc4..47c13cc 100644 (file)
@@ -7,6 +7,12 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+from apex.common.constants import (
+    EXTERNAL_NETWORK,
+    STORAGE_NETWORK,
+    ADMIN_NETWORK,
+)
+
 from apex.network_settings import (
     NetworkSettings,
     NetworkSettingsException,
@@ -18,6 +24,8 @@ from nose.tools import (
     assert_raises
 )
 
+files_dir = '../config/network/'
+
 
 class TestNetworkSettings(object):
     @classmethod
@@ -35,7 +43,42 @@ class TestNetworkSettings(object):
         """This method is run once after _each_ test method is executed"""
 
     def test_init(self):
-        NetworkSettings('../config/network/network_settings.yaml', True)
+        assert_is_instance(
+            NetworkSettings(files_dir+'network_settings.yaml', True),
+            NetworkSettings)
+
+    def test_init_vlans(self):
+        assert_is_instance(
+            NetworkSettings(files_dir+'network_settings_vlans.yaml', True),
+            NetworkSettings)
+
+# TODO, v6 test is stuck
+    # def test_init_v6(self):
+    #     assert_is_instance(
+    #         NetworkSettings(files_dir+'network_settings_v6.yaml', True),
+    #         NetworkSettings)
+
+    def test_init_admin_disabled_or_missing(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # remove admin, apex section will re-add it
+        ns['networks'].pop('admin', None)
+        assert_raises(NetworkSettingsException, NetworkSettings, ns, True)
+        # remove admin and apex
+        ns.pop('apex', None)
+        ns['networks'].pop('admin', None)
+        assert_raises(NetworkSettingsException, NetworkSettings, ns, True)
+
+    def test_init_collapse_storage(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # remove storage
+        ns['networks'].pop('storage', None)
+        assert_is_instance(NetworkSettings(ns, True), NetworkSettings)
+
+    def test_init_missing_dns_domain(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # remove storage
+        ns.pop('dns-domain', None)
+        assert_is_instance(NetworkSettings(ns, True), NetworkSettings)
 
     def test_dump_bash(self):
         ns = NetworkSettings('../config/network/network_settings.yaml', True)
@@ -44,39 +87,74 @@ class TestNetworkSettings(object):
 
     def test_get_network_settings(self):
         ns = NetworkSettings('../config/network/network_settings.yaml', True)
-        assert_is_instance(ns, dict)
+        assert_is_instance(ns, NetworkSettings)
         for role in ['controller', 'compute']:
             nic_index = 1
-            for network in ['admin_network', 'private_network',
-                            'public_network', 'storage_network']:
-                nic = 'nic' + str(nic_index)
-                assert_equal(ns.nics[role][network], nic)
-                nic_index += 1
-
-    def test_get_network_settings_unspecified_nics(self):
-        ns = NetworkSettings(
-            '../tests/config/network_settings_nics_not_specified.yaml',
-            True)
-        assert_is_instance(ns, dict)
-        for role in ['controller', 'compute']:
-            nic_index = 1
-            for network in ['admin_network', 'private_network',
-                            'public_network', 'storage_network']:
+            print(ns.nics)
+            for network in ns.enabled_network_list:
                 nic = 'nic' + str(nic_index)
                 assert_equal(ns.nics[role][network], nic)
                 nic_index += 1
 
     def test_get_enabled_networks(self):
         ns = NetworkSettings('../config/network/network_settings.yaml', True)
-        assert_is_instance(ns.get_enabled_networks(), list)
-
-    def test_negative_network_settings(self):
-        assert_raises(NetworkSettingsException, NetworkSettings,
-                      '../tests/config/network_settings_duplicate_nic.yaml',
-                      True)
-        assert_raises(NetworkSettingsException, NetworkSettings,
-                      '../tests/config/network_settings_nic1_reserved.yaml',
-                      True)
-        assert_raises(NetworkSettingsException, NetworkSettings,
-                      '../tests/config/network_settings_missing_required_nic'
-                      '.yaml', True)
+        assert_is_instance(ns.enabled_network_list, list)
+
+    def test_invalid_nic_members(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        storage_net_nicmap = ns['networks'][STORAGE_NETWORK]['nic_mapping']
+        # set duplicate nic
+        storage_net_nicmap['compute']['members'][0] = 'nic1'
+        assert_raises(NetworkSettingsException, NetworkSettings, ns, True)
+        # remove nic members
+        storage_net_nicmap['compute']['members'] = []
+        assert_raises(NetworkSettingsException, NetworkSettings, ns, True)
+
+    def test_missing_vlan(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        storage_net_nicmap = ns['networks'][STORAGE_NETWORK]['nic_mapping']
+        # remove vlan from storage net
+        storage_net_nicmap['compute'].pop('vlan', None)
+        assert_is_instance(NetworkSettings(ns, True), NetworkSettings)
+
+# TODO
+# need to manipulate interfaces some how
+# maybe for ip_utils to return something to pass this
+#    def test_admin_auto_detect(self):
+#        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+#        # remove cidr to force autodetection
+#        ns['networks'][ADMIN_NETWORK].pop('cidr', None)
+#        assert_is_instance(NetworkSettings(ns, True), NetworkSettings)
+
+    def test_admin_fail_auto_detect(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # remove cidr and installer_vm to fail autodetect
+        ns['networks'][ADMIN_NETWORK].pop('cidr', None)
+        ns['networks'][ADMIN_NETWORK].pop('installer_vm', None)
+        assert_raises(NetworkSettingsException, NetworkSettings, ns, True)
+
+    def test_exception(self):
+        e = NetworkSettingsException("test")
+        print(e)
+        assert_is_instance(e, NetworkSettingsException)
+
+    def test_config_ip(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # set the provisioner ip to None to force _gen_ip to generate one
+        ns['networks'][ADMIN_NETWORK]['installer_vm']['ip'] = None
+        ns['networks'][EXTERNAL_NETWORK][0]['installer_vm']['ip'] = None
+        # Now rebuild network settings object and check for repopulated values
+        ns = NetworkSettings(ns, True)
+        assert_equal(ns['networks'][ADMIN_NETWORK]['installer_vm']['ip'],
+                     '192.0.2.1')
+        assert_equal(ns['networks'][EXTERNAL_NETWORK][0]['installer_vm']['ip'],
+                     '192.168.37.1')
+
+    def test_config_gateway(self):
+        ns = NetworkSettings(files_dir+'network_settings.yaml', True)
+        # set the gateway ip to None to force _config_gateway to generate one
+        ns['networks'][EXTERNAL_NETWORK][0]['gateway'] = None
+        # Now rebuild network settings object and check for a repopulated value
+        ns = NetworkSettings(ns, True)
+        assert_equal(ns['networks'][EXTERNAL_NETWORK][0]['gateway'],
+                     '192.168.37.1')