Change the default for aaa to socket based because of eap tls.
Separate the radius port subnet. (though it doesn't work with EAP tls)
Dynamically add users on radius start that maps to the source mac.
This could be used with eap-md5/pap and sample customizer.
Disable voltha teardown for subscriber and tls tests.

Change-Id: Id4f1e1242456579d44dfbcfff2f9d1ee417dfff1
diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index b058a5c..f017cc0 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -30,7 +30,7 @@
 from CordTestServer import cord_test_server_start,cord_test_server_stop,cord_test_server_shutdown,CORD_TEST_HOST,CORD_TEST_PORT
 from TestManifest import TestManifest
 from VolthaCtrl import VolthaService
-from EapolAAA import get_radius_macs
+from EapolAAA import get_radius_macs, get_radius_networks, radius_restore_users, RADIUS_USER_MAC_START, RADIUS_USER_MAC_END
 
 try:
     from docker import APIClient as Client
@@ -448,6 +448,10 @@
                 wan = 'ponmgmt'
         vcpe_port_num = port_num
         port_list = self.port_map['switch_port_list'] + self.port_map['switch_relay_port_list']
+        subscribers = self.port_map['num_ports'] * len(self.port_map['switch_port_list'])
+        subscriber_macs = get_radius_macs(subscribers,
+                                          start = RADIUS_USER_MAC_START,
+                                          end = RADIUS_USER_MAC_END)
         print('Provisioning the ports for the test container\n')
         for host_intf, ports in port_list:
             if self.switch_started is False and host_intf.startswith('br-int'):
@@ -480,13 +484,19 @@
                         host_intf = '{}_{}'.format(host_intf_base, host_index)
                         host_index += 1
 
+                port_mac = ''
+                if len(subscriber_macs) > 0:
+                    port_mac = subscriber_macs.pop(0)
+
                 ##Use pipeworks to configure container interfaces on host/bridge interfaces
-                pipework_cmd = 'pipework {0} -i {1} -l {2} {3} {4}'.format(host_intf, guest_if,
-                                                                           local_if, self.name, guest_ip)
+                pipework_cmd = 'pipework {0} -i {1} -l {2} {3} {4} {5}'.format(host_intf, guest_if,
+                                                                               local_if, self.name, guest_ip,
+                                                                               port_mac)
                 #if the wan interface is specified for uplink, then use it instead
                 if wan and port == self.port_map[uplink]:
-                    pipework_cmd = 'pipework {0} -i {1} -l {2} {3} {4}'.format(wan, guest_if,
-                                                                               local_if, self.name, guest_ip)
+                    pipework_cmd = 'pipework {0} -i {1} -l {2} {3} {4} {5}'.format(wan, guest_if,
+                                                                                   local_if, self.name, guest_ip,
+                                                                                   port_mac)
                 else:
                     if start_vlan != 0:
                         pipework_cmd += ' @{}'.format(start_vlan)
@@ -502,13 +512,25 @@
         if self.switch_started and self.radius:
             radius_macs = get_radius_macs(len(self.port_map['radius_ports']))
             radius_intf_index = 0
-            radius_intf_subnet = Radius.SUBNET_PREFIX
+            radius_networks = get_radius_networks(len(self.port_map['switch_radius_port_list']))
+            index = 0
             for host_intf, ports in self.port_map['switch_radius_port_list']:
+                prefix, subnet, gw = radius_networks[index]
+                mask = subnet.split('/')[-1]
+                #configure the host interface as the gateway
+                cmds = ( #'ip addr add {}/{} dev {}'.format(gw, mask, host_intf),
+                        'ip link set {} up'.format(host_intf),
+                )
+                print('Configuring host interface %s for radius server' %(host_intf))
+                for cmd in cmds:
+                    print('Running command: %s' %(cmd))
+                    res += os.system(cmd)
+                index += 1
                 for port in ports:
                     guest_if = 'eth{}'.format(radius_intf_index+2)
                     port_index = self.port_map[port]
                     local_if = 'r{}'.format(port_index)
-                    guest_ip = '{}.{}/24'.format(radius_intf_subnet, port_index)
+                    guest_ip = '{}.{}/{}'.format(prefix, port_index, mask)
                     mac = radius_macs[radius_intf_index]
                     radius_intf_index += 1
                     port_num += 1
@@ -518,6 +540,12 @@
                     print('Configuring Radius port %s on OVS bridge %s' %(guest_if, host_intf))
                     print('Running pipework command: %s' %(pipework_cmd))
                     res += os.system(pipework_cmd)
+                    brd = '{}.255'.format(prefix)
+                    brd_cmd = 'docker exec {} ifconfig {} broadcast {} up'.format(self.radius.name,
+                                                                                  guest_if,
+                                                                                  brd)
+                    print('Setting broadcast address to %s for radius interface %s' %(brd, guest_if))
+                    res += os.system(brd_cmd)
 
         self.setup_vcpes(vcpe_port_num)
         return res, port_num
@@ -938,7 +966,8 @@
     if radius_ip is None:
         ##Create Radius container
         radius = Radius(prefix = Container.IMAGE_PREFIX, update = update_map['radius'],
-                        network = test_manifest.docker_network)
+                        network = test_manifest.docker_network,
+                        olt_config = olt_config_file)
         radius_ip = radius.ip(network = Radius.NETWORK)
 
     print('Radius server running with IP %s' %radius_ip)
@@ -1222,7 +1251,8 @@
     ##Start Radius container if not started
     if radius_ip is None:
         radius = Radius(prefix = Container.IMAGE_PREFIX, update = update_map['radius'],
-                        network = test_manifest.docker_network)
+                        network = test_manifest.docker_network,
+                        olt_config = olt_config_file)
         radius_ip = radius.ip(network = Radius.NETWORK)
 
     print('Radius server running with IP %s' %radius_ip)
@@ -1351,6 +1381,7 @@
     radius_container = '{}{}:candidate'.format(prefix, Radius.IMAGE)
     quagga_container = '{}{}:candidate'.format(prefix, Quagga.IMAGE)
     Container.cleanup(radius_container)
+    radius_restore_users()
     Container.cleanup(quagga_container)
     if args.voltha_loc:
         voltha = VolthaService(args.voltha_loc, args.onos_ip)