, fillNDParams
, Node(..)
, AllocPolicy(..)
+ , FilledISpecParams(..)
+ , PartialISpecParams(..)
+ , fillISpecParams
+ , FilledIPolicy(..)
+ , PartialIPolicy(..)
+ , fillIPolicy
, NodeGroup(..)
+ , IpFamily(..)
+ , ipFamilyToVersion
, Cluster(..)
, ConfigData(..)
) where
, ("DTPlain", 'C.dtPlain)
, ("DTBlock", 'C.dtBlock)
, ("DTDrbd8", 'C.dtDrbd8)
+ , ("DTRados", 'C.dtRbd)
])
$(makeJSONInstance ''DiskTemplate)
++ uuidFields
++ serialFields)
+-- * IPolicy definitions
+
+$(buildParam "ISpec" "ispec" $
+ [ simpleField C.ispecMemSize [t| Int |]
+ , simpleField C.ispecDiskSize [t| Int |]
+ , simpleField C.ispecDiskCount [t| Int |]
+ , simpleField C.ispecCpuCount [t| Int |]
+ , simpleField C.ispecSpindleUse [t| Int |]
+ ])
+
+-- | Custom partial ipolicy. This is not built via buildParam since it
+-- has a special 2-level inheritance mode.
+$(buildObject "PartialIPolicy" "ipolicy" $
+ [ renameField "MinSpecP" $ simpleField "min" [t| PartialISpecParams |]
+ , renameField "MaxSpecP" $ simpleField "max" [t| PartialISpecParams |]
+ , renameField "StdSpecP" $ simpleField "std" [t| PartialISpecParams |]
+ , optionalField . renameField "SpindleRatioP"
+ $ simpleField "spindle-ratio" [t| Double |]
+ , optionalField . renameField "VcpuRatioP"
+ $ simpleField "vcpu-ratio" [t| Double |]
+ , optionalField . renameField "DiskTemplatesP"
+ $ simpleField "disk-templates" [t| [DiskTemplate] |]
+ ])
+
+-- | Custom filled ipolicy. This is not built via buildParam since it
+-- has a special 2-level inheritance mode.
+$(buildObject "FilledIPolicy" "ipolicy" $
+ [ renameField "MinSpec" $ simpleField "min" [t| FilledISpecParams |]
+ , renameField "MaxSpec" $ simpleField "max" [t| FilledISpecParams |]
+ , renameField "StdSpec" $ simpleField "std" [t| FilledISpecParams |]
+ , simpleField "spindle-ratio" [t| Double |]
+ , simpleField "vcpu-ratio" [t| Double |]
+ , simpleField "disk-templates" [t| [DiskTemplate] |]
+ ])
+
+-- | Custom filler for the ipolicy types.
+fillIPolicy :: FilledIPolicy -> PartialIPolicy -> FilledIPolicy
+fillIPolicy (FilledIPolicy { ipolicyMinSpec = fmin
+ , ipolicyMaxSpec = fmax
+ , ipolicyStdSpec = fstd
+ , ipolicySpindleRatio = fspindleRatio
+ , ipolicyVcpuRatio = fvcpuRatio
+ , ipolicyDiskTemplates = fdiskTemplates})
+ (PartialIPolicy { ipolicyMinSpecP = pmin
+ , ipolicyMaxSpecP = pmax
+ , ipolicyStdSpecP = pstd
+ , ipolicySpindleRatioP = pspindleRatio
+ , ipolicyVcpuRatioP = pvcpuRatio
+ , ipolicyDiskTemplatesP = pdiskTemplates}) =
+ FilledIPolicy { ipolicyMinSpec = fillISpecParams fmin pmin
+ , ipolicyMaxSpec = fillISpecParams fmax pmax
+ , ipolicyStdSpec = fillISpecParams fstd pstd
+ , ipolicySpindleRatio = fromMaybe fspindleRatio pspindleRatio
+ , ipolicyVcpuRatio = fromMaybe fvcpuRatio pvcpuRatio
+ , ipolicyDiskTemplates = fromMaybe fdiskTemplates
+ pdiskTemplates
+ }
-- * Node definitions
$(buildParam "ND" "ndp" $
- [ simpleField "oob_program" [t| String |]
+ [ simpleField "oob_program" [t| String |]
+ , simpleField "spindle_count" [t| Int |]
])
$(buildObject "Node" "node" $
, simpleField "group" [t| String |]
, simpleField "master_capable" [t| Bool |]
, simpleField "vm_capable" [t| Bool |]
--- , simpleField "ndparams" [t| PartialNDParams |]
+ , simpleField "ndparams" [t| PartialNDParams |]
, simpleField "powered" [t| Bool |]
]
++ timeStampFields
$(buildObject "NodeGroup" "group" $
[ simpleField "name" [t| String |]
, defaultField [| [] |] $ simpleField "members" [t| [String] |]
--- , simpleField "ndparams" [t| PartialNDParams |]
- , simpleField "alloc_policy" [t| AllocPolicy |]
+ , simpleField "ndparams" [t| PartialNDParams |]
+ , simpleField "alloc_policy" [t| AllocPolicy |]
+ , simpleField "ipolicy" [t| PartialIPolicy |]
]
++ timeStampFields
++ uuidFields
++ serialFields)
+-- | IP family type
+$(declareIADT "IpFamily"
+ [ ("IpFamilyV4", 'C.ip4Family)
+ , ("IpFamilyV6", 'C.ip6Family)
+ ])
+$(makeJSONInstance ''IpFamily)
+
+-- | Conversion from IP family to IP version. This is needed because
+-- Python uses both, depending on context.
+ipFamilyToVersion :: IpFamily -> Int
+ipFamilyToVersion IpFamilyV4 = C.ip4Version
+ipFamilyToVersion IpFamilyV6 = C.ip6Version
+
-- * Cluster definitions
$(buildObject "Cluster" "cluster" $
[ simpleField "rsahostkeypub" [t| String |]
, simpleField "mac_prefix" [t| String |]
, simpleField "volume_group_name" [t| String |]
, simpleField "reserved_lvs" [t| [String] |]
--- , simpleField "drbd_usermode_helper" [t| String |]
+ , optionalField $ simpleField "drbd_usermode_helper" [t| String |]
-- , simpleField "default_bridge" [t| String |]
-- , simpleField "default_hypervisor" [t| String |]
, simpleField "master_node" [t| String |]
, simpleField "master_ip" [t| String |]
, simpleField "master_netdev" [t| String |]
--- , simpleField "master_netmask" [t| String |]
+ , simpleField "master_netmask" [t| Int |]
+ , simpleField "use_external_mip_script" [t| Bool |]
, simpleField "cluster_name" [t| String |]
, simpleField "file_storage_dir" [t| String |]
--- , simpleField "shared_file_storage_dir" [t| String |]
+ , simpleField "shared_file_storage_dir" [t| String |]
, simpleField "enabled_hypervisors" [t| [String] |]
-- , simpleField "hvparams" [t| [(String, [(String, String)])] |]
-- , simpleField "os_hvp" [t| [(String, String)] |]
, simpleField "beparams" [t| Container FilledBEParams |]
--- , simpleField "osparams" [t| [(String, String)] |]
+ , simpleField "osparams" [t| Container (Container String) |]
, simpleField "nicparams" [t| Container FilledNICParams |]
--- , simpleField "ndparams" [t| FilledNDParams |]
+ , simpleField "ndparams" [t| FilledNDParams |]
, simpleField "candidate_pool_size" [t| Int |]
, simpleField "modify_etc_hosts" [t| Bool |]
, simpleField "modify_ssh_setup" [t| Bool |]
, simpleField "maintain_node_health" [t| Bool |]
- , simpleField "uid_pool" [t| [Int] |]
+ , simpleField "uid_pool" [t| [(Int, Int)] |]
, simpleField "default_iallocator" [t| String |]
, simpleField "hidden_os" [t| [String] |]
, simpleField "blacklisted_os" [t| [String] |]
- , simpleField "primary_ip_family" [t| Int |]
+ , simpleField "primary_ip_family" [t| IpFamily |]
, simpleField "prealloc_wipe_disks" [t| Bool |]
+ , simpleField "ipolicy" [t| FilledIPolicy |]
]
++ serialFields
++ timeStampFields