Index: server/site_wifitest.py |
diff --git a/server/site_wifitest.py b/server/site_wifitest.py |
index 16c72a0846bd4796bbe8bced142febd2859f2108..d2a771ecd9cdea9611f0ba784cb7321a322942aa 100644 |
--- a/server/site_wifitest.py |
+++ b/server/site_wifitest.py |
@@ -1,4 +1,4 @@ |
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
+# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
@@ -7,6 +7,7 @@ import common, datetime, fnmatch, logging, os, re, string, threading, time |
from autotest_lib.server import autotest, hosts, subcommand |
from autotest_lib.server import site_bsd_router |
from autotest_lib.server import site_linux_router |
+from autotest_lib.server import site_linux_server |
from autotest_lib.server import site_host_attributes |
from autotest_lib.server import site_eap_certs |
from autotest_lib.server import test |
@@ -54,6 +55,9 @@ class WiFiTest(object): |
server_iperf run iperf on the server to the client |
client_netperf run netperf on the client to the server |
server_netperf run netperf on the server to the client |
+ vpn_client_load_tunnel load 'tun' device for VPN client |
+ vpn_client_config launch a VPN client to connect with the |
+ VPN server |
Steps that are done on the client or server machine are implemented in |
this class. Steps that are done on the wifi router are implemented in |
@@ -72,11 +76,20 @@ class WiFiTest(object): |
self.steps = steps |
self.perf_keyvals = {} |
- self.cur_frequency = None; |
- self.cur_phymode = None; |
- self.cur_security = None; |
+ self.cur_frequency = None |
+ self.cur_phymode = None |
+ self.cur_security = None |
+ self.vpn_kind = None |
router = config['router'] |
+ # |
+ # The server machine may be multi-homed or only on the wifi |
+ # network. When only on the wifi net we suppress server_* |
+ # requests since we cannot initiate them from the control machine. |
+ # |
+ server = config['server'] |
+ # NB: server may not be reachable on the control network |
+ |
self.router = hosts.create_host(router['addr']) |
# NB: truncate SSID to 32 characters |
self.defssid = self.__get_defssid(router['addr'])[0:32] |
@@ -116,13 +129,6 @@ class WiFiTest(object): |
self.client_wifi_device_path = None # client's flimflam wifi path |
self.client_installed_scripts = {} |
- # |
- # The server machine may be multi-homed or only on the wifi |
- # network. When only on the wifi net we suppress server_* |
- # requests since we cannot initiate them from the control machine. |
- # |
- server = config['server'] |
- # NB: server may not be reachable on the control network |
if 'addr' in server: |
self.server = hosts.create_host(server['addr']) |
self.server_at = autotest.Autotest(self.server) |
@@ -134,6 +140,10 @@ class WiFiTest(object): |
# NB: wifi address must be set if not reachable from control |
self.server_wifi_ip = server['wifi_addr'] |
+ # hosting_server is a machine which hosts network services, |
+ # such as VPN. |
+ self.hosting_server = site_linux_server.LinuxServer(self.server, server) |
+ |
# potential bg thread for ping untilstop |
self.ping_thread = None |
@@ -276,6 +286,8 @@ class WiFiTest(object): |
func = getattr(self, method, None) |
if func is None: |
func = getattr(self.wifi, method, None) |
+ if func is None: |
+ func = getattr(self.hosting_server, method, None) |
if func is not None: |
try: |
func(params) |
@@ -373,8 +385,11 @@ class WiFiTest(object): |
system = self.router |
elif systemname == 'client': |
system = self.client |
+ elif systemname == 'server': |
+ system = self.server |
else: |
- raise error.TestFail('install_files: Must specify router or client') |
+ raise error.TestFail('install_files: Must specify router, ' |
+ 'server or client') |
for name,contents in params.get('files', {}).iteritems(): |
self.insert_file(system, name, contents) |
@@ -1081,7 +1096,7 @@ class WiFiTest(object): |
def restart_supplicant(self, params): |
""" Restart wpa_supplicant. Cert params are unfortunately "sticky". """ |
- self.client.run("stop wpasupplicant; start wpasupplicant"); |
+ self.client.run("stop wpasupplicant; start wpasupplicant") |
def __list_profile(self): |
ret = [] |
@@ -1171,6 +1186,69 @@ class WiFiTest(object): |
system.run('date -u %s' % |
datetime.datetime.utcnow().strftime(datefmt)) |
+ def vpn_client_load_tunnel(self, params): |
+ """ Load the 'tun' device. |
+ |
+ Necessary when the VPN Server is configured with 'dev tun'. |
+ """ |
+ result = self.client.run('modprobe tun') # When server using tunnel. |
+ |
+ def vpn_client_config(self, params): |
+ """ Configure & launch the VPN client. |
+ |
+ Parameters: |
+ |
+ 'kind' : required |
+ Indicates the kind of VPN which is to be used. |
+ Valid values are: |
+ |
+ openvpn |
+ |
+ 'vpn-host-ip': optional |
+ Specifies the IP of the VPN server. If not provided, |
+ defaults to 'self.server_wifi_ip' |
+ |
+ 'files' : required |
+ A dict which contains a set of file names. |
+ |
+ 'ca-certificate' : path to CA certificate file |
+ 'client-certificate' : path to client certificate file |
+ 'client-key' : path to client key file |
+ """ |
+ self.vpn_client_kill({}) # Must be first. Relies on self.vpn_kind. |
+ self.vpn_kind = params.get('kind', None) |
+ vpn_host_ip = params.get('vpn-host-ip', self.server_wifi_ip) |
+ |
+ # Must get 'ca_certificate', 'client-certificate' and 'client-key'. |
+ cert_pathnames = params.get('files', {}) |
+ |
+ if self.vpn_kind is None: |
+ raise error.TestFail('No VPN kind specified for this test.') |
+ elif self.vpn_kind == 'openvpn': |
+ # connect-vpn openvpn <name> <host> <domain> <cafile> <certfile> |
+ result = self.client.run('%s/test/connect-vpn openvpn ' |
+ 'vpn-name %s vpn-domain ' |
+ '%s ' # ca certificate |
+ '%s ' # client certificate |
+ '%s' % # client key |
+ (self.client_cmd_flimflam_lib, |
+ vpn_host_ip, |
+ cert_pathnames['ca-certificate'], |
+ cert_pathnames['client-certificate'], |
+ cert_pathnames['client-key'])) |
+ else: |
+ raise error.TestFail('(internal error): No launch case ' |
+ 'for VPN kind (%s)' % self.vpn_kind) |
+ |
+ def vpn_client_kill(self, params): |
+ """ Kill the VPN client if it's running. """ |
+ if self.vpn_kind is not None: |
+ if self.vpn_kind == 'openvpn': |
+ self.server.run("pkill openvpn") |
+ else: |
+ raise error.TestFail('(internal error): No kill case ' |
+ 'for VPN kind (%s)' % self.vpn_kind) |
+ self.vpn_kind = None |
class HelperThread(threading.Thread): |
# Class that wraps a ping command in a thread so it can run in the bg. |