1 #pragma once
2 
3 #include <string>
4 
5 namespace openpower
6 {
7 namespace software
8 {
9 namespace image
10 {
11 
12 /** @class MinimumShipLevel
13  *  @brief Contains minimum ship level verification functions.
14  */
15 class MinimumShipLevel
16 {
17   public:
18     MinimumShipLevel() = delete;
19     MinimumShipLevel(const MinimumShipLevel&) = delete;
20     MinimumShipLevel& operator=(const MinimumShipLevel&) = delete;
21     MinimumShipLevel(MinimumShipLevel&&) = default;
22     MinimumShipLevel& operator=(MinimumShipLevel&&) = default;
23     ~MinimumShipLevel() = default;
24 
25     /** @brief Constructs MinimumShipLevel.
26      *  @param[in] minShipLevel - Minimum Ship Level string
27      */
28     explicit MinimumShipLevel(const std::string& minShipLevel) :
29         minShipLevel(minShipLevel){};
30 
31     /** @brief Verify if the current PNOR version meets the min ship level
32      *  @return true if the verification succeeded, false otherwise
33      */
34     bool verify();
35 
36     /** @brief Version components */
37     struct Version
38     {
39         uint8_t major;
40         uint8_t minor;
41         uint8_t rev;
42     };
43 
44     /** @brief Get the functional PNOR version on the system
45      *  @details If the PNOR version file is not found, don't log an error since
46      *           all PNOR images may had been deleted. If there is an issue with
47      *           the VERSION partition, it should be caught by the host fw code.
48      *  @return The populated or empty version string
49      */
50     std::string getFunctionalVersion();
51 
52     /** @brief Parse the version components into a struct
53      *  @details Version format follows a git tag convention: vX.Y[.Z]
54      *          Reference:
55      *          https://github.com/open-power/op-build/blob/master/openpower/package/VERSION.readme
56      * @param[in]  versionStr - The version string to be parsed
57      * @param[out] version    - The version struct to be populated
58      */
59     void parse(const std::string& versionStr, Version& version);
60 
61     /** @brief Compare the versions provided
62      *  @param[in] a - The first version to compare
63      *  @param[in] b - The second version to compare
64      *  @return 1 if a > b
65      *          0 if a = b
66      *         -1 if a < b
67      */
68     int compare(const Version& a, const Version& b);
69 
70   private:
71     /** Minimum Ship Level to compare against */
72     std::string minShipLevel;
73 };
74 
75 } // namespace image
76 } // namespace software
77 } // namespace openpower
78