update_engine: Add minimum version policy
Make the minimum version policy available in the update_engine.
This policy is set to a minimum Chrome OS version the device
must have to run.
No-update windows will not apply if the device's
version is below minimum version.
If during a Kiosk update Chrome is unreachable and we can not
determine the required Chrome OS version, we will fall back to
minimum device version and update if the device's version is older.
BUG=chromium:1117450, chromium:1084453
TEST=cros_run_unit_test --board ${BOARD} --packages update_engine
Change-Id: Ie4fc868805718c9a08a562350bfb015a70a190ac
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/system/update_engine/+/2388067
Tested-by: Miriam Polzer <mpolzer@google.com>
Commit-Queue: Miriam Polzer <mpolzer@google.com>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
diff --git a/update_manager/boxed_value.cc b/update_manager/boxed_value.cc
index b499c30..ee7236c 100644
--- a/update_manager/boxed_value.cc
+++ b/update_manager/boxed_value.cc
@@ -23,6 +23,7 @@
#include <base/strings/string_number_conversions.h>
#include <base/time/time.h>
+#include <base/version.h>
#include "update_engine/common/utils.h"
#include "update_engine/connection_utils.h"
@@ -250,4 +251,12 @@
return "Unknown";
}
+template <>
+string BoxedValue::ValuePrinter<base::Version>(const void* value) {
+ const base::Version* val = reinterpret_cast<const base::Version*>(value);
+ if (val->IsValid())
+ return val->GetString();
+ return "Unknown";
+}
+
} // namespace chromeos_update_manager
diff --git a/update_manager/device_policy_provider.h b/update_manager/device_policy_provider.h
index f177e71..a59f2a3 100644
--- a/update_manager/device_policy_provider.h
+++ b/update_manager/device_policy_provider.h
@@ -21,6 +21,7 @@
#include <string>
#include <base/time/time.h>
+#include <base/version.h>
#include <policy/libpolicy.h>
#include "update_engine/update_manager/provider.h"
@@ -92,6 +93,10 @@
virtual Variable<ChannelDowngradeBehavior>*
var_channel_downgrade_behavior() = 0;
+ // Variable that contains Chrome OS minimum required version. It contains a
+ // Chrome OS version number.
+ virtual Variable<base::Version>* var_device_minimum_version() = 0;
+
protected:
DevicePolicyProvider() {}
diff --git a/update_manager/fake_device_policy_provider.h b/update_manager/fake_device_policy_provider.h
index 44a9464..55d66b3 100644
--- a/update_manager/fake_device_policy_provider.h
+++ b/update_manager/fake_device_policy_provider.h
@@ -100,6 +100,10 @@
return &var_channel_downgrade_behavior_;
}
+ FakeVariable<base::Version>* var_device_minimum_version() override {
+ return &var_device_minimum_version_;
+ }
+
private:
FakeVariable<bool> var_device_policy_is_loaded_{"policy_is_loaded",
kVariableModePoll};
@@ -133,6 +137,8 @@
"disallowed_time_intervals", kVariableModePoll};
FakeVariable<ChannelDowngradeBehavior> var_channel_downgrade_behavior_{
"channel_downgrade_behavior", kVariableModePoll};
+ FakeVariable<base::Version> var_device_minimum_version_{
+ "device_minimum_version", kVariableModePoll};
DISALLOW_COPY_AND_ASSIGN(FakeDevicePolicyProvider);
};
diff --git a/update_manager/real_device_policy_provider.cc b/update_manager/real_device_policy_provider.cc
index 51d01d5..0aaf20e 100644
--- a/update_manager/real_device_policy_provider.cc
+++ b/update_manager/real_device_policy_provider.cc
@@ -264,6 +264,8 @@
&RealDevicePolicyProvider::ConvertDisallowedTimeIntervals);
UpdateVariable(&var_channel_downgrade_behavior_,
&RealDevicePolicyProvider::ConvertChannelDowngradeBehavior);
+ UpdateVariable(&var_device_minimum_version_,
+ &DevicePolicy::GetHighestDeviceMinimumVersion);
}
} // namespace chromeos_update_manager
diff --git a/update_manager/real_device_policy_provider.h b/update_manager/real_device_policy_provider.h
index 134e118..ebda8fd 100644
--- a/update_manager/real_device_policy_provider.h
+++ b/update_manager/real_device_policy_provider.h
@@ -118,6 +118,10 @@
return &var_channel_downgrade_behavior_;
}
+ Variable<base::Version>* var_device_minimum_version() override {
+ return &var_device_minimum_version_;
+ }
+
private:
FRIEND_TEST(UmRealDevicePolicyProviderTest, RefreshScheduledTest);
FRIEND_TEST(UmRealDevicePolicyProviderTest, NonExistentDevicePolicyReloaded);
@@ -228,6 +232,8 @@
"auto_launched_kiosk_app_id"};
AsyncCopyVariable<ChannelDowngradeBehavior> var_channel_downgrade_behavior_{
"channel_downgrade_behavior"};
+ AsyncCopyVariable<base::Version> var_device_minimum_version_{
+ "device_minimum_version"};
DISALLOW_COPY_AND_ASSIGN(RealDevicePolicyProvider);
};
diff --git a/update_manager/real_device_policy_provider_unittest.cc b/update_manager/real_device_policy_provider_unittest.cc
index fd46d6e..4699ad1 100644
--- a/update_manager/real_device_policy_provider_unittest.cc
+++ b/update_manager/real_device_policy_provider_unittest.cc
@@ -430,4 +430,19 @@
provider_->var_channel_downgrade_behavior());
}
+TEST_F(UmRealDevicePolicyProviderTest, DeviceMinimumVersionPolicySet) {
+ SetUpExistentDevicePolicy();
+
+ base::Version device_minimum_version("13315.60.12");
+
+ EXPECT_CALL(mock_device_policy_, GetHighestDeviceMinimumVersion(_))
+ .WillRepeatedly(
+ DoAll(SetArgPointee<0>(device_minimum_version), Return(true)));
+ EXPECT_TRUE(provider_->Init());
+ loop_.RunOnce(false);
+
+ UmTestUtils::ExpectVariableHasValue(device_minimum_version,
+ provider_->var_device_minimum_version());
+}
+
} // namespace chromeos_update_manager