Skip to content

Commit 3c8ffa2

Browse files
committed
Use fetcher_config.json from the system image dir
cvd fetch saves the fetcher_config.json file in the same directory where it downloads the images. assemble_cvd was searching for this file only under $HOME and current directory, which are the default values for the system_image_dir flag, but not guaranteed to have fetcher_config.json in all cases. Bug: 440789112
1 parent 944b601 commit 3c8ffa2

File tree

13 files changed

+142
-84
lines changed

13 files changed

+142
-84
lines changed

base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd.cc

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include "cuttlefish/common/libs/fs/shared_buf.h"
2626
#include "cuttlefish/common/libs/fs/shared_fd.h"
2727
#include "cuttlefish/common/libs/utils/contains.h"
28-
#include "cuttlefish/common/libs/utils/environment.h"
2928
#include "cuttlefish/common/libs/utils/files.h"
3029
#include "cuttlefish/common/libs/utils/flag_parser.h"
3130
#include "cuttlefish/common/libs/utils/in_sandbox.h"
@@ -65,27 +64,20 @@ namespace {
6564

6665
static constexpr std::string_view kFetcherConfigFile = "fetcher_config.json";
6766

68-
FetcherConfig FindFetcherConfig(const std::vector<std::string>& files) {
69-
FetcherConfig fetcher_config;
70-
for (const auto& file : files) {
71-
if (android::base::EndsWith(file, kFetcherConfigFile)) {
72-
std::string home_directory = StringFromEnv("HOME", CurrentDirectory());
73-
std::string fetcher_file = file;
74-
if (!FileExists(file) &&
75-
FileExists(home_directory + "/" + fetcher_file)) {
76-
LOG(INFO) << "Found " << fetcher_file << " in HOME directory ('"
77-
<< home_directory << "') and not current working directory";
78-
fetcher_file = home_directory + "/" + fetcher_file;
79-
}
80-
81-
if (fetcher_config.LoadFromFile(fetcher_file)) {
82-
return fetcher_config;
83-
}
84-
LOG(ERROR) << "Could not load fetcher config file.";
67+
FetcherConfigs FindFetcherConfigs(
68+
const SystemImageDirFlag& system_image_dir) {
69+
std::vector<FetcherConfig> fetcher_configs;
70+
for (size_t i = 0; i < system_image_dir.Size(); ++i) {
71+
std::string fetcher_file =
72+
fmt::format("{}/{}", system_image_dir.ForIndex(i), kFetcherConfigFile);
73+
FetcherConfig fetcher_config;
74+
if (!fetcher_config.LoadFromFile(fetcher_file)) {
75+
LOG(DEBUG) << "No valid fetcher_config in '" << fetcher_file
76+
<< "', falling back to default";
8577
}
78+
fetcher_configs.emplace_back(std::move(fetcher_config));
8679
}
87-
LOG(DEBUG) << "Could not locate fetcher config file.";
88-
return fetcher_config;
80+
return FetcherConfigs::Create(std::move(fetcher_configs));
8981
}
9082

9183
std::string GetLegacyConfigFilePath(const CuttlefishConfig& config) {
@@ -316,8 +308,9 @@ Result<SharedFD> SetLogger(std::string runtime_dir_parent) {
316308
}
317309

318310
Result<const CuttlefishConfig*> InitFilesystemAndCreateConfig(
319-
FetcherConfig fetcher_config, const std::vector<GuestConfig>& guest_configs,
320-
fruit::Injector<>& injector, SharedFD log, const BootImageFlag& boot_image,
311+
FetcherConfigs fetcher_configs,
312+
const std::vector<GuestConfig>& guest_configs, fruit::Injector<>& injector,
313+
SharedFD log, const BootImageFlag& boot_image,
321314
const InitramfsPathFlag& initramfs_path, const KernelPathFlag& kernel_path,
322315
const SuperImageFlag& super_image,
323316
const SystemImageDirFlag& system_image_dir,
@@ -330,7 +323,7 @@ Result<const CuttlefishConfig*> InitFilesystemAndCreateConfig(
330323
// disk.
331324
auto config = CF_EXPECT(
332325
InitializeCuttlefishConfiguration(
333-
FLAGS_instance_dir, guest_configs, injector, fetcher_config,
326+
FLAGS_instance_dir, guest_configs, injector, fetcher_configs,
334327
boot_image, initramfs_path, kernel_path, super_image,
335328
system_image_dir, vendor_boot_image, vm_manager_flag),
336329
"cuttlefish configuration initialization failed");
@@ -517,7 +510,7 @@ Result<const CuttlefishConfig*> InitFilesystemAndCreateConfig(
517510
}
518511
}
519512

520-
CF_EXPECT(CreateDynamicDiskFiles(fetcher_config, *config, system_image_dir));
513+
CF_EXPECT(CreateDynamicDiskFiles(fetcher_configs, *config, system_image_dir));
521514

522515
return config;
523516
}
@@ -557,14 +550,7 @@ fruit::Component<> FlagsComponent(SystemImageDirFlag* system_image_dir) {
557550
.install(CustomActionsComponent);
558551
}
559552

560-
} // namespace
561-
562-
Result<int> AssembleCvdMain(int argc, char** argv) {
563-
setenv("ANDROID_LOG_TAGS", "*:v", /* overwrite */ 0);
564-
::android::base::InitLogging(argv, android::base::StderrLogger);
565-
566-
auto log = CF_EXPECT(SetLogger(AbsolutePath(FLAGS_instance_dir)));
567-
553+
Result<void> CheckNoTTY() {
568554
int tty = isatty(0);
569555
int error_num = errno;
570556
CF_EXPECT(tty == 0,
@@ -573,17 +559,33 @@ Result<int> AssembleCvdMain(int argc, char** argv) {
573559
CF_EXPECT(error_num != EBADF,
574560
"stdin was not a valid file descriptor, expected to be "
575561
"passed the output of launch_cvd. Did you mean to run launch_cvd?");
562+
return {};
563+
}
576564

565+
Result<std::vector<std::string>> ReadInputFiles() {
577566
std::string input_files_str;
578-
{
579-
auto input_fd = SharedFD::Dup(0);
580-
auto bytes_read = ReadAll(input_fd, &input_files_str);
581-
CF_EXPECT(bytes_read >= 0, "Failed to read input files. Error was \""
582-
<< input_fd->StrError() << "\"");
583-
}
584-
std::vector<std::string> input_files = android::base::Split(input_files_str, "\n");
567+
auto input_fd = SharedFD::Dup(0);
568+
CF_EXPECTF(input_fd->IsOpen(), "Failed to dup stdin: {}",
569+
input_fd->StrError());
570+
auto bytes_read = ReadAll(input_fd, &input_files_str);
571+
CF_EXPECT(bytes_read >= 0, "Failed to read input files. Error was \""
572+
<< input_fd->StrError() << "\"");
573+
return android::base::Split(input_files_str, "\n");
574+
}
575+
576+
} // namespace
577+
578+
Result<int> AssembleCvdMain(int argc, char** argv) {
579+
setenv("ANDROID_LOG_TAGS", "*:v", /* overwrite */ 0);
580+
::android::base::InitLogging(argv, android::base::StderrLogger);
585581

586-
FetcherConfig fetcher_config = FindFetcherConfig(input_files);
582+
auto log = CF_EXPECT(SetLogger(AbsolutePath(FLAGS_instance_dir)));
583+
584+
CF_EXPECT(CheckNoTTY());
585+
586+
// Read everything that cvd_internal_start writes, but ignore it since
587+
// fetcher_config.json will be searched for in the system image directory.
588+
(void) CF_EXPECT(ReadInputFiles());
587589

588590
auto args = ArgsToVec(argc - 1, argv + 1);
589591

@@ -617,13 +619,15 @@ Result<int> AssembleCvdMain(int argc, char** argv) {
617619
/* remove_flags */ false);
618620
}
619621

620-
InitramfsPathFlag initramfs_path =
621-
InitramfsPathFlag::FromGlobalGflags(fetcher_config);
622-
KernelPathFlag kernel_path = KernelPathFlag::FromGlobalGflags(fetcher_config);
623-
624622
SystemImageDirFlag system_image_dir =
625623
CF_EXPECT(SystemImageDirFlag::FromGlobalGflags());
626624

625+
FetcherConfigs fetcher_configs = FindFetcherConfigs(system_image_dir);
626+
627+
InitramfsPathFlag initramfs_path =
628+
InitramfsPathFlag::FromGlobalGflags(fetcher_configs);
629+
KernelPathFlag kernel_path = KernelPathFlag::FromGlobalGflags(fetcher_configs);
630+
627631
BootImageFlag boot_image = BootImageFlag::FromGlobalGflags(system_image_dir);
628632
SuperImageFlag super_image =
629633
SuperImageFlag::FromGlobalGflags(system_image_dir);
@@ -675,7 +679,7 @@ Result<int> AssembleCvdMain(int argc, char** argv) {
675679

676680
auto config =
677681
CF_EXPECT(InitFilesystemAndCreateConfig(
678-
std::move(fetcher_config), guest_configs, injector, log,
682+
std::move(fetcher_configs), guest_configs, injector, log,
679683
boot_image, initramfs_path, kernel_path, super_image,
680684
system_image_dir, vendor_boot_image, vm_manager_flag),
681685
"Failed to create config");

base/cvd/cuttlefish/host/commands/assemble_cvd/create_dynamic_disk_files.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ static uint64_t AvailableSpaceAtPath(const std::string& path) {
7373
}
7474

7575
Result<void> CreateDynamicDiskFiles(
76-
const FetcherConfig& fetcher_config, const CuttlefishConfig& config,
76+
const FetcherConfigs& fetcher_configs, const CuttlefishConfig& config,
7777
const SystemImageDirFlag& system_image_dir) {
78+
size_t instance_index = 0;
7879
for (const auto& instance : config.Instances()) {
7980
std::optional<ChromeOsStateImage> chrome_os_state =
8081
CF_EXPECT(ChromeOsStateImage::CreateIfNecessary(instance));
@@ -84,7 +85,8 @@ Result<void> CreateDynamicDiskFiles(
8485
CF_EXPECT(BootloaderPresentCheck(instance));
8586
CF_EXPECT(Gem5ImageUnpacker(config)); // Requires RepackKernelRamdisk
8687
CF_EXPECT(InitializeEspImage(config, instance));
87-
CF_EXPECT(RebuildSuperImageIfNecessary(fetcher_config, instance));
88+
CF_EXPECT(RebuildSuperImageIfNecessary(
89+
fetcher_configs.ForInstance(instance_index), instance));
8890

8991
CF_EXPECT(InitializeAccessKregistryImage(instance));
9092
CF_EXPECT(InitializeHwcomposerPmemImage(instance));
@@ -202,6 +204,7 @@ Result<void> CreateDynamicDiskFiles(
202204
RepackGem5BootImage(instance.PerInstancePath("initrd.img"), boot_config,
203205
config.assembly_dir(), instance.initramfs_path());
204206
}
207+
++instance_index;
205208
}
206209

207210
return {};

base/cvd/cuttlefish/host/commands/assemble_cvd/create_dynamic_disk_files.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
namespace cuttlefish {
2525

26-
Result<void> CreateDynamicDiskFiles(const FetcherConfig& fetcher_config,
26+
Result<void> CreateDynamicDiskFiles(const FetcherConfigs& fetcher_config,
2727
const CuttlefishConfig& config,
2828
const SystemImageDirFlag&);
2929

base/cvd/cuttlefish/host/commands/assemble_cvd/disk_image_flags_vectorization.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
namespace cuttlefish {
4444

4545
Result<void> DiskImageFlagsVectorization(
46-
CuttlefishConfig& config, const FetcherConfig& fetcher_config,
46+
CuttlefishConfig& config, const FetcherConfigs& fetcher_configs,
4747
const AndroidEfiLoaderFlag& android_efi_loader,
4848
const BootImageFlag& boot_image, const BootloaderFlag& bootloader,
4949
const InitramfsPathFlag& initramfs_path, const KernelPathFlag& kernel_path,
@@ -251,7 +251,8 @@ Result<void> DiskImageFlagsVectorization(
251251
// We will need to rebuild vendor_dlkm if custom ramdisk is specified, as a
252252
// result super image would need to be rebuilt as well.
253253
if (CF_EXPECT(SuperImageNeedsRebuilding(
254-
fetcher_config, const_instance.default_target_zip(),
254+
fetcher_configs.ForInstance(instance_index),
255+
const_instance.default_target_zip(),
255256
const_instance.system_target_zip())) ||
256257
has_initramfs) {
257258
const std::string new_super_image_path =

base/cvd/cuttlefish/host/commands/assemble_cvd/disk_image_flags_vectorization.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
namespace cuttlefish {
3232

3333
Result<void> DiskImageFlagsVectorization(
34-
CuttlefishConfig& config, const FetcherConfig& fetcher_config,
34+
CuttlefishConfig& config, const FetcherConfigs& fetcher_configs,
3535
const AndroidEfiLoaderFlag&, const BootImageFlag&, const BootloaderFlag&,
3636
const InitramfsPathFlag&, const KernelPathFlag&, const SuperImageFlag&,
3737
const SystemImageDirFlag&, const VendorBootImageFlag&);

base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <set>
2626
#include <sstream>
2727
#include <unordered_map>
28+
#include <vector>
2829

2930
#include <android-base/file.h>
3031
#include <android-base/logging.h>
@@ -317,7 +318,7 @@ std::optional<std::string> InstancesUdsDir() {
317318

318319
Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
319320
const std::string& root_dir, const std::vector<GuestConfig>& guest_configs,
320-
fruit::Injector<>& injector, const FetcherConfig& fetcher_config,
321+
fruit::Injector<>& injector, const FetcherConfigs& fetcher_configs,
321322
const BootImageFlag& boot_image, const InitramfsPathFlag& initramfs_path,
322323
const KernelPathFlag& kernel_path, const SuperImageFlag& super_image,
323324
const SystemImageDirFlag& system_image_dir,
@@ -1322,7 +1323,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
13221323
guest_configs, system_image_dir, vm_manager_flag));
13231324

13241325
CF_EXPECT(DiskImageFlagsVectorization(
1325-
tmp_config_obj, fetcher_config, efi_loader, boot_image, bootloader,
1326+
tmp_config_obj, fetcher_configs, efi_loader, boot_image, bootloader,
13261327
initramfs_path, kernel_path, super_image, system_image_dir,
13271328
vendor_boot_image));
13281329

base/cvd/cuttlefish/host/commands/assemble_cvd/flags.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#pragma once
1717

1818
#include <string>
19+
#include <vector>
1920

2021
#include <fruit/fruit.h>
2122

@@ -40,12 +41,12 @@ Result<void> SetFlagDefaultsForVmm(
4041
// Must be called after ParseCommandLineFlags.
4142
Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
4243
const std::string& root_dir, const std::vector<GuestConfig>& guest_configs,
43-
fruit::Injector<>& injector, const FetcherConfig& fetcher_config,
44+
fruit::Injector<>& injector, const FetcherConfigs& fetcher_configs,
4445
const BootImageFlag&, const InitramfsPathFlag&,
4546
const KernelPathFlag& kernel_path, const SuperImageFlag&,
4647
const SystemImageDirFlag&, const VendorBootImageFlag&,
4748
const VmManagerFlag&);
4849

4950
std::string GetConfigFilePath(const CuttlefishConfig& config);
5051

51-
} // namespace cuttlefish
52+
} // namespace cuttlefish

base/cvd/cuttlefish/host/commands/assemble_cvd/flags/initramfs_path.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,20 @@ DEFINE_string(initramfs_path, CF_DEFAULTS_INITRAMFS_PATH,
3232
namespace cuttlefish {
3333

3434
InitramfsPathFlag InitramfsPathFlag::FromGlobalGflags(
35-
const FetcherConfig& fetcher_config) {
35+
const FetcherConfigs& fetcher_configs) {
3636
gflags::CommandLineFlagInfo flag_info =
3737
gflags::GetCommandLineFlagInfoOrDie("initramfs_path");
3838

39-
std::string paths_comma_separated =
40-
flag_info.is_default
41-
? fetcher_config.FindCvdFileWithSuffix("initramfs.img")
42-
: flag_info.current_value;
43-
44-
std::vector<std::string> initramfs_paths =
45-
android::base::Split(paths_comma_separated, ",");
39+
std::vector<std::string> initramfs_paths;
40+
if (flag_info.is_default) {
41+
for (size_t i = 0; i < fetcher_configs.Size(); ++i) {
42+
initramfs_paths.emplace_back(
43+
fetcher_configs.ForInstance(i).FindCvdFileWithSuffix(
44+
"initramfs.img"));
45+
}
46+
} else {
47+
initramfs_paths = android::base::Split(flag_info.current_value, ",");
48+
}
4649

4750
return InitramfsPathFlag(std::move(initramfs_paths));
4851
}

base/cvd/cuttlefish/host/commands/assemble_cvd/flags/initramfs_path.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace cuttlefish {
2626
class InitramfsPathFlag {
2727
public:
2828
static InitramfsPathFlag FromGlobalGflags(
29-
const FetcherConfig& fetcher_config);
29+
const FetcherConfigs& fetcher_configs);
3030

3131
std::string InitramfsPathForIndex(size_t index) const;
3232

base/cvd/cuttlefish/host/commands/assemble_cvd/flags/kernel_path.cc

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,20 @@ DEFINE_string(kernel_path, CF_DEFAULTS_KERNEL_PATH,
3232
namespace cuttlefish {
3333

3434
KernelPathFlag KernelPathFlag::FromGlobalGflags(
35-
const FetcherConfig& fetcher_config) {
35+
const FetcherConfigs& fetcher_configs) {
3636
gflags::CommandLineFlagInfo flag_info =
3737
gflags::GetCommandLineFlagInfoOrDie("kernel_path");
3838

39-
std::string paths_comma_separated =
40-
flag_info.is_default ? fetcher_config.FindCvdFileWithSuffix("kernel")
41-
: flag_info.current_value;
39+
std::vector<std::string> kernel_paths;
4240

43-
std::vector<std::string> kernel_paths =
44-
android::base::Split(paths_comma_separated, ",");
41+
if (flag_info.is_default) {
42+
for (size_t i = 0; i < fetcher_configs.Size(); ++i) {
43+
kernel_paths.emplace_back(
44+
fetcher_configs.ForInstance(i).FindCvdFileWithSuffix("kernel"));
45+
}
46+
} else {
47+
kernel_paths = android::base::Split(flag_info.current_value, ",");
48+
}
4549

4650
return KernelPathFlag(std::move(kernel_paths));
4751
}

0 commit comments

Comments
 (0)