blob: b3fe21403d704d018ec9247dae8ff08920779a7a [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2019 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.
"""Android operations."""
from __future__ import print_function
import os
from chromite.api import faux
from chromite.api import validate
from chromite.api.controller import controller_util
from chromite.api.gen.chromite.api import android_pb2
from chromite.lib import constants
from chromite.lib import osutils
from chromite.lib.parser import package_info
from chromite.service import packages
ANDROIDPIN_MASK_PATH = os.path.join(constants.SOURCE_ROOT,
constants.CHROMIUMOS_OVERLAY_DIR,
'profiles', 'default', 'linux',
'package.mask', 'androidpin')
def _MarkStableResponse(_input_proto, output_proto, _config):
"""Add fake status to a successful response."""
output_proto.android_atom.category = 'category'
output_proto.android_atom.package_name = 'android-package-name'
output_proto.android_atom.version = '1.2'
output_proto.status = android_pb2.MARK_STABLE_STATUS_SUCCESS
@faux.success(_MarkStableResponse)
@faux.empty_error
@validate.require('package_name', 'android_build_branch')
@validate.validation_complete
def MarkStable(input_proto, output_proto, _config):
"""Uprev Android, if able.
Uprev Android, verify that the newly uprevved package can be emerged, and
return the new package info.
See AndroidService documentation in api/proto/android.proto.
Args:
input_proto (MarkStableRequest): The input proto.
output_proto (MarkStableResponse): The output proto.
_config (api_config.ApiConfig): The call config.
"""
chroot = controller_util.ParseChroot(input_proto.chroot)
build_targets = controller_util.ParseBuildTargets(input_proto.build_targets)
tracking_branch = input_proto.tracking_branch
package_name = input_proto.package_name
android_build_branch = input_proto.android_build_branch
android_version = input_proto.android_version
# Assume success.
output_proto.status = android_pb2.MARK_STABLE_STATUS_SUCCESS
# TODO(crbug/904939): This should move to service/android.py and the port
# should be finished.
try:
android_atom_to_build = packages.uprev_android(
tracking_branch=tracking_branch,
android_package=package_name,
android_build_branch=android_build_branch,
chroot=chroot,
build_targets=build_targets,
android_version=android_version)
except packages.AndroidIsPinnedUprevError as e:
# If the uprev failed due to a pin, CI needs to unpin and retry.
android_atom_to_build = e.new_android_atom
output_proto.status = android_pb2.MARK_STABLE_STATUS_PINNED
if android_atom_to_build:
pkg = package_info.parse(android_atom_to_build)
controller_util.serialize_package_info(pkg, output_proto.android_atom)
else:
output_proto.status = android_pb2.MARK_STABLE_STATUS_EARLY_EXIT
# We don't use @faux.success for UnpinVersion because output_proto is unused.
@faux.all_empty
@validate.validation_complete
def UnpinVersion(_input_proto, _output_proto, _config):
"""Unpin the Android version.
See AndroidService documentation in api/proto/android.proto.
Args:
_input_proto (UnpinVersionRequest): The input proto. (not used.)
_output_proto (UnpinVersionResponse): The output proto. (not used.)
_config (api_config.ApiConfig): The call config.
"""
osutils.SafeUnlink(ANDROIDPIN_MASK_PATH)