| #!/usr/bin/env lucicfg | 
 | # Copyright 2019 The Flutter Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 | """ | 
 | LUCI project configuration for the production instance of LUCI. | 
 |  | 
 | After modifying this file execute it ('./main.star') to regenerate the configs. | 
 |  | 
 | This file uses a Python-like syntax known as Starlark: | 
 | https://docs.bazel.build/versions/master/skylark/language.html | 
 |  | 
 | The documentation for lucicfg can be found here: | 
 | https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md | 
 | """ | 
 |  | 
 | load("//lib/common.star", "common") | 
 | load("//lib/repos.star", "repos") | 
 | load("//cocoon_config.star", "cocoon_config") | 
 | load("//flutter_config.star", "flutter_config") | 
 | load("//recipes_config.star", "recipes_config") | 
 | load("//engine_config.star", "engine_config") | 
 | load("//infra_config.star", "infra_config") | 
 | load("//iostools_config.star", "iostools_config") | 
 | load("//packages_config.star", "packages_config") | 
 |  | 
 | # Avoid jumping back and forth with configs being updated by lower version | 
 | # lucicfg. | 
 | LUCICFG_VERSION = "1.32.1" | 
 | lucicfg.check_version(LUCICFG_VERSION) | 
 |  | 
 | # Use LUCI Scheduler BBv2 names and add Scheduler realms configs. | 
 | lucicfg.enable_experiment("crbug.com/1182002") | 
 |  | 
 | lucicfg.config( | 
 |     config_dir = "generated/flutter", | 
 |     tracked_files = ["**/*"], | 
 |     fail_on_warnings = True, | 
 |     lint_checks = ["default"], | 
 | ) | 
 |  | 
 | luci.project( | 
 |     name = "flutter", | 
 |     config_dir = "luci", | 
 |     buildbucket = "cr-buildbucket.appspot.com", | 
 |     logdog = "luci-logdog.appspot.com", | 
 |     milo = "luci-milo.appspot.com", | 
 |     scheduler = "luci-scheduler.appspot.com", | 
 |     swarming = "chromium-swarm.appspot.com", | 
 |     notify = "luci-notify.appspot.com", | 
 |     acls = [ | 
 |         acl.entry( | 
 |             roles = [ | 
 |                 acl.BUILDBUCKET_READER, | 
 |                 acl.LOGDOG_READER, | 
 |                 acl.PROJECT_CONFIGS_READER, | 
 |                 acl.SCHEDULER_READER, | 
 |             ], | 
 |             groups = "all", | 
 |         ), | 
 |         acl.entry( | 
 |             roles = [ | 
 |                 acl.BUILDBUCKET_TRIGGERER, | 
 |                 acl.SCHEDULER_TRIGGERER, | 
 |             ], | 
 |             groups = [ | 
 |                 "project-flutter-prod-schedulers", | 
 |                 "project-flutter-staging-schedulers", | 
 |             ], | 
 |         ), | 
 |         acl.entry( | 
 |             roles = [ | 
 |                 acl.BUILDBUCKET_OWNER, | 
 |                 acl.SCHEDULER_OWNER, | 
 |             ], | 
 |             groups = "project-flutter-admins", | 
 |         ), | 
 |         acl.entry( | 
 |             acl.LOGDOG_WRITER, | 
 |             groups = "luci-logdog-chromium-writers", | 
 |         ), | 
 |         acl.entry( | 
 |             roles = [ | 
 |                 acl.CQ_COMMITTER, | 
 |                 acl.CQ_DRY_RUNNER, | 
 |                 acl.CQ_NEW_PATCHSET_RUN_TRIGGERER, | 
 |             ], | 
 |             groups = ["project-flutter-try-schedulers"], | 
 |         ), | 
 |     ], | 
 |     bindings = [ | 
 |         luci.binding( | 
 |             roles = "role/configs.validator", | 
 |             groups = [ | 
 |                 "project-flutter-try-task-accounts", | 
 |                 "project-flutter-prod-task-accounts", | 
 |                 "project-flutter-staging-task-accounts", | 
 |             ], | 
 |         ), | 
 |         luci.binding( | 
 |             roles = "role/swarming.poolOwner", | 
 |             groups = "project-flutter-admins", | 
 |         ), | 
 |         luci.binding( | 
 |             roles = "role/swarming.poolViewer", | 
 |             groups = "all",  # public | 
 |         ), | 
 |     ], | 
 | ) | 
 |  | 
 | # Allow admins to use LED and "Debug" button on every builder and bot. | 
 | luci.binding( | 
 |     realm = "@root", | 
 |     roles = "role/swarming.poolUser", | 
 |     groups = "project-flutter-admins", | 
 | ) | 
 | luci.binding( | 
 |     realm = "@root", | 
 |     roles = "role/swarming.taskTriggerer", | 
 |     groups = "project-flutter-admins", | 
 | ) | 
 |  | 
 | # These 4 pool security realms are effectively no-ops, | 
 | # as they inherit ACLs from the @root realm (defined via acls/bindings above). | 
 | # However, they are left here to ensure humans can search & find them, | 
 | # since they are referenced from LUCI's side of configs in `pools.cfg` file. | 
 | luci.realm(name = "pools/prod") | 
 | luci.realm(name = "pools/try") | 
 | luci.realm(name = "pools/staging") | 
 | luci.realm(name = "pools/tests") | 
 |  | 
 | def task_triggerers(*, pool_realm, builder_realms, users = None, groups = None, projects = "flutter"): | 
 |     # Allow submitting tasks to the pool. | 
 |     luci.binding( | 
 |         realm = pool_realm, | 
 |         roles = "role/swarming.poolUser", | 
 |         users = users, | 
 |         groups = groups, | 
 |         projects = projects, | 
 |     ) | 
 |  | 
 |     # Allow associating tasks with a particular builder realm. | 
 |     luci.binding( | 
 |         realm = builder_realms, | 
 |         roles = "role/swarming.taskTriggerer", | 
 |         users = users, | 
 |         groups = groups, | 
 |     ) | 
 |  | 
 |     # Allow to create subbuilds. | 
 |     luci.binding( | 
 |         realm = builder_realms, | 
 |         roles = "role/buildbucket.creator", | 
 |         users = users, | 
 |         groups = groups, | 
 |     ) | 
 |  | 
 | # Permissions for prod builds to trigger subbuilds. | 
 | task_triggerers( | 
 |     pool_realm = "pools/prod", | 
 |     builder_realms = ["prod"], | 
 |     users = ["flutter-prod-builder@chops-service-accounts.iam.gserviceaccount.com"], | 
 |     groups = [ | 
 |         "project-flutter-led-prod-users", | 
 |     ], | 
 |     projects = [ | 
 |         "flutter", | 
 |         "dart", | 
 |     ], | 
 | ) | 
 |  | 
 | # Permissions to run LED jobs with try builds. | 
 | task_triggerers( | 
 |     pool_realm = "pools/try", | 
 |     builder_realms = ["try"], | 
 |     users = ["flutter-try-builder@chops-service-accounts.iam.gserviceaccount.com"], | 
 |     groups = [ | 
 |         "project-flutter-led-users", | 
 |         "project-flutter-try-schedulers", | 
 |     ], | 
 | ) | 
 |  | 
 | # Permissions to run LED jobs with staging builds. | 
 | task_triggerers( | 
 |     pool_realm = "pools/staging", | 
 |     builder_realms = ["staging"], | 
 |     groups = [ | 
 |         "project-flutter-led-users", | 
 |         "project-flutter-staging-schedulers", | 
 |     ], | 
 |     projects = [ | 
 |         "flutter", | 
 |         "dart", | 
 |     ], | 
 | ) | 
 |  | 
 | luci.logdog(gs_bucket = "chromium-luci-logdog") | 
 |  | 
 | luci.milo( | 
 |     logo = | 
 |         "https://storage.googleapis.com/chrome-infra-public/logo/flutter-logo.svg", | 
 |     favicon = "https://storage.googleapis.com/flutter_infra/favicon.ico", | 
 | ) | 
 |  | 
 | luci.bucket( | 
 |     name = "prod", | 
 |     acls = [ | 
 |         acl.entry( | 
 |             acl.BUILDBUCKET_TRIGGERER, | 
 |             groups = "project-flutter-prod-schedulers", | 
 |         ), | 
 |         acl.entry( | 
 |             acl.SCHEDULER_TRIGGERER, | 
 |             groups = "project-flutter-prod-schedulers", | 
 |         ), | 
 |     ], | 
 | ) | 
 |  | 
 | luci.bucket( | 
 |     name = "try", | 
 |     acls = [ | 
 |         acl.entry( | 
 |             acl.BUILDBUCKET_TRIGGERER, | 
 |             groups = | 
 |                 "project-flutter-try-schedulers", | 
 |         ), | 
 |     ], | 
 | ) | 
 |  | 
 | # These shawdow bucket is used to trigger a real Buildbucket build using led | 
 | # go/luci-how-to-led#new-trigger-a-real-buildbucket-build-using-led | 
 |  | 
 | # No need to add constraints as try builds do not persist anything. | 
 | luci.bucket( | 
 |     name = "try.shadow", | 
 |     shadows = "try", | 
 |     constraints = luci.bucket_constraints( | 
 |         pools = ["luci.flutter.try"], | 
 |         service_accounts = ["flutter-try-builder@chops-service-accounts.iam.gserviceaccount.com"], | 
 |     ), | 
 |     bindings = [ | 
 |         # for led permissions. | 
 |         luci.binding( | 
 |             roles = "role/buildbucket.creator", | 
 |             groups = "project-flutter-try-schedulers", | 
 |         ), | 
 |     ], | 
 |     dynamic = True, | 
 | ) | 
 |  | 
 | luci.bucket( | 
 |     name = "prod.shadow", | 
 |     shadows = "prod", | 
 |     constraints = luci.bucket_constraints( | 
 |         pools = ["luci.flutter.prod"], | 
 |         service_accounts = ["flutter-prod-builder@chops-service-accounts.iam.gserviceaccount.com"], | 
 |     ), | 
 |     bindings = [ | 
 |         # for led permissions. | 
 |         luci.binding( | 
 |             roles = "role/buildbucket.creator", | 
 |             groups = "project-flutter-prod-schedulers", | 
 |         ), | 
 |     ], | 
 |     dynamic = True, | 
 | ) | 
 |  | 
 | luci.bucket( | 
 |     name = "staging.shadow", | 
 |     shadows = "staging", | 
 |     constraints = luci.bucket_constraints( | 
 |         pools = ["luci.flutter.staging"], | 
 |         service_accounts = ["flutter-staging-builder@chops-service-accounts.iam.gserviceaccount.com"], | 
 |     ), | 
 |     bindings = [ | 
 |         # for led permissions. | 
 |         luci.binding( | 
 |             roles = "role/buildbucket.creator", | 
 |             groups = "project-flutter-staging-schedulers", | 
 |         ), | 
 |     ], | 
 |     dynamic = True, | 
 | ) | 
 |  | 
 | luci.bucket( | 
 |     name = "staging", | 
 |     acls = [ | 
 |         acl.entry( | 
 |             acl.BUILDBUCKET_TRIGGERER, | 
 |             groups = "project-flutter-staging-schedulers", | 
 |         ), | 
 |     ], | 
 | ) | 
 |  | 
 | # CQ group configurations. Only FLUTTER_RECIPES is using | 
 | # LUCI CQ but we still need the CQ configurations for all | 
 | # the try configurations for led recipe tests. | 
 | luci.cq(gerrit_listener_type = cq.GERRIT_LISTENER_TYPE_LEGACY_POLLER) | 
 |  | 
 | common.cq_group(repos.FLUTTER_INFRA) | 
 |  | 
 | luci.builder.defaults.properties.set({ | 
 |     "$kitchen": { | 
 |         "emulate_gce": True, | 
 |     }, | 
 |     "$flutter/goma": { | 
 |         "server": "rbe-prod1.endpoints.fuchsia-infra-goma-prod.cloud.goog", | 
 |     }, | 
 |     "$flutter/rbe": { | 
 |         "instance": "projects/flutter-rbe-prod/instances/default", | 
 |         "platform": "container-image=docker://gcr.io/cloud-marketplace/google/debian11@sha256:69e2789c9f3d28c6a0f13b25062c240ee7772be1f5e6d41bb4680b63eae6b304", | 
 |     }, | 
 |     "$recipe_engine/isolated": { | 
 |         "server": "https://isolateserver.appspot.com", | 
 |     }, | 
 |     "$recipe_engine/swarming": { | 
 |         "server": "https://chromium-swarm.appspot.com", | 
 |     }, | 
 |     "mastername": "client.flutter", | 
 |     "goma_jobs": "200", | 
 |     "rbe_jobs": "200", | 
 |     "upload_packages": False, | 
 |     "clobber": False, | 
 | }) | 
 |  | 
 | ############################ End Global Defaults ############################ | 
 | cocoon_config.setup() | 
 |  | 
 | # While it doens't make alphabetical sense, temporarily it does | 
 | flutter_config.setup() | 
 |  | 
 | engine_config.setup() | 
 |  | 
 | infra_config.setup() | 
 |  | 
 | iostools_config.setup() | 
 |  | 
 | packages_config.setup() | 
 |  | 
 | recipes_config.setup() | 
 |  | 
 | ######################### Console Definitions ################################# |