diff --git a/tests/atests/common/authentication.py b/tests/atests/common/authentication.py
index 6bbc669..5cde7b5 100644
--- a/tests/atests/common/authentication.py
+++ b/tests/atests/common/authentication.py
@@ -21,10 +21,9 @@
 import time
 import os
 import subprocess
-import commands
 import testCaseUtils
 import logging
-import signal
+
 
 class Authentication(object):
 
@@ -34,61 +33,63 @@
     AUTHENTICATE_FILENAME = 'voltha_authenticate.log'
     
     def __init__(self):
-        self.dirs = {}
-        self.dirs ['log'] = None
-        self.dirs ['root'] = None
-        self.dirs ['voltha'] = None
+        self.dirs = dict()
+        self.dirs['log'] = None
+        self.dirs['root'] = None
+        self.dirs['voltha'] = None
         
         self.__rgName = None
         self.__radiusName = None
         self.__radiusIp = None
         
-    def aSetLogDirs(self, rootDir, volthaDir, logDir):
-        testCaseUtils.configDirs(self, logDir, rootDir, volthaDir)
+    def a_set_log_dirs(self, root_dir, voltha_dir, log_dir):
+        testCaseUtils.config_dirs(self, log_dir, root_dir, voltha_dir)
 
     def discover_rg_pod_name(self):
-        self.__rgName = testCaseUtils.extractPodName('rg-').strip()
+        self.__rgName = testCaseUtils.extract_pod_name('rg-').strip()
          
     def discover_freeradius_pod_name(self):
-        self.__radiusName = testCaseUtils.extractPodName('freeradius').strip()
-        logging.info ('freeradius Name = %s' % self.__radiusName)
+        self.__radiusName = testCaseUtils.extract_pod_name('freeradius').strip()
+        logging.info('freeradius Name = %s' % self.__radiusName)
         
     def discover_freeradius_ip_addr(self):
-        ipAddr = testCaseUtils.extractRadiusIpAddr(self.__radiusName)
+        ipAddr = testCaseUtils.extract_radius_ip_addr(self.__radiusName)
         assert ipAddr, 'No IP address listed for freeradius'
         self.__radiusIp = ipAddr.strip()
         logging.info('freeradius IP = %s' % self.__radiusIp)
         
     def set_current_freeradius_ip_in_aaa_json(self):
-        status = testCaseUtils.modifyRadiusIpInJsonUsingSed(self, self.__radiusIp)
-        assertFalse = 'Setting Radius Ip in Json File did not return Success'
+        status = testCaseUtils.modify_radius_ip_in_json_using_sed(self, self.__radiusIp)
+        assert (status == 0), 'Setting Radius Ip in Json File did not return Success'
           
     def alter_aaa_application_configuration_in_onos_using_aaa_json(self):
-        logging.info ('Altering the Onos NetCfg AAA apps with Freeradius IP address')
-        logging.debug ('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/aaa_json'
-            % testCaseUtils.getDir(self, 'voltha'))
+        logging.info('Altering the Onos NetCfg AAA apps with Freeradius IP address')
+        logging.debug('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
+                      'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/aaa_json'
+                      % testCaseUtils.get_dir(self, 'voltha'))
         os.system('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/aaa_json'
-            % testCaseUtils.getDir(self, 'voltha'))
+                  'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/aaa_json'
+                  % testCaseUtils.get_dir(self, 'voltha'))
      
-    def execute_authenticatication_on_rg(self):
-        logging.info ('Running Radius Authentication from RG')
-        process_output = open('%s/%s' % (testCaseUtils.getDir(self, 'log'), self.AUTHENTICATE_FILENAME), 'w')
-        proc1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'bash', '-c', \
+    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')
+        proc1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'bash', '-c',
                                   '/sbin/wpa_supplicant -Dwired -ieth0 -c /etc/wpa_supplicant/wpa_supplicant.conf'],
                                  stdout=process_output,
                                  stderr=process_output)
+
         time.sleep(15)
+        logging.debug('return value from supplicant subprocess = %s' % proc1.returncode)
         procPidSupplicant1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'ps', '-ef'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                              stdout=subprocess.PIPE,
+                                              stderr=subprocess.PIPE)
         procPidSupplicant2 = subprocess.Popen(['grep', '-e', '/sbin/wpa_supplicant'], stdin=procPidSupplicant1.stdout,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                              stdout=subprocess.PIPE,
+                                              stderr=subprocess.PIPE)
         procPidSupplicant3 = subprocess.Popen(['awk', "{print $2}"], stdin=procPidSupplicant2.stdout,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                              stdout=subprocess.PIPE,
+                                              stderr=subprocess.PIPE)
 
         procPidSupplicant1.stdout.close()
         procPidSupplicant2.stdout.close()
@@ -97,19 +98,20 @@
         supplicantPid = out.strip()
         
         procKillSupplicant1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'kill', supplicantPid],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                               stdout=subprocess.PIPE,
+                                               stderr=subprocess.PIPE)
         out, err = procKillSupplicant1.communicate()
+        assert not err, 'Killing Supplicant returned %s' % err
 
         procPidBash1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'ps', '-ef'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                        stdout=subprocess.PIPE,
+                                        stderr=subprocess.PIPE)
         procPidBash2 = subprocess.Popen(['grep', '-e', '/bin/bash'], stdin=procPidBash1.stdout,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                        stdout=subprocess.PIPE,
+                                        stderr=subprocess.PIPE)
         procPidBash3 = subprocess.Popen(['awk', "{print $2}"], stdin=procPidBash2.stdout,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                        stdout=subprocess.PIPE,
+                                        stderr=subprocess.PIPE)
 
         procPidBash1.stdout.close()
         procPidBash2.stdout.close()
@@ -118,13 +120,14 @@
         bashPid = out.strip()
         
         procKillBash1 = subprocess.Popen(['/usr/bin/kubectl', 'exec', '-n', 'voltha', self.__rgName, '--', 'kill', '-9', bashPid],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+                                         stdout=subprocess.PIPE,
+                                         stderr=subprocess.PIPE)
         out, err = procKillBash1.communicate()
+        assert not err, 'Killing Bash returned %s' % err
 
         process_output.close()       
 
-        testCaseUtils.printLogFile(self, self.AUTHENTICATE_FILENAME)
+        testCaseUtils.print_log_file(self, self.AUTHENTICATE_FILENAME)
         
     def verify_authentication_should_have_started(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-EAP-STARTED', self.AUTHENTICATE_FILENAME)
@@ -142,17 +145,17 @@
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'CTRL-EVENT-TERMINATING', self.AUTHENTICATE_FILENAME)
         assert statusLines, 'Authentication was not terminated'
        
-def runTest(rootDir, volthaDir, logDir):
+
+def run_test(root_dir, voltha_dir, log_dir):
     auth = Authentication()
-    auth.aSetLogDirs(rootDir, volthaDir, logDir)
+    auth.a_set_log_dirs(root_dir, voltha_dir, log_dir)
     auth.discover_rg_pod_name()
     auth.discover_freeradius_pod_name()
     auth.discover_freeradius_ip_addr()
     auth.set_current_freeradius_ip_in_aaa_json()
     auth.alter_aaa_application_configuration_in_onos_using_aaa_json()
-    auth.execute_authenticatication_on_rg()
+    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()
-
diff --git a/tests/atests/common/auto_test.py b/tests/atests/common/auto_test.py
index 308ec04..f4b90ae 100755
--- a/tests/atests/common/auto_test.py
+++ b/tests/atests/common/auto_test.py
@@ -31,14 +31,15 @@
 DEFAULT_LOG_DIR = '/tmp/voltha_test_results'
 logging.basicConfig(level=logging.INFO)
 
-def dir_init(logDir=DEFAULT_LOG_DIR, volthaDir=os.environ['VOLTHA_BASE']):
+
+def dir_init(log_dir=DEFAULT_LOG_DIR, voltha_dir=os.environ['VOLTHA_BASE']):
     logging.info(__file__)
     """
     Init automated testing environment and return three directories: root dir,
     voltha sources dir and log dir
     """
 
-    rootDir = os.path.abspath(os.path.dirname(__file__))
+    root_dir = os.path.abspath(os.path.dirname(__file__))
 
     currentTime = time.strftime("%Y-%m-%d-%H-%M-%S")
 
@@ -46,13 +47,13 @@
     # added to the log directory name
     # logDir += '_' + currentTime
  
-    os.system('mkdir -p ' + logDir + ' > /dev/null 2>&1')
-    os.system('rm -rf %s/*' % logDir)
+    os.system('mkdir -p ' + log_dir + ' > /dev/null 2>&1')
+    os.system('rm -rf %s/*' % log_dir)
     logging.info('Starting Voltha Test Case Suite at: %s\nRoot Directory: %s\n'
-          'VOLTHA Directory: %s\nLog Directory: %s' %
-          (currentTime, rootDir, volthaDir, logDir))
+                 'VOLTHA Directory: %s\nLog Directory: %s' %
+                 (currentTime, root_dir, voltha_dir, log_dir))
 
-    return rootDir, volthaDir, logDir
+    return root_dir, voltha_dir, log_dir
 
 
 #
@@ -70,12 +71,12 @@
 
     ROOT_DIR, VOLTHA_DIR, LOG_DIR = dir_init(args.logDir)
     
-    volthaMngr.voltha_Initialize(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
+    volthaMngr.voltha_initialize(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
 
-    preprovisioning.runTest('olt.voltha.svc', 50060, 'ponsim_olt', 'ponsim_onu', LOG_DIR)
+    preprovisioning.run_test('olt.voltha.svc', 50060, 'ponsim_olt', 'ponsim_onu', LOG_DIR)
     
-    discovery.runTest('olt.voltha.svc', 'ponsim_olt', 'ponsim_onu', LOG_DIR)
+    discovery.run_test('olt.voltha.svc', 'ponsim_olt', 'ponsim_onu', LOG_DIR)
 
-    authentication.runTest(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
+    authentication.run_test(ROOT_DIR, VOLTHA_DIR, LOG_DIR)
 
     time.sleep(5)
diff --git a/tests/atests/common/discovery.py b/tests/atests/common/discovery.py
index a0f3ef5..e125dcf 100755
--- a/tests/atests/common/discovery.py
+++ b/tests/atests/common/discovery.py
@@ -18,12 +18,10 @@
 vOLT-HA Discovery Test Case module
 """
 
-import time
-import os
-import commands
 import testCaseUtils
 import logging
 
+
 class Discovery(object):
 
     """
@@ -31,10 +29,10 @@
     """
     
     def __init__(self):
-        self.dirs = {}
-        self.dirs ['log'] = None
-        self.dirs ['root'] = None
-        self.dirs ['voltha'] = None
+        self.dirs = dict()
+        self.dirs['log'] = None
+        self.dirs['root'] = None
+        self.dirs['voltha'] = None
 
         self.__logicalDeviceType = None
         self.__oltType = None
@@ -45,98 +43,100 @@
         self.__onuDeviceIds = []
         self.__peers = None
         
-    def dSetLogDirs(self, logDir):
-        testCaseUtils.configDirs(self, logDir)
+    def d_set_log_dirs(self, log_dir):
+        testCaseUtils.config_dirs(self, log_dir)
 
-    def dConfigure(self, logicalDeviceType, oltType, onuType):
-        self.__logicalDeviceType = logicalDeviceType
-        self.__oltType = oltType
-        self.__onuType = onuType
+    def d_configure(self, logical_device_type, olt_type, onu_type):
+        self.__logicalDeviceType = logical_device_type
+        self.__oltType = olt_type
+        self.__onuType = onu_type
 
-    def logicalDevice(self):
+    def logical_device(self):
         logging.info('Logical Device Info')
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__logicalDeviceType, 'voltha_devices_after_enable.log')
         assert statusLines, 'No Logical Devices listed under devices'
-        self.__fields = testCaseUtils.parseFields(statusLines)
+        self.__fields = testCaseUtils.parse_fields(statusLines)
         self.__logicalDeviceId = self.__fields[4].strip()
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-            'voltha_logical_device.log', 'logical_device ' + self.__logicalDeviceId, 'voltha_logical_device_ports.log', 'ports', 'voltha_logical_device_flows.log', 'flows')
-        testCaseUtils.printLogFile (self, 'voltha_logical_device_ports.log')
-        testCaseUtils.printLogFile (self, 'voltha_logical_device_flows.log')
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_logical_device.log', 'logical_device ' + self.__logicalDeviceId,
+                                                 'voltha_logical_device_ports.log', 'ports', 'voltha_logical_device_flows.log', 'flows')
+        testCaseUtils.print_log_file(self, 'voltha_logical_device_ports.log')
+        testCaseUtils.print_log_file(self, 'voltha_logical_device_flows.log')
 
-    def oltDiscovery(self):
+    def olt_discovery(self):
         logging.info('Olt Discovery')
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__oltType, 'voltha_devices_after_enable.log')
         assert statusLines, 'No Olt listed under devices'
-        self.__fields = testCaseUtils.parseFields(statusLines)
+        self.__fields = testCaseUtils.parse_fields(statusLines)
         self.__oltDeviceId = self.__fields[1].strip()
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-            'voltha_olt_device.log', 'device ' + self.__oltDeviceId, 'voltha_olt_ports.log', 'ports', 'voltha_olt_flows.log', 'flows')
-        testCaseUtils.printLogFile (self, 'voltha_olt_ports.log')
-        testCaseUtils.printLogFile (self, 'voltha_olt_flows.log')
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_olt_device.log', 'device ' + self.__oltDeviceId, 'voltha_olt_ports.log',
+                                                 'ports', 'voltha_olt_flows.log', 'flows')
+        testCaseUtils.print_log_file(self, 'voltha_olt_ports.log')
+        testCaseUtils.print_log_file(self, 'voltha_olt_flows.log')
             
-    def onuDiscovery(self):
+    def onu_discovery(self):
         logging.info('Onu Discovery')
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__onuType, 'voltha_devices_after_enable.log')
         assert statusLines, 'No Onu listed under devices'
         lines = statusLines.splitlines()
         for line in lines:
-            self.__fields = testCaseUtils.parseFields(line)
+            self.__fields = testCaseUtils.parse_fields(line)
             onuDeviceId = self.__fields[1].strip()
             self.__onuDeviceIds.append(onuDeviceId)
-            testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-            'voltha_onu_device_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log', 'device ' + onuDeviceId, 
-            'voltha_onu_ports_' +  str(self.__onuDeviceIds.index(onuDeviceId)) + '.log', 'ports', 
-            'voltha_onu_flows_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log', 'flows')
-            testCaseUtils.printLogFile (self, 'voltha_onu_ports_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
-            testCaseUtils.printLogFile (self, 'voltha_onu_flows_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
+            testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                     'voltha_onu_device_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log',
+                                                     'device ' + onuDeviceId, 'voltha_onu_ports_' +
+                                                     str(self.__onuDeviceIds.index(onuDeviceId)) + '.log', 'ports', 'voltha_onu_flows_' +
+                                                     str(self.__onuDeviceIds.index(onuDeviceId)) + '.log', 'flows')
+            testCaseUtils.print_log_file(self, 'voltha_onu_ports_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
+            testCaseUtils.print_log_file(self, 'voltha_onu_flows_' + str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
                 
     def olt_ports_should_be_enabled_and_active(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__oltDeviceId, 'voltha_olt_ports.log')
         assert statusLines, 'No Olt device listed under ports'
         lines = statusLines.splitlines()
         for line in lines:
-            self.__fields = testCaseUtils.parseFields(line)
-            assert self.check_states(self.__oltDeviceId) == True, 'States of %s does match expected ' % self.__oltDeviceId
+            self.__fields = testCaseUtils.parse_fields(line)
+            assert (self.check_states(self.__oltDeviceId) is True), 'States of %s does match expected ' % self.__oltDeviceId
             portType = self.__fields[3].strip()
             assert (portType == 'ETHERNET_NNI' or portType == 'PON_OLT'),\
-            'Port type for %s does not match expected ETHERNET_NNI or PON_OLT' % self.__oltDeviceId
+                'Port type for %s does not match expected ETHERNET_NNI or PON_OLT' % self.__oltDeviceId
             if portType == 'PON_OLT':
                 self.__peers = self.__fields[7].strip()
                 peerFields = self.__peers.split(',')
                 peerDevices = peerFields[1::2]
                 for peerDevice in peerDevices:
                     deviceFields = peerDevice.split(':')
-                    deviceId = deviceFields[1].replace("'","").replace('u','').rstrip("}]").strip()
+                    deviceId = deviceFields[1].replace("'", "").replace('u', '').rstrip("}]").strip()
                     assert deviceId in self.__onuDeviceIds, 'ONU Device %s not found as Peer' % deviceId
                     
     def onu_ports_should_be_enabled_and_active(self):
         for onuDeviceId in self.__onuDeviceIds:
-            statusLines = testCaseUtils.get_fields_from_grep_command(self, onuDeviceId, 'voltha_onu_ports_' + \
-            str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
+            statusLines = testCaseUtils.get_fields_from_grep_command(self, onuDeviceId, 'voltha_onu_ports_' +
+                                                                     str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
             assert statusLines, 'No Onu device listed under ports'
             lines = statusLines.splitlines()
             for line in lines:
-                self.__fields = testCaseUtils.parseFields(line)
-                assert self.check_states(onuDeviceId) == True, 'States of %s does match expected ' % onuDeviceId
+                self.__fields = testCaseUtils.parse_fields(line)
+                assert (self.check_states(onuDeviceId) is True), 'States of %s does match expected ' % onuDeviceId
                 portType = self.__fields[3].strip()
                 assert (portType == 'ETHERNET_UNI' or portType == 'PON_ONU'),\
-                'Port type for %s does not match expected ETHERNET_UNI or PON_ONU' % onuDeviceId
+                    'Port type for %s does not match expected ETHERNET_UNI or PON_ONU' % onuDeviceId
                 if portType == 'PON_ONU':
                     self.__peers = self.__fields[7].strip()
                     peerFields = self.__peers.split(',')
                     peerDevice = peerFields[1]
                     deviceFields = peerDevice.split(':')
-                    deviceId = deviceFields[1].replace("'","").replace('u','').rstrip("}]").strip()
+                    deviceId = deviceFields[1].replace("'", "").replace('u', '').rstrip("}]").strip()
                     assert deviceId == self.__oltDeviceId, 'OLT Device %s not found as Peer' % deviceId
                     
-                           
-    def check_states(self, deviceId):
+    def check_states(self, device_id):
         result = True
         adminState = self.__fields[4].strip()
-        assert adminState == 'ENABLED', 'Admin State of %s not ENABLED' % deviceId
-        operStatus = self.__fields[5].strip()
-        assert operStatus == 'ACTIVE', 'Oper Status of %s not ACTIVE' % deviceId
+        assert adminState == 'ENABLED', 'Admin State of %s not ENABLED' % device_id
+        operatorStatus = self.__fields[5].strip()
+        assert operatorStatus == 'ACTIVE', 'Operator Status of %s not ACTIVE' % device_id
         return result
 
     def olt_should_have_at_least_one_flow(self):
@@ -149,8 +149,8 @@
             
     def onu_should_have_at_least_one_flow(self):
         for onuDeviceId in self.__onuDeviceIds:
-            statusLines = testCaseUtils.get_fields_from_grep_command(self, 'Flows', 'voltha_onu_flows_' + \
-            str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
+            statusLines = testCaseUtils.get_fields_from_grep_command(self, 'Flows', 'voltha_onu_flows_' +
+                                                                     str(self.__onuDeviceIds.index(onuDeviceId)) + '.log')
             assert statusLines, 'No Onu flows under device %s' % onuDeviceId
             before, flows, numFlows = statusLines.partition('Flows')
             plainNumber = numFlows.strip().strip('():')
@@ -158,14 +158,14 @@
                 assert int(plainNumber) > 0, 'Zero number of flows for Onu %s' % onuDeviceId
                       
 
-def runTest(logicalDeviceType, oltType, onuType, logDir):
+def run_test(logical_device_type, olt_type, onu_type, log_dir):
     discovery = Discovery()
-    discovery.dSetLogDirs(logDir)
-    discovery.dConfigure(logicalDeviceType, oltType, onuType)
-    discovery.oltDiscovery()
-    discovery.onuDiscovery()
-    discovery.logicalDevice()
-    discovery.olt_ports_should_be_enabled_and_active()                                      
+    discovery.d_set_log_dirs(log_dir)
+    discovery.d_configure(logical_device_type, olt_type, onu_type)
+    discovery.olt_discovery()
+    discovery.onu_discovery()
+    discovery.logical_device()
+    discovery.olt_ports_should_be_enabled_and_active()
     discovery.onu_ports_should_be_enabled_and_active()
     discovery.olt_should_have_at_least_one_flow()
     discovery.onu_should_have_at_least_one_flow()
diff --git a/tests/atests/common/preprovisioning.py b/tests/atests/common/preprovisioning.py
index 81cfd8a..affa991 100755
--- a/tests/atests/common/preprovisioning.py
+++ b/tests/atests/common/preprovisioning.py
@@ -19,11 +19,10 @@
 """
 
 import time
-import os
-import commands
 import testCaseUtils
 import logging
 
+
 class Preprovisioning(object):
 
     """
@@ -31,10 +30,10 @@
     """
     
     def __init__(self):
-        self.dirs = {}
-        self.dirs ['log'] = None
-        self.dirs ['root'] = None
-        self.dirs ['voltha'] = None
+        self.dirs = dict()
+        self.dirs['log'] = None
+        self.dirs['root'] = None
+        self.dirs['voltha'] = None
         
         self.__oltIpAddress = None
         self.__oltPort = None
@@ -43,20 +42,20 @@
         self.__fields = []
         self.__oltDeviceId = None
         
-    def pSetLogDirs(self, logDir):
-        testCaseUtils.configDirs(self, logDir)
+    def p_set_log_dirs(self, log_dir):
+        testCaseUtils.config_dirs(self, log_dir)
 
-    def pConfigure(self, oltIpAddress, oltPort, oltType, onuType):
-        self.__oltIpAddress = oltIpAddress       
-        self.__oltPort = oltPort
-        self.__oltType = oltType
-        self.__onuType = onuType
+    def p_configure(self, olt_ip_address, olt_port, olt_type, onu_type):
+        self.__oltIpAddress = olt_ip_address
+        self.__oltPort = olt_port
+        self.__oltType = olt_type
+        self.__onuType = onu_type
 
-    def preprovisionOlt(self):
+    def preprovision_olt(self):
         logging.info('Do PROVISIONING')
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-            'voltha_preprovision_olt.log', 'preprovision_olt -t ponsim_olt -H %s:%s' %
-            (self.__oltIpAddress, self.__oltPort))
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_preprovision_olt.log', 'preprovision_olt -t ponsim_olt -H %s:%s' %
+                                                 (self.__oltIpAddress, self.__oltPort))
         time.sleep(5)
         
     def status_should_be_success_after_preprovision_command(self):
@@ -64,15 +63,15 @@
         assert statusLines, 'Preprovision Olt command should have returned success but did not'
         
     def query_devices_before_enabling(self):
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'), 
-                    'voltha_devices_before_enable.log', 'devices')
-        testCaseUtils.printLogFile (self, 'voltha_devices_before_enable.log')
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_devices_before_enable.log', 'devices')
+        testCaseUtils.print_log_file(self, 'voltha_devices_before_enable.log')
         time.sleep(5)
         
     def check_olt_fields_before_enabling(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__oltType, 'voltha_devices_before_enable.log')
         assert statusLines, 'No Olt listed under devices'
-        self.__fields = testCaseUtils.parseFields(statusLines)
+        self.__fields = testCaseUtils.parse_fields(statusLines)
         self.__oltDeviceId = self.__fields[1].strip()
         logging.debug("OLT device id = %s" % self.__oltDeviceId)
         adminState = self.__fields[3].strip()
@@ -83,20 +82,20 @@
         assert hostPortFields[0].strip() == self.__oltIpAddress or hostPortFields[1] == str(self.__oltPort), \
             'Olt IP or Port does not match'
            
-    def check_states(self, devType):
+    def check_states(self, dev_type):
         result = True
         adminState = self.__fields[7].strip()
-        assert adminState == 'ENABLED', 'Admin State of %s not ENABLED' % devType
-        operStatus = self.__fields[8].strip()
-        assert operStatus == 'ACTIVE', 'Oper Status of %s not ACTIVE' % devType
+        assert adminState == 'ENABLED', 'Admin State of %s not ENABLED' % dev_type
+        operatorStatus = self.__fields[8].strip()
+        assert operatorStatus == 'ACTIVE', 'Operator Status of %s not ACTIVE' % dev_type
         connectStatus = self.__fields[9].strip()
-        assert connectStatus == 'REACHABLE', 'Connect Status of %s not REACHABLE' % devType
+        assert connectStatus == 'REACHABLE', 'Connect Status of %s not REACHABLE' % dev_type
         return result
 
     def check_olt_fields_after_enabling(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, self.__oltType, 'voltha_devices_after_enable.log')
         assert statusLines, 'No Olt listed under devices'
-        self.__fields = testCaseUtils.parseFields(statusLines)
+        self.__fields = testCaseUtils.parse_fields(statusLines)
         assert self.check_states(self.__oltType), 'States of %s does match expected' % self.__oltType
         hostPort = self.__fields[11].strip()
         assert hostPort, 'hostPort field is empty'
@@ -111,28 +110,29 @@
         lenLines = len(lines)
         assert lenLines == 1, 'Fixed single onu does not match, ONU Count was %d' % lenLines
         for line in lines:
-            self.__fields = testCaseUtils.parseFields(line)
-            assert self.check_states(self.__onuType) == True, 'States of %s does match expected' % self.__onuType
+            self.__fields = testCaseUtils.parse_fields(line)
+            assert (self.check_states(self.__onuType) is True), 'States of %s does match expected' % self.__onuType
         
     def enable(self):
         logging.info('Enable %s OLT device' % self.__oltDeviceId)
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-              'voltha_enable.log', 'enable ' + self.__oltDeviceId)
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_enable.log', 'enable ' + self.__oltDeviceId)
 
     def status_should_be_success_after_enable_command(self):
         statusLines = testCaseUtils.get_fields_from_grep_command(self, 'success', 'voltha_enable.log')
         assert statusLines, 'Enable command should have returned success but did not'
               
     def query_devices_after_enabling(self):
-        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.getDir(self, 'log'),
-              'voltha_devices_after_enable.log', 'devices')
-        testCaseUtils.printLogFile (self, 'voltha_devices_after_enable.log')
+        testCaseUtils.send_command_to_voltha_cli(testCaseUtils.get_dir(self, 'log'),
+                                                 'voltha_devices_after_enable.log', 'devices')
+        testCaseUtils.print_log_file(self, 'voltha_devices_after_enable.log')
 
-def runTest(oltIpAddress, oltPort, oltType, onuType, logDir):
+
+def run_test(olt_ip_address, olt_port, olt_type, onu_type, log_dir):
     preprovisioning = Preprovisioning()
-    preprovisioning.pSetLogDirs(logDir)
-    preprovisioning.pConfigure(oltIpAddress, oltPort, oltType, onuType)
-    preprovisioning.preprovisionOlt()
+    preprovisioning.p_set_log_dirs(log_dir)
+    preprovisioning.p_configure(olt_ip_address, olt_port, olt_type, onu_type)
+    preprovisioning.preprovision_olt()
     preprovisioning.status_should_be_success_after_preprovision_command()
     preprovisioning.query_devices_before_enabling()
     preprovisioning.check_olt_fields_before_enabling()
@@ -141,6 +141,3 @@
     preprovisioning.query_devices_after_enabling()
     preprovisioning.check_olt_fields_after_enabling()
     preprovisioning.check_onu_fields_after_enabling()
-                                          
-                                          
-
diff --git a/tests/atests/common/testCaseUtils.py b/tests/atests/common/testCaseUtils.py
index fe76687..e51199d 100755
--- a/tests/atests/common/testCaseUtils.py
+++ b/tests/atests/common/testCaseUtils.py
@@ -18,69 +18,72 @@
 vOLT-HA Test Case Utils module
 """
 import time
-import os
 import commands
 import subprocess
 import pexpect
 import sys
    
-def configDirs(self, logDir, rootDir = None, volthaDir = None):
-    self.dirs ['log'] = logDir
-    self.dirs ['root'] = rootDir
-    self.dirs ['voltha'] = volthaDir
+
+def config_dirs(self, log_dir, root_dir=None, voltha_dir=None):
+    self.dirs['log'] = log_dir
+    self.dirs['root'] = root_dir
+    self.dirs['voltha'] = voltha_dir
     
-def getDir(self, Dir):
-    return self.dirs.get(Dir)
+
+def get_dir(self, directory):
+    return self.dirs.get(directory)
     
-def removeLeadingLine(logDir, logFile):
-    with open(logDir + '/' + logFile, 'r+') as file:
-        lines = file.readlines()
-        file.seek(0)
+
+def remove_leading_line(log_dir, log_file):
+    with open(log_dir + '/' + log_file, 'r+') as FILE:
+        lines = FILE.readlines()
+        FILE.seek(0)
         lines = lines[1:]
         for line in lines:
-            file.write(line)
-        file.truncate()
-        file.close()      
+            FILE.write(line)
+        FILE.truncate()
+        FILE.close()
 
-def send_command_to_voltha_cli(logDir, logFile1, cmd1, logFile2 = None, cmd2 = None, logFile3 = None, cmd3 = None):
-    output = open(logDir + '/' + logFile1, 'w')
+
+def send_command_to_voltha_cli(log_dir, log_file1, cmd1, log_file2=None, cmd2=None, log_file3=None, cmd3=None):
+    output = open(log_dir + '/' + log_file1, 'w')
     child = pexpect.spawn('ssh -p 30110 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no voltha@localhost')
     child.expect('[pP]assword:')
     child.sendline('admin')
     child.expect('\((\\x1b\[\d*;?\d+m){1,2}voltha(\\x1b\[\d*;?\d+m){1,2}\)')
     time.sleep(10)
-    bytes = child.sendline(cmd1)
+    child.sendline(cmd1)
     i = child.expect(['\((\\x1b\[\d*;?\d+m){1,2}voltha(\\x1b\[\d*;?\d+m){1,2}\)',
-    '\((\\x1b\[\d*;?\d+m){1,2}.*device [0-9a-f]{16}(\\x1b\[\d*;?\d+m){1,2}\)'])
+                     '\((\\x1b\[\d*;?\d+m){1,2}.*device [0-9a-f]{16}(\\x1b\[\d*;?\d+m){1,2}\)'])
     if i == 0:
         output.write(child.before)
         output.close()
-        removeLeadingLine(logDir, logFile1)
+        remove_leading_line(log_dir, log_file1)
     elif i == 1:
-        if logFile2 != None and cmd2 != None:
-            output = open(logDir + '/' + logFile2, 'w')
-            bytes = child.sendline(cmd2)
+        if log_file2 is not None and cmd2 is not None:
+            output = open(log_dir + '/' + log_file2, 'w')
+            child.sendline(cmd2)
             child.expect('\((\\x1b\[\d*;?\d+m){1,2}.*device [0-9a-f]{16}(\\x1b\[\d*;?\d+m){1,2}\)')
             output.write(child.before)
             output.close()
-            removeLeadingLine(logDir, logFile2)
-        if logFile3 != None and cmd3 != None:
-            output = open(logDir + '/' + logFile3, 'w')
-            bytes = child.sendline(cmd3)
+            remove_leading_line(log_dir, log_file2)
+        if log_file3 is not None and cmd3 is not None:
+            output = open(log_dir + '/' + log_file3, 'w')
+            child.sendline(cmd3)
             child.expect('\((\\x1b\[\d*;?\d+m){1,2}.*device [0-9a-f]{16}(\\x1b\[\d*;?\d+m){1,2}\)')
             output.write(child.before)
             output.close()
-            removeLeadingLine(logDir, logFile3)
+            remove_leading_line(log_dir, log_file3)
     child.close()
 
-def send_command_to_onos_cli(logDir, cmd, logFile):
-    output = open(logDir + '/' + logFile, 'w')
+
+def send_command_to_onos_cli(log_dir, cmd, log_file):
+    output = open(log_dir + '/' + log_file, 'w')
     child = pexpect.spawn('ssh -p 30115 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no karaf@localhost')
     child.expect('[pP]assword:')
     child.sendline('karaf')
     child.expect('(\\x1b\[\d*;?\d+m){1,2}onos>(\\x1b\[\d*;?\d+m){1,2}')
-    child.sendline('flows')
-    child.expect('flows')
+    child.sendline(cmd)
     child.expect('(\\x1b\[\d*;?\d+m){1,2}onos>(\\x1b\[\d*;?\d+m){1,2}')
 
     output.write(child.before)
@@ -88,41 +91,46 @@
     output.close()
     child.close()
 
-def get_fields_from_grep_command(self, searchWord, logFile):
+
+def get_fields_from_grep_command(self, search_word, log_file):
     grepCommand =\
-        "grep %s %s/%s" % (searchWord, getDir(self, 'log'), logFile)  
+        "grep %s %s/%s" % (search_word, get_dir(self, 'log'), log_file)
     statusLines = commands.getstatusoutput(grepCommand)[1]
     return statusLines
     
-def parseFields(statusLine):
-    statusList = statusLine.split("|")
+
+def parse_fields(status_line):
+    statusList = status_line.split("|")
     return statusList
 
-def printLogFile(self, logFile):
-    with open(getDir(self, 'log') + '/' + logFile, 'r+') as file:
-        lines = file.readlines()
+
+def print_log_file(self, log_file):
+    with open(get_dir(self, 'log') + '/' + log_file, 'r+') as FILE:
+        lines = FILE.readlines()
         print
         for line in lines:
-            sys.stdout.write (line)
+            sys.stdout.write(line)
 
-def extractPodIpAddr(podName):
+
+def extract_pod_ip_addr(pod_name):
     proc1 = subprocess.Popen(['/usr/bin/kubectl', 'get', 'svc', '--all-namespaces'],
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
-    proc2 = subprocess.Popen(['grep', '-e', podName], stdin=proc1.stdout,
+    proc2 = subprocess.Popen(['grep', '-e', pod_name], stdin=proc1.stdout,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
     proc3 = subprocess.Popen(['awk', "{print $4}"], stdin=proc2.stdout,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
                             
-    proc1.stdout.close
-    proc2.stdout.close
+    proc1.stdout.close()
+    proc2.stdout.close()
     out, err = proc3.communicate()
     return out
     
-def extractRadiusIpAddr(podName):
-    proc1 = subprocess.Popen(['/usr/bin/kubectl', 'describe', 'pod', '-n', 'voltha', podName],
+
+def extract_radius_ip_addr(pod_name):
+    proc1 = subprocess.Popen(['/usr/bin/kubectl', 'describe', 'pod', '-n', 'voltha', pod_name],
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
     proc2 = subprocess.Popen(['grep', '^IP:'], stdin=proc1.stdout,
@@ -131,31 +139,32 @@
     proc3 = subprocess.Popen(['awk', "{print $2}"], stdin=proc2.stdout,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
-                            
-    proc1.stdout.close
-    proc2.stdout.close
+
+    proc1.stdout.close()
+    proc2.stdout.close()
     out, err = proc3.communicate()
     return out
     
-def extractPodName(shortPodName):
+
+def extract_pod_name(short_pod_name):
     proc1 = subprocess.Popen(['/usr/bin/kubectl', 'get', 'pods', '--all-namespaces'],
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
-    proc2 = subprocess.Popen(['grep', '-e', shortPodName], stdin=proc1.stdout,
+    proc2 = subprocess.Popen(['grep', '-e', short_pod_name], stdin=proc1.stdout,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
     proc3 = subprocess.Popen(['awk', "{print $2}"], stdin=proc2.stdout,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
-                      
-                      
-    proc1.stdout.close
-    proc2.stdout.close
+
+    proc1.stdout.close()
+    proc2.stdout.close()
     out, err = proc3.communicate()
     return out
     
-def modifyRadiusIpInJsonUsingSed(self, newIpAddr):
-    sedCommand ="sed -i '/radiusIp/c\  \"radiusIp\":\"'%s'\",' %s/tests/atests/build/aaa_json" % (newIpAddr, getDir(self, 'voltha'))
+
+def modify_radius_ip_in_json_using_sed(self, new_ip_addr):
+    sedCommand = "sed -i '/radiusIp/c\      \"radiusIp\":\"'%s'\",' %s/tests/atests/build/aaa_json" \
+                 % (new_ip_addr, get_dir(self, 'voltha'))
     status = commands.getstatusoutput(sedCommand)[0]
     return status
-
diff --git a/tests/atests/common/volthaMngr.py b/tests/atests/common/volthaMngr.py
index c164989..9b314c2 100755
--- a/tests/atests/common/volthaMngr.py
+++ b/tests/atests/common/volthaMngr.py
@@ -20,48 +20,48 @@
 
 
 import os
-import time
 import subprocess
 import testCaseUtils
 import logging
 
+
 class VolthaMngr(object):
 
     """
     This class implements voltha startup/shutdown callable helper functions
     """
     def __init__(self):
-        self.dirs = {}
-        self.dirs ['root'] = None
-        self.dirs ['voltha'] = None
-        self.dirs ['log'] = None
+        self.dirs = dict()
+        self.dirs['root'] = None
+        self.dirs['voltha'] = None
+        self.dirs['log'] = None
         
-    def vSetLogDirs(self, rootDir, volthaDir, logDir):
-        testCaseUtils.configDirs(self, logDir, rootDir, volthaDir)
+    def v_set_log_dirs(self, root_dir, voltha_dir, log_dir):
+        testCaseUtils.config_dirs(self, log_dir, root_dir, voltha_dir)
         
-    def startAllPods(self):
-        proc1 = subprocess.Popen([testCaseUtils.getDir(self, 'root') + '/build.sh', 'start'],
+    def start_all_pods(self):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'start'],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
         print(output)
-        proc1.stdout.close
+        proc1.stdout.close()
 
-    def stopAllPods(self):
-        proc1 = subprocess.Popen([testCaseUtils.getDir(self, 'root') + '/build.sh', 'stop'],
+    def stop_all_pods(self):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'stop'],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
         print(output)
-        proc1.stdout.close
+        proc1.stdout.close()
         
-    def resetKubeAdm(self):
-        proc1 = subprocess.Popen([testCaseUtils.getDir(self, 'root') + '/build.sh', 'clear'],
+    def reset_kube_adm(self):
+        proc1 = subprocess.Popen([testCaseUtils.get_dir(self, 'root') + '/build.sh', 'clear'],
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE)
         output = proc1.communicate()[0]
         print(output)
-        proc1.stdout.close
+        proc1.stdout.close()
 
     """
     Because we are not deploying SEBA with XOS and NEM, and that a standalone Voltha
@@ -69,63 +69,62 @@
     NetCfg in two fashion.
     One is to add to device list and the other is to add the missing Sadis section
     """        
-    def alterOnosNetCfg(self):
-        logging.info ('Altering the Onos NetCfg to suit Voltha\'s needs')
-        logging.debug ('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/devices/ -d @%s/tests/atests/build/devices_json'
-            % testCaseUtils.getDir(self, 'voltha'))
+    def alter_onos_net_cfg(self):
+        logging.info('Altering the Onos NetCfg to suit Voltha\'s needs')
+        logging.debug('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
+                      'http://localhost:30120/onos/v1/network/configuration/devices/ -d @%s/tests/atests/build/devices_json'
+                      % testCaseUtils.get_dir(self, 'voltha'))
         os.system('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/devices/ -d @%s/tests/atests/build/devices_json'
-            % testCaseUtils.getDir(self, 'voltha'))
-        logging.debug ('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/sadis_json'
-            % testCaseUtils.getDir(self, 'voltha'))
+                  'http://localhost:30120/onos/v1/network/configuration/devices/ -d @%s/tests/atests/build/devices_json'
+                  % testCaseUtils.get_dir(self, 'voltha'))
+        logging.debug('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
+                      'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/sadis_json'
+                      % testCaseUtils.get_dir(self, 'voltha'))
         os.system('curl --user karaf:karaf -X POST -H "Content-Type: application/json" '
-            'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/sadis_json'
-            % testCaseUtils.getDir(self, 'voltha'))
-                    
-    def getAllRunningPods(self):
-        allRunningPods = []
-        proc1 = subprocess.Popen(['/usr/bin/kubectl', 'get', 'pods', '--all-namespaces'],
-                                 stdout=subprocess.PIPE,
-                                 stderr=subprocess.PIPE)
-        proc2 = subprocess.Popen(['grep', '-v', 'NAMESPACE'], stdin=proc1.stdout,
-                                 stdout=subprocess.PIPE,
-                                 stderr=subprocess.PIPE)
-        proc1.stdout.close
-        out, err = proc2.communicate()
-        print(out)
-        if out:
-            for line in out.split('\n'):
-                items = line.split()
-                nsName = {}
-                if len(items) > 2:
-                    nsName = {}
-                    nsName['NS'] = items[0]
-                    nsName['Name'] = items[1]
-                    allRunningPods.append(nsName)
-        return allRunningPods
- 
-    def collectPodLogs(self):
+                  'http://localhost:30120/onos/v1/network/configuration/apps/ -d @%s/tests/atests/build/sadis_json'
+                  % testCaseUtils.get_dir(self, 'voltha'))
+
+    def collect_pod_logs(self):
         logging.info('Collect logs from all Pods')
-        allRunningPods = self.getAllRunningPods()
+        allRunningPods = get_all_running_pods()
         for nsName in allRunningPods:
             Namespace = nsName.get('NS')
-            podName   = nsName.get('Name')
+            podName = nsName.get('Name')
             if 'onos' not in podName:
                 os.system('/usr/bin/kubectl logs -n %s -f %s > %s/%s.log 2>&1 &' %
-                          (Namespace, podName, testCaseUtils.getDir(self, 'log'), podName))
+                          (Namespace, podName, testCaseUtils.get_dir(self, 'log'), podName))
             else:
                 os.system('/usr/bin/kubectl logs -n %s -f %s onos > %s/%s.log 2>&1 &' %
-                          (Namespace, podName, testCaseUtils.getDir(self, 'log'), podName))
+                          (Namespace, podName, testCaseUtils.get_dir(self, 'log'), podName))
 
         
-def voltha_Initialize(rootDir, volthaDir, logDir):
-    voltha = VolthaMngr()
-    voltha.vSetLogDirs(rootDir, volthaDir, logDir)
-    voltha.stopAllPods()
-    voltha.resetKubeAdm()
-    voltha.startAllPods()
-    voltha.alterOnosNetCfg()
-    voltha.collectPodLogs()
+def get_all_running_pods():
+    allRunningPods = []
+    proc1 = subprocess.Popen(['/usr/bin/kubectl', 'get', 'pods', '--all-namespaces'],
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+    proc2 = subprocess.Popen(['grep', '-v', 'NAMESPACE'], stdin=proc1.stdout,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+    proc1.stdout.close()
+    out, err = proc2.communicate()
+    print(out)
+    if out:
+        for line in out.split('\n'):
+            items = line.split()
+            if len(items) > 2:
+                nsName = dict()
+                nsName['NS'] = items[0]
+                nsName['Name'] = items[1]
+                allRunningPods.append(nsName)
+    return allRunningPods
 
+
+def voltha_initialize(root_dir, voltha_dir, log_dir):
+    voltha = VolthaMngr()
+    voltha.v_set_log_dirs(root_dir, voltha_dir, log_dir)
+    voltha.stop_all_pods()
+    voltha.reset_kube_adm()
+    voltha.start_all_pods()
+    voltha.alter_onos_net_cfg()
+    voltha.collect_pod_logs()
