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.command.remote.DeviceDescriptor;
19 
20 import org.json.JSONArray;
21 import org.json.JSONException;
22 import org.json.JSONObject;
23 
24 import java.util.LinkedHashMap;
25 import java.util.Map;
26 
27 /** A class to encapsulate cluster device info to be uploaded. */
28 public class ClusterDeviceInfo {
29     private String mRunTarget;
30     private String mGroupName;
31     private DeviceDescriptor mDeviceDescriptor;
32     private Map<String, String> mExtraInfo;
33 
ClusterDeviceInfo( DeviceDescriptor deviceDescriptor, String runTarget, String groupName, Map<String, String> extraInfo)34     private ClusterDeviceInfo(
35             DeviceDescriptor deviceDescriptor,
36             String runTarget,
37             String groupName,
38             Map<String, String> extraInfo) {
39         mDeviceDescriptor = deviceDescriptor;
40         mRunTarget = runTarget;
41         mGroupName = groupName;
42         mExtraInfo = new LinkedHashMap<>(extraInfo);
43     }
44 
getRunTarget()45     public String getRunTarget() {
46         return mRunTarget;
47     }
48 
getGroupName()49     public String getGroupName() {
50         return mGroupName;
51     }
52 
getDeviceDescriptor()53     public DeviceDescriptor getDeviceDescriptor() {
54         return mDeviceDescriptor;
55     }
56 
getExtraInfo()57     public Map<String, String> getExtraInfo() {
58         return new LinkedHashMap<>(mExtraInfo);
59     }
60 
61     public static class Builder {
62         private DeviceDescriptor mDeviceDescriptor;
63         private String mRunTarget;
64         private String mGroupName;
65         private Map<String, String> mExtraInfo = new LinkedHashMap<>();
66 
Builder()67         public Builder() {}
68 
setRunTarget(final String runTarget)69         public Builder setRunTarget(final String runTarget) {
70             mRunTarget = runTarget;
71             return this;
72         }
73 
setGroupName(final String groupName)74         public Builder setGroupName(final String groupName) {
75             mGroupName = groupName;
76             return this;
77         }
78 
setDeviceDescriptor(final DeviceDescriptor deviceDescriptor)79         public Builder setDeviceDescriptor(final DeviceDescriptor deviceDescriptor) {
80             mDeviceDescriptor = deviceDescriptor;
81             mExtraInfo.put("hardware_revision", deviceDescriptor.getHardwareRevision());
82             return this;
83         }
84 
addExtraInfo(final Map<String, String> extraInfo)85         public Builder addExtraInfo(final Map<String, String> extraInfo) {
86             mExtraInfo.putAll(extraInfo);
87             return this;
88         }
89 
build()90         public ClusterDeviceInfo build() {
91             final ClusterDeviceInfo deviceInfo =
92                     new ClusterDeviceInfo(mDeviceDescriptor, mRunTarget, mGroupName, mExtraInfo);
93             return deviceInfo;
94         }
95     }
96 
97     /**
98      * Generates the JSON Object for this device info.
99      *
100      * @return JSONObject equivalent of this device info.
101      * @throws JSONException
102      */
toJSON()103     public JSONObject toJSON() throws JSONException {
104         final JSONObject json = new JSONObject();
105         json.put("device_serial", ClusterHostUtil.getUniqueDeviceSerial(mDeviceDescriptor));
106         json.put("run_target", mRunTarget);
107         json.put("build_id", mDeviceDescriptor.getBuildId());
108         json.put("product", mDeviceDescriptor.getProduct());
109         json.put("product_variant", mDeviceDescriptor.getProductVariant());
110         json.put("sdk_version", mDeviceDescriptor.getSdkVersion());
111         json.put("battery_level", mDeviceDescriptor.getBatteryLevel());
112         json.put("mac_address", mDeviceDescriptor.getMacAddress());
113         json.put("sim_state", mDeviceDescriptor.getSimState());
114         json.put("sim_operator", mDeviceDescriptor.getSimOperator());
115         json.put("state", mDeviceDescriptor.getState());
116         json.put("is_stub_device", mDeviceDescriptor.isStubDevice());
117         json.put("preconfigured_ip", mDeviceDescriptor.getPreconfiguredIp());
118         json.put(
119                 "preconfigured_device_num_offset",
120                 mDeviceDescriptor.getPreconfiguredDeviceNumOffset());
121         json.put("group_name", mGroupName);
122         JSONArray extraInfoKeyValuePairs = new JSONArray();
123         for (Map.Entry<String, String> entry : mExtraInfo.entrySet()) {
124             extraInfoKeyValuePairs.put(
125                     new JSONObject().put("key", entry.getKey()).put("value", entry.getValue()));
126         }
127         json.put("extra_info", extraInfoKeyValuePairs);
128         return json;
129     }
130 }
131