On Thu, Dec 8, 2011 at 9:14 AM, Iustin Pop <[email protected]> wrote:
> On Tue, Dec 06, 2011 at 06:52:11PM +0100, Agata Murawska wrote:
>> Introduction of command line arguments used later to set instance policy
>> elements, creation of InstancePolicy dictionary from the command line
>> arguments.
>>
>> If there is a nicer way of setting these values, I'd gladly
>> learn about that...
>>
>> Signed-off-by: Agata Murawska <[email protected]>
>> ---
>>  lib/cli.py                |   27 ++++++++++++++++++
>>  lib/client/gnt_cluster.py |    7 +++-
>>  lib/objects.py            |   66 
>> +++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 98 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/cli.py b/lib/cli.py
>> index cde9991..060b2e2 100644
>> --- a/lib/cli.py
>> +++ b/lib/cli.py
>> @@ -65,11 +65,14 @@ __all__ = [
>>    "CLUSTER_DOMAIN_SECRET_OPT",
>>    "CONFIRM_OPT",
>>    "CP_SIZE_OPT",
>> +  "CPU_COUNT_SPECS_OPT",
>>    "DEBUG_OPT",
>>    "DEBUG_SIMERR_OPT",
>>    "DISKIDX_OPT",
>> +  "DISK_COUNT_SPECS_OPT",
>>    "DISK_OPT",
>>    "DISK_PARAMS_OPT",
>> +  "DISK_SIZE_SPECS_OPT",
>>    "DISK_TEMPLATE_OPT",
>>    "DRAINED_OPT",
>>    "DRY_RUN_OPT",
>> @@ -106,6 +109,7 @@ __all__ = [
>>    "MASTER_NETDEV_OPT",
>>    "MASTER_NETMASK_OPT",
>>    "MC_OPT",
>> +  "MEM_COUNT_SPECS_OPT",
>>    "MIGRATION_MODE_OPT",
>>    "NET_OPT",
>>    "NEW_CLUSTER_CERT_OPT",
>> @@ -114,6 +118,7 @@ __all__ = [
>>    "NEW_RAPI_CERT_OPT",
>>    "NEW_SECONDARY_OPT",
>>    "NEW_SPICE_CERT_OPT",
>> +  "NIC_COUNT_SPECS_OPT",
>>    "NIC_PARAMS_OPT",
>>    "NODE_FORCE_JOIN_OPT",
>>    "NODE_LIST_OPT",
>> @@ -758,6 +763,28 @@ DISK_PARAMS_OPT = cli_option("-D", "--disk-parameters", 
>> dest="diskparams",
>>                               " template:option=value,option=value,...",
>>                               type="identkeyval", action="append", 
>> default=[])
>>
>> +MEM_COUNT_SPECS_OPT = cli_option("--mem-count-specs", 
>> dest="mem_count_ispecs",
>> +                                 type="keyval", default={},
>> +                                 help="Memory count specs: min, max, std"
>> +                                 " (in MB)")
>> +
>> +CPU_COUNT_SPECS_OPT = cli_option("--cpu-count-specs", 
>> dest="cpu_count_ispecs",
>> +                                 type="keyval", default={},
>> +                                 help="CPU count specs: min, max, std")
>> +
>> +DISK_COUNT_SPECS_OPT = cli_option("--disk-count-specs",
>> +                                  dest="disk_count_ispecs",
>> +                                  type="keyval", default={},
>> +                                  help="Disk count specs: min, max, std")
>> +
>> +DISK_SIZE_SPECS_OPT = cli_option("--disk-size-specs", 
>> dest="disk_size_ispecs",
>> +                                 type="keyval", default={},
>> +                                 help="Disk size specs: min, max, std (in 
>> MB)")
>> +
>> +NIC_COUNT_SPECS_OPT = cli_option("--nic-count-specs", 
>> dest="nic_count_ispecs",
>> +                                 type="keyval", default={},
>> +                                 help="NIC count specs: min, max, std")
>> +
>
> Once comment is that maybe these would be better groups with prefix,
> e.g. --specs-nic-count. Not sure though.
Makes sense - it's easier to see what all the specs are then, changed.

>
>>  HYPERVISOR_OPT = cli_option("-H", "--hypervisor-parameters", 
>> dest="hypervisor",
>>                              help="Hypervisor and hypervisor options, in the"
>>                              " format 
>> hypervisor:option=value,option=value,...",
>> diff --git a/lib/client/gnt_cluster.py b/lib/client/gnt_cluster.py
>> index 15a99c8..9d77e59 100644
>> --- a/lib/client/gnt_cluster.py
>> +++ b/lib/client/gnt_cluster.py
>> @@ -1403,7 +1403,8 @@ commands = {
>>       MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, DRBD_HELPER_OPT, 
>> NODRBD_STORAGE_OPT,
>>       DEFAULT_IALLOCATOR_OPT, PRIMARY_IP_VERSION_OPT, 
>> PREALLOC_WIPE_DISKS_OPT,
>>       NODE_PARAMS_OPT, GLOBAL_SHARED_FILEDIR_OPT, USE_EXTERNAL_MIP_SCRIPT,
>> -     DISK_PARAMS_OPT],
>> +     DISK_PARAMS_OPT, MEM_COUNT_SPECS_OPT, CPU_COUNT_SPECS_OPT,
>> +     DISK_COUNT_SPECS_OPT, DISK_SIZE_SPECS_OPT, NIC_COUNT_SPECS_OPT],
>>      "[opts...] <cluster_name>", "Initialises a new cluster configuration"),
>>    "destroy": (
>>      DestroyCluster, ARGS_NONE, [YES_DOIT_OPT],
>> @@ -1480,7 +1481,9 @@ commands = {
>>       MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, ADD_UIDS_OPT, REMOVE_UIDS_OPT,
>>       DRBD_HELPER_OPT, NODRBD_STORAGE_OPT, DEFAULT_IALLOCATOR_OPT,
>>       RESERVED_LVS_OPT, DRY_RUN_OPT, PRIORITY_OPT, PREALLOC_WIPE_DISKS_OPT,
>> -     NODE_PARAMS_OPT, USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT],
>> +     NODE_PARAMS_OPT, USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT,
>> +     MEM_COUNT_SPECS_OPT, CPU_COUNT_SPECS_OPT, DISK_COUNT_SPECS_OPT,
>> +     DISK_SIZE_SPECS_OPT, NIC_COUNT_SPECS_OPT],
>>      "[opts...]",
>>      "Alters the parameters of the cluster"),
>>    "renew-crypto": (
>> diff --git a/lib/objects.py b/lib/objects.py
>> index 4616bb7..fed3f93 100644
>> --- a/lib/objects.py
>> +++ b/lib/objects.py
>> @@ -44,6 +44,7 @@ from cStringIO import StringIO
>>  from ganeti import errors
>>  from ganeti import constants
>>  from ganeti import netutils
>> +from ganeti import utils
>>
>>  from socket import AF_INET
>>
>> @@ -54,6 +55,29 @@ __all__ = ["ConfigObject", "ConfigData", "NIC", "Disk", 
>> "Instance",
>>  _TIMESTAMPS = ["ctime", "mtime"]
>>  _UUID = ["uuid"]
>>
>> +# constants used to create InstancePolicy dictionary
>> +TISPECS_GROUP_DEFAULTS = {
>> +  constants.MIN_ISPECS: 0,
>> +  constants.MAX_ISPECS: 0,
>> +  }
>> +
>> +TISPECS_CLUSTER_DEFAULTS = {
>> +  constants.MIN_ISPECS: 0,
>> +  constants.MAX_ISPECS: 0,
>> +  constants.STD_ISPECS: 0,
>> +  }
>
> Hmm, why 0? Are you using 0 as "not modified" tag later?
Nah, I just took ForceDictType for something it is not (i.e. I thought
it required
all the fields to be there, and not 'if the field is there it should
have the type'.
No idea why, though. Anyway - removed.
>
>> +TISPECS_GROUP_TYPES = {
>> +  constants.MIN_ISPECS: constants.VTYPE_INT,
>> +  constants.MAX_ISPECS: constants.VTYPE_INT,
>> +}
>> +
>> +TISPECS_CLUSTER_TYPES = {
>> +  constants.MIN_ISPECS: constants.VTYPE_INT,
>> +  constants.MAX_ISPECS: constants.VTYPE_INT,
>> +  constants.STD_ISPECS: constants.VTYPE_INT,
>> +  }
>> +
>>
>>  def FillDict(defaults_dict, custom_dict, skip_keys=None):
>>    """Basic function to apply settings on top a default dict.
>> @@ -148,6 +172,48 @@ def UpgradeDiskParams(diskparams):
>>    return result
>>
>>
>> +def CreateIPolicyFromOpts(mem_count_ispecs=None,
>> +                          cpu_count_ispecs=None,
>> +                          disk_count_ispecs=None,
>> +                          disk_size_ispecs=None,
>> +                          nic_count_ispecs=None,
>> +                          group_ipolicy=False,
>> +                          allowed_values=None):
>> +  """Creation of instane policy based on command line options.
>> +
>> +
>> +  """
>> +  # prepare ipolicy dict
>> +  ipolicy_transposed = {
>> +    constants.MEM_COUNT_SPEC: mem_count_ispecs,
>> +    constants.CPU_COUNT_SPEC: cpu_count_ispecs,
>> +    constants.DISK_COUNT_SPEC: disk_count_ispecs,
>> +    constants.DISK_SIZE_SPEC: disk_size_ispecs,
>> +    constants.NIC_COUNT_SPEC: nic_count_ispecs,
>> +    }
>> +
>> +  # first, check that the values given are correct
>> +  if group_ipolicy:
>> +    defaults = TISPECS_GROUP_DEFAULTS
>> +    forced_type = TISPECS_GROUP_TYPES
>> +  else:
>> +    defaults = TISPECS_CLUSTER_DEFAULTS
>> +    forced_type = TISPECS_CLUSTER_TYPES
>> +
>> +  for specs in ipolicy_transposed.values():
>> +    specs = FillDict(defaults, specs)
>> +    utils.ForceDictType(specs, forced_type, allowed_values=allowed_values)
>> +
>> +  # then transpose
>> +  ipolicy_out = constants.IPOLICY_EMPTY
>
> Again, the bug I referred to in the first patch. Mutable types, hate
> hate hate.
Ack, ack, ack

>
>> +  for name, specs in ipolicy_transposed.iteritems():
>
> items() please (instead of iteritems()).
Ack

>
>> +    assert name in constants.ISPECS_PARAMETERS
>> +    for key, val in specs.iteritems(): # {min: .. ,max: .., std: ..}
>> +      ipolicy_out[key][name] = val
>
> thanks,
> iustin

Also, since both cluster init and modify use options for instance
policy, I extracted them as a separate list.

Interdiff:

diff --git a/lib/cli.py b/lib/cli.py
index 060b2e2..41adb79 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -65,14 +65,11 @@ __all__ = [
   "CLUSTER_DOMAIN_SECRET_OPT",
   "CONFIRM_OPT",
   "CP_SIZE_OPT",
-  "CPU_COUNT_SPECS_OPT",
   "DEBUG_OPT",
   "DEBUG_SIMERR_OPT",
   "DISKIDX_OPT",
-  "DISK_COUNT_SPECS_OPT",
   "DISK_OPT",
   "DISK_PARAMS_OPT",
-  "DISK_SIZE_SPECS_OPT",
   "DISK_TEMPLATE_OPT",
   "DRAINED_OPT",
   "DRY_RUN_OPT",
@@ -109,7 +106,6 @@ __all__ = [
   "MASTER_NETDEV_OPT",
   "MASTER_NETMASK_OPT",
   "MC_OPT",
-  "MEM_COUNT_SPECS_OPT",
   "MIGRATION_MODE_OPT",
   "NET_OPT",
   "NEW_CLUSTER_CERT_OPT",
@@ -118,7 +114,6 @@ __all__ = [
   "NEW_RAPI_CERT_OPT",
   "NEW_SECONDARY_OPT",
   "NEW_SPICE_CERT_OPT",
-  "NIC_COUNT_SPECS_OPT",
   "NIC_PARAMS_OPT",
   "NODE_FORCE_JOIN_OPT",
   "NODE_LIST_OPT",
@@ -171,6 +166,11 @@ __all__ = [
   "SHOWCMD_OPT",
   "SHUTDOWN_TIMEOUT_OPT",
   "SINGLE_NODE_OPT",
+  "SPECS_CPU_COUNT_OPT",
+  "SPECS_DISK_COUNT_OPT",
+  "SPECS_DISK_SIZE_OPT",
+  "SPECS_MEM_SIZE_OPT",
+  "SPECS_NIC_COUNT_OPT",
   "SPICE_CACERT_OPT",
   "SPICE_CERT_OPT",
   "SRC_DIR_OPT",
@@ -763,25 +763,25 @@ DISK_PARAMS_OPT = cli_option("-D",
"--disk-parameters", dest="diskparams",
                              " template:option=value,option=value,...",
                              type="identkeyval", action="append", default=[])

-MEM_COUNT_SPECS_OPT = cli_option("--mem-count-specs", dest="mem_count_ispecs",
+SPECS_MEM_SIZE_OPT = cli_option("--specs-mem-size", dest="ispecs_mem_size",
                                  type="keyval", default={},
                                  help="Memory count specs: min, max, std"
                                  " (in MB)")

-CPU_COUNT_SPECS_OPT = cli_option("--cpu-count-specs", dest="cpu_count_ispecs",
+SPECS_CPU_COUNT_OPT = cli_option("--specs-cpu-count", dest="ispecs_cpu_count",
                                  type="keyval", default={},
                                  help="CPU count specs: min, max, std")

-DISK_COUNT_SPECS_OPT = cli_option("--disk-count-specs",
-                                  dest="disk_count_ispecs",
+SPECS_DISK_COUNT_OPT = cli_option("--specs-disk-count",
+                                  dest="ispecs_disk_count",
                                   type="keyval", default={},
                                   help="Disk count specs: min, max, std")

-DISK_SIZE_SPECS_OPT = cli_option("--disk-size-specs", dest="disk_size_ispecs",
+SPECS_DISK_SIZE_OPT = cli_option("--specs-disk-size", dest="ispecs_disk_size",
                                  type="keyval", default={},
                                  help="Disk size specs: min, max, std (in MB)")

-NIC_COUNT_SPECS_OPT = cli_option("--nic-count-specs", dest="nic_count_ispecs",
+SPECS_NIC_COUNT_OPT = cli_option("--specs-nic-count", dest="ispecs_nic_count",
                                  type="keyval", default={},
                                  help="NIC count specs: min, max, std")

diff --git a/lib/client/gnt_cluster.py b/lib/client/gnt_cluster.py
index 9d77e59..ccf6137 100644
--- a/lib/client/gnt_cluster.py
+++ b/lib/client/gnt_cluster.py
@@ -1392,6 +1392,13 @@ def Epo(opts, args):
   else:
     return _EpoOff(opts, node_list, inst_map)

+instance_policy_opts = [
+  SPECS_CPU_COUNT_OPT,
+  SPECS_DISK_COUNT_OPT,
+  SPECS_DISK_SIZE_OPT,
+  SPECS_MEM_SIZE_OPT,
+  SPECS_NIC_COUNT_OPT,
+  ]

 commands = {
   "init": (
@@ -1403,8 +1410,7 @@ commands = {
      MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, DRBD_HELPER_OPT,
NODRBD_STORAGE_OPT,
      DEFAULT_IALLOCATOR_OPT, PRIMARY_IP_VERSION_OPT, PREALLOC_WIPE_DISKS_OPT,
      NODE_PARAMS_OPT, GLOBAL_SHARED_FILEDIR_OPT, USE_EXTERNAL_MIP_SCRIPT,
-     DISK_PARAMS_OPT, MEM_COUNT_SPECS_OPT, CPU_COUNT_SPECS_OPT,
-     DISK_COUNT_SPECS_OPT, DISK_SIZE_SPECS_OPT, NIC_COUNT_SPECS_OPT],
+     DISK_PARAMS_OPT] + instance_policy_opts,
     "[opts...] <cluster_name>", "Initialises a new cluster configuration"),
   "destroy": (
     DestroyCluster, ARGS_NONE, [YES_DOIT_OPT],
@@ -1481,9 +1487,8 @@ commands = {
      MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, ADD_UIDS_OPT, REMOVE_UIDS_OPT,
      DRBD_HELPER_OPT, NODRBD_STORAGE_OPT, DEFAULT_IALLOCATOR_OPT,
      RESERVED_LVS_OPT, DRY_RUN_OPT, PRIORITY_OPT, PREALLOC_WIPE_DISKS_OPT,
-     NODE_PARAMS_OPT, USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT,
-     MEM_COUNT_SPECS_OPT, CPU_COUNT_SPECS_OPT, DISK_COUNT_SPECS_OPT,
-     DISK_SIZE_SPECS_OPT, NIC_COUNT_SPECS_OPT],
+     NODE_PARAMS_OPT, USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT] +
+    instance_policy_opts,
     "[opts...]",
     "Alters the parameters of the cluster"),
   "renew-crypto": (
diff --git a/lib/objects.py b/lib/objects.py
index b8fc04d..47dd451 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -56,17 +56,6 @@ _TIMESTAMPS = ["ctime", "mtime"]
 _UUID = ["uuid"]

 # constants used to create InstancePolicy dictionary
-TISPECS_GROUP_DEFAULTS = {
-  constants.MIN_ISPECS: 0,
-  constants.MAX_ISPECS: 0,
-  }
-
-TISPECS_CLUSTER_DEFAULTS = {
-  constants.MIN_ISPECS: 0,
-  constants.MAX_ISPECS: 0,
-  constants.STD_ISPECS: 0,
-  }
-
 TISPECS_GROUP_TYPES = {
   constants.MIN_ISPECS: constants.VTYPE_INT,
   constants.MAX_ISPECS: constants.VTYPE_INT,
@@ -183,11 +172,11 @@ def MakeEmptyIPolicy():
     ])


-def CreateIPolicyFromOpts(mem_count_ispecs=None,
-                          cpu_count_ispecs=None,
-                          disk_count_ispecs=None,
-                          disk_size_ispecs=None,
-                          nic_count_ispecs=None,
+def CreateIPolicyFromOpts(ispecs_mem_size=None,
+                          ispecs_cpu_count=None,
+                          ispecs_disk_count=None,
+                          ispecs_disk_size=None,
+                          ispecs_nic_count=None,
                           group_ipolicy=False,
                           allowed_values=None):
   """Creation of instane policy based on command line options.
@@ -196,30 +185,27 @@ def CreateIPolicyFromOpts(mem_count_ispecs=None,
   """
   # prepare ipolicy dict
   ipolicy_transposed = {
-    constants.MEM_COUNT_SPEC: mem_count_ispecs,
-    constants.CPU_COUNT_SPEC: cpu_count_ispecs,
-    constants.DISK_COUNT_SPEC: disk_count_ispecs,
-    constants.DISK_SIZE_SPEC: disk_size_ispecs,
-    constants.NIC_COUNT_SPEC: nic_count_ispecs,
+    constants.MEM_SIZE_SPEC: ispecs_mem_size,
+    constants.CPU_COUNT_SPEC: ispecs_cpu_count,
+    constants.DISK_COUNT_SPEC: ispecs_disk_count,
+    constants.DISK_SIZE_SPEC: ispecs_disk_size,
+    constants.NIC_COUNT_SPEC: ispecs_nic_count,
     }

   # first, check that the values given are correct
   if group_ipolicy:
-    defaults = TISPECS_GROUP_DEFAULTS
     forced_type = TISPECS_GROUP_TYPES
   else:
-    defaults = TISPECS_CLUSTER_DEFAULTS
     forced_type = TISPECS_CLUSTER_TYPES

   for specs in ipolicy_transposed.values():
-    specs = FillDict(defaults, specs)
     utils.ForceDictType(specs, forced_type, allowed_values=allowed_values)

   # then transpose
-  ipolicy_out = constants.IPOLICY_EMPTY
+  ipolicy_out = MakeEmptyIPolicy()
   for name, specs in ipolicy_transposed.iteritems():
     assert name in constants.ISPECS_PARAMETERS
-    for key, val in specs.iteritems(): # {min: .. ,max: .., std: ..}
+    for key, val in specs.items(): # {min: .. ,max: .., std: ..}
       ipolicy_out[key][name] = val

   return ipolicy_out

Reply via email to