Implement mode/owner and string conversions

Move Manager::convertToMode() to utils::strToMode();
Move Manager::convertToOwner() to utils::strToOwner();
Add utils::modeToStr() and utils::ownerToStr();
Adjust and add unit tests.

Change-Id: Ied35d0e732c477017e1b2db1a3464b0425b12387
Signed-off-by: Lei YU <mine260309@gmail.com>
8 files changed
tree: 9b6c9480294d2c53eaf892674bac94027084e89d
  1. test/
  2. .gitignore
  3. bmc_epoch.cpp
  4. bmc_epoch.hpp
  5. bmc_time_change_listener.hpp
  6. bootstrap.sh
  7. configure.ac
  8. epoch_base.cpp
  9. epoch_base.hpp
  10. host_epoch.cpp
  11. host_epoch.hpp
  12. LICENSE
  13. main.cpp
  14. Makefile.am
  15. manager.cpp
  16. manager.hpp
  17. property_change_listener.hpp
  18. README.md
  19. settings.cpp
  20. settings.hpp
  21. types.hpp
  22. utils.cpp
  23. utils.hpp
README.md

Introduction

phosphor-time-manager is the time manager service that implements dbus interface xyz/openbmc_project/Time/EpochTime.interface.yaml. User can get or set the BMC's or HOST's time via this interface.

General usage

The service xyz.openbmc_project.Time.Manager provides two objects on dbus:

  • /xyz/openbmc_project/time/bmc
  • /xyz/openbmc_project/time/host

where each object implements interface xyz.openbmc_project.Time.EpochTime.

User can directly get or set the property Elasped of the objects to get or set the time. For example on an authenticated session:

  • To get BMC's time:
    ### With busctl on BMC
    busctl get-property xyz.openbmc_project.Time.Manager \
        /xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
    
    ### With REST API on remote host
    curl -b cjar -k https://bmc-ip/xyz/openbmc_project/time/bmc
    
  • To set HOST's time:
    ### With busctl on BMC
    busctl set-property xyz.openbmc_project.Time.Manager \
        /xyz/openbmc_project/time/host xyz.openbmc_project.Time.EpochTime \
        Elapsed t <value-in-microseconds>
    
    ### With REST API on remote host
    curl -b cjar -k -H "Content-Type: application/json" -X PUT \
        -d '{"data": 1487304700000000}' \
        https://bmc-ip/xyz/openbmc_project/time/host/attr/Elapsed
    

Time settings

Getting BMC or HOST time is always allowed, but setting the time may not be allowed depending on below two settings in settings manager.

  • time_mode
    • NTP: Time is set via NTP server.
    • MANUAL: Time is set manually.
  • time_owner
    • BMC: BMC owns the time and can set the time.
    • HOST: Host owns the time and can set the time.
    • SPLIT: BMC and Host owns separate time.
    • BOTH: Both BMC and Host can set the time.

A summary of which cases the time can be set on BMC or HOST: Mode | Owner | Set BMC Time | Set Host Time --------- | ----- | ------------- | ------------------- NTP | BMC | Not allowed | Not allowed NTP | HOST | Not allowed | Not allowed NTP | SPLIT | Not allowed | OK NTP | BOTH | Not allowed | Not allowed MANUAL | BMC | OK | Not allowed MANUAL | HOST | Not allowed | OK MANUAL | SPLIT | OK | OK MANUAL | BOTH | OK | OK

Pgood

When host is on (pgood == 1), the changes of the above time mode/owner are not applied but deferred. The changes of the mode/owner are saved to persistent storage.

When host is off (pgood == 0), the saved mode/owner are read from persistent storage and are applied.

Note: user can set the time mode and owner in settings daemon at any time, but time manager applying them is governed by the above condition.