• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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