• 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 <functional>
20 #include <memory>
21 #include <vector>
22 
23 #include "common/libs/utils/result.h"
24 #include "host/commands/cvd/selector/constant_reference.h"
25 #include "host/commands/cvd/selector/instance_database_types.h"
26 #include "host/commands/cvd/selector/instance_group_record.h"
27 #include "host/commands/cvd/selector/instance_record.h"
28 
29 namespace cuttlefish {
30 namespace selector {
31 
32 // TODO(kwstephenkim): make this per-user instance database
33 class InstanceDatabase {
34   template <typename T>
35   using ConstHandler = std::function<Result<Set<ConstRef<T>>>(const Value&)>;
36 
37   using ConstGroupHandler = ConstHandler<LocalInstanceGroup>;
38   using ConstInstanceHandler = ConstHandler<LocalInstance>;
39 
40  public:
41   InstanceDatabase();
42   bool IsEmpty() const;
43 
44   struct AddInstanceGroupParam {
45     std::string group_name;
46     std::string home_dir;
47     std::string host_artifacts_path;
48     std::string product_out_path;
49   };
50   /** Adds instance group.
51    *
52    * If group_name or home_dir is already taken or host_artifacts_path is
53    * not likely an artifacts path, CF_ERR is returned.
54    */
55   Result<ConstRef<LocalInstanceGroup>> AddInstanceGroup(
56       const AddInstanceGroupParam& param);
57 
58   Json::Value Serialize() const;
59   Result<void> LoadFromJson(const Json::Value&);
60 
61   /**
62    * Adds instance to the group.
63    *
64    * If id is duplicated in the scope of the InstanceDatabase or instance_name
65    * is not unique within the group, CF_ERR is returned.
66    */
67   Result<void> AddInstance(const std::string& group_name, const unsigned id,
68                            const std::string& instance_name);
69 
70   struct InstanceInfo {
71     const unsigned id;
72     const std::string name;
73   };
74   Result<void> AddInstances(const std::string& group_name,
75                             const std::vector<InstanceInfo>& instances);
76 
77   Result<void> SetBuildId(const std::string& group_name,
78                           const std::string& build_id);
79 
80   /*
81    *  auto group = CF_EXPEC(FindGroups(...));
82    *  RemoveInstanceGroup(group)
83    */
84   bool RemoveInstanceGroup(const LocalInstanceGroup& group);
85   bool RemoveInstanceGroup(const std::string& group_name);
86   void Clear();
87 
88   Result<Set<ConstRef<LocalInstanceGroup>>> FindGroups(
89       const Query& query) const;
90   Result<Set<ConstRef<LocalInstanceGroup>>> FindGroups(
91       const Queries& queries) const;
92   Result<Set<ConstRef<LocalInstance>>> FindInstances(const Query& query) const;
93   Result<Set<ConstRef<LocalInstance>>> FindInstances(
94       const Queries& queries) const;
InstanceGroups()95   const auto& InstanceGroups() const { return local_instance_groups_; }
96 
97   /*
98    * FindGroup/Instance method must be used when exactly one instance/group
99    * is expected to match the query
100    */
101   Result<ConstRef<LocalInstanceGroup>> FindGroup(const Query& query) const;
102   Result<ConstRef<LocalInstanceGroup>> FindGroup(const Queries& queries) const;
103   Result<ConstRef<LocalInstance>> FindInstance(const Query& query) const;
104   Result<ConstRef<LocalInstance>> FindInstance(const Queries& queries) const;
105 
106  private:
107   template <typename T>
108   Result<Set<ConstRef<T>>> Find(
109       const Query& query,
110       const Map<FieldName, ConstHandler<T>>& handler_map) const;
111 
112   template <typename T>
113   Result<Set<ConstRef<T>>> Find(
114       const Queries& queries,
115       const Map<FieldName, ConstHandler<T>>& handler_map) const;
116 
117   template <typename T>
118   Result<ConstRef<T>> FindOne(
119       const Query& query,
120       const Map<FieldName, ConstHandler<T>>& handler_map) const;
121 
122   template <typename T>
123   Result<ConstRef<T>> FindOne(
124       const Queries& queries,
125       const Map<FieldName, ConstHandler<T>>& handler_map) const;
126 
127   std::vector<std::unique_ptr<LocalInstanceGroup>>::iterator FindIterator(
128       const LocalInstanceGroup& group);
129 
130   // actual Find implementations
131   Result<Set<ConstRef<LocalInstanceGroup>>> FindGroupsByHome(
132       const Value& home) const;
133   Result<Set<ConstRef<LocalInstanceGroup>>> FindGroupsByGroupName(
134       const Value& group_name) const;
135   Result<Set<ConstRef<LocalInstanceGroup>>> FindGroupsByInstanceName(
136       const Value& instance_name) const;
137   Result<Set<ConstRef<LocalInstance>>> FindInstancesById(const Value& id) const;
138   Result<Set<ConstRef<LocalInstance>>> FindInstancesByGroupName(
139       const Value& instance_specific_name) const;
140   Result<Set<ConstRef<LocalInstance>>> FindInstancesByInstanceName(
141       const Value& group_name) const;
142 
143   Result<LocalInstanceGroup*> FindMutableGroup(const std::string& group_name);
144 
145   Result<void> LoadGroupFromJson(const Json::Value& group_json);
146 
147   std::vector<std::unique_ptr<LocalInstanceGroup>> local_instance_groups_;
148   Map<FieldName, ConstGroupHandler> group_handlers_;
149   Map<FieldName, ConstInstanceHandler> instance_handlers_;
150 
151   static constexpr const char kJsonGroups[] = "Groups";
152 };
153 
154 }  // namespace selector
155 }  // namespace cuttlefish
156