diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel index 604f3e9e289..1ad7525f946 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel @@ -301,6 +301,7 @@ cf_cc_library( "//cuttlefish/host/commands/assemble_cvd/flags:bootloader", "//cuttlefish/host/commands/assemble_cvd/flags:cpus", "//cuttlefish/host/commands/assemble_cvd/flags:daemon", + "//cuttlefish/host/commands/assemble_cvd/flags:data_policy", "//cuttlefish/host/commands/assemble_cvd/flags:display_proto", "//cuttlefish/host/commands/assemble_cvd/flags:initramfs_path", "//cuttlefish/host/commands/assemble_cvd/flags:kernel_path", diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp index b955a56653b..e1fe2acb28b 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp @@ -27,10 +27,6 @@ #define DEFINE_vec DEFINE_string -DEFINE_vec(data_policy, CF_DEFAULTS_DATA_POLICY, - "How to handle userdata partition." - " Either 'use_existing', 'create_if_missing', 'resize_up_to', or " - "'always_create'."); DEFINE_vec(gdb_port, std::to_string(CF_DEFAULTS_GDB_PORT), "Port number to spawn kernel gdb on e.g. -gdb_port=1234. The" "kernel must have been built with CONFIG_RANDOMIZE_BASE " diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h index 7e180cd4f53..40f31e3294a 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h @@ -20,7 +20,6 @@ #define DECLARE_vec DECLARE_string -DECLARE_vec(data_policy); DECLARE_vec(gdb_port); // TODO(b/192495477): combine these into a single repeatable '--display' flag diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index 1cac6ede01d..12ea66d3ddd 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -56,6 +56,7 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/bootloader.h" #include "cuttlefish/host/commands/assemble_cvd/flags/cpus.h" #include "cuttlefish/host/commands/assemble_cvd/flags/daemon.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" #include "cuttlefish/host/commands/assemble_cvd/flags/display_proto.h" #include "cuttlefish/host/commands/assemble_cvd/flags/initramfs_path.h" #include "cuttlefish/host/commands/assemble_cvd/flags/kernel_path.h" @@ -603,8 +604,8 @@ Result InitializeCuttlefishConfiguration( CF_EXPECT(GET_FLAG_STR_VALUE(gem5_binary_dir)); std::vector gem5_checkpoint_dir_vec = CF_EXPECT(GET_FLAG_STR_VALUE(gem5_checkpoint_dir)); - std::vector data_policy_vec = - CF_EXPECT(GET_FLAG_STR_VALUE(data_policy)); + DataPolicyFlag data_policy_values = + CF_EXPECT(DataPolicyFlag::FromGlobalGflags()); // multi-virtual-device multi-display proto input DisplaysProtoFlag instances_display_configs = @@ -983,7 +984,7 @@ Result InitializeCuttlefishConfiguration( instance.set_camera_server_port(camera_server_port_vec[instance_index]); instance.set_gem5_binary_dir(gem5_binary_dir_vec[instance_index]); instance.set_gem5_checkpoint_dir(gem5_checkpoint_dir_vec[instance_index]); - instance.set_data_policy(data_policy_vec[instance_index]); + instance.set_data_policy(data_policy_values.ForIndex(instance_index)); instance.set_has_wifi_card(enable_wifi_vec[instance_index]); instance.set_mobile_bridge_name(StrForInstance("cvd-mbr-", num)); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel index f71ba865e36..cec3547f283 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/BUILD.bazel @@ -111,6 +111,20 @@ cf_cc_library( ], ) +cf_cc_library( + name = "data_policy", + srcs = ["data_policy.cc"], + hdrs = ["data_policy.h"], + deps = [ + "//cuttlefish/host/commands/assemble_cvd:flags_defaults", + "//cuttlefish/host/commands/assemble_cvd/flags:flag_base", + "//cuttlefish/host/commands/assemble_cvd/flags:from_gflags", + "//cuttlefish/host/libs/config:data_image_policy", + "//cuttlefish/result", + "@gflags", + ], +) + cf_cc_library( name = "display_proto", srcs = ["display_proto.cc"], diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc new file mode 100644 index 00000000000..58909118dbb --- /dev/null +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.cc @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" + +#include +#include +#include + +#include + +#include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/from_gflags.h" +#include "cuttlefish/host/commands/assemble_cvd/flags_defaults.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" +#include "cuttlefish/result/result.h" + +DEFINE_string(data_policy, CF_DEFAULTS_DATA_POLICY, + "How to handle userdata partition. Either 'use_existing', " + "'resize_up_to', or 'always_create'."); + +namespace cuttlefish { +namespace { + +constexpr char kFlagName[] = "data_policy"; + +} // namespace + +Result DataPolicyFlag::FromGlobalGflags() { + const auto flag_info = gflags::GetCommandLineFlagInfoOrDie(kFlagName); + std::vector flag_string_values = + CF_EXPECT(StringFromGlobalGflags(flag_info, kFlagName)); + std::vector flag_values; + std::transform(flag_string_values.cbegin(), flag_string_values.cend(), + flag_values.begin(), DataImagePolicyFromString); + return DataPolicyFlag(std::move(flag_values)); +} + +DataPolicyFlag::DataPolicyFlag(std::vector flag_values) + : FlagBase(std::move(flag_values)) {} + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h new file mode 100644 index 00000000000..da6eb4d7fdd --- /dev/null +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/data_policy.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" +#include "cuttlefish/result/result.h" + +namespace cuttlefish { + +class DataPolicyFlag : public FlagBase { + public: + static Result FromGlobalGflags(); + ~DataPolicyFlag() override = default; + + private: + DataPolicyFlag(std::vector); +}; + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc index 4e8dea5e167..1bd64bfcce4 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.cc @@ -16,29 +16,10 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/flag_base.h" -#include #include -#include -#include namespace cuttlefish { -template -T FlagBase::ForIndex(const std::size_t index) const { - if (index < values_.size()) { - return values_[index]; - } else { - return values_[0]; - } -} - -template -FlagBase::FlagBase(std::vector flag_values) - : values_(std::move(flag_values)) {} - -template -FlagBase::~FlagBase() {} - template class FlagBase; template class FlagBase; template class FlagBase; diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h index 557853ddb5b..b145012e1c8 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags/flag_base.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include namespace cuttlefish { @@ -24,14 +25,27 @@ namespace cuttlefish { template class FlagBase { public: - T ForIndex(const std::size_t index) const; + T ForIndex(const std::size_t index) const { + if (index < values_.size()) { + return values_[index]; + } else { + return values_[0]; + } + } protected: - FlagBase(std::vector flag_values); + FlagBase(std::vector flag_values) : values_(std::move(flag_values)) {} virtual ~FlagBase() = 0; private: std::vector values_; }; +template +FlagBase::~FlagBase() {} + +extern template class FlagBase; +extern template class FlagBase; +extern template class FlagBase; + } // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel index 1347c3b5834..04bab297a32 100644 --- a/base/cvd/cuttlefish/host/libs/config/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/config/BUILD.bazel @@ -124,6 +124,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:config_constants", "//cuttlefish/host/libs/config:config_fragment", "//cuttlefish/host/libs/config:config_utils", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:external_network_mode", "//cuttlefish/host/libs/config:guest_hwui_renderer", "//cuttlefish/host/libs/config:guest_renderer_preload", @@ -155,6 +156,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:boot_flow", "//cuttlefish/host/libs/config:config_utils", "//cuttlefish/host/libs/config:cuttlefish_config", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/config:esp", "//cuttlefish/host/libs/config:openwrt_args", "//cuttlefish/host/libs/image_aggregator:mbr", @@ -164,6 +166,16 @@ cf_cc_library( ], ) +cf_cc_library( + name = "data_image_policy", + srcs = [ + "data_image_policy.cc", + ], + hdrs = [ + "data_image_policy.h", + ], +) + cf_cc_library( name = "display", srcs = ["display.cpp"], diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h index baa6e45cf48..f63a469050b 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h @@ -34,6 +34,7 @@ #include "cuttlefish/host/libs/config/config_constants.h" #include "cuttlefish/host/libs/config/config_fragment.h" #include "cuttlefish/host/libs/config/config_utils.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/external_network_mode.h" #include "cuttlefish/host/libs/config/guest_hwui_renderer.h" #include "cuttlefish/host/libs/config/guest_renderer_preload.h" @@ -470,7 +471,7 @@ class CuttlefishConfig { std::string vcpu_config_path() const; - std::string data_policy() const; + DataImagePolicy data_policy() const; int blank_data_image_mb() const; @@ -707,7 +708,7 @@ class CuttlefishConfig { void set_target_arch(Arch target_arch); void set_cpus(int cpus); void set_vcpu_config_path(const std::string& vcpu_config_path); - void set_data_policy(const std::string& data_policy); + void set_data_policy(DataImagePolicy data_policy); void set_blank_data_image_mb(int blank_data_image_mb); void set_gdb_port(int gdb_port); void set_display_configs(const std::vector& display_configs); diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp index 0293922f966..d64fa4379b8 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp @@ -46,6 +46,7 @@ #include "cuttlefish/host/libs/config/ap_boot_flow.h" #include "cuttlefish/host/libs/config/boot_flow.h" #include "cuttlefish/host/libs/config/config_constants.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/external_network_mode.h" #include "cuttlefish/host/libs/config/guest_hwui_renderer.h" #include "cuttlefish/host/libs/config/guest_renderer_preload.h" @@ -576,11 +577,11 @@ std::string CuttlefishConfig::InstanceSpecific::vcpu_config_path() const { static constexpr char kDataPolicy[] = "data_policy"; void CuttlefishConfig::MutableInstanceSpecific::set_data_policy( - const std::string& data_policy) { - (*Dictionary())[kDataPolicy] = data_policy; + DataImagePolicy data_policy) { + (*Dictionary())[kDataPolicy] = DataImagePolicyString(data_policy); } -std::string CuttlefishConfig::InstanceSpecific::data_policy() const { - return (*Dictionary())[kDataPolicy].asString(); +DataImagePolicy CuttlefishConfig::InstanceSpecific::data_policy() const { + return DataImagePolicyFromString((*Dictionary())[kDataPolicy].asString()); } static constexpr char kBlankDataImageMb[] = "blank_data_image_mb"; diff --git a/base/cvd/cuttlefish/host/libs/config/data_image.cpp b/base/cvd/cuttlefish/host/libs/config/data_image.cpp index c878eacafa9..c1147353d53 100644 --- a/base/cvd/cuttlefish/host/libs/config/data_image.cpp +++ b/base/cvd/cuttlefish/host/libs/config/data_image.cpp @@ -36,6 +36,7 @@ #include "cuttlefish/host/libs/config/boot_flow.h" #include "cuttlefish/host/libs/config/config_utils.h" #include "cuttlefish/host/libs/config/cuttlefish_config.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/config/esp.h" #include "cuttlefish/host/libs/config/openwrt_args.h" #include "cuttlefish/host/libs/image_aggregator/mbr.h" @@ -48,10 +49,6 @@ namespace cuttlefish { namespace { -static constexpr std::string_view kDataPolicyUseExisting = "use_existing"; -static constexpr std::string_view kDataPolicyAlwaysCreate = "always_create"; -static constexpr std::string_view kDataPolicyResizeUpTo = "resize_up_to"; - const int FSCK_ERROR_CORRECTED = 1; const int FSCK_ERROR_CORRECTED_REQUIRES_REBOOT = 2; @@ -135,24 +132,25 @@ enum class DataImageAction { kNoAction, kResizeImage, kCreateBlankImage }; static Result ChooseDataImageAction( const CuttlefishConfig::InstanceSpecific& instance) { - if (instance.data_policy() == kDataPolicyAlwaysCreate) { + if (instance.data_policy() == DataImagePolicy::AlwaysCreate) { return DataImageAction::kCreateBlankImage; } if (!FileHasContent(instance.data_image())) { return DataImageAction::kCreateBlankImage; } - if (instance.data_policy() == kDataPolicyUseExisting) { + if (instance.data_policy() == DataImagePolicy::UseExisting) { return DataImageAction::kNoAction; } auto current_fs_type = GetFsType(instance.data_image()); if (current_fs_type != instance.userdata_format()) { - CF_EXPECT(instance.data_policy() != kDataPolicyResizeUpTo, - "Changing the fs format is incompatible with -data_policy=" - << kDataPolicyResizeUpTo << " (\"" << current_fs_type - << "\" != \"" << instance.userdata_format() << "\")"); + CF_EXPECT(instance.data_policy() != DataImagePolicy::ResizeUpTo, + "Changing the fs format is incompatible with --data_policy=" + << DataImagePolicyString(DataImagePolicy::ResizeUpTo) + << " (\"" << current_fs_type << "\" != \"" + << instance.userdata_format() << "\")"); return DataImageAction::kCreateBlankImage; } - if (instance.data_policy() == kDataPolicyResizeUpTo) { + if (instance.data_policy() == DataImagePolicy::ResizeUpTo) { return DataImageAction::kResizeImage; } return DataImageAction::kNoAction; diff --git a/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc b/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc new file mode 100644 index 00000000000..e72445e66e2 --- /dev/null +++ b/base/cvd/cuttlefish/host/libs/config/data_image_policy.cc @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cuttlefish/host/libs/config/data_image_policy.h" + +#include +#include + +namespace cuttlefish { + +namespace { + +constexpr std::string_view kAlwaysCreate = "always_create"; +constexpr std::string_view kResizeUpTo = "resize_up_to"; +constexpr std::string_view kUnknown = "unknown"; +constexpr std::string_view kUseExisting = "use_existing"; + +} // namespace + +DataImagePolicy DataImagePolicyFromString(std::string_view policy) { + if (policy == kAlwaysCreate) { + return DataImagePolicy::AlwaysCreate; + } else if (policy == kResizeUpTo) { + return DataImagePolicy::ResizeUpTo; + } else if (policy == kUseExisting) { + return DataImagePolicy::UseExisting; + } else { + return DataImagePolicy::Unknown; + } +} + +std::string DataImagePolicyString(DataImagePolicy policy) { + switch (policy) { + case DataImagePolicy::AlwaysCreate: + return std::string(kAlwaysCreate); + case DataImagePolicy::ResizeUpTo: + return std::string(kResizeUpTo); + case DataImagePolicy::UseExisting: + return std::string(kUseExisting); + case DataImagePolicy::Unknown: + return std::string(kUnknown); + } +} + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/libs/config/data_image_policy.h b/base/cvd/cuttlefish/host/libs/config/data_image_policy.h new file mode 100644 index 00000000000..ab0143f4738 --- /dev/null +++ b/base/cvd/cuttlefish/host/libs/config/data_image_policy.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +namespace cuttlefish { + +enum class DataImagePolicy { + AlwaysCreate, + ResizeUpTo, + Unknown, + UseExisting, +}; + +DataImagePolicy DataImagePolicyFromString(std::string_view policy); + +std::string DataImagePolicyString(DataImagePolicy policy); + +} // namespace cuttlefish diff --git a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel index beb9cd9eb53..1ac6a1ad3a9 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel +++ b/base/cvd/cuttlefish/host/libs/metrics/BUILD.bazel @@ -38,6 +38,8 @@ cf_cc_library( deps = [ "//cuttlefish/host/commands/assemble_cvd/flags:cpus", "//cuttlefish/host/commands/assemble_cvd/flags:daemon", + "//cuttlefish/host/commands/assemble_cvd/flags:data_policy", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/result", ], ) @@ -89,6 +91,7 @@ cf_cc_library( ], deps = [ "//cuttlefish/common/libs/utils:host_info", + "//cuttlefish/host/libs/config:data_image_policy", "//cuttlefish/host/libs/metrics:event_type", "//cuttlefish/host/libs/metrics:flag_metrics", "//cuttlefish/host/libs/metrics:guest_metrics", diff --git a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc index 71826aacba3..70333244a23 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc +++ b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.cc @@ -20,6 +20,7 @@ #include "cuttlefish/host/commands/assemble_cvd/flags/cpus.h" #include "cuttlefish/host/commands/assemble_cvd/flags/daemon.h" +#include "cuttlefish/host/commands/assemble_cvd/flags/data_policy.h" #include "cuttlefish/result/result.h" namespace cuttlefish { @@ -30,11 +31,14 @@ Result> GetFlagMetrics(const int guest_count) { CpusFlag cpus_values = CF_EXPECT(CpusFlag::FromGlobalGflags()); DaemonFlag daemon_values = CF_EXPECT(DaemonFlag::FromGlobalGflags()); + DataPolicyFlag data_policy_values = + CF_EXPECT(DataPolicyFlag::FromGlobalGflags()); for (int i = 0; i < guest_count; i++) { result.emplace_back(FlagMetrics{ - .cpus = cpus_values.ForIndex(i), - .daemon = daemon_values.ForIndex(i), + .cpus = cpus_values.ForIndex(i), + .daemon = daemon_values.ForIndex(i), + .data_policy = data_policy_values.ForIndex(i), }); } return result; diff --git a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h index e0b34b23bb3..41f268274d6 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h +++ b/base/cvd/cuttlefish/host/libs/metrics/flag_metrics.h @@ -16,8 +16,10 @@ #pragma once +#include #include +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/result/result.h" namespace cuttlefish { @@ -25,6 +27,7 @@ namespace cuttlefish { struct FlagMetrics { int cpus; bool daemon; + DataImagePolicy data_policy; }; // depends on gflags::ParseCommandLineFlags being called previously diff --git a/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc b/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc index 2a4680f8590..83fb0272641 100644 --- a/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc +++ b/base/cvd/cuttlefish/host/libs/metrics/metrics_conversion.cc @@ -22,6 +22,7 @@ #include "google/protobuf/timestamp.pb.h" #include "cuttlefish/common/libs/utils/host_info.h" +#include "cuttlefish/host/libs/config/data_image_policy.h" #include "cuttlefish/host/libs/metrics/event_type.h" #include "external_proto/cf_flags.pb.h" #include "external_proto/cf_guest.pb.h" @@ -35,6 +36,8 @@ namespace { using google::protobuf::Timestamp; using logs::proto::wireless::android::cuttlefish::CuttlefishLogEvent; using logs::proto::wireless::android::cuttlefish::events::CuttlefishFlags; +using logs::proto::wireless::android::cuttlefish::events:: + CuttlefishFlags_DataPolicy; using logs::proto::wireless::android::cuttlefish::events::CuttlefishGuest; using logs::proto::wireless::android::cuttlefish::events:: CuttlefishGuest_EventType; @@ -42,6 +45,23 @@ using logs::proto::wireless::android::cuttlefish::events::CuttlefishHost; using logs::proto::wireless::android::cuttlefish::events::CuttlefishHost_OsType; using logs::proto::wireless::android::cuttlefish::events::MetricsEventV2; +CuttlefishFlags_DataPolicy ConvertDataPolicy(DataImagePolicy policy) { + switch (policy) { + case DataImagePolicy::AlwaysCreate: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_ALWAYS_CREATE; + case DataImagePolicy::ResizeUpTo: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_RESIZE_UP_TO; + case DataImagePolicy::Unknown: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_UNSPECIFIED; + case DataImagePolicy::UseExisting: + return CuttlefishFlags_DataPolicy:: + CuttlefishFlags_DataPolicy_CUTTLEFISH_FLAGS_DATA_POLICY_USE_EXISTING; + } +} + CuttlefishGuest_EventType ConvertEventType(EventType event_type) { switch (event_type) { case EventType::DeviceInstantiation: @@ -100,6 +120,7 @@ void PopulateCuttlefishGuest(CuttlefishGuest& guest, CuttlefishFlags& flags = *guest.mutable_flags(); flags.set_cpus(flag_metrics.cpus); flags.set_daemon(flag_metrics.daemon); + flags.set_data_policy(ConvertDataPolicy(flag_metrics.data_policy)); } } // namespace