Android-cuttlefish cvd tool
instance_database.h
Go to the documentation of this file.
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 <string>
20#include <optional>
21#include <unordered_set>
22#include <utility>
23#include <vector>
24
25#include <json/json.h>
26
28#include "cuttlefish/host/commands/cvd/instances/cvd_persistent_data.pb.h"
31
32namespace cuttlefish {
33
35 public:
36 // Filter is used to search for instances or groups based on their properties.
37 // A group/instance matches the filter if it matches all of the specified
38 // properties in the filter (effectively an AND operation, not an OR).
39 struct Filter {
40 std::optional<std::string> home;
41 std::optional<unsigned> instance_id;
42 std::optional<std::string> group_name;
43 // This property matches a group that contains instances with all these
44 // names, even if it has other instances too. It matches an instance if the
45 // instance name is the only element in the set (therefore if more than one
46 // name is given it'll match no instances).
47 std::unordered_set<std::string> instance_names;
48 bool Empty() const;
49 };
50
51 InstanceDatabase(const std::string& backing_file);
52
53 Result<bool> IsEmpty() const;
54
55 Result<void> LoadFromJson(const Json::Value&);
56
58
60
68 Result<LocalInstanceGroup> AddInstanceGroup(cvd::InstanceGroup& group_proto);
70
72 Result<bool> RemoveInstanceGroup(const std::string& group_name);
77
79 const Filter& filter) const;
80
81 /*
82 * FindGroup/Instance method must be used when exactly one instance/group
83 * is expected to match the filter
84 */
86 return ExactlyOne(FindGroups(filter));
87 }
89 const Filter& filter) const;
90
91 private:
92 template <typename T>
93 Result<T> ExactlyOne(Result<std::vector<T>>&& container_result) const {
94 auto container = CF_EXPECT(std::move(container_result));
95 CF_EXPECT_EQ(container.size(), (std::size_t)1, "Expected unique result");
96 return *container.begin();
97 }
98
99 static std::vector<LocalInstanceGroup> FindGroups(
100 const cvd::PersistentData& data, const Filter& filter);
101
103};
104
105} // namespace cuttlefish
Definition: expected.h:86
Definition: data_viewer.h:40
Definition: instance_database.h:34
Result< std::vector< LocalInstanceGroup > > FindGroups(const Filter &filter) const
Definition: instance_database.cpp:211
Result< LocalInstanceGroup > AddInstanceGroup(cvd::InstanceGroup &group_proto)
Definition: instance_database.cpp:130
Result< void > SetAcloudTranslatorOptout(bool optout)
Definition: instance_database.cpp:294
Result< void > UpdateInstanceGroup(const LocalInstanceGroup &group)
Definition: instance_database.cpp:179
Result< bool > IsEmpty() const
Definition: instance_database.cpp:111
Result< std::pair< LocalInstance, LocalInstanceGroup > > FindInstanceWithGroup(const Filter &filter) const
Definition: instance_database.cpp:235
Result< void > LoadFromJson(const Json::Value &)
Definition: instance_database.cpp:275
Result< bool > GetAcloudTranslatorOptout() const
Definition: instance_database.cpp:302
Result< LocalInstanceGroup > FindGroup(const Filter &filter) const
Definition: instance_database.h:85
InstanceDatabase(const std::string &backing_file)
Definition: instance_database.cpp:108
Result< bool > RemoveInstanceGroup(const std::string &group_name)
Definition: instance_database.cpp:196
Result< T > ExactlyOne(Result< std::vector< T > > &&container_result) const
Definition: instance_database.h:93
DataViewer viewer_
Definition: instance_database.h:102
Result< std::vector< LocalInstanceGroup > > Clear()
Definition: instance_database.cpp:117
Result< std::vector< LocalInstanceGroup > > InstanceGroups() const
Definition: instance_database.cpp:263
Definition: instance_group_record.h:32
#define CF_EXPECT(...)
Definition: result.h:414
#define CF_EXPECT_EQ(LHS_RESULT, RHS_RESULT,...)
Definition: result.h:450
char data[Size]
Definition: incremental_server.cpp:1
std::vector< LocalInstance > Filter(const std::vector< LocalInstance > &instances, std::function< bool(const LocalInstance &)> predicate)
Definition: instance_group_record.cpp:46
Definition: alloc_utils.cpp:23
Definition: instance_database.h:39
std::unordered_set< std::string > instance_names
Definition: instance_database.h:47
std::optional< unsigned > instance_id
Definition: instance_database.h:41
bool Empty() const
Definition: instance_database.cpp:104
std::optional< std::string > home
Definition: instance_database.h:40
std::optional< std::string > group_name
Definition: instance_database.h:42