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