, DiskTemplate(..)
, diskTemplateToRaw
, diskTemplateFromRaw
+ , MirrorType(..)
+ , templateMirrorType
, MoveJob
, JobSet
- , Result(..)
- , isOk
- , isBad
- , eitherToResult
- , annotateResult
, Element(..)
, FailMode(..)
, FailStats
, OpResult(..)
, opToResult
- , connTimeout
- , queryTimeout
, EvacMode(..)
, ISpec(..)
, IPolicy(..)
import qualified Ganeti.Constants as C
import qualified Ganeti.THH as THH
import Ganeti.BasicTypes
-import Ganeti.HTools.JSON
+import Ganeti.JSON
-- | The instance index type.
type Idx = Int
, ("DTPlain", 'C.dtPlain)
, ("DTBlock", 'C.dtBlock)
, ("DTDrbd8", 'C.dtDrbd8)
+ , ("DTRbd", 'C.dtRbd)
])
$(THH.makeJSONInstance ''DiskTemplate)
+-- | Mirroring type.
+data MirrorType = MirrorNone -- ^ No mirroring/movability
+ | MirrorInternal -- ^ DRBD-type mirroring
+ | MirrorExternal -- ^ Shared-storage type mirroring
+ deriving (Eq, Show, Read)
+
+-- | Correspondence between disk template and mirror type.
+templateMirrorType :: DiskTemplate -> MirrorType
+templateMirrorType DTDiskless = MirrorExternal
+templateMirrorType DTFile = MirrorNone
+templateMirrorType DTSharedFile = MirrorExternal
+templateMirrorType DTPlain = MirrorNone
+templateMirrorType DTBlock = MirrorExternal
+templateMirrorType DTDrbd8 = MirrorInternal
+templateMirrorType DTRbd = MirrorExternal
+
-- | The Group allocation policy type.
--
-- Note that the order of constructors is important as the automatic
-- | Instance specification type.
$(THH.buildObject "ISpec" "iSpec"
- [ THH.renameField "MemorySize" $ THH.simpleField "memory-size" [t| Int |]
- , THH.renameField "CpuCount" $ THH.simpleField "cpu-count" [t| Int |]
- , THH.renameField "DiskSize" $ THH.simpleField "disk-size" [t| Int |]
- , THH.renameField "DiskCount" $ THH.simpleField "disk-count" [t| Int |]
- , THH.renameField "NicCount" $ THH.simpleField "nic-count" [t| Int |]
+ [ THH.renameField "MemorySize" $ THH.simpleField C.ispecMemSize [t| Int |]
+ , THH.renameField "CpuCount" $ THH.simpleField C.ispecCpuCount [t| Int |]
+ , THH.renameField "DiskSize" $ THH.simpleField C.ispecDiskSize [t| Int |]
+ , THH.renameField "DiskCount" $ THH.simpleField C.ispecDiskCount [t| Int |]
+ , THH.renameField "NicCount" $ THH.simpleField C.ispecNicCount [t| Int |]
+ , THH.renameField "SpindleUse" $ THH.simpleField C.ispecSpindleUse [t| Int |]
])
-- | The default minimum ispec.
, iSpecDiskSize = C.ipolicyDefaultsMinDiskSize
, iSpecDiskCount = C.ipolicyDefaultsMinDiskCount
, iSpecNicCount = C.ipolicyDefaultsMinNicCount
+ , iSpecSpindleUse = C.ipolicyDefaultsMinSpindleUse
}
-- | The default standard ispec.
, iSpecDiskSize = C.ipolicyDefaultsStdDiskSize
, iSpecDiskCount = C.ipolicyDefaultsStdDiskCount
, iSpecNicCount = C.ipolicyDefaultsStdNicCount
+ , iSpecSpindleUse = C.ipolicyDefaultsStdSpindleUse
}
-- | The default max ispec.
, iSpecDiskSize = C.ipolicyDefaultsMaxDiskSize
, iSpecDiskCount = C.ipolicyDefaultsMaxDiskCount
, iSpecNicCount = C.ipolicyDefaultsMaxNicCount
+ , iSpecSpindleUse = C.ipolicyDefaultsMaxSpindleUse
}
-- | Instance policy type.
$(THH.buildObject "IPolicy" "iPolicy"
- [ THH.renameField "StdSpec" $ THH.simpleField "std" [t| ISpec |]
- , THH.renameField "MinSpec" $ THH.simpleField "min" [t| ISpec |]
- , THH.renameField "MaxSpec" $ THH.simpleField "max" [t| ISpec |]
+ [ THH.renameField "StdSpec" $ THH.simpleField C.ispecsStd [t| ISpec |]
+ , THH.renameField "MinSpec" $ THH.simpleField C.ispecsMin [t| ISpec |]
+ , THH.renameField "MaxSpec" $ THH.simpleField C.ispecsMax [t| ISpec |]
, THH.renameField "DiskTemplates" $
- THH.simpleField "disk_templates" [t| [DiskTemplate] |]
+ THH.simpleField C.ipolicyDts [t| [DiskTemplate] |]
, THH.renameField "VcpuRatio" $
- THH.simpleField "vcpu_ratio" [t| Double |]
+ THH.simpleField C.ipolicyVcpuRatio [t| Double |]
+ , THH.renameField "SpindleRatio" $
+ THH.simpleField C.ipolicySpindleRatio [t| Double |]
])
-- | Converts an ISpec type to a RSpec one.
-- hardcoding here since Constants.hs exports the
-- string values, not the actual type; and in
-- htools, we are mostly looking at DRBD
- , iPolicyDiskTemplates = [DTDrbd8, DTPlain]
+ , iPolicyDiskTemplates = [minBound..maxBound]
, iPolicyVcpuRatio = C.ipolicyDefaultsVcpuRatio
+ , iPolicySpindleRatio = C.ipolicyDefaultsSpindleRatio
}
-- | The dynamic resource specs of a machine (i.e. load or load
-- | An instance move definition.
data IMove = Failover -- ^ Failover the instance (f)
+ | FailoverToAny Ndx -- ^ Failover to a random node
+ -- (fa:np), for shared storage
| ReplacePrimary Ndx -- ^ Replace primary (f, r:np, f)
| ReplaceSecondary Ndx -- ^ Replace secondary (r:ns)
| ReplaceAndFailover Ndx -- ^ Replace secondary, failover (r:np, f)
-- | A list of command elements.
type JobSet = [MoveJob]
--- | Connection timeout (when using non-file methods).
-connTimeout :: Int
-connTimeout = 15
-
--- | The default timeout for queries (when using non-file methods).
-queryTimeout :: Int
-queryTimeout = 60
-
-- | Default max disk usage ratio.
defReservedDiskRatio :: Double
defReservedDiskRatio = 0