Enhance the Luxi interface implementation
[ganeti-local] / htools / Ganeti / Objects.hs
index f4e0798..380524c 100644 (file)
@@ -52,7 +52,15 @@ module Ganeti.Objects
   , fillNDParams
   , Node(..)
   , AllocPolicy(..)
+  , FilledISpecParams(..)
+  , PartialISpecParams(..)
+  , fillISpecParams
+  , FilledIPolicy(..)
+  , PartialIPolicy(..)
+  , fillIPolicy
   , NodeGroup(..)
+  , IpFamily(..)
+  , ipFamilyToVersion
   , Cluster(..)
   , ConfigData(..)
   ) where
@@ -251,6 +259,7 @@ $(declareSADT "DiskTemplate"
   , ("DTPlain",      'C.dtPlain)
   , ("DTBlock",      'C.dtBlock)
   , ("DTDrbd8",      'C.dtDrbd8)
+  , ("DTRados",      'C.dtRbd)
   ])
 $(makeJSONInstance ''DiskTemplate)
 
@@ -286,10 +295,68 @@ $(buildObject "Instance" "inst" $
   ++ 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" $
@@ -302,7 +369,7 @@ $(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
@@ -329,13 +396,27 @@ $(makeJSONInstance ''AllocPolicy)
 $(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   |]
@@ -344,33 +425,35 @@ $(buildObject "Cluster" "cluster" $
   , 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