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 <stddef.h>
20
21#include <optional>
22#include <string>
23#include <unordered_set>
24#include <utility>
25#include <vector>
26
27#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<unsigned> instance_id;
41 std::optional<std::string> group_name;
42 // This property matches a group that contains instances with all these
43 // names, even if it has other instances too. It matches an instance if the
44 // instance name is the only element in the set (therefore if more than one
45 // name is given it'll match no instances).
46 std::unordered_set<std::string> instance_names;
47 bool Empty() const;
48 };
49
50 InstanceDatabase(const std::string& backing_file);
51
52 Result<bool> IsEmpty() const;
53
63
65 Result<bool> RemoveInstanceGroup(const std::string& group_name);
70
72 const Filter& filter) const;
73
74 /*
75 * FindGroup/Instance method must be used when exactly one instance/group
76 * is expected to match the filter
77 */
79 return ExactlyOne(FindGroups(filter));
80 }
82 const Filter& filter) const;
84 FindInstances(const Filter& filter) const;
85
86 private:
87 template <typename T>
88 Result<T> ExactlyOne(Result<std::vector<T>>&& container_result) const {
89 auto container = CF_EXPECT(std::move(container_result));
90 CF_EXPECT_EQ(container.size(), static_cast<size_t>(1),
91 "Expected unique result");
92 return *container.begin();
93 }
94
95 static std::vector<LocalInstanceGroup> FindGroups(
96 const cvd::PersistentData& data, const Filter& filter);
97
99};
100
101} // namespace cuttlefish
Definition: data_viewer.h:40
Definition: instance_database.h:34
Result< std::vector< LocalInstanceGroup > > FindGroups(const Filter &filter) const
Definition: instance_database.cpp:204
Result< void > UpdateInstanceGroup(const LocalInstanceGroup &group)
Definition: instance_database.cpp:172
Result< bool > IsEmpty() const
Definition: instance_database.cpp:103
Result< std::pair< LocalInstance, LocalInstanceGroup > > FindInstanceWithGroup(const Filter &filter) const
Definition: instance_database.cpp:229
Result< void > AddInstanceGroup(LocalInstanceGroup group)
Definition: instance_database.cpp:122
Result< LocalInstanceGroup > FindGroup(const Filter &filter) const
Definition: instance_database.h:78
InstanceDatabase(const std::string &backing_file)
Definition: instance_database.cpp:100
Result< bool > RemoveInstanceGroup(const std::string &group_name)
Definition: instance_database.cpp:189
Result< T > ExactlyOne(Result< std::vector< T > > &&container_result) const
Definition: instance_database.h:88
DataViewer viewer_
Definition: instance_database.h:98
Result< std::vector< LocalInstanceGroup > > Clear()
Definition: instance_database.cpp:109
Result< std::vector< LocalInstanceGroup > > InstanceGroups() const
Definition: instance_database.cpp:288
Result< std::vector< std::pair< LocalInstanceGroup, std::vector< LocalInstance > > > > FindInstances(const Filter &filter) const
Definition: instance_database.cpp:258
Definition: local_instance_group.h:32
#define data
Definition: dict.c:56
#define CF_EXPECT(...)
Definition: expect.h:149
#define CF_EXPECT_EQ(LHS_RESULT, RHS_RESULT,...)
Definition: expect.h:185
std::vector< LocalInstance > Filter(const std::vector< LocalInstance > &instances, std::function< bool(const LocalInstance &)> predicate)
Definition: local_instance_group.cpp:42
Definition: alloc_driver.h:20
tl::expected< T, StackTraceError > Result
Definition: result_type.h:30
Definition: instance_database.h:39
std::unordered_set< std::string > instance_names
Definition: instance_database.h:46
std::optional< unsigned > instance_id
Definition: instance_database.h:40
bool Empty() const
Definition: instance_database.cpp:96
std::optional< std::string > group_name
Definition: instance_database.h:41