conman: use get-quantenna-interfaces.

Use get-quantenna-interfaces instead of "wifi show" to determine the
Quantenna client interface. Remove now unneeded "wifi show" support for
Quantenna as a step towards the transition to wifi_files.

Change-Id: Ic7bd0e9ec6be7c9a548c659898166fb5a6be2483
diff --git a/conman/connection_manager.py b/conman/connection_manager.py
index cbb3b5b..2ab4763 100755
--- a/conman/connection_manager.py
+++ b/conman/connection_manager.py
@@ -798,11 +798,11 @@
     return ''
 
 
-def _get_quantenna_interface():
+def _get_quantenna_interfaces():
   try:
-    return subprocess.check_output(['get-quantenna-interface']).strip()
+    return subprocess.check_output(['get-quantenna-interfaces']).split()
   except subprocess.CalledProcessError:
-    logging.fatal('Failed to call get-quantenna-interface')
+    logging.fatal('Failed to call get-quantenna-interfaces')
     raise
 
 
@@ -812,6 +812,7 @@
   Returns:
     A dict mapping wireless client interfaces to their supported bands.
   """
+  # TODO(mikemu): Use wifi_files instead of "wifi show".
 
   current_band = None
   result = collections.defaultdict(lambda: collections.defaultdict(set))
@@ -821,10 +822,9 @@
     elif line.startswith('Client Interface:'):
       result[line.split()[2]]['bands'].add(current_band)
 
-  # TODO(rofrankel):  Make 'wifi show' (or wifi_files) include this information
-  # so we don't need a subprocess call to check.
-  quantenna_interface = _get_quantenna_interface()
-  if quantenna_interface in result:
-    result[quantenna_interface]['frenzy'] = True
+  for quantenna_interface in _get_quantenna_interfaces():
+    if quantenna_interface.startswith('wcli'):
+      result[quantenna_interface]['bands'].add('5')
+      result[quantenna_interface]['frenzy'] = True
 
   return result
diff --git a/conman/connection_manager_test.py b/conman/connection_manager_test.py
index d96022e..e651cb1 100755
--- a/conman/connection_manager_test.py
+++ b/conman/connection_manager_test.py
@@ -106,22 +106,12 @@
 
 Band: 5
 RegDomain: 00
-Interface: wlan0  # 5 GHz ap
-AutoChannel: False
-Station List for band: 5
-
-Client Interface: wlan1  # 5 GHz client
 """
 
 WIFI_SHOW_OUTPUT_FRENZY = """Band: 2.4
 RegDomain: 00
 Band: 5
 RegDomain: 00
-Interface: wlan0  # 5 GHz ap
-AutoChannel: False
-Station List for band: 5
-
-Client Interface: wlan0  # 5 GHz client
 """
 
 IW_SCAN_DEFAULT_OUTPUT = """BSS 00:11:22:33:44:55(on wcli0)
@@ -141,14 +131,22 @@
 @wvtest.wvtest
 def get_client_interfaces_test():
   """Test get_client_interfaces."""
+  wifi_show = None
+  quantenna_interfaces = None
+
   # pylint: disable=protected-access
-  original_wifi_show = connection_manager._wifi_show
-  original_get_quantenna_interface = connection_manager._get_quantenna_interface
-  connection_manager._get_quantenna_interface = lambda: ''
-  connection_manager._wifi_show = lambda: WIFI_SHOW_OUTPUT_MARVELL8897
+  old_wifi_show = connection_manager._wifi_show
+  old_get_quantenna_interfaces = connection_manager._get_quantenna_interfaces
+  connection_manager._wifi_show = lambda: wifi_show
+  connection_manager._get_quantenna_interfaces = lambda: quantenna_interfaces
+
+  wifi_show = WIFI_SHOW_OUTPUT_MARVELL8897
+  quantenna_interfaces = []
   wvtest.WVPASSEQ(connection_manager.get_client_interfaces(),
                   {'wcli0': {'bands': set(['2.4', '5'])}})
-  connection_manager._wifi_show = lambda: WIFI_SHOW_OUTPUT_ATH9K_ATH10K
+
+  wifi_show = WIFI_SHOW_OUTPUT_ATH9K_ATH10K
+  quantenna_interfaces = []
   wvtest.WVPASSEQ(connection_manager.get_client_interfaces(), {
       'wcli0': {'bands': set(['2.4'])},
       'wcli1': {'bands': set(['5'])}
@@ -157,21 +155,21 @@
   # Test Quantenna devices.
 
   # 2.4 GHz cfg80211 radio + 5 GHz Frenzy (Optimus Prime).
-  connection_manager._wifi_show = lambda: WIFI_SHOW_OUTPUT_ATH9K_FRENZY
-  connection_manager._get_quantenna_interface = lambda: 'wlan1'
+  wifi_show = WIFI_SHOW_OUTPUT_ATH9K_FRENZY
+  quantenna_interfaces = ['wlan1', 'wlan1_portal', 'wcli1']
   wvtest.WVPASSEQ(connection_manager.get_client_interfaces(), {
       'wcli0': {'bands': set(['2.4'])},
-      'wlan1': {'frenzy': True, 'bands': set(['5'])}
+      'wcli1': {'frenzy': True, 'bands': set(['5'])}
   })
 
   # Only Frenzy (e.g. Lockdown).
-  connection_manager._wifi_show = lambda: WIFI_SHOW_OUTPUT_FRENZY
-  connection_manager._get_quantenna_interface = lambda: 'wlan0'
+  wifi_show = WIFI_SHOW_OUTPUT_FRENZY
+  quantenna_interfaces = ['wlan0', 'wlan0_portal', 'wcli0']
   wvtest.WVPASSEQ(connection_manager.get_client_interfaces(),
-                  {'wlan0': {'frenzy': True, 'bands': set(['5'])}})
+                  {'wcli0': {'frenzy': True, 'bands': set(['5'])}})
 
-  connection_manager._wifi_show = original_wifi_show
-  connection_manager._get_quantenna_interface = original_get_quantenna_interface
+  connection_manager._wifi_show = old_wifi_show
+  connection_manager._get_quantenna_interfaces = old_get_quantenna_interfaces
 
 
 class WLANConfiguration(connection_manager.WLANConfiguration):
@@ -495,7 +493,7 @@
 
 
 def connection_manager_test(radio_config, wlan_configs=None,
-                            quantenna_interface='', **cm_kwargs):
+                            quantenna_interfaces=None, **cm_kwargs):
   """Returns a decorator that does ConnectionManager test boilerplate."""
   if wlan_configs is None:
     wlan_configs = {}
@@ -510,11 +508,12 @@
       wifi_scan_period_s = run_duration_s * wifi_scan_period
 
       # pylint: disable=protected-access
-      original_wifi_show = connection_manager._wifi_show
+      old_wifi_show = connection_manager._wifi_show
       connection_manager._wifi_show = lambda: radio_config
 
-      original_gqi = connection_manager._get_quantenna_interface
-      connection_manager._get_quantenna_interface = lambda: quantenna_interface
+      old_gqi = connection_manager._get_quantenna_interfaces
+      connection_manager._get_quantenna_interfaces = (
+          lambda: quantenna_interfaces or [])
 
       try:
         # No initial state.
@@ -523,7 +522,6 @@
         os.mkdir(os.path.join(tmp_dir, 'interfaces'))
         moca_tmp_dir = tempfile.mkdtemp()
         wpa_control_interface = tempfile.mkdtemp()
-        FrenzyWifi.WPACtrl.WIFIINFO_PATH = tempfile.mkdtemp()
 
         for band, access_point in wlan_configs.iteritems():
           write_wlan_config(config_dir, band, 'initial ssid', 'initial psk')
@@ -551,10 +549,9 @@
         shutil.rmtree(config_dir)
         shutil.rmtree(moca_tmp_dir)
         shutil.rmtree(wpa_control_interface)
-        shutil.rmtree(FrenzyWifi.WPACtrl.WIFIINFO_PATH)
         # pylint: disable=protected-access
-        connection_manager._wifi_show = original_wifi_show
-        connection_manager._get_quantenna_interface = original_gqi
+        connection_manager._wifi_show = old_wifi_show
+        connection_manager._get_quantenna_interfaces = old_gqi
 
     actual_test.func_name = f.func_name
     return actual_test
@@ -853,21 +850,24 @@
 
 @wvtest.wvtest
 @connection_manager_test(WIFI_SHOW_OUTPUT_ATH9K_FRENZY,
-                         quantenna_interface='wlan1')
+                         quantenna_interfaces=['wlan1', 'wlan1_portal', 'wcli1']
+                        )
 def connection_manager_test_generic_ath9k_frenzy_2g(c):
   connection_manager_test_generic(c, '2.4')
 
 
 @wvtest.wvtest
 @connection_manager_test(WIFI_SHOW_OUTPUT_ATH9K_FRENZY,
-                         quantenna_interface='wlan1')
+                         quantenna_interfaces=['wlan1', 'wlan1_portal', 'wcli1']
+                        )
 def connection_manager_test_generic_ath9k_frenzy_5g(c):
   connection_manager_test_generic(c, '5')
 
 
 @wvtest.wvtest
 @connection_manager_test(WIFI_SHOW_OUTPUT_FRENZY,
-                         quantenna_interface='wlan0')
+                         quantenna_interfaces=['wlan0', 'wlan0_portal', 'wcli0']
+                        )
 def connection_manager_test_generic_frenzy_5g(c):
   connection_manager_test_generic(c, '5')
 
@@ -970,7 +970,8 @@
 
 @wvtest.wvtest
 @connection_manager_test(WIFI_SHOW_OUTPUT_ATH9K_FRENZY,
-                         quantenna_interface='wlan1')
+                         quantenna_interfaces=['wlan1', 'wlan1_portal', 'wcli1']
+                        )
 def connection_manager_test_dual_band_two_radios_ath9k_frenzy(c):
   connection_manager_test_dual_band_two_radios(c)
 
diff --git a/wifi/quantenna.py b/wifi/quantenna.py
index 33378ba..de53ba7 100755
--- a/wifi/quantenna.py
+++ b/wifi/quantenna.py
@@ -2,7 +2,6 @@
 
 """Wifi commands for Quantenna using QCSAPI."""
 
-import json
 import os
 import subprocess
 import time
@@ -10,9 +9,6 @@
 import utils
 
 
-WIFIINFO_PATH = '/tmp/wifi/wifiinfo'
-
-
 ALREADY_MEMBER_FMT = ('device %s is already a member of a bridge; '
                       "can't enslave it to bridge %s.")
 NOT_MEMBER_FMT = 'device %s is not a slave of %s'
@@ -44,18 +40,6 @@
                                  stderr=subprocess.STDOUT).strip()
 
 
-def info_parsed(interface):
-  """Fake version of iw.info_parsed."""
-  wifiinfo_filename = os.path.join(WIFIINFO_PATH, interface)
-
-  if not os.path.exists(wifiinfo_filename):
-    return {}
-
-  wifiinfo = json.load(open(wifiinfo_filename))
-  return {'addr' if k == 'BSSID' else k.lower(): v
-          for k, v in wifiinfo.iteritems()}
-
-
 def _set_interface_in_bridge(bridge, interface, want_in_bridge):
   """Add/remove Quantenna interface from/to the bridge."""
   if want_in_bridge:
diff --git a/wifi/quantenna_test.py b/wifi/quantenna_test.py
index ebef2a0..802b7a3 100755
--- a/wifi/quantenna_test.py
+++ b/wifi/quantenna_test.py
@@ -2,11 +2,8 @@
 
 """Tests for quantenna.py."""
 
-import json
 import os
-import shutil
 from subprocess import CalledProcessError
-import tempfile
 
 from configs_test import FakeOptDict
 import quantenna
@@ -214,27 +211,6 @@
 
 
 @wvtest.wvtest
-def info_parsed_test():
-  set_fakes()
-
-  try:
-    quantenna.WIFIINFO_PATH = tempfile.mkdtemp()
-    json.dump({
-        'Channel': '64',
-        'SSID': 'my ssid',
-        'BSSID': '00:00:00:00:00:00',
-    }, open(os.path.join(quantenna.WIFIINFO_PATH, 'wlan0'), 'w'))
-
-    wvtest.WVPASSEQ(quantenna.info_parsed('wlan0'), {
-        'ssid': 'my ssid',
-        'addr': '00:00:00:00:00:00',
-        'channel': '64',
-    })
-  finally:
-    shutil.rmtree(quantenna.WIFIINFO_PATH)
-
-
-@wvtest.wvtest
 def parse_scan_result_test():
   result = '  " ssid with "quotes" " 00:11:22:33:44:55 40 25 0 0 0 0 0 1 40  '
   wvtest.WVPASSEQ(quantenna._parse_scan_result(result),
diff --git a/wifi/wifi.py b/wifi/wifi.py
index 7d0d301..b0ef7f9 100755
--- a/wifi/wifi.py
+++ b/wifi/wifi.py
@@ -459,7 +459,6 @@
     True.
   """
   for band in opt.band.split():
-    frenzy = False
     print('Band: %s' % band)
     for tokens in utils.subprocess_line_tokens(('iw', 'reg', 'get')):
       if len(tokens) >= 2 and tokens[0] == 'country':
@@ -471,20 +470,11 @@
       interface = iw.find_interface_from_band(
           band, interface_type, opt.interface_suffix)
       if interface is None:
-        if band == '5':
-          interface = _get_quantenna_interface()
-          if interface:
-            frenzy = True
-        if not interface:
-          continue
-
+        continue
       print('%sInterface: %s  # %s GHz %s' %
-            (prefix, interface, band, prefix.lower() or 'ap'))
+            (prefix, interface, band, 'client' if 'cli' in interface else 'ap'))
 
-      if frenzy:
-        info_parsed = quantenna.info_parsed(interface)
-      else:
-        info_parsed = iw.info_parsed(interface)
+      info_parsed = iw.info_parsed(interface)
       for k, label in (('channel', 'Channel'),
                        ('ssid', 'SSID'),
                        ('addr', 'BSSID')):
@@ -511,13 +501,6 @@
   return True
 
 
-def _get_quantenna_interface():
-  try:
-    return subprocess.check_output(['get-quantenna-interface']).strip()
-  except subprocess.CalledProcessError as e:
-    utils.log('Failed to call get-quantenna-interface: %s', e)
-
-
 @iw.requires_iw
 def scan_wifi(opt):
   """Prints 'iw scan' results.