VOL-1665: BBSim Radius Authentication Test Case

BBSim specific Test Case for Radius Authentication
Consists of verifying that all 16 ONUs have authenticated
- Restart Onos AAA application whcih is know to return exception
  upon executing aaa-users command
- Address comments from review

Change-Id: I5f7fb231067f77a1f2e52ecde7328f702b333fd1
diff --git a/tests/atests/build/Makefile b/tests/atests/build/Makefile
index 6bbe23c..d760150 100644
--- a/tests/atests/build/Makefile
+++ b/tests/atests/build/Makefile
@@ -23,8 +23,8 @@
 
 KAFKA_CHART_VERSION  ?= 0.8.8
 
-ponsim: $(M)/voltha-running $(M)/adapter-ponsim $(M)/voltha-adapter-running
-bbsim:  $(M)/voltha-running $(M)/adapter-bbsim $(M)/voltha-adapter-running
+ponsim: $(M)/voltha-running $(M)/simtype-ponsim $(M)/voltha-simtype-running
+bbsim:  $(M)/voltha-running $(M)/simtype-bbsim $(M)/voltha-simtype-running
 
 $(M)/setup: 
 	echo "MYDIR = ${MYDIR}"
@@ -112,13 +112,13 @@
 	$(HOME)/cord/helm-charts/scripts/wait_for_pods.sh voltha
 	touch $@
 
-$(M)/adapter-bbsim: | $(M)/voltha-running
+$(M)/simtype-bbsim: | $(M)/voltha-running
 	cd $(HOME)/cord/helm-charts; helm upgrade --install ponnet ponnet
 	$(HOME)/cord/helm-charts/scripts/wait_for_pods.sh kube-system
 	cd $(HOME)/cord/helm-charts; helm upgrade --install bbsim bbsim -f configs/seba-ponsim.yaml --set images.bbsim.repository=voltha/voltha-bbsim,images.bbsim.tag=latest,images.bbsim.pullPolicy=Never
 	touch $@
 
-$(M)/adapter-ponsim: | $(M)/voltha-running
+$(M)/simtype-ponsim: | $(M)/voltha-running
 	cd $(HOME)/cord/helm-charts; helm upgrade --install ponnet ponnet
 	$(HOME)/cord/helm-charts/scripts/wait_for_pods.sh kube-system
 	cd $(HOME)/cord/helm-charts; helm upgrade --install ponsimv2 ponsimv2 -f configs/seba-ponsim.yaml --set images.olt.repository=voltha-ponsim,images.olt.tag=latest,images.olt.pullPolicy=Never,images.onu.repository=voltha-ponsim,images.onu.tag=latest,images.onu.pullPolicy=Never,images.rg.repository=voltha-tester,images.rg.tag=latest,images.rg.pullPolicy=Never
@@ -134,7 +134,7 @@
 	rm /tmp/pon0_group_fwd_mask
 	touch $@
 	
-$(M)/voltha-adapter-running: | $(M)/pon0-fwd
+$(M)/voltha-simtype-running: | $(M)/pon0-fwd
 	$(HOME)/cord/helm-charts/scripts/wait_for_pods.sh
 	until http -a karaf:karaf --ignore-stdin --check-status GET http://127.0.0.1:30120/onos/v1/configuration/org.opencord.olt.impl.Olt; \
 	do \
@@ -148,7 +148,7 @@
 
 remove-chart-milestones:
 	cd $(M); sudo rm -f setup kafka kafka-running onos voltha etcd-operator-ready etcd-cluster \
-		voltha-running adapter-ponsim adapter-bbsim pon0-fwd voltha-adapter-running
+		voltha-running simtype-ponsim simtype-bbsim pon0-fwd voltha-simtype-running
 remove-kube-milestones:
 	cd $(M); sudo rm -f kubeadm helm-init
 
diff --git a/tests/atests/common/authentication.py b/tests/atests/common/authentication.py
index b5196d7..a03f17e 100644
--- a/tests/atests/common/authentication.py
+++ b/tests/atests/common/authentication.py
@@ -36,14 +36,16 @@
         self.dirs['log'] = None
         self.dirs['root'] = None
         self.dirs['voltha'] = None
-        
+
+        self.__onuCount = None
         self.__rgName = testCaseUtils.discover_rg_pod_name()
-        self.__radiusName = None
-        self.__radiusIp = None
-        
+
     def a_set_log_dirs(self, root_dir, voltha_dir, log_dir):
         testCaseUtils.config_dirs(self, log_dir, root_dir, voltha_dir)
 
+    def a_configure(self, onu_count):
+        self.__onuCount = onu_count
+
     def execute_authentication_on_rg(self):
         logging.info('Running Radius Authentication from RG')
         process_output = open('%s/%s' % (testCaseUtils.get_dir(self, 'log'), self.AUTHENTICATE_FILENAME), 'w')
@@ -102,28 +104,40 @@
 
         testCaseUtils.print_log_file(self, self.AUTHENTICATE_FILENAME)
         
-    def verify_authentication_should_have_started(self):
+    def authentication_should_have_started(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-EAP-STARTED', self.AUTHENTICATE_FILENAME)
         assert statusLines, 'Authentication was not started'
         
-    def verify_authentication_should_have_completed(self):
+    def authentication_should_have_completed(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-EAP-SUCCESS', self.AUTHENTICATE_FILENAME)
         assert statusLines, 'Authentication was not completed successfully'
 
-    def verify_authentication_should_have_disconnected(self):
+    def authentication_should_have_disconnected(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-DISCONNECTED', self.AUTHENTICATE_FILENAME)
         assert statusLines, 'Authentication was not disconnected'
 
-    def verify_authentication_should_have_terminated(self):
+    def authentication_should_have_terminated(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-TERMINATING', self.AUTHENTICATE_FILENAME)
         assert statusLines, 'Authentication was not terminated'
-       
 
-def run_test(root_dir, voltha_dir, log_dir):
+    def should_have_all_onus_authenticated(self):
+        testCaseUtils.send_command_to_onos_cli(testCaseUtils.get_dir(self, 'log'),
+                                               'voltha_onu_auth.log', 'aaa-users')
+        statusLines = testCaseUtils.get_fields_from_grep_command(self, 'AUTHORIZED', 'voltha_onu_auth.log')
+        lines = statusLines.splitlines()
+        auth_count = len(lines)
+        assert self.__onuCount == auth_count, 'There are only %s ONUS Authenticated' % auth_count
+
+
+def run_test(onu_count, root_dir, voltha_dir, log_dir, simtype):
     auth = Authentication()
     auth.a_set_log_dirs(root_dir, voltha_dir, log_dir)
-    auth.execute_authentication_on_rg()
-    auth.verify_authentication_should_have_started()
-    auth.verify_authentication_should_have_completed()
-    auth.verify_authentication_should_have_disconnected()
-    auth.verify_authentication_should_have_terminated()
+    auth.a_configure(onu_count)
+    if simtype == 'ponsim':
+        auth.execute_authentication_on_rg()
+        auth.authentication_should_have_started()
+        auth.authentication_should_have_completed()
+        auth.authentication_should_have_disconnected()
+        auth.authentication_should_have_terminated()
+    elif simtype == 'bbsim':
+        auth.should_have_all_onus_authenticated()
diff --git a/tests/atests/common/auto_test.py b/tests/atests/common/auto_test.py
index 5182bdc..4dea0ab 100755
--- a/tests/atests/common/auto_test.py
+++ b/tests/atests/common/auto_test.py
@@ -31,7 +31,7 @@
 import logging
 
 DEFAULT_LOG_DIR = '/tmp/voltha_test_results'
-DEFAULT_ADAPTER = 'ponsim'
+DEFAULT_SIMTYPE = 'ponsim'
 logging.basicConfig(level=logging.INFO)
 
 
@@ -66,18 +66,18 @@
     return root_dir, voltha_dir, log_dir
 
 
-def adapter_init(adapter=DEFAULT_ADAPTER):
+def simtype_init(simtype=DEFAULT_SIMTYPE):
     """
 
-    :param adapter: ponsim or bbsim
+    :param simtype: ponsim or bbsim
     :return: olt_type, onu_type, olt_host_ip, onu_count
     """
-    if adapter == 'ponsim':
+    if simtype == 'ponsim':
         olt_type = 'ponsim_olt'
         onu_type = 'ponsim_onu'
         olt_host_ip = 'olt.voltha.svc'
         onu_count = 1
-    elif adapter == 'bbsim':
+    elif simtype == 'bbsim':
         olt_type = 'openolt'
         onu_type = 'brcm_openomci_onu'
         olt_host_ip = 'bbsim.voltha.svc'
@@ -102,21 +102,22 @@
     parser = argparse.ArgumentParser(description='VOLTHA Automated Testing')
     parser.add_argument('-l', dest='logDir', default=DEFAULT_LOG_DIR,
                         help='log directory (default: %s).' % DEFAULT_LOG_DIR)
-    parser.add_argument('-a', dest='adapter', choices=['ponsim', 'bbsim'], default=DEFAULT_ADAPTER,
-                        help='adapter (default: %s).' % DEFAULT_ADAPTER)
+    parser.add_argument('-a', dest='simtype', choices=['ponsim', 'bbsim'], default=DEFAULT_SIMTYPE,
+                        help='simtype (default: %s).' % DEFAULT_SIMTYPE)
     args = parser.parse_args()
 
     ROOT_DIR, VOLTHA_DIR, LOG_DIR = dir_init(args.logDir)
-    OLT_TYPE, ONU_TYPE, OLT_HOST_IP, ONU_COUNT = adapter_init(args.adapter)
+    OLT_TYPE, ONU_TYPE, OLT_HOST_IP, ONU_COUNT = simtype_init(args.simtype)
     
-    volthaMngr.voltha_initialize(ROOT_DIR, VOLTHA_DIR, LOG_DIR, args.adapter)
+    volthaMngr.voltha_initialize(ROOT_DIR, VOLTHA_DIR, LOG_DIR, args.simtype)
 
     preprovisioning.run_test(OLT_HOST_IP, 50060, OLT_TYPE, ONU_TYPE, ONU_COUNT, LOG_DIR)
 
     discovery.run_test(OLT_HOST_IP, OLT_TYPE, ONU_TYPE, ONU_COUNT, LOG_DIR)
-    if args.adapter == 'ponsim':
-        authentication.run_test(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
 
+    authentication.run_test(ONU_COUNT, ROOT_DIR, VOLTHA_DIR, LOG_DIR, args.simtype)
+
+    if args.simtype == 'ponsim':
         dhcp.run_test(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
 
         unicast.run_test(ONU_TYPE, ONU_COUNT, ROOT_DIR, VOLTHA_DIR, LOG_DIR)
diff --git a/tests/atests/common/run_robot.sh b/tests/atests/common/run_robot.sh
index 84e6bcd..17847a1 100755
--- a/tests/atests/common/run_robot.sh
+++ b/tests/atests/common/run_robot.sh
@@ -16,13 +16,13 @@
 SRC_DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 VOLTHA_DIR="$SRC_DIR/../../.."
 
-echo "Run Robot Framework TEST. Log: $1, Adapter: ${2:-ponsim}"
+echo "Run Voltha Test Automation Suite. Log: $1, Simtype: ${2:-ponsim}"
 cd ${VOLTHA_DIR}
 source env.sh
 if [[ "${2:-ponsim}" == "ponsim" ]]
   then
-    robot -d $1 -v LOG_DIR:$1/voltha_test_results -v ADAPTER:ponsim ./tests/atests/robot/voltha_automated_test_suite.robot
+    robot -d $1 -v LOG_DIR:$1/voltha_test_results -v SIMTYPE:ponsim ./tests/atests/robot/voltha_automated_test_suite.robot
 elif [[ "${2}" == "bbsim" ]]
     then
-      robot -d $1 -v LOG_DIR:$1/voltha_test_results -v ADAPTER:bbsim -e ponsim ./tests/atests/robot/voltha_automated_test_suite.robot
+      robot -d $1 -v LOG_DIR:$1/voltha_test_results -v SIMTYPE:bbsim -e ponsim ./tests/atests/robot/voltha_automated_test_suite.robot
 fi
\ No newline at end of file
diff --git a/tests/atests/common/volthaMngr.py b/tests/atests/common/volthaMngr.py
index f94322d..84e937f 100755
--- a/tests/atests/common/volthaMngr.py
+++ b/tests/atests/common/volthaMngr.py
@@ -23,6 +23,7 @@
 import subprocess
 import testCaseUtils
 import logging
+import time
 
 
 class VolthaMngr(object):
@@ -31,7 +32,7 @@
     This class implements voltha startup/shutdown callable helper functions
     """
 
-    DEFAULT_ADAPTER = 'ponsim'
+    DEFAULT_SIMTYPE = 'ponsim'
 
     def __init__(self):
         self.dirs = dict()
@@ -45,24 +46,24 @@
     def v_set_log_dirs(self, root_dir, voltha_dir, log_dir):
         testCaseUtils.config_dirs(self, log_dir, root_dir, voltha_dir)
 
-    def start_all_pods(self, adapter=DEFAULT_ADAPTER):
-        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'start', adapter],
+    def start_all_pods(self, simtype=DEFAULT_SIMTYPE):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'start', simtype],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
         print(output)
         proc1.stdout.close()
 
-    def stop_all_pods(self, adapter=DEFAULT_ADAPTER):
-        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'stop', adapter],
+    def stop_all_pods(self, simtype=DEFAULT_SIMTYPE):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'stop', simtype],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
         print(output)
         proc1.stdout.close()
         
-    def reset_kube_adm(self, adapter=DEFAULT_ADAPTER):
-        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'clear', adapter],
+    def reset_kube_adm(self, simtype=DEFAULT_SIMTYPE):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'clear', simtype],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
@@ -129,6 +130,20 @@
                   'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/aaa_json'
                   % testCaseUtils.get_dir(self, 'voltha'))
 
+    def activate_aaa_app_in_onos(self):
+        logging.info('Activating AAA Application on Onos')
+        testCaseUtils.send_command_to_onos_cli(testCaseUtils.get_dir(self, 'log'),
+                                               'voltha_aaa_application_activate.log', 'app activate aaa')
+        statusLines = testCaseUtils.get_fields_from_grep_command(self, 'Activated', 'voltha_aaa_application_activate.log')
+        assert statusLines, 'AAA Application failed to be Activated'
+
+    def deactivate_aaa_app_in_onos(self):
+        logging.info('Deactivating AAA Application on Onos')
+        testCaseUtils.send_command_to_onos_cli(testCaseUtils.get_dir(self, 'log'),
+                                               'voltha_aaa_application_deactivate.log', 'app deactivate aaa')
+        statusLines = testCaseUtils.get_fields_from_grep_command(self, 'Deactivated', 'voltha_aaa_application_deactivate.log')
+        assert statusLines, 'AAA Application failed to be Deactivated'
+
 
 def get_all_running_pods():
     allRunningPods = []
@@ -152,15 +167,18 @@
     return allRunningPods
 
 
-def voltha_initialize(root_dir, voltha_dir, log_dir, adapter):
+def voltha_initialize(root_dir, voltha_dir, log_dir, simtype):
     voltha = VolthaMngr()
     voltha.v_set_log_dirs(root_dir, voltha_dir, log_dir)
-    voltha.stop_all_pods(adapter)
-    voltha.reset_kube_adm(adapter)
-    voltha.start_all_pods(adapter)
+    voltha.stop_all_pods(simtype)
+    voltha.reset_kube_adm(simtype)
+    voltha.start_all_pods(simtype)
     voltha.alter_onos_net_cfg()
     voltha.collect_pod_logs()
     voltha.discover_freeradius_pod_name()
     voltha.discover_freeradius_ip_addr()
     voltha.prepare_current_freeradius_ip()
     voltha.alter_freeradius_ip_in_onos_aaa_application_configuration()
+    voltha.deactivate_aaa_app_in_onos()
+    time.sleep(5)
+    voltha.activate_aaa_app_in_onos()
diff --git a/tests/atests/robot/voltha_automated_test_suite.robot b/tests/atests/robot/voltha_automated_test_suite.robot
index 10a9f34..afb9672 100755
--- a/tests/atests/robot/voltha_automated_test_suite.robot
+++ b/tests/atests/robot/voltha_automated_test_suite.robot
@@ -41,7 +41,7 @@
 ${ONU_TYPE}             ${EMPTY}
 ${OLT_HOST_IP}          ${EMPTY}
 ${ONU_COUNT}            ${EMPTY}
-${ADAPTER}              ${EMPTY}
+${SIMTYPE}              ${EMPTY}
 ${RETRY_TIMEOUT_60}     60s
 ${RETRY_INTERVAL_2}     2s
 ${PROCEED_TIMEOUT_180}  180s
@@ -89,16 +89,15 @@
     
 Radius Authentication
     [Documentation]     Radius Authentication
-    ...                 This test attempts to perform a Radius Authentication from the RG
-    ...                 It uses the wpa_supplicant app to authenticate using EAPOL.
+    ...                 This test attempts to perform a Radius Authentication from the RG in the case
+    ...                 of the 'ponsim' simtype. It uses the wpa_supplicant app to authenticate using EAPOL.
     ...                 We then verify the generated log file confirming all the authentication steps
-    [Tags]              ponsim
+    ...                 In the case where the simtype is 'bbsim' we simply verify that all ONUs have
+    ...                 authenticated. We do this by executing the 'aaa-users command on onos
     A Set Log Dirs      ${ROOT_DIR}    ${VOLTHA_DIR}    ${LOG_DIR}
-    Execute Authentication On RG
-    Verify Authentication Should Have Started
-    Verify Authentication Should Have Completed
-    Verify Authentication Should Have Disconnected
-    Verify Authentication Should Have Terminated    
+    A Configure         ${ONU_COUNT}
+    Run Keyword If      '${SIMTYPE}' == 'ponsim'      Ponsim Authentication Steps
+    ...  ELSE IF        '${SIMTYPE}' == 'bbsim'       BBSim Authentication Verification Step
 
 Dhcp IP Address Assignment on RG
     [Documentation]     DHCP assigned IP Address
@@ -141,19 +140,21 @@
     [Documentation]     Start Voltha infrastructure to run test(s). This includes starting all 
     ...                 Kubernetes Pods and start collection of logs. PonsimV2 has now been
     ...                 containerized and does not need to be managed separately
-    ...                 Initialize working DIRs as well as Adapter specific variables
+    ...                 Initialize working DIRs as well as Simtype specific variables. We also 
+    ...                 setup Freeradius and restart AAA app in onos in preparation for 
+    ...                 authentication test case
     ${ROOT_DIR}  ${VOLTHA_DIR}  ${LOG_DIR}  Dir Init    ${LOG_DIR}
     Set Suite Variable  ${ROOT_DIR}
     Set Suite Variable  ${VOLTHA_DIR}
     Set Suite Variable  ${LOG_DIR}   
     V Set Log Dirs      ${ROOT_DIR}    ${VOLTHA_DIR}    ${LOG_DIR}
-    ${OLT_TYPE}  ${ONU_TYPE}    ${OLT_HOST_IP}  ${ONU_COUNT}  Adapter Init  ${ADAPTER}
+    ${OLT_TYPE}  ${ONU_TYPE}    ${OLT_HOST_IP}  ${ONU_COUNT}  Simtype Init  ${SIMTYPE}
     Set Suite Variable  ${OLT_TYPE}
     Set Suite Variable  ${ONU_TYPE}
     Set Suite Variable  ${OLT_HOST_IP}
     Set Suite Variable  ${ONU_COUNT}
     Stop Voltha
-    Start All Pods      ${ADAPTER}
+    Start All Pods      ${SIMTYPE}
     Sleep    60
     ${pod_status}       Run    kubectl get pods --all-namespaces
     Log To Console      \n${pod_status}\n
@@ -162,10 +163,26 @@
     Discover Freeradius Ip Addr
     Prepare Current Freeradius Ip
     Alter Freeradius Ip In Onos AAA Application Configuration
+    Deactivate Aaa App In Onos
+    Sleep   5
+    Activate Aaa App In Onos
 
 Stop Voltha
     [Documentation]     Stop Voltha infrastructure. This includes clearing all installation milestones
     ...                 files and stopping all Kubernetes pods
     Collect Pod Logs
-    Stop All Pods       ${ADAPTER}
-    Reset Kube Adm      ${ADAPTER}
+    Stop All Pods       ${SIMTYPE}
+    Reset Kube Adm      ${SIMTYPE}
+
+Ponsim Authentication Steps
+    [Documentation]     List of steps required to run manual Authentication from RG
+    Execute Authentication On RG
+    Authentication Should Have Started
+    Authentication Should Have Completed
+    Authentication Should Have Disconnected
+    Authentication Should Have Terminated
+
+BBSim Authentication Verification Step
+    [Documentation]     List of steps to verify that all BBSim ONUs have successfully authenticated
+    Should Have All Onus Authenticated
+    
\ No newline at end of file