Skip to content

Commit 21aed3a

Browse files
feat(backend): Update cvd start to handle single instances
1 parent 096139a commit 21aed3a

3 files changed

Lines changed: 86 additions & 0 deletions

File tree

base/cvd/cuttlefish/host/commands/cvd/cli/commands/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ cf_cc_library(
390390
hdrs = ["start.h"],
391391
clang_format_enabled = False,
392392
deps = [
393+
"//cuttlefish/common/libs/fs",
393394
"//cuttlefish/common/libs/utils:contains",
394395
"//cuttlefish/common/libs/utils:files",
395396
"//cuttlefish/common/libs/utils:json",

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

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "cuttlefish/host/commands/cvd/cli/commands/start.h"
1818

19+
#include <fcntl.h>
1920
#include <signal.h> // IWYU pragma: keep
2021
#include <stddef.h>
2122
#include <stdlib.h>
@@ -40,6 +41,7 @@
4041
#include "absl/strings/str_join.h"
4142
#include "absl/strings/str_split.h"
4243

44+
#include "cuttlefish/common/libs/fs/shared_fd.h"
4345
#include "cuttlefish/common/libs/utils/contains.h"
4446
#include "cuttlefish/common/libs/utils/files.h"
4547
#include "cuttlefish/flag_parser/flag.h"
@@ -337,6 +339,19 @@ Result<void> CvdStartCommandHandler::Handle(const CommandRequest& request) {
337339
return CF_ERR(NoGroupMessage(request));
338340
}
339341

342+
if (request.Selectors().instance_names) {
343+
auto [instance, group] =
344+
CF_EXPECT(selector::SelectInstance(instance_manager_, request));
345+
346+
auto config_path =
347+
group.AssemblyDir() + "/cuttlefish_config.json";
348+
if (FileExists(config_path)) {
349+
return LaunchSingleInstance(instance, group, request);
350+
} else {
351+
LOG(INFO) << "Group configuration does not exist on disk. Proceeding with normal group start.";
352+
}
353+
}
354+
340355
CF_EXPECT(ConsumeDaemonModeFlag(subcmd_args));
341356
subcmd_args.push_back("--daemon=true");
342357

@@ -477,6 +492,72 @@ Result<void> CvdStartCommandHandler::LaunchDeviceInterruptible(
477492
return {};
478493
}
479494

495+
Result<void> CvdStartCommandHandler::LaunchSingleInstance(
496+
LocalInstance& instance, LocalInstanceGroup& group,
497+
const CommandRequest& request) {
498+
auto bin_path = group.HostArtifactsPath() + "/bin/run_cvd";
499+
cvd_common::Envs run_cvd_envs = request.Env();
500+
run_cvd_envs[kCuttlefishInstanceEnvVarName] = std::to_string(instance.Id());
501+
run_cvd_envs["HOME"] = group.HomeDir();
502+
run_cvd_envs[kAndroidHostOut] = group.HostArtifactsPath();
503+
run_cvd_envs[kAndroidProductOut] = group.ProductOutPath();
504+
run_cvd_envs[kAndroidSoongHostOut] = group.HostArtifactsPath();
505+
run_cvd_envs[kCvdMarkEnv] = "true";
506+
507+
ConstructCommandParam construct_cmd_param{.bin_path = bin_path,
508+
.home = group.HomeDir(),
509+
.args = cvd_common::Args{},
510+
.envs = run_cvd_envs,
511+
.working_dir = CurrentDirectory(),
512+
.command_name = "run_cvd"};
513+
514+
Command command = CF_EXPECT(ConstructCommand(construct_cmd_param));
515+
command.RedirectStdIO(Subprocess::StdIOChannel::kStdOut,
516+
Subprocess::StdIOChannel::kStdErr);
517+
SharedFD dev_null = SharedFD::Open("/dev/null", O_RDONLY);
518+
if (dev_null->IsOpen()) {
519+
command.RedirectStdIO(Subprocess::StdIOChannel::kStdIn, dev_null);
520+
} else {
521+
LOG(ERROR) << "Failed to open /dev/null: " << dev_null->StrError();
522+
}
523+
524+
auto symlink_config_res = SymlinkPreviousConfig(group.HomeDir());
525+
if (!symlink_config_res.ok()) {
526+
LOG(ERROR) << "Failed to symlink the config file at system wide home: "
527+
<< symlink_config_res.error();
528+
}
529+
530+
auto set_instance_state = [&group, &instance](cvd::InstanceState state) {
531+
for (auto& inst : group.Instances()) {
532+
if (inst.Id() == instance.Id()) {
533+
inst.SetState(state);
534+
break;
535+
}
536+
}
537+
};
538+
539+
set_instance_state(cvd::INSTANCE_STATE_STARTING);
540+
group.SetStartTime(CvdServerClock::now());
541+
CF_EXPECT(instance_manager_.UpdateInstanceGroup(group));
542+
543+
Result<void> start_res =
544+
LaunchDevice(std::move(command), group, run_cvd_envs, request);
545+
546+
if (!start_res.ok()) {
547+
set_instance_state(cvd::INSTANCE_STATE_BOOT_FAILED);
548+
CF_EXPECT(instance_manager_.UpdateInstanceGroup(group));
549+
return start_res;
550+
}
551+
552+
set_instance_state(cvd::INSTANCE_STATE_RUNNING);
553+
CF_EXPECT(instance_manager_.UpdateInstanceGroup(group));
554+
555+
auto group_json = CF_EXPECT(group.FetchStatus());
556+
std::cout << group_json.toStyledString();
557+
558+
return {};
559+
}
560+
480561
std::vector<HelpParagraph> CvdStartCommandHandler::Description() const {
481562
std::vector<HelpParagraph> description;
482563
description.emplace_back(

base/cvd/cuttlefish/host/commands/cvd/cli/commands/start.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ class CvdStartCommandHandler : public CvdCommandHandler {
4343
bool RequiresDeviceExists() const override { return true; }
4444

4545
private:
46+
Result<void> LaunchSingleInstance(LocalInstance& instance,
47+
LocalInstanceGroup& group,
48+
const CommandRequest& request);
49+
4650
Result<void> LaunchDevice(Command command, LocalInstanceGroup& group,
4751
const cvd_common::Envs& envs,
4852
const CommandRequest& request);

0 commit comments

Comments
 (0)