1*800a58d9SAndroid Build Coastguard Worker#!/usr/bin/env python 2*800a58d9SAndroid Build Coastguard Worker# 3*800a58d9SAndroid Build Coastguard Worker# Copyright 2016 - The Android Open Source Project 4*800a58d9SAndroid Build Coastguard Worker# 5*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*800a58d9SAndroid Build Coastguard Worker# 9*800a58d9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*800a58d9SAndroid Build Coastguard Worker# 11*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*800a58d9SAndroid Build Coastguard Worker# limitations under the License. 16*800a58d9SAndroid Build Coastguard Worker"""This module defines an AVD instance. 17*800a58d9SAndroid Build Coastguard Worker 18*800a58d9SAndroid Build Coastguard WorkerTODO: 19*800a58d9SAndroid Build Coastguard Worker The current implementation only initialize an object 20*800a58d9SAndroid Build Coastguard Worker with IP and instance name. A complete implementation 21*800a58d9SAndroid Build Coastguard Worker will include the following features. 22*800a58d9SAndroid Build Coastguard Worker - Connect 23*800a58d9SAndroid Build Coastguard Worker - Disconnect 24*800a58d9SAndroid Build Coastguard Worker - HasApp 25*800a58d9SAndroid Build Coastguard Worker - InstallApp 26*800a58d9SAndroid Build Coastguard Worker - UninstallApp 27*800a58d9SAndroid Build Coastguard Worker - GrantAppPermission 28*800a58d9SAndroid Build Coastguard Worker Merge cloud/android/platform/devinfra/caci/framework/app_manager.py 29*800a58d9SAndroid Build Coastguard Worker with this module and updated any callers. 30*800a58d9SAndroid Build Coastguard Worker""" 31*800a58d9SAndroid Build Coastguard Worker 32*800a58d9SAndroid Build Coastguard Workerimport logging 33*800a58d9SAndroid Build Coastguard Worker 34*800a58d9SAndroid Build Coastguard Worker 35*800a58d9SAndroid Build Coastguard Workerlogger = logging.getLogger(__name__) 36*800a58d9SAndroid Build Coastguard Worker 37*800a58d9SAndroid Build Coastguard Worker 38*800a58d9SAndroid Build Coastguard Workerclass AndroidVirtualDevice(): 39*800a58d9SAndroid Build Coastguard Worker """Represent an Android device.""" 40*800a58d9SAndroid Build Coastguard Worker 41*800a58d9SAndroid Build Coastguard Worker def __init__(self, instance_name, ip=None, time_info=None, stage=None, 42*800a58d9SAndroid Build Coastguard Worker openwrt=None, gce_hostname=None): 43*800a58d9SAndroid Build Coastguard Worker """Initialize. 44*800a58d9SAndroid Build Coastguard Worker 45*800a58d9SAndroid Build Coastguard Worker Args: 46*800a58d9SAndroid Build Coastguard Worker instance_name: Name of the gce instance, e.g. "instance-1" 47*800a58d9SAndroid Build Coastguard Worker ip: namedtuple (internal, external) that holds IP address of the 48*800a58d9SAndroid Build Coastguard Worker gce instance, e.g. "external:140.110.20.1, internal:10.0.0.1" 49*800a58d9SAndroid Build Coastguard Worker time_info: Dict of time cost information, e.g. {"launch_cvd": 5} 50*800a58d9SAndroid Build Coastguard Worker stage: Integer of AVD in which stage, e.g. STAGE_GCE, STAGE_BOOT_UP 51*800a58d9SAndroid Build Coastguard Worker openwrt: Boolean of the instance creates the OpenWrt device. 52*800a58d9SAndroid Build Coastguard Worker gce_hostname: String of the GCE hostname. 53*800a58d9SAndroid Build Coastguard Worker """ 54*800a58d9SAndroid Build Coastguard Worker self._ip = ip 55*800a58d9SAndroid Build Coastguard Worker self._instance_name = instance_name 56*800a58d9SAndroid Build Coastguard Worker 57*800a58d9SAndroid Build Coastguard Worker # Time info that the AVD device is created with. It will be assigned 58*800a58d9SAndroid Build Coastguard Worker # by the inherited AndroidVirtualDevice. For example: 59*800a58d9SAndroid Build Coastguard Worker # {"artifact": "100", 60*800a58d9SAndroid Build Coastguard Worker # "launch_cvd": "120"} 61*800a58d9SAndroid Build Coastguard Worker self._time_info = time_info 62*800a58d9SAndroid Build Coastguard Worker 63*800a58d9SAndroid Build Coastguard Worker # Build info that the AVD device is created with. It will be assigned 64*800a58d9SAndroid Build Coastguard Worker # by the inherited AndroidVirtualDevice. For example: 65*800a58d9SAndroid Build Coastguard Worker # {"branch": "git_master-release", 66*800a58d9SAndroid Build Coastguard Worker # "build_id": "5325535", 67*800a58d9SAndroid Build Coastguard Worker # "build_target": "cf_x86_phone-userdebug", 68*800a58d9SAndroid Build Coastguard Worker # "gcs_bucket_build_id": "AAAA.190220.001-5325535"} 69*800a58d9SAndroid Build Coastguard Worker # It can alo have mixed builds' info. For example: 70*800a58d9SAndroid Build Coastguard Worker # {"branch": "git_master-release", 71*800a58d9SAndroid Build Coastguard Worker # "build_id": "5325535", 72*800a58d9SAndroid Build Coastguard Worker # "build_target": "cf_x86_phone-userdebug", 73*800a58d9SAndroid Build Coastguard Worker # "gcs_bucket_build_id": "AAAA.190220.001-5325535", 74*800a58d9SAndroid Build Coastguard Worker # "system_branch": "git_master", 75*800a58d9SAndroid Build Coastguard Worker # "system_build_id": "12345", 76*800a58d9SAndroid Build Coastguard Worker # "system_build_target": "cf_x86_phone-userdebug", 77*800a58d9SAndroid Build Coastguard Worker # "system_gcs_bucket_build_id": "12345"} 78*800a58d9SAndroid Build Coastguard Worker self._build_info = {} 79*800a58d9SAndroid Build Coastguard Worker self._stage = stage 80*800a58d9SAndroid Build Coastguard Worker self._openwrt = openwrt 81*800a58d9SAndroid Build Coastguard Worker self._gce_hostname = gce_hostname 82*800a58d9SAndroid Build Coastguard Worker 83*800a58d9SAndroid Build Coastguard Worker @property 84*800a58d9SAndroid Build Coastguard Worker def ip(self): 85*800a58d9SAndroid Build Coastguard Worker """Getter of _ip.""" 86*800a58d9SAndroid Build Coastguard Worker if not self._ip: 87*800a58d9SAndroid Build Coastguard Worker raise ValueError( 88*800a58d9SAndroid Build Coastguard Worker "IP of instance %s is unknown yet." % self._instance_name) 89*800a58d9SAndroid Build Coastguard Worker return self._ip 90*800a58d9SAndroid Build Coastguard Worker 91*800a58d9SAndroid Build Coastguard Worker @ip.setter 92*800a58d9SAndroid Build Coastguard Worker def ip(self, value): 93*800a58d9SAndroid Build Coastguard Worker self._ip = value 94*800a58d9SAndroid Build Coastguard Worker 95*800a58d9SAndroid Build Coastguard Worker @property 96*800a58d9SAndroid Build Coastguard Worker def instance_name(self): 97*800a58d9SAndroid Build Coastguard Worker """Getter of _instance_name.""" 98*800a58d9SAndroid Build Coastguard Worker return self._instance_name 99*800a58d9SAndroid Build Coastguard Worker 100*800a58d9SAndroid Build Coastguard Worker @property 101*800a58d9SAndroid Build Coastguard Worker def build_info(self): 102*800a58d9SAndroid Build Coastguard Worker """Getter of _build_info.""" 103*800a58d9SAndroid Build Coastguard Worker return self._build_info 104*800a58d9SAndroid Build Coastguard Worker 105*800a58d9SAndroid Build Coastguard Worker @property 106*800a58d9SAndroid Build Coastguard Worker def time_info(self): 107*800a58d9SAndroid Build Coastguard Worker """Getter of _time_info.""" 108*800a58d9SAndroid Build Coastguard Worker return self._time_info 109*800a58d9SAndroid Build Coastguard Worker 110*800a58d9SAndroid Build Coastguard Worker @property 111*800a58d9SAndroid Build Coastguard Worker def stage(self): 112*800a58d9SAndroid Build Coastguard Worker """Getter of _stage.""" 113*800a58d9SAndroid Build Coastguard Worker return self._stage 114*800a58d9SAndroid Build Coastguard Worker 115*800a58d9SAndroid Build Coastguard Worker @property 116*800a58d9SAndroid Build Coastguard Worker def openwrt(self): 117*800a58d9SAndroid Build Coastguard Worker """Getter of _openwrt.""" 118*800a58d9SAndroid Build Coastguard Worker return self._openwrt 119*800a58d9SAndroid Build Coastguard Worker 120*800a58d9SAndroid Build Coastguard Worker @property 121*800a58d9SAndroid Build Coastguard Worker def gce_hostname(self): 122*800a58d9SAndroid Build Coastguard Worker """Getter of _gce_hostname.""" 123*800a58d9SAndroid Build Coastguard Worker return self._gce_hostname 124*800a58d9SAndroid Build Coastguard Worker 125*800a58d9SAndroid Build Coastguard Worker @build_info.setter 126*800a58d9SAndroid Build Coastguard Worker def build_info(self, value): 127*800a58d9SAndroid Build Coastguard Worker self._build_info = value 128*800a58d9SAndroid Build Coastguard Worker 129*800a58d9SAndroid Build Coastguard Worker def __str__(self): 130*800a58d9SAndroid Build Coastguard Worker """Return a string representation.""" 131*800a58d9SAndroid Build Coastguard Worker return "<ip: (internal: %s, external: %s), instance_name: %s >" % ( 132*800a58d9SAndroid Build Coastguard Worker self._ip.internal if self._ip else "", 133*800a58d9SAndroid Build Coastguard Worker self._ip.external if self._ip else "", 134*800a58d9SAndroid Build Coastguard Worker self._instance_name) 135