Revision 1a182390

b/lib/backend.py
3604 3604
  @type checks: list
3605 3605
  @param checks: list of the checks to run (currently only 'parameters')
3606 3606
  @type osparams: dict
3607
  @param osparams: dictionary with OS parameters
3607
  @param osparams: dictionary with OS parameters, some of which may be
3608
                   private.
3608 3609
  @rtype: boolean
3609 3610
  @return: True if the validation passed, or False if the OS was not
3610 3611
      found and L{required} was false
b/lib/client/gnt_instance.py
1310 1310
  @return: the desired exit code
1311 1311

  
1312 1312
  """
1313
  if not (opts.nics or opts.disks or opts.disk_template or
1314
          opts.hvparams or opts.beparams or opts.os or opts.osparams or
1315
          opts.offline_inst or opts.online_inst or opts.runtime_mem or
1313
  if not (opts.nics or opts.disks or opts.disk_template or opts.hvparams or
1314
          opts.beparams or opts.os or opts.osparams or opts.osparams_private
1315
          or opts.offline_inst or opts.online_inst or opts.runtime_mem or
1316 1316
          opts.new_primary_node):
1317 1317
    ToStderr("Please give at least one of the parameters.")
1318 1318
    return 1
......
1372 1372
                                   runtime_mem=opts.runtime_mem,
1373 1373
                                   os_name=opts.os,
1374 1374
                                   osparams=opts.osparams,
1375
                                   osparams_private=opts.osparams_private,
1375 1376
                                   force_variant=opts.force_variant,
1376 1377
                                   force=opts.force,
1377 1378
                                   wait_for_sync=opts.wait_for_sync,
b/lib/cmdlib/instance.py
2475 2475
    if not (self.op.nics or self.op.disks or self.op.disk_template or
2476 2476
            self.op.hvparams or self.op.beparams or self.op.os_name or
2477 2477
            self.op.osparams or self.op.offline is not None or
2478
            self.op.runtime_mem or self.op.pnode):
2478
            self.op.runtime_mem or self.op.pnode or self.op.osparams_private):
2479 2479
      raise errors.OpPrereqError("No changes submitted", errors.ECODE_INVAL)
2480 2480

  
2481 2481
    if self.op.hvparams:
......
3008 3008
                                hvspecs)
3009 3009

  
3010 3010
    # osparams processing
3011
    if self.op.osparams:
3012
      i_osdict = GetUpdatedParams(self.instance.osparams, self.op.osparams)
3013
      CheckOSParams(self, True, node_uuids, instance_os, i_osdict)
3014
      self.os_inst = i_osdict # the new dict (without defaults)
3011
    if self.op.osparams or self.op.osparams_private_cluster:
3012
      public_parms = self.op.osparams or {}
3013
      private_parms = self.op.osparams_private_cluster or {}
3014
      dupe_keys = utils.GetRepeatedKeys(public_parms, private_parms)
3015

  
3016
      if dupe_keys:
3017
        raise errors.OpPrereqError("OS parameters repeated multiple times: %s" %
3018
                                   utils.CommaJoin(dupe_keys))
3019

  
3020
      self.os_inst = GetUpdatedParams(self.instance.osparams,
3021
                                      public_parms)
3022
      self.os_inst_private = GetUpdatedParams(self.instance.osparams_private,
3023
                                              private_parms)
3024

  
3025
      CheckOSParams(self, True, node_uuids, instance_os,
3026
                    objects.FillDict(self.os_inst,
3027
                                     self.os_inst_private))
3028

  
3015 3029
    else:
3016 3030
      self.os_inst = {}
3031
      self.os_inst_private = {}
3017 3032

  
3018 3033
    #TODO(dynmem): do the appropriate check involving MINMEM
3019 3034
    if (constants.BE_MAXMEM in self.op.beparams and not self.op.force and
......
3610 3625
      for key, val in self.op.osparams.iteritems():
3611 3626
        result.append(("os/%s" % key, val))
3612 3627

  
3628
    if self.op.osparams_private:
3629
      self.instance.osparams_private = self.os_inst_private
3630
      for key, val in self.op.osparams_private.iteritems():
3631
        # Show the Private(...) blurb.
3632
        result.append(("os_private/%s" % key, repr(val)))
3633

  
3613 3634
    if self.op.offline is None:
3614 3635
      # Ignore
3615 3636
      pass
b/lib/rpc/node.py
501 501
    # name to the prep_fn, and serialise its return value
502 502
    encode_args_fn = lambda node: map(compat.partial(self._encoder, node),
503 503
                                      zip(map(compat.snd, argdefs), args))
504
    pnbody = dict((n, serializer.DumpJson(prep_fn(n, encode_args_fn(n))))
505
                  for n in node_list)
504
    pnbody = dict(
505
      (n,
506
       serializer.DumpJson(prep_fn(n, encode_args_fn(n)),
507
                           private_encoder=serializer.EncodeWithPrivateFields))
508
      for n in node_list
509
    )
506 510

  
507 511
    result = self._proc(node_list, procedure, pnbody, read_timeout,
508 512
                        req_resolver_opts)
b/man/gnt-instance.rst
1173 1173
| [\--new-primary=*node*]
1174 1174
| [\--os-type=*OS* [\--force-variant]]
1175 1175
| [{-O|\--os-parameters} *param*=*value*... ]
1176
| [--os-parameters-private *param*=*value*... ]
1176 1177
| [\--offline \| \--online]
1177 1178
| [\--submit] [\--print-job-id]
1178 1179
| [\--ignore-ipolicy]
b/src/Ganeti/OpCodes.hs
648 648
       pRemoteNodeUuid
649 649
     , pOsNameChange
650 650
     , pInstOsParams
651
     , pInstOsParamsPrivate
651 652
     , pWaitForSync
652 653
     , withDoc "Whether to mark the instance as offline" pOffline
653 654
     , pIpConflictsCheck
b/test/hs/Test/Ganeti/OpCodes.hs
285 285
        OpCodes.OpInstanceQueryData <$> arbitrary <*>
286 286
          genNodeNamesNE <*> arbitrary
287 287
      "OP_INSTANCE_SET_PARAMS" ->
288
        OpCodes.OpInstanceSetParams <$> genFQDN <*> return Nothing <*>
289
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
290
          arbitrary <*> pure emptyJSObject <*> arbitrary <*>
291
          pure emptyJSObject <*> arbitrary <*> genMaybe genNodeNameNE <*>
292
          return Nothing <*> genMaybe genNodeNameNE <*> return Nothing <*>
293
          genMaybe genNameNE <*> pure emptyJSObject <*> arbitrary <*>
294
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
288
        OpCodes.OpInstanceSetParams
289
          <$> genFQDN                         -- instance_name
290
          <*> return Nothing                  -- instance_uuid
291
          <*> arbitrary                       -- force
292
          <*> arbitrary                       -- force_variant
293
          <*> arbitrary                       -- ignore_ipolicy
294
          <*> arbitrary                       -- nics
295
          <*> arbitrary                       -- disks
296
          <*> pure emptyJSObject              -- beparams
297
          <*> arbitrary                       -- runtime_mem
298
          <*> pure emptyJSObject              -- hvparams
299
          <*> arbitrary                       -- disk_template
300
          <*> genMaybe genNodeNameNE          -- pnode
301
          <*> return Nothing                  -- pnode_uuid
302
          <*> genMaybe genNodeNameNE          -- remote_node
303
          <*> return Nothing                  -- remote_node_uuid
304
          <*> genMaybe genNameNE              -- os_name
305
          <*> pure emptyJSObject              -- osparams
306
          <*> genMaybe arbitraryPrivateJSObj  -- osparams_private
307
          <*> arbitrary                       -- wait_for_sync
308
          <*> arbitrary                       -- offline
309
          <*> arbitrary                       -- conflicts_check
310
          <*> arbitrary                       -- hotplug
311
          <*> arbitrary                       -- hotplug_if_possible
295 312
      "OP_INSTANCE_GROW_DISK" ->
296 313
        OpCodes.OpInstanceGrowDisk <$> genFQDN <*> return Nothing <*>
297 314
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary

Also available in: Unified diff