Di Qian | 38c02a7 | 2019-11-18 19:14:07 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2019 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | package com.android.tradefed.cluster; |
| 17 | |
| 18 | import com.android.tradefed.config.GlobalConfiguration; |
| 19 | import com.android.tradefed.config.IConfiguration; |
| 20 | import com.android.tradefed.config.Option; |
| 21 | import com.android.tradefed.config.OptionClass; |
| 22 | import com.android.tradefed.util.MultiMap; |
| 23 | |
| 24 | import com.google.common.annotations.VisibleForTesting; |
| 25 | |
| 26 | import java.io.File; |
| 27 | import java.util.ArrayList; |
| 28 | import java.util.HashMap; |
| 29 | import java.util.List; |
| 30 | import java.util.Map; |
| 31 | |
| 32 | /* |
| 33 | * A {@link IClusterOptions} implementation which contains cluster-related options. |
| 34 | */ |
| 35 | @OptionClass(alias = "cluster", global_namespace = false) |
| 36 | public class ClusterOptions implements IClusterOptions { |
| 37 | |
| 38 | /** |
| 39 | * The unique configuration object type name. Used to retrieve the singleton instance from the |
| 40 | * {@link GlobalConfiguration}. |
| 41 | * |
| 42 | * @see IConfiguration#getConfigurationObject(String) |
| 43 | */ |
| 44 | public static final String TYPE_NAME = "cluster_options"; |
| 45 | |
| 46 | @Option(name = "service-url", description = "the base url of the tradefed cluster REST API") |
| 47 | public String mServiceUrl = null; |
| 48 | |
| 49 | // TODO: The "service-account-keyfile" option should be HostOption (AOSP HostOptions.java). |
| 50 | @Option( |
| 51 | name = "service-account-keyfile", |
| 52 | description = |
| 53 | "The service account json key file. " |
| 54 | + "This is used by tradefed test scheduler (e.g. Tradefed Cluster) to " |
| 55 | + "authenticate the tradefed host. " |
| 56 | + "See google doc for the definition and how service account key works. " |
| 57 | + "https://cloud.google.com/iam/docs/service-accounts ") |
| 58 | private File mSchedulerServiceAccountKeyfile = null; |
| 59 | |
| 60 | @Option(name = "cluster", description = "the cluster id for this TF instance", mandatory = true) |
| 61 | public String mClusterId = null; |
| 62 | |
| 63 | @Option( |
| 64 | name = "next-cluster", |
| 65 | description = |
| 66 | "seconadary clusters for this TF instance to run commands from. If " |
| 67 | + "this option is set, TF will try to lease commands from these clusters in " |
| 68 | + "the order they are specified if it still has available devices after " |
| 69 | + "leasing commands from the primary cluster.") |
| 70 | public List<String> mNextClusterIds = new ArrayList<>(); |
| 71 | |
| 72 | @Option(name = "run-target-format", description = "the format for labelling run targets.") |
| 73 | private String mRunTargetFormat = null; |
| 74 | |
| 75 | @Option(name = "disable-device-monitor", description = "disable Cluster device reporting") |
| 76 | private boolean mIsDeviceMonitorDisabled = false; |
| 77 | |
| 78 | @Option( |
| 79 | name = "device-monitor-interval", |
| 80 | isTimeVal = true, |
| 81 | description = "the time interval between each device snapshot") |
| 82 | private long mDeviceMonitorSnapshotInterval = 60 * 1000; |
| 83 | |
| 84 | @Option( |
| 85 | name = "device-group", |
| 86 | description = |
| 87 | "A multi-map from device group to device serials." |
| 88 | + " The key is a device group name and value is device serial.") |
| 89 | private MultiMap<String, String> mDeviceGroup = new MultiMap<String, String>(); |
| 90 | |
| 91 | @Option( |
| 92 | name = "device-tag", |
| 93 | description = |
| 94 | "A map for tagging device serials; each device may " |
| 95 | + "have one tag. This can be used for reporting in run-target") |
| 96 | private Map<String, String> mDeviceTag = new HashMap<>(); |
| 97 | |
| 98 | @Option( |
| 99 | name = "check-flashing-permits-on-lease", |
| 100 | description = "Check available flashing permits when leasing tasks") |
| 101 | private boolean mCheckFlashingPermitsOnLease = true; |
| 102 | |
| 103 | @Option( |
| 104 | name = "invocation-heartbeat-interval", |
| 105 | isTimeVal = true, |
| 106 | description = "The time interval between invocation heartbeats") |
| 107 | private long mInvocationHeartbeatInterval = 5 * 60 * 1000; |
| 108 | |
| 109 | @Option(name = "upload-invocation-status", description = "Upload invocation status to TFC") |
| 110 | private Boolean mShouldUploadInvocationStatus = false; |
| 111 | |
| 112 | @Option( |
| 113 | name = "check-command-state", |
| 114 | description = "Check cluster command state to detect canceled invocations") |
| 115 | private boolean mCheckCommandState = false; |
| 116 | |
| 117 | @Option(name = "connect-timeout", description = "HTTP connect timeout.", isTimeVal = true) |
| 118 | private int mConnectTimeout = 60000; |
| 119 | |
| 120 | @Option(name = "read-timeout", description = "HTTP read timeout.", isTimeVal = true) |
| 121 | private int mReadTimeout = 60000; |
| 122 | |
Xing Dai | 81f6f9f | 2019-12-03 14:01:32 -0800 | [diff] [blame] | 123 | @Option(name = "label", description = "Labels to describe the host.") |
| 124 | private List<String> mLabels = new ArrayList<>(); |
| 125 | |
| 126 | @Option(name = "lab-name", description = "The name of the lab the host belong to.") |
| 127 | private String mLabName; |
| 128 | |
Yichun Li | b935e79 | 2020-02-10 18:31:48 -0800 | [diff] [blame] | 129 | @Option( |
| 130 | name = "collect-early-test-summary", |
| 131 | description = "Collect early test summary from ITestSummaryListener to scheduler.") |
| 132 | private boolean mCollectEarlyTestSummary = false; |
| 133 | |
Di Qian | 38c02a7 | 2019-11-18 19:14:07 -0800 | [diff] [blame] | 134 | /** {@inheritDoc} */ |
| 135 | @Override |
| 136 | public String getServiceUrl() { |
| 137 | return mServiceUrl; |
| 138 | } |
| 139 | |
| 140 | /** {@inheritDoc} */ |
| 141 | @Override |
| 142 | public String getClusterId() { |
| 143 | return mClusterId; |
| 144 | } |
| 145 | |
| 146 | /** {@inheritDoc} */ |
| 147 | @Override |
| 148 | public List<String> getNextClusterIds() { |
| 149 | return mNextClusterIds; |
| 150 | } |
| 151 | |
| 152 | /** {@inheritDoc} */ |
| 153 | @Override |
| 154 | public MultiMap<String, String> getDeviceGroup() { |
| 155 | return mDeviceGroup; |
| 156 | } |
| 157 | |
| 158 | /** {@inheritDoc} */ |
| 159 | @Override |
| 160 | public Map<String, String> getDeviceTag() { |
| 161 | return mDeviceTag; |
| 162 | } |
| 163 | |
| 164 | /** {@inheritDoc} */ |
| 165 | @Override |
| 166 | public boolean checkFlashingPermitsOnLease() { |
| 167 | return mCheckFlashingPermitsOnLease; |
| 168 | } |
| 169 | |
| 170 | /** {@inheritDoc} */ |
| 171 | @Override |
| 172 | public String getRunTargetFormat() { |
| 173 | return mRunTargetFormat; |
| 174 | } |
| 175 | |
| 176 | /** {@inheritDoc} */ |
| 177 | @Override |
| 178 | public boolean isDeviceMonitorDisabled() { |
| 179 | return mIsDeviceMonitorDisabled; |
| 180 | } |
| 181 | |
| 182 | /** {@inheritDoc} */ |
| 183 | @Override |
| 184 | public long getDeviceMonitorSnapshotInterval() { |
| 185 | return mDeviceMonitorSnapshotInterval; |
| 186 | } |
| 187 | |
| 188 | /** |
| 189 | * Set the base url of the tradefed cluster REST API. |
| 190 | * |
| 191 | * <p>Exposed for testing. |
| 192 | */ |
| 193 | void setServiceUrl(String url) { |
| 194 | mServiceUrl = url; |
| 195 | } |
| 196 | |
| 197 | /** |
| 198 | * Set the cluster id for this TF instance. |
| 199 | * |
| 200 | * <p>Exposed for testing. |
| 201 | */ |
| 202 | void setClusterId(String id) { |
| 203 | mClusterId = id; |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * Set the format for labelling run targets. |
| 208 | * |
| 209 | * <p>Exposed for testing. |
| 210 | */ |
| 211 | void setRunTargetFormat(String format) { |
| 212 | mRunTargetFormat = format; |
| 213 | } |
| 214 | |
| 215 | /** |
| 216 | * Set whether Cluster device reporting is disabled. |
| 217 | * |
| 218 | * <p>Exposed for testing. |
| 219 | */ |
| 220 | void setDeviceMonitorDisabled(boolean disabled) { |
| 221 | mIsDeviceMonitorDisabled = disabled; |
| 222 | } |
| 223 | |
| 224 | /** |
| 225 | * Set the time interval between each device snapshot in ms. |
| 226 | * |
| 227 | * <p>Exposed for testing. |
| 228 | */ |
| 229 | void setDeviceMonitorSnapshotInterval(long interval) { |
| 230 | mDeviceMonitorSnapshotInterval = interval; |
| 231 | } |
| 232 | |
| 233 | /** |
| 234 | * Set whether the scheduler should check if there are available flashing permits. |
| 235 | * |
| 236 | * <p>Exposed for testing. |
| 237 | */ |
| 238 | void setCheckFlashingPermitsLease(boolean checkFlashingPermitsLease) { |
| 239 | mCheckFlashingPermitsOnLease = checkFlashingPermitsLease; |
| 240 | } |
| 241 | |
Yichun Li | b935e79 | 2020-02-10 18:31:48 -0800 | [diff] [blame] | 242 | /** |
| 243 | * Set whether the scheduler should collect early test summary. |
| 244 | * |
| 245 | * <p>Exposed for testing. |
| 246 | */ |
| 247 | void setCollectEarlyTestSummary(boolean collectEarlyTestSummary) { |
| 248 | mCollectEarlyTestSummary = collectEarlyTestSummary; |
| 249 | } |
| 250 | |
Di Qian | 38c02a7 | 2019-11-18 19:14:07 -0800 | [diff] [blame] | 251 | /** {@inheritDoc} */ |
| 252 | @Override |
| 253 | public long getInvocationHeartbeatInterval() { |
| 254 | return mInvocationHeartbeatInterval; |
| 255 | } |
| 256 | |
| 257 | /** {@inheritDoc} */ |
| 258 | @Override |
| 259 | public Boolean shouldUploadInvocationStatus() { |
| 260 | return mShouldUploadInvocationStatus; |
| 261 | } |
| 262 | |
| 263 | /** Set the service account key file. */ |
| 264 | @VisibleForTesting |
| 265 | void setSchedulerServiceAccountKeyfile(File keyFile) { |
| 266 | mSchedulerServiceAccountKeyfile = keyFile; |
| 267 | } |
| 268 | |
| 269 | /** {@inheritDoc} */ |
| 270 | @Override |
| 271 | public File getSchedulerServiceAccountKeyfile() { |
| 272 | return mSchedulerServiceAccountKeyfile; |
| 273 | } |
| 274 | |
| 275 | /** {@inheritDoc} */ |
| 276 | @Override |
| 277 | public String getSchedulerServiceUrl() { |
| 278 | return mServiceUrl; |
| 279 | } |
| 280 | |
| 281 | /** {@inheritDoc} */ |
| 282 | @Override |
| 283 | public int getConnectTimeout() { |
| 284 | return mConnectTimeout; |
| 285 | } |
| 286 | |
| 287 | /** {@inheritDoc} */ |
| 288 | @Override |
| 289 | public int getReadTimeout() { |
| 290 | return mReadTimeout; |
| 291 | } |
| 292 | |
| 293 | @Override |
| 294 | public boolean checkCommandState() { |
| 295 | return mCheckCommandState; |
| 296 | } |
| 297 | |
| 298 | @VisibleForTesting |
| 299 | void setCheckCommandState(boolean checkCommandState) { |
| 300 | mCheckCommandState = checkCommandState; |
| 301 | } |
Xing Dai | 81f6f9f | 2019-12-03 14:01:32 -0800 | [diff] [blame] | 302 | |
| 303 | /** {@inheritDoc} */ |
| 304 | @Override |
| 305 | public List<String> getLabels() { |
| 306 | return new ArrayList<>(mLabels); |
| 307 | } |
| 308 | |
| 309 | /** {@inheritDoc} */ |
| 310 | @Override |
| 311 | public String getLabName() { |
| 312 | return mLabName; |
| 313 | } |
Yichun Li | b935e79 | 2020-02-10 18:31:48 -0800 | [diff] [blame] | 314 | |
| 315 | /** {@inheritDoc} */ |
| 316 | @Override |
| 317 | public boolean shouldCollectEarlyTestSummary() { |
| 318 | return mCollectEarlyTestSummary; |
| 319 | } |
Di Qian | 38c02a7 | 2019-11-18 19:14:07 -0800 | [diff] [blame] | 320 | } |