LGTM.

Thanks,
Jose

On Thu, Feb 06, 2014 at 05:24:18PM +0100, Santi Raffa wrote:
> Modify InstanceReinstall to accept and process private and secret
> parameters
> 
> Signed-off-by: Santi Raffa <[email protected]>
> ---
>  lib/client/gnt_instance.py       |  4 +++-
>  lib/cmdlib/instance_operation.py | 33 ++++++++++++++++++++++++++-------
>  man/gnt-instance.rst             |  5 ++++-
>  src/Ganeti/OpCodes.hs            |  2 ++
>  src/Ganeti/OpParams.hs           | 14 ++++++++++++++
>  test/hs/Test/Ganeti/OpCodes.hs   |  1 +
>  6 files changed, 50 insertions(+), 9 deletions(-)
> 
> diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py
> index b40ae3d..4ef8e9a 100644
> --- a/lib/client/gnt_instance.py
> +++ b/lib/client/gnt_instance.py
> @@ -395,7 +395,9 @@ def ReinstallInstance(opts, args):
>      op = opcodes.OpInstanceReinstall(instance_name=instance_name,
>                                       os_type=os_name,
>                                       force_variant=opts.force_variant,
> -                                     osparams=opts.osparams)
> +                                     osparams=opts.osparams,
> +                                     osparams_private=opts.osparams_private,
> +                                     osparams_secret=opts.osparams_secret)
>      jex.QueueJob(instance_name, op)
>  
>    results = jex.WaitOrShow(not opts.submit_only)
> diff --git a/lib/cmdlib/instance_operation.py 
> b/lib/cmdlib/instance_operation.py
> index 0f3599b..0282d31 100644
> --- a/lib/cmdlib/instance_operation.py
> +++ b/lib/cmdlib/instance_operation.py
> @@ -292,6 +292,14 @@ class LUInstanceReinstall(LogicalUnit):
>                                   errors.ECODE_INVAL)
>      CheckInstanceState(self, instance, INSTANCE_DOWN, msg="cannot reinstall")
>  
> +    # Handle OS parameters
> +    self._MergeValidateOsParams(instance)
> +
> +    self.instance = instance
> +
> +  def _MergeValidateOsParams(self, instance):
> +    "Handle the OS parameter merging and validation for the target instance."
> +
>      if self.op.os_type is not None:
>        # OS verification
>        CheckNodeHasOS(self, instance.primary_node, self.op.os_type,
> @@ -302,14 +310,25 @@ class LUInstanceReinstall(LogicalUnit):
>  
>      node_uuids = list(instance.all_nodes)
>  
> -    if self.op.osparams:
> -      i_osdict = GetUpdatedParams(instance.osparams, self.op.osparams)
> -      CheckOSParams(self, True, node_uuids, instance_os, i_osdict)
> -      self.os_inst = i_osdict # the new dict (without defaults)
> -    else:
> -      self.os_inst = None
> +    self.op.osparams = self.op.osparams or {}
> +    self.op.osparams_private = self.op.osparams_private or {}
> +    self.op.osparams_secret = self.op.osparams_secret or {}
>  
> -    self.instance = instance
> +    # Handle the use of 'default' values.
> +    params_public = GetUpdatedParams(instance.osparams, self.op.osparams)
> +    params_private = GetUpdatedParams(instance.osparams_private,
> +                                        self.op.osparams_private)
> +    params_secret = self.op.osparams_secret
> +
> +    cluster = self.cfg.GetClusterInfo()
> +    self.os_inst = cluster.SimpleFillOS(
> +      instance_os,
> +      params_public,
> +      os_params_private=params_private,
> +      os_params_secret=params_secret
> +    )
> +
> +    CheckOSParams(self, True, node_uuids, instance_os, self.os_inst)
>  
>    def Exec(self, feedback_fn):
>      """Reinstall the instance.
> diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst
> index 0afd3ed..1b1d995 100644
> --- a/man/gnt-instance.rst
> +++ b/man/gnt-instance.rst
> @@ -1297,7 +1297,10 @@ REINSTALL
>  | **reinstall** [{-o|\--os-type} *os-type*] [\--select-os] [-f *force*]
>  | [\--force-multiple]
>  | [\--instance \| \--node \| \--primary \| \--secondary \| \--all]
> -| [{-O|\--os-parameters} *OS\_PARAMETERS*] [\--submit] [\--print-job-id]
> +| [{-O|\--os-parameters} *OS\_PARAMETERS*]
> +| [--os-parameters-private} *OS\_PARAMETERS*]
> +| [--os-parameters-secret} *OS\_PARAMETERS*]
> +| [\--submit] [\--print-job-id]
>  | {*instance*...}
>  
>  Reinstalls the operating system on the given instance(s). The
> diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs
> index 9dfc1ac..73b4dc1 100644
> --- a/src/Ganeti/OpCodes.hs
> +++ b/src/Ganeti/OpCodes.hs
> @@ -474,6 +474,8 @@ $(genOpCode "OpCode"
>       , pForceVariant
>       , pInstOs
>       , pTempOsParams
> +     , pTempOsParamsPrivate
> +     , pTempOsParamsSecret
>       ],
>       "instance_name")
>    , ("OpInstanceRemove",
> diff --git a/src/Ganeti/OpParams.hs b/src/Ganeti/OpParams.hs
> index 3da9530..59f1cb3 100644
> --- a/src/Ganeti/OpParams.hs
> +++ b/src/Ganeti/OpParams.hs
> @@ -190,6 +190,8 @@ module Ganeti.OpParams
>    , pInstTags
>    , pMultiAllocInstances
>    , pTempOsParams
> +  , pTempOsParamsPrivate
> +  , pTempOsParamsSecret
>    , pTempHvParams
>    , pTempBeParams
>    , pIgnoreFailures
> @@ -1210,6 +1212,18 @@ pTempOsParams =
>    renameField "TempOsParams" .
>    optionalField $ simpleField "osparams" [t| JSObject JSValue |]
>  
> +pTempOsParamsPrivate :: Field
> +pTempOsParamsPrivate =
> +  withDoc "Private OS parameters for instance reinstalls" .
> +  optionalField $
> +  simpleField "osparams_private" [t| JSObject (Private JSValue) |]
> +
> +pTempOsParamsSecret :: Field
> +pTempOsParamsSecret =
> +  withDoc "Secret OS parameters for instance reinstalls" .
> +  optionalField $
> +  simpleField "osparams_secret" [t| JSObject (Private JSValue) |]
> +
>  pShutdownTimeout :: Field
>  pShutdownTimeout =
>    withDoc "How long to wait for instance to shut down" .
> diff --git a/test/hs/Test/Ganeti/OpCodes.hs b/test/hs/Test/Ganeti/OpCodes.hs
> index 3deddad..7cd40b8 100644
> --- a/test/hs/Test/Ganeti/OpCodes.hs
> +++ b/test/hs/Test/Ganeti/OpCodes.hs
> @@ -301,6 +301,7 @@ instance Arbitrary OpCodes.OpCode where
>        "OP_INSTANCE_REINSTALL" ->
>          OpCodes.OpInstanceReinstall <$> genFQDN <*> return Nothing <*>
>            arbitrary <*> genMaybe genNameNE <*> genMaybe (pure emptyJSObject)
> +          <*> genMaybe arbitraryPrivateJSObj <*> genMaybe 
> arbitraryPrivateJSObj
>        "OP_INSTANCE_REMOVE" ->
>          OpCodes.OpInstanceRemove <$> genFQDN <*> return Nothing <*>
>            arbitrary <*> arbitrary
> -- 
> 1.9.0.rc1.175.g0b1dcb5
> 

-- 
Jose Antonio Lopes
Ganeti Engineering
Google Germany GmbH
Dienerstr. 12, 80331, München

Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores
Steuernummer: 48/725/00206
Umsatzsteueridentifikationsnummer: DE813741370

Reply via email to