buffet: Implement command polling. Now we periodically fetch the queue of commands to run and publish them via CommandManager. BUG=chromium:420604 TEST=cros_workon_make buffet --test&&manual Change-Id: Idfa22145fcfa8d38ab44c1a65cfc5a4469d7c4e1 Reviewed-on: https://chromium-review.googlesource.com/225910 Commit-Queue: Anton Muhin <antonm@chromium.org> Tested-by: Anton Muhin <antonm@chromium.org> Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc index 330b515..d4cee76 100644 --- a/buffet/device_registration_info.cc +++ b/buffet/device_registration_info.cc
@@ -711,11 +711,40 @@ } void DeviceRegistrationInfo::PeriodicallyPollCommands() { - auto delay = base::TimeDelta::FromSeconds(7); - PostRepeatingTask(FROM_HERE, base::Bind([]{ - VLOG(1) << "Poll commands"; - // TODO(antonm): Implement real polling of commands. - }), delay); + VLOG(1) << "Poll commands"; + PostRepeatingTask( + FROM_HERE, + base::Bind( + &DeviceRegistrationInfo::FetchCommands, + base::Unretained(this), + base::Bind(&DeviceRegistrationInfo::PublishCommands, + base::Unretained(this))), + base::TimeDelta::FromSeconds(7)); +} + +void DeviceRegistrationInfo::PublishCommands(const base::ListValue& commands) { + const CommandDictionary& command_dictionary = + command_manager_->GetCommandDictionary(); + + const size_t size{commands.GetSize()}; + for (size_t i = 0; i < size; ++i) { + const base::DictionaryValue* command{nullptr}; + if (!commands.GetDictionary(i, &command)) { + LOG(WARNING) << "No command resource at " << i; + continue; + } + + std::unique_ptr<CommandInstance> command_instance = + CommandInstance::FromJson(command, command_dictionary, nullptr); + if (!command_instance) { + LOG(WARNING) << "Failed to parse a command"; + continue; + } + + // TODO(antonm): Double check if there is a chance to publish + // the same command twice if it doesn't change its status. + command_manager_->AddCommand(std::move(command_instance)); + } } } // namespace buffet
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h index c683e37..c9b6335 100644 --- a/buffet/device_registration_info.h +++ b/buffet/device_registration_info.h
@@ -145,6 +145,8 @@ void PeriodicallyPollCommands(); + void PublishCommands(const base::ListValue& commands); + // Builds Cloud API devices collection REST resouce which matches // current state of the device including command definitions // for all supported commands and current device state.