/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include "common/libs/utils/result.h" #include "host/commands/cvd/selector/constant_reference.h" #include "host/commands/cvd/selector/instance_database_types.h" #include "host/commands/cvd/selector/instance_group_record.h" #include "host/commands/cvd/selector/instance_record.h" namespace cuttlefish { namespace selector { // TODO(kwstephenkim): make this per-user instance database class InstanceDatabase { template using ConstHandler = std::function>>(const Value&)>; using ConstGroupHandler = ConstHandler; using ConstInstanceHandler = ConstHandler; public: InstanceDatabase(); bool IsEmpty() const; struct AddInstanceGroupParam { std::string group_name; std::string home_dir; std::string host_artifacts_path; std::string product_out_path; }; /** Adds instance group. * * If group_name or home_dir is already taken or host_artifacts_path is * not likely an artifacts path, CF_ERR is returned. */ Result> AddInstanceGroup( const AddInstanceGroupParam& param); Json::Value Serialize() const; Result LoadFromJson(const Json::Value&); /** * Adds instance to the group. * * If id is duplicated in the scope of the InstanceDatabase or instance_name * is not unique within the group, CF_ERR is returned. */ Result AddInstance(const std::string& group_name, const unsigned id, const std::string& instance_name); struct InstanceInfo { const unsigned id; const std::string name; }; Result AddInstances(const std::string& group_name, const std::vector& instances); Result SetBuildId(const std::string& group_name, const std::string& build_id); /* * auto group = CF_EXPEC(FindGroups(...)); * RemoveInstanceGroup(group) */ bool RemoveInstanceGroup(const LocalInstanceGroup& group); bool RemoveInstanceGroup(const std::string& group_name); void Clear(); Result>> FindGroups( const Query& query) const; Result>> FindGroups( const Queries& queries) const; Result>> FindInstances(const Query& query) const; Result>> FindInstances( const Queries& queries) const; const auto& InstanceGroups() const { return local_instance_groups_; } /* * FindGroup/Instance method must be used when exactly one instance/group * is expected to match the query */ Result> FindGroup(const Query& query) const; Result> FindGroup(const Queries& queries) const; Result> FindInstance(const Query& query) const; Result> FindInstance(const Queries& queries) const; private: template Result>> Find( const Query& query, const Map>& handler_map) const; template Result>> Find( const Queries& queries, const Map>& handler_map) const; template Result> FindOne( const Query& query, const Map>& handler_map) const; template Result> FindOne( const Queries& queries, const Map>& handler_map) const; std::vector>::iterator FindIterator( const LocalInstanceGroup& group); // actual Find implementations Result>> FindGroupsByHome( const Value& home) const; Result>> FindGroupsByGroupName( const Value& group_name) const; Result>> FindGroupsByInstanceName( const Value& instance_name) const; Result>> FindInstancesById(const Value& id) const; Result>> FindInstancesByGroupName( const Value& instance_specific_name) const; Result>> FindInstancesByInstanceName( const Value& group_name) const; Result FindMutableGroup(const std::string& group_name); Result LoadGroupFromJson(const Json::Value& group_json); std::vector> local_instance_groups_; Map group_handlers_; Map instance_handlers_; static constexpr const char kJsonGroups[] = "Groups"; }; } // namespace selector } // namespace cuttlefish