blob: ba7c9345afc4c1ec91426ec4c4c16a9b81da7e11 [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "leaderd/group_config.h"
#include <base/rand_util.h>
#include "leaderd/errors.h"
namespace leaderd {
namespace group_options {
const char kMinWandererTimeoutSeconds[] = "min_wanderer_timeout_ms";
const char kMaxWandererTimeoutSeconds[] = "max_wanderer_timeout_ms";
const char kLeaderSteadyStateTimeoutSeconds[] =
"leader_steady_state_timeout_ms";
const char kIsPersistent[] = "persistent";
} // namespace group_options
bool GroupConfig::Load(const std::map<std::string, chromeos::Any>& options,
chromeos::ErrorPtr* error) {
size_t parsed_fields = 0;
auto it = options.find(group_options::kMinWandererTimeoutSeconds);
int32_t timeout_value; // This decides the parsed type of our DBus interface.
if (it != options.end()) {
if (!it->second.GetValue(&timeout_value) || timeout_value < 0) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions, "Bad min wanderer time");
return false;
}
min_wanderer_timeout_ms_ = timeout_value;
++parsed_fields;
}
it = options.find(group_options::kMaxWandererTimeoutSeconds);
if (it != options.end()) {
if (!it->second.GetValue(&timeout_value) || timeout_value < 0) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions, "Bad max wanderer time");
return false;
}
max_wanderer_timeout_ms_ = timeout_value;
++parsed_fields;
}
if (min_wanderer_timeout_ms_ > max_wanderer_timeout_ms_) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions,
"Min wanderer timeout greater than max");
return false;
}
it = options.find(group_options::kLeaderSteadyStateTimeoutSeconds);
if (it != options.end()) {
if (!it->second.GetValue(&timeout_value) || timeout_value < 0) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions,
"Bad leader steady state timeout");
return false;
}
leader_steady_state_timeout_ms_ = timeout_value;
++parsed_fields;
}
it = options.find(group_options::kIsPersistent);
if (it != options.end()) {
if (!it->second.GetValue(&is_persistent_)) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions, "Bad persistent value.");
return false;
}
++parsed_fields;
}
if (parsed_fields != options.size()) {
chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain,
errors::kBadOptions, "Got unexpected options.");
return false;
}
return true;
}
uint64_t GroupConfig::PickWandererTimeoutMs() const {
const uint64_t offset_range = 1 + (max_wanderer_timeout_ms_ -
min_wanderer_timeout_ms_);
return min_wanderer_timeout_ms_ + base::RandGenerator(offset_range);
}
} // namespace leaderd