#!/usr/bin/env python # # Copyright 2017 - The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from metrics.metric import Metric from utils import job from utils import shell class NetworkMetric(Metric): """Determines if test server is connected to network by passed in ip's. The dev servers pinged is determined by the cli arguments. """ DEFAULT_IPS = ['8.8.8.8', '8.8.4.4'] HOSTNAME_COMMAND = 'hostname | cut -d- -f1' PING_COMMAND = 'ping -c 1 -W 1 {}' CONNECTED = 'connected' def __init__(self, ip_list=None, shell=shell.ShellCommand(job)): Metric.__init__(self, shell=shell) self.ip_list = ip_list def get_prefix_hostname(self): """Gets the hostname prefix of the test station. Example, on android-test-server-14, it would return, android Returns: The prefix of the hostname. """ return self._shell.run('hostname | cut -d- -f1').stdout def check_connected(self, ips=None): """Determines if a network connection can be established to a dev server Args: ips: The list of ip's to ping. Returns: A dictionary of ip addresses as keys, and whether they're connected as values. """ if not ips: ips = self.DEFAULT_IPS ip_dict = {} for ip in ips: # -c 1, ping once, -W 1, set timeout 1 second. stat = self._shell.run( self.PING_COMMAND.format(ip), ignore_status=True).exit_status ip_dict[ip] = stat == 0 return ip_dict def gather_metric(self): is_connected = self.check_connected(self.ip_list) return {self.CONNECTED: is_connected}