| # |
| # Copyright (C) 2016 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. |
| # |
| |
| import types |
| import threading |
| import re |
| import logging |
| |
| from vts.runners.host import const |
| from vts.testcases.kernel.ltp.shell_environment import shell_commands |
| |
| |
| class ShellEnvironment(object): |
| '''Class for executing environment definition classes and do cleanup jobs. |
| |
| Attributes: |
| shell: shell mirror object, shell to execute commands |
| _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store |
| clean up jobs if requested. |
| _thread_lock: a threading.Lock object |
| ''' |
| |
| def __init__(self, shell): |
| self.shell = shell |
| self._cleanup_jobs = [] |
| self._thread_lock = threading.Lock() |
| |
| def Cleanup(self): |
| '''Final cleanup jobs. Will run all the stored cleanup jobs''' |
| return all([method(*args) for method, args in self._cleanup_jobs]) |
| |
| def AddCleanupJob(self, method, *args): |
| '''Add a clean up job for final cleanup''' |
| if (method, args) not in self._cleanup_jobs: |
| self._cleanup_jobs.append((method, args)) |
| |
| @property |
| def shell(self): |
| '''returns an object that can execute a shell command''' |
| return self._shell |
| |
| @shell.setter |
| def shell(self, shell): |
| self._shell = shell |
| |
| def ExecuteDefinitions(self, definitions): |
| '''Execute a given list of environment check definitions''' |
| self._thread_lock.acquire() |
| if not isinstance(definitions, types.ListType): |
| definitions = [definitions] |
| |
| for definition in definitions: |
| definition.context = self |
| if not definition.Execute(): |
| self._thread_lock.release() |
| return (False, definition.GetNote()) |
| |
| self._thread_lock.release() |
| return (True, "") |
| |
| def GetDeviceNumberOfPresentCpu(self): |
| '''Get the number of available CPUs on target device''' |
| results = self.shell.Execute('cat %s' % |
| shell_commands.FILEPATH_CPU_PRESENT) |
| if (not results or results[const.EXIT_CODE][0] or |
| not results[const.STDOUT][0]): |
| logging.error("Cannot get number of working CPU info." |
| "\n Command results: {}".format(results)) |
| return 1 |
| else: |
| cpu_info = results[const.STDOUT][0].strip() |
| m = re.match("[0-9]+-?[0-9]*", cpu_info) |
| if m and m.span() == (0, len(cpu_info)): |
| logging.info("spam" + str(m.span())) |
| try: |
| return int(cpu_info.split('-')[-1]) + 1 |
| except Exception as e: |
| logging.error(e) |
| |
| logging.error("Cannot parse number of working CPU info." |
| "\n CPU info: '{}'".format(cpu_info)) |
| return 1 |
| |