diff --git a/lib/constants.py b/lib/constants.py index 508d6088e6f214b7471ef58aed65f9f3e525e4bf..b24c055b8bb9dfd224ccfafa1c6ded7b06f5c9ae 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -2280,5 +2280,34 @@ RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid" # Regex string for verifying a UUID UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$" +# Auto-repair tag prefixes +AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:" +AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX +AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:" +AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:" +AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:" + +# Auto-repair levels +AUTO_REPAIR_FIX_STORAGE = "fix-storage" +AUTO_REPAIR_MIGRATE = "migrate" +AUTO_REPAIR_FAILOVER = "failover" +AUTO_REPAIR_REINSTALL = "reinstall" +AUTO_REPAIR_ALL_TYPES = [ + AUTO_REPAIR_FIX_STORAGE, + AUTO_REPAIR_MIGRATE, + AUTO_REPAIR_FAILOVER, + AUTO_REPAIR_REINSTALL, +] + +# Auto-repair results +AUTO_REPAIR_SUCCESS = "success" +AUTO_REPAIR_FAILURE = "failure" +AUTO_REPAIR_ENOPERM = "enoperm" +AUTO_REPAIR_ALL_RESULTS = frozenset([ + AUTO_REPAIR_SUCCESS, + AUTO_REPAIR_FAILURE, + AUTO_REPAIR_ENOPERM, +]) + # Do not re-export imported modules del re, _vcsversion, _autoconf, socket, pathutils, compat diff --git a/src/Ganeti/HTools/Types.hs b/src/Ganeti/HTools/Types.hs index 160473b139635f04bd9bff46ce49d6b1903a64d7..b006dde79d3b8acb2b0867f822ec45d090714ac4 100644 --- a/src/Ganeti/HTools/Types.hs +++ b/src/Ganeti/HTools/Types.hs @@ -72,6 +72,12 @@ module Ganeti.HTools.Types , IPolicy(..) , defIPolicy , rspecFromISpec + , AutoRepairType(..) + , autoRepairTypeToRaw + , autoRepairTypeFromRaw + , AutoRepairResult(..) + , autoRepairResultToRaw + , autoRepairResultFromRaw ) where import qualified Data.Map as M @@ -347,3 +353,19 @@ $(THH.declareSADT "EvacMode" , ("ChangeAll", 'C.iallocatorNevacAll) ]) $(THH.makeJSONInstance ''EvacMode) + +-- | The repair modes for the auto-repair tool. +$(THH.declareSADT "AutoRepairType" + -- Order is important here: from least destructive to most. + [ ("ArFixStorage", 'C.autoRepairFixStorage) + , ("ArMigrate", 'C.autoRepairMigrate) + , ("ArFailover", 'C.autoRepairFailover) + , ("ArReinstall", 'C.autoRepairReinstall) + ]) + +-- | The possible auto-repair results. +$(THH.declareSADT "AutoRepairResult" + [ ("ArSuccess", 'C.autoRepairSuccess) + , ("ArFailure", 'C.autoRepairFailure) + , ("ArEnoperm", 'C.autoRepairEnoperm) + ]) diff --git a/test/hs/Test/Ganeti/HTools/Types.hs b/test/hs/Test/Ganeti/HTools/Types.hs index 5dbcbe71587ca9f90c12d256b6492400ced0f051..7c12c4185be0d501c3db486c9c14b4eb18de2556 100644 --- a/test/hs/Test/Ganeti/HTools/Types.hs +++ b/test/hs/Test/Ganeti/HTools/Types.hs @@ -38,8 +38,10 @@ module Test.Ganeti.HTools.Types ) where import Test.QuickCheck hiding (Result) +import Test.HUnit import Control.Applicative +import Data.List (sort) import Test.Ganeti.TestHelper import Test.Ganeti.TestCommon @@ -47,6 +49,7 @@ import Test.Ganeti.TestHTools import Test.Ganeti.Types () import Ganeti.BasicTypes +import qualified Ganeti.Constants as C import qualified Ganeti.HTools.Types as Types -- * Helpers @@ -146,10 +149,33 @@ prop_eitherToResult ei = Ok v' -> v == v' where r = eitherToResult ei +-- | Test 'AutoRepairType' ordering is as expected and consistent with Python +-- codebase. +case_AutoRepairType_sort :: Assertion +case_AutoRepairType_sort = do + let expected = [ Types.ArFixStorage + , Types.ArMigrate + , Types.ArFailover + , Types.ArReinstall + ] + all_hs_raw = map Types.autoRepairTypeToRaw [minBound..maxBound] + assertEqual "Haskell order" expected [minBound..maxBound] + assertEqual "consistent with Python" C.autoRepairAllTypes all_hs_raw + +-- | Test 'AutoRepairResult' type is equivalent with Python codebase. +case_AutoRepairResult_pyequiv :: Assertion +case_AutoRepairResult_pyequiv = do + let all_py_results = sort C.autoRepairAllResults + all_hs_results = sort $ + map Types.autoRepairResultToRaw [minBound..maxBound] + assertEqual "for AutoRepairResult equivalence" all_py_results all_hs_results + testSuite "HTools/Types" [ 'prop_ISpec_serialisation , 'prop_IPolicy_serialisation , 'prop_EvacMode_serialisation , 'prop_opToResult , 'prop_eitherToResult + , 'case_AutoRepairType_sort + , 'case_AutoRepairResult_pyequiv ]