1 /* 2 * Copyright (C) 2022 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 17 #pragma once 18 19 #include <sys/types.h> 20 21 #include <mutex> 22 #include <optional> 23 #include <set> 24 #include <string> 25 #include <unordered_map> 26 #include <vector> 27 28 #include <fruit/fruit.h> 29 30 #include "common/libs/fs/shared_fd.h" 31 #include "common/libs/utils/json.h" 32 #include "common/libs/utils/result.h" 33 #include "cvd_server.pb.h" 34 #include "host/commands/cvd/common_utils.h" 35 #include "host/commands/cvd/instance_lock.h" 36 #include "host/commands/cvd/selector/creation_analyzer.h" 37 #include "host/commands/cvd/selector/group_selector.h" 38 #include "host/commands/cvd/selector/instance_database.h" 39 #include "host/commands/cvd/selector/instance_database_types.h" 40 #include "host/commands/cvd/selector/instance_selector.h" 41 #include "host/commands/cvd/server_command/host_tool_target_manager.h" 42 43 namespace cuttlefish { 44 45 class InstanceManager { 46 public: 47 using CreationAnalyzer = selector::CreationAnalyzer; 48 using CreationAnalyzerParam = CreationAnalyzer::CreationAnalyzerParam; 49 using GroupCreationInfo = selector::GroupCreationInfo; 50 using LocalInstanceGroup = selector::LocalInstanceGroup; 51 using LocalInstance = selector::LocalInstance; 52 using GroupSelector = selector::GroupSelector; 53 using InstanceSelector = selector::InstanceSelector; 54 using Queries = selector::Queries; 55 using Query = selector::Query; 56 template <typename T> 57 using Set = selector::Set<T>; 58 59 INJECT(InstanceManager(InstanceLockFileManager&, HostToolTargetManager&)); 60 61 // For cvd start 62 Result<GroupCreationInfo> Analyze(const std::string& sub_cmd, 63 const CreationAnalyzerParam& param, 64 const ucred& credential); 65 66 Result<LocalInstanceGroup> SelectGroup(const cvd_common::Args& selector_args, 67 const cvd_common::Envs& envs, 68 const uid_t uid); 69 70 Result<LocalInstanceGroup> SelectGroup(const cvd_common::Args& selector_args, 71 const Queries& extra_queries, 72 const cvd_common::Envs& envs, 73 const uid_t uid); 74 75 Result<LocalInstance::Copy> SelectInstance( 76 const cvd_common::Args& selector_args, const Queries& extra_queries, 77 const cvd_common::Envs& envs, const uid_t uid); 78 79 Result<LocalInstance::Copy> SelectInstance( 80 const cvd_common::Args& selector_args, const cvd_common::Envs& envs, 81 const uid_t uid); 82 83 bool HasInstanceGroups(const uid_t uid); 84 Result<void> SetInstanceGroup(const uid_t uid, 85 const selector::GroupCreationInfo& group_info); 86 Result<void> SetBuildId(const uid_t uid, const std::string& group_name, 87 const std::string& build_id); 88 void RemoveInstanceGroup(const uid_t uid, const std::string&); 89 90 cvd::Status CvdClear(const SharedFD& out, const SharedFD& err); 91 Result<cvd::Status> CvdFleet(const uid_t uid, const SharedFD& out, 92 const SharedFD& err, 93 const std::vector<std::string>& fleet_cmd_args); 94 static Result<std::string> GetCuttlefishConfigPath(const std::string& home); 95 96 Result<std::optional<InstanceLockFile>> TryAcquireLock(int instance_num); 97 98 Result<std::vector<LocalInstanceGroup>> FindGroups(const uid_t uid, 99 const Query& query) const; 100 Result<std::vector<LocalInstanceGroup>> FindGroups( 101 const uid_t uid, const Queries& queries) const; 102 Result<std::vector<LocalInstance::Copy>> FindInstances( 103 const uid_t uid, const Query& query) const; 104 Result<std::vector<LocalInstance::Copy>> FindInstances( 105 const uid_t uid, const Queries& queries) const; 106 107 Result<LocalInstanceGroup> FindGroup(const uid_t uid, 108 const Query& query) const; 109 Result<LocalInstanceGroup> FindGroup(const uid_t uid, 110 const Queries& queries) const; 111 Result<Json::Value> Serialize(const uid_t uid); 112 Result<void> LoadFromJson(const uid_t uid, const Json::Value&); 113 114 private: 115 Result<cvd::Status> CvdFleetImpl(const uid_t uid, const SharedFD& out, 116 const SharedFD& err); 117 struct StatusCommandOutput { 118 std::string stderr_msg; 119 Json::Value stdout_json; 120 }; 121 Result<StatusCommandOutput> IssueStatusCommand( 122 const selector::LocalInstanceGroup& group, const SharedFD& err); 123 Result<void> IssueStopCommand(const SharedFD& out, const SharedFD& err, 124 const std::string& config_file_path, 125 const selector::LocalInstanceGroup& group); 126 Result<std::string> StopBin(const std::string& host_android_out); 127 128 selector::InstanceDatabase& GetInstanceDB(const uid_t uid); 129 InstanceLockFileManager& lock_manager_; 130 HostToolTargetManager& host_tool_target_manager_; 131 mutable std::mutex instance_db_mutex_; 132 std::unordered_map<uid_t, selector::InstanceDatabase> instance_dbs_; 133 }; 134 135 } // namespace cuttlefish 136