Files
docker-android/cli/src/device/geny_saas.py
T
Dave GolombekandGitHub 6e5ed8386a Add Genymotion auth tokens (#512)
As described in #511, Genymotion has deprecated credential based
login. This adds support for passing in an auth token instead.

This could also check for the GENYMOTION_API_TOKEN env variable being
set and skipping the login entirely, but I haven't added that in favor
of keeping the explicit token check during login.

This also updates the default version of the gmsaas package to the
latest release.
2025-06-20 08:42:58 +02:00

81 lines
3.3 KiB
Python

import logging
import os
import subprocess
from src.device import Genymotion, DeviceType
from src.helper import get_env_value_or_raise
from src.constants import ENV, UTF8
class GenySAAS(Genymotion):
def __init__(self) -> None:
super().__init__()
self.logger = logging.getLogger(self.__class__.__name__)
self.device_type = DeviceType.GENY_SAAS.value
self.created_devices = []
def login(self) -> None:
if os.getenv(ENV.GENY_AUTH_TOKEN):
auth_token = get_env_value_or_raise(ENV.GENY_AUTH_TOKEN)
subprocess.check_call(f"gmsaas auth token {auth_token} > /dev/null 2>&1", shell=True)
else:
user = get_env_value_or_raise(ENV.GENY_SAAS_USER)
password = get_env_value_or_raise(ENV.GENY_SAAS_PASS)
subprocess.check_call(f"gmsaas auth login {user} {password} > /dev/null 2>&1", shell=True)
self.logger.info("successfully logged in!")
def create(self) -> None:
super().create()
for item in self.get_data_from_template(ENV.GENY_SAAS_TEMPLATE_FILE_NAME):
name = ""
template = ""
local_port = ""
# implement like this because local_port param is not a must
for k, v in item.items():
if k.lower() == "name":
name = v
elif k.lower() == "template":
template = v
elif k.lower() == "local_port":
local_port = v
else:
self.logger.warning(f"'{k}' is not supported! Please check the documentation!")
if not name:
import uuid
name = str(uuid.uuid4())
if not template:
self.shutdown_and_logout()
raise RuntimeError(f"'template' is a must parameter and not given!")
else:
self.logger.info(f"name: {name}, template: {template}")
creation_cmd = f"gmsaas instances start {template} {name}"
try:
instance_id = subprocess.check_output(creation_cmd.split()).decode(UTF8).replace("\n", "")
created_device = {f"{name}": {instance_id}}
self.created_devices.append(created_device)
additional_args = ""
if local_port:
additional_args = f"--adb-serial-port {local_port}"
connect_cmd = f"gmsaas instances adbconnect {instance_id} {additional_args}"
subprocess.check_call(f"{connect_cmd}", shell=True)
except Exception as e:
self.shutdown_and_logout()
self.logger.error(e)
exit(1)
def shutdown_and_logout(self) -> None:
if bool(self.created_devices):
self.logger.info("Created device(s) will be removed!")
for d in self.created_devices:
for n, i in d.items():
subprocess.check_call(f"gmsaas instances stop {i}", shell=True)
self.logger.info(f"device '{n}' is successfully removed!")
if os.getenv(ENV.GENY_AUTH_TOKEN):
subprocess.check_call("gmsaas auth reset", shell=True)
else:
subprocess.check_call("gmsaas auth logout", shell=True)
self.logger.info("successfully logged out!")