New setting to mark postinstall as optional.
This setting allows to mark a postinstall script as optional. This
allows the postinstall program to fail when it is not strictly required
to run for the update to succeed.
Bug: 27178350
TEST=Added unittest. Sideloaded an update with an optional postinstall.
Change-Id: I41956d3308f3458b6bf94b835c9b5e470c84ca41
diff --git a/payload_generator/payload_file.cc b/payload_generator/payload_file.cc
index de81a39..2f95b21 100644
--- a/payload_generator/payload_file.cc
+++ b/payload_generator/payload_file.cc
@@ -138,6 +138,7 @@
partition->set_postinstall_path(part.postinstall.path);
if (!part.postinstall.filesystem_type.empty())
partition->set_filesystem_type(part.postinstall.filesystem_type);
+ partition->set_postinstall_optional(part.postinstall.optional);
}
for (const AnnotatedOperation& aop : part.aops) {
*partition->add_operations() = aop.op;
diff --git a/payload_generator/payload_generation_config.cc b/payload_generator/payload_generation_config.cc
index c705f60..38a72a9 100644
--- a/payload_generator/payload_generation_config.cc
+++ b/payload_generator/payload_generation_config.cc
@@ -28,7 +28,7 @@
namespace chromeos_update_engine {
bool PostInstallConfig::IsEmpty() const {
- return run == false && path.empty() && filesystem_type.empty();
+ return !run && path.empty() && filesystem_type.empty() && !optional;
}
bool PartitionConfig::ValidateExists() const {
@@ -90,6 +90,8 @@
store.GetString("POSTINSTALL_PATH_" + part.name, &part.postinstall.path);
store.GetString("FILESYSTEM_TYPE_" + part.name,
&part.postinstall.filesystem_type);
+ store.GetBoolean("POSTINSTALL_OPTIONAL_" + part.name,
+ &part.postinstall.optional);
}
if (!found_postinstall) {
LOG(ERROR) << "No valid postinstall config found.";
diff --git a/payload_generator/payload_generation_config.h b/payload_generator/payload_generation_config.h
index 2601821..373c7cd 100644
--- a/payload_generator/payload_generation_config.h
+++ b/payload_generator/payload_generation_config.h
@@ -46,6 +46,9 @@
// The filesystem type used to mount the partition in order to run the
// post-install program.
std::string filesystem_type;
+
+ // Whether this postinstall script should be ignored if it fails.
+ bool optional = false;
};
struct PartitionConfig {
diff --git a/payload_generator/payload_generation_config_unittest.cc b/payload_generator/payload_generation_config_unittest.cc
index 122d94a..3545056 100644
--- a/payload_generator/payload_generation_config_unittest.cc
+++ b/payload_generator/payload_generation_config_unittest.cc
@@ -29,12 +29,14 @@
EXPECT_TRUE(
store.LoadFromString("RUN_POSTINSTALL_root=true\n"
"POSTINSTALL_PATH_root=postinstall\n"
- "FILESYSTEM_TYPE_root=ext4"));
+ "FILESYSTEM_TYPE_root=ext4\n"
+ "POSTINSTALL_OPTIONAL_root=true"));
EXPECT_TRUE(image_config.LoadPostInstallConfig(store));
EXPECT_FALSE(image_config.partitions[0].postinstall.IsEmpty());
EXPECT_EQ(true, image_config.partitions[0].postinstall.run);
EXPECT_EQ("postinstall", image_config.partitions[0].postinstall.path);
EXPECT_EQ("ext4", image_config.partitions[0].postinstall.filesystem_type);
+ EXPECT_TRUE(image_config.partitions[0].postinstall.optional);
}
TEST_F(PayloadGenerationConfigTest, LoadPostInstallConfigNameMismatchTest) {