Merge branch 'stable-2.12' into stable-2.13
authorKlaus Aehlig <aehlig@google.com>
Thu, 22 Oct 2015 08:51:36 +0000 (10:51 +0200)
committerKlaus Aehlig <aehlig@google.com>
Thu, 22 Oct 2015 09:37:24 +0000 (11:37 +0200)
* stable-2.12
  Fix inconsistency in python and haskell objects
  Add notSerializeDefault default field option
  Move design-disks.rst to drafts

* stable-2.11
  Fix default for --default-iallocator-params

Conflicts:
doc/design-draft.rst
doc/index.rst
lib/cli.py

Resolution:
for lib/cli.py follow the code move
for the rest, take all additions.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Oleg Ponomarev <oponomarev@google.com>

doc/design-draft.rst
lib/cli_opts.py
lib/client/gnt_cluster.py
src/Ganeti/Objects.hs
src/Ganeti/THH.hs
test/hs/Test/Ganeti/Objects.hs

index 0cfa13f..bc6735c 100644 (file)
@@ -24,6 +24,7 @@ Design document drafts
    design-sync-rate-throttling.rst
    design-network2.rst
    design-configlock.rst
+   design-disks.rst
 
 .. vim: set textwidth=72 :
 .. Local Variables:
index ec974cb..79de008 100644 (file)
@@ -686,7 +686,7 @@ DEFAULT_IALLOCATOR_PARAMS_OPT = cli_option("--default-iallocator-params",
                                            " template:option=value,"
                                            " option=value,...",
                                            type="keyval",
-                                           default={})
+                                           default=None)
 
 OS_OPT = cli_option("-o", "--os-type", dest="os", help="What OS to run",
                     metavar="<os>",
index 7304aab..fa29f9f 100644 (file)
@@ -1336,7 +1336,7 @@ def SetClusterParams(opts, args):
           opts.add_uids is not None or
           opts.remove_uids is not None or
           opts.default_iallocator is not None or
-          opts.default_iallocator_params or
+          opts.default_iallocator_params is not None or
           opts.reserved_lvs is not None or
           opts.mac_prefix is not None or
           opts.master_netdev is not None or
index 5060898..4bbf5b6 100644 (file)
@@ -711,6 +711,18 @@ $(buildParam "ND" "ndp"
   , simpleField "cpu_speed"     [t| Double |]
   ])
 
+-- | Disk state parameters.
+--
+-- As according to the documentation this option is unused by Ganeti,
+-- the content is just a 'JSValue'.
+type DiskState = Container JSValue
+
+-- | Hypervisor state parameters.
+--
+-- As according to the documentation this option is unused by Ganeti,
+-- the content is just a 'JSValue'.
+type HypervisorState = Container JSValue
+
 $(buildObject "Node" "node" $
   [ simpleField "name"             [t| String |]
   , simpleField "primary_ip"       [t| String |]
@@ -723,6 +735,10 @@ $(buildObject "Node" "node" $
   , simpleField "vm_capable"       [t| Bool   |]
   , simpleField "ndparams"         [t| PartialNDParams |]
   , simpleField "powered"          [t| Bool   |]
+  , notSerializeDefaultField [| emptyContainer |] $
+    simpleField "hv_state_static"   [t| HypervisorState |]
+  , notSerializeDefaultField [| emptyContainer |] $
+    simpleField "disk_state_static" [t| DiskState       |]
   ]
   ++ timeStampFields
   ++ uuidFields
@@ -758,6 +774,10 @@ $(buildObject "NodeGroup" "group" $
   , simpleField "ipolicy"      [t| PartialIPolicy  |]
   , simpleField "diskparams"   [t| GroupDiskParams |]
   , simpleField "networks"     [t| Networks        |]
+  , notSerializeDefaultField [| emptyContainer |] $
+    simpleField "hv_state_static"   [t| HypervisorState |]
+  , notSerializeDefaultField [| emptyContainer |] $
+    simpleField "disk_state_static" [t| DiskState       |]
   ]
   ++ timeStampFields
   ++ uuidFields
@@ -923,18 +943,6 @@ type IAllocatorParams = Container JSValue
 -- | The master candidate client certificate digests
 type CandidateCertificates = Container String
 
--- | Disk state parameters.
---
--- As according to the documentation this option is unused by Ganeti,
--- the content is just a 'JSValue'.
-type DiskState = Container JSValue
-
--- | Hypervisor state parameters.
---
--- As according to the documentation this option is unused by Ganeti,
--- the content is just a 'JSValue'.
-type HypervisorState = Container JSValue
-
 -- * Cluster definitions
 $(buildObject "Cluster" "cluster" $
   [ simpleField "rsahostkeypub"                  [t| String                  |]
index 2aa0d95..e716aca 100644 (file)
@@ -61,6 +61,7 @@ module Ganeti.THH ( declareSADT
                   , andRestArguments
                   , withDoc
                   , defaultField
+                  , notSerializeDefaultField
                   , optionalField
                   , optionalNullSerField
                   , renameField
@@ -176,6 +177,9 @@ data Field = Field { fieldName        :: String
                      -- ^ a list of extra keys added by 'fieldShow'
                    , fieldDefault     :: Maybe (Q Exp)
                      -- ^ an optional default value of type @t@
+                   , fieldSerializeDefault :: Bool
+                     -- ^ whether not presented default value will be
+                     -- serialized
                    , fieldConstr      :: Maybe String
                    , fieldIsOptional  :: OptionalType
                      -- ^ determines if a field is optional, and if yes,
@@ -192,6 +196,7 @@ simpleField fname ftype =
         , fieldShow        = Nothing
         , fieldExtraKeys   = []
         , fieldDefault     = Nothing
+        , fieldSerializeDefault = True
         , fieldConstr      = Nothing
         , fieldIsOptional  = NotOptional
         , fieldDoc         = ""
@@ -206,6 +211,7 @@ andRestArguments fname =
         , fieldShow        = Nothing
         , fieldExtraKeys   = []
         , fieldDefault     = Nothing
+        , fieldSerializeDefault = True
         , fieldConstr      = Nothing
         , fieldIsOptional  = AndRestArguments
         , fieldDoc         = ""
@@ -224,6 +230,13 @@ renameField constrName field = field { fieldConstr = Just constrName }
 defaultField :: Q Exp -> Field -> Field
 defaultField defval field = field { fieldDefault = Just defval }
 
+-- | A defaultField which will be serialized only if it's value differs from
+-- a default value.
+notSerializeDefaultField :: Q Exp -> Field -> Field
+notSerializeDefaultField defval field =
+  field { fieldDefault = Just defval
+        , fieldSerializeDefault = False }
+
 -- | Marks a field optional (turning its base type into a Maybe).
 optionalField :: Field -> Field
 optionalField field = field { fieldIsOptional = OptionalOmitNull }
@@ -1037,7 +1050,14 @@ saveObjectField fvar field = do
                                    Nothing -> [( $nameE, JSON.JSNull )]
                                    Just v  -> $(formatCode [| v |])
                               |]
-    NotOptional ->            formatCode fvarE
+    NotOptional -> case (fieldDefault field, fieldSerializeDefault field) of
+                     (Just v, False) -> [| if $v /= $fvarE
+                                             then $(formatCode fvarE)
+                                             else [] |]
+                     -- If a default value exists and we shouldn't serialize
+                     -- default fields - serialize only if the value differs
+                     -- from the default one.
+                     _ -> formatCode fvarE
     AndRestArguments -> [| M.toList $(varE fvar) |]
   where nameE = stringE (fieldName field)
         fvarE = varE fvar
index be0733f..6edab31 100644 (file)
@@ -95,8 +95,8 @@ instance Arbitrary Node where
   arbitrary = Node <$> genFQDN <*> genFQDN <*> genFQDN
               <*> arbitrary <*> arbitrary <*> arbitrary <*> genFQDN
               <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
-              <*> arbitrary <*> arbitrary <*> genFQDN <*> arbitrary
-              <*> (Set.fromList <$> genTags)
+              <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
+              <*> genFQDN <*> arbitrary <*> (Set.fromList <$> genTags)
 
 $(genArbitrary ''BlockDriver)
 
@@ -569,6 +569,8 @@ genNodeGroup = do
   nic_param_list <- vectorOf num_networks (arbitrary::Gen PartialNicParams)
   net_map <- pure (GenericContainer . Map.fromList $
     zip net_uuid_list nic_param_list)
+  hv_state <- arbitrary
+  disk_state <- arbitrary
   -- timestamp fields
   ctime <- arbitrary
   mtime <- arbitrary
@@ -576,7 +578,7 @@ genNodeGroup = do
   serial <- arbitrary
   tags <- Set.fromList <$> genTags
   let group = NodeGroup name members ndparams alloc_policy ipolicy diskparams
-              net_map ctime mtime uuid serial tags
+              net_map hv_state disk_state ctime mtime uuid serial tags
   return group
 
 instance Arbitrary NodeGroup where