Skip to content

Commit a8b20d7

Browse files
committed
Rewrite SelectInstance
In the same fashion as the `SelectGroup` rewrite, implement `SelectInstance` to be explicit about the various cases and fallbacks. This rewrite also stubs out instance-prompting, though it is not yet implemented. That will be in a follow-up commit, and technically this implementation is just as capable as the previous version. It just fails with a different error message. Bug: 511316553
1 parent 6dc1324 commit a8b20d7

1 file changed

Lines changed: 18 additions & 22 deletions

File tree

  • base/cvd/cuttlefish/host/commands/cvd/cli/selector

base/cvd/cuttlefish/host/commands/cvd/cli/selector/selector.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,6 @@ namespace cuttlefish {
3434
namespace selector {
3535
namespace {
3636

37-
Result<LocalInstanceGroup> GetDefaultGroup(
38-
const InstanceManager& instance_manager) {
39-
const std::vector<LocalInstanceGroup> all_groups =
40-
CF_EXPECT(instance_manager.FindGroups({}));
41-
CF_EXPECTF(all_groups.size() == 1,
42-
"There are {} instance groups, unable to pick one",
43-
all_groups.size());
44-
return all_groups.front();
45-
}
46-
4737
Result<InstanceDatabase::Filter> BuildFilterFromSelectors(
4838
const SelectorOptions& selectors) {
4939
InstanceDatabase::Filter filter;
@@ -122,13 +112,10 @@ Result<LocalInstanceGroup> PromptUserForGroup(
122112
}
123113
}
124114

125-
Result<std::pair<LocalInstance, LocalInstanceGroup>> FindDefaultInstance(
126-
const InstanceManager& instance_manager) {
127-
const LocalInstanceGroup group = CF_EXPECT(GetDefaultGroup(instance_manager));
128-
const std::vector<LocalInstance> instances = group.Instances();
129-
CF_EXPECT_EQ(instances.size(), 1u,
130-
"Default instance is the single instance in the default group.");
131-
return std::make_pair(instances.front(), group);
115+
Result<std::pair<LocalInstance, LocalInstanceGroup>> PromptUserForInstance(
116+
const InstanceManager& instance_manager, const CommandRequest& request,
117+
InstanceDatabase::Filter filter) {
118+
return CF_ERR("TODO(chadreynolds): implement in follow-up commit");
132119
}
133120

134121
} // namespace
@@ -152,12 +139,21 @@ Result<LocalInstanceGroup> SelectGroup(const InstanceManager& instance_manager,
152139

153140
Result<std::pair<LocalInstance, LocalInstanceGroup>> SelectInstance(
154141
const InstanceManager& instance_manager, const CommandRequest& request) {
155-
InstanceDatabase::Filter filter =
142+
const InstanceDatabase::Filter filter =
156143
CF_EXPECT(BuildFilterFromSelectors(request.Selectors()));
157-
158-
return filter.Empty()
159-
? CF_EXPECT(FindDefaultInstance(instance_manager))
160-
: CF_EXPECT(instance_manager.FindInstanceWithGroup(filter));
144+
std::vector<std::pair<LocalInstanceGroup, std::vector<LocalInstance>>>
145+
found_instances = CF_EXPECT(instance_manager.FindInstances(filter));
146+
CF_EXPECT(!found_instances.empty(), "No instances available");
147+
if (found_instances.size() == 1 &&
148+
found_instances.front().second.size() == 1) {
149+
auto [group, instances] = found_instances.front();
150+
return std::make_pair(instances.front(), group);
151+
}
152+
CF_EXPECT(isatty(0),
153+
"Multiple instances found. Narrow the selection with selector "
154+
"arguments or run in an interactive terminal");
155+
return CF_EXPECT(
156+
PromptUserForInstance(instance_manager, request, std::move(filter)));
161157
}
162158

163159
} // namespace selector

0 commit comments

Comments
 (0)