From 7514fe92cd4f5e5c854b91f11dc6ac399d9e6ba6 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Sat, 18 Aug 2012 16:54:54 +0200
Subject: [PATCH] Add Objects definitions for the ispec/ipolicy types

Note that since we don't have yet a way to nicely handle two-level
optional parameters, the Filled/Partial types and filling function are
all manually built.

Signed-off-by: Iustin Pop <iustin@google.com>
Reviewed-by: Agata Murawska <agatamurawska@google.com>
---
 htools/Ganeti/HTools/QC.hs |  2 +-
 htools/Ganeti/Objects.hs   | 70 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/htools/Ganeti/HTools/QC.hs b/htools/Ganeti/HTools/QC.hs
index bd58d3993..5bf17d675 100644
--- a/htools/Ganeti/HTools/QC.hs
+++ b/htools/Ganeti/HTools/QC.hs
@@ -540,7 +540,7 @@ instance Arbitrary Objects.Hypervisor where
   arbitrary = elements [minBound..maxBound]
 
 instance Arbitrary Objects.PartialNDParams where
-  arbitrary = Objects.PartialNDParams <$> arbitrary
+  arbitrary = Objects.PartialNDParams <$> arbitrary <*> arbitrary
 
 instance Arbitrary Objects.Node where
   arbitrary = Objects.Node <$> getFQDN <*> getFQDN <*> getFQDN
diff --git a/htools/Ganeti/Objects.hs b/htools/Ganeti/Objects.hs
index 9b98b8fa1..380524c03 100644
--- a/htools/Ganeti/Objects.hs
+++ b/htools/Ganeti/Objects.hs
@@ -52,6 +52,12 @@ module Ganeti.Objects
   , fillNDParams
   , Node(..)
   , AllocPolicy(..)
+  , FilledISpecParams(..)
+  , PartialISpecParams(..)
+  , fillISpecParams
+  , FilledIPolicy(..)
+  , PartialIPolicy(..)
+  , fillIPolicy
   , NodeGroup(..)
   , IpFamily(..)
   , ipFamilyToVersion
@@ -289,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" $
@@ -333,7 +397,8 @@ $(buildObject "NodeGroup" "group" $
   [ simpleField "name"         [t| String |]
   , defaultField  [| [] |] $ simpleField "members" [t| [String] |]
   , simpleField "ndparams"     [t| PartialNDParams |]
-  , simpleField "alloc_policy" [t| AllocPolicy |]
+  , simpleField "alloc_policy" [t| AllocPolicy     |]
+  , simpleField "ipolicy"      [t| PartialIPolicy  |]
   ]
   ++ timeStampFields
   ++ uuidFields
@@ -388,6 +453,7 @@ $(buildObject "Cluster" "cluster" $
   , simpleField "blacklisted_os"            [t| [String]           |]
   , simpleField "primary_ip_family"         [t| IpFamily           |]
   , simpleField "prealloc_wipe_disks"       [t| Bool               |]
+  , simpleField "ipolicy"                   [t| FilledIPolicy      |]
  ]
  ++ serialFields
  ++ timeStampFields
-- 
GitLab