The previous interdiffs broke the unittests.
This interdiff fixes the unittest for user shutdown.
It basically enables user shutdown at the cluster level so that the
instance correctly reports USER_down.
Interdiff:
diff --git a/test/py/ganeti.query_unittest.py b/test/py/ganeti.query_unittest.py
index 29d32dd..1bbbc27 100755
--- a/test/py/ganeti.query_unittest.py
+++ b/test/py/ganeti.query_unittest.py
@@ -670,6 +670,7 @@ class TestInstanceQuery(unittest.TestCase):
query.IQ_CONSOLE, query.IQ_NODES,
query.IQ_NETWORKS]))
cluster = objects.Cluster(cluster_name="testcluster",
+ enabled_user_shutdown=True,
hvparams=constants.HVC_DEFAULTS,
beparams={
constants.PP_DEFAULT: constants.BEC_DEFAULTS,
On Jun 06 17:47, Hrvoje Ribicic wrote:
> LGTM, thanks
>
>
> On Fri, Jun 6, 2014 at 10:51 AM, 'Jose A. Lopes' via ganeti-devel <
> [email protected]> wrote:
>
> > ... including object, queries, opcode, LU, command line, upgrade, etc.
> >
> > Signed-off-by: Jose A. Lopes <[email protected]>
> > ---
> > lib/bootstrap.py | 9 ++++++++-
> > lib/cli.py | 7 +++++++
> > lib/client/gnt_cluster.py | 18 +++++++++++++++---
> > lib/cmdlib/cluster.py | 4 ++++
> > lib/objects.py | 4 ++++
> > src/Ganeti/Objects.hs | 1 +
> > src/Ganeti/OpCodes.hs | 1 +
> > src/Ganeti/OpParams.hs | 7 +++++++
> > src/Ganeti/Query/Server.hs | 2 ++
> > test/hs/Test/Ganeti/OpCodes.hs | 2 +-
> > test/py/cfgupgrade_unittest.py | 1 +
> > tools/cfgupgrade | 4 ++++
> > 12 files changed, 55 insertions(+), 5 deletions(-)
> >
> > diff --git a/lib/bootstrap.py b/lib/bootstrap.py
> > index 9cd7f2b..d0b56b2 100644
> > --- a/lib/bootstrap.py
> > +++ b/lib/bootstrap.py
> > @@ -552,15 +552,21 @@ def InitCluster(cluster_name, mac_prefix, # pylint:
> > disable=R0913, R0914
> > default_iallocator=None, default_iallocator_params=None,
> > primary_ip_version=None, ipolicy=None,
> > prealloc_wipe_disks=False, use_external_mip_script=False,
> > - hv_state=None, disk_state=None,
> > enabled_disk_templates=None):
> > + hv_state=None, disk_state=None,
> > enabled_disk_templates=None,
> > + enabled_user_shutdown=False):
> > """Initialise the cluster.
> >
> > @type candidate_pool_size: int
> > @param candidate_pool_size: master candidate pool size
> > +
> > @type enabled_disk_templates: list of string
> > @param enabled_disk_templates: list of disk_templates to be used in this
> > cluster
> >
> > + @type enabled_user_shutdown: bool
> > + @param enabled_user_shutdown: whether user shutdown is enabled cluster
> > + wide
> > +
> > """
> > # TODO: complete the docstring
> > if config.ConfigWriter.IsCluster():
> > @@ -819,6 +825,7 @@ def InitCluster(cluster_name, mac_prefix, # pylint:
> > disable=R0913, R0914
> > disk_state_static=disk_state,
> > enabled_disk_templates=enabled_disk_templates,
> > candidate_certs=candidate_certs,
> > + enabled_user_shutdown=enabled_user_shutdown,
> > )
> > master_node_config = objects.Node(name=hostname.name,
> > primary_ip=hostname.ip,
> > diff --git a/lib/cli.py b/lib/cli.py
> > index 9480505..dd81c81 100644
> > --- a/lib/cli.py
> > +++ b/lib/cli.py
> > @@ -83,6 +83,7 @@ __all__ = [
> > "EARLY_RELEASE_OPT",
> > "ENABLED_HV_OPT",
> > "ENABLED_DISK_TEMPLATES_OPT",
> > + "ENABLED_USER_SHUTDOWN_OPT",
> > "ERROR_CODES_OPT",
> > "FAILURE_ONLY_OPT",
> > "FIELDS_OPT",
> > @@ -1273,6 +1274,12 @@ ENABLED_DISK_TEMPLATES_OPT =
> > cli_option("--enabled-disk-templates",
> > "disk templates",
> > type="string", default=None)
> >
> > +ENABLED_USER_SHUTDOWN_OPT = cli_option("--user-shutdown",
> > + default=None,
> > + dest="enabled_user_shutdown",
> > + help="Whether user shutdown is
> > enabled",
> > + type="bool")
> > +
> > NIC_PARAMS_OPT = cli_option("-N", "--nic-parameters", dest="nicparams",
> > type="keyval", default={},
> > help="NIC parameters")
> > diff --git a/lib/client/gnt_cluster.py b/lib/client/gnt_cluster.py
> > index fd3d74c..3e63d3a 100644
> > --- a/lib/client/gnt_cluster.py
> > +++ b/lib/client/gnt_cluster.py
> > @@ -265,6 +265,12 @@ def InitCluster(opts, args):
> > hv_state = dict(opts.hv_state)
> >
> > default_ialloc_params = opts.default_iallocator_params
> > +
> > + if opts.enabled_user_shutdown:
> > + enabled_user_shutdown = True
> > + else:
> > + enabled_user_shutdown = False
> > +
> > bootstrap.InitCluster(cluster_name=args[0],
> > secondary_ip=opts.secondary_ip,
> > vg_name=vg_name,
> > @@ -295,6 +301,7 @@ def InitCluster(opts, args):
> > hv_state=hv_state,
> > disk_state=disk_state,
> > enabled_disk_templates=enabled_disk_templates,
> > + enabled_user_shutdown=enabled_user_shutdown,
> > )
> > op = opcodes.OpClusterPostInit()
> > SubmitOpCode(op, opts=opts)
> > @@ -540,6 +547,7 @@ def ShowClusterConfig(opts, args):
> > utils.CommaJoin(pathutils.ES_SEARCH_PATH)),
> > ("enabled disk templates",
> > utils.CommaJoin(result["enabled_disk_templates"])),
> > + ("enabled user shutdown", result["enabled_user_shutdown"]),
> > ]),
> >
> > ("Default node parameters",
> > @@ -1115,7 +1123,8 @@ def SetClusterParams(opts, args):
> > opts.ipolicy_spindle_ratio is not None or
> > opts.modify_etc_hosts is not None or
> > opts.file_storage_dir is not None or
> > - opts.shared_file_storage_dir is not None):
> > + opts.shared_file_storage_dir is not None or
> > + opts.enabled_user_shutdown is not None):
> > ToStderr("Please give at least one of the parameters.")
> > return 1
> >
> > @@ -1227,6 +1236,7 @@ def SetClusterParams(opts, args):
> > force=opts.force,
> > file_storage_dir=opts.file_storage_dir,
> > shared_file_storage_dir=opts.shared_file_storage_dir,
> > + enabled_user_shutdown=opts.enabled_user_shutdown,
> > )
> > SubmitOrSend(op, opts)
> > return 0
> > @@ -2109,7 +2119,8 @@ commands = {
> > PRIMARY_IP_VERSION_OPT, PREALLOC_WIPE_DISKS_OPT, NODE_PARAMS_OPT,
> > GLOBAL_SHARED_FILEDIR_OPT, USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT,
> > HV_STATE_OPT, DISK_STATE_OPT, ENABLED_DISK_TEMPLATES_OPT,
> > - IPOLICY_STD_SPECS_OPT, GLOBAL_GLUSTER_FILEDIR_OPT]
> > + ENABLED_USER_SHUTDOWN_OPT, IPOLICY_STD_SPECS_OPT,
> > + GLOBAL_GLUSTER_FILEDIR_OPT]
> > + INSTANCE_POLICY_OPTS + SPLIT_ISPECS_OPTS,
> > "[opts...] <cluster_name>", "Initialises a new cluster
> > configuration"),
> > "destroy": (
> > @@ -2192,7 +2203,8 @@ commands = {
> > DRY_RUN_OPT, PRIORITY_OPT, PREALLOC_WIPE_DISKS_OPT, NODE_PARAMS_OPT,
> > USE_EXTERNAL_MIP_SCRIPT, DISK_PARAMS_OPT, HV_STATE_OPT,
> > DISK_STATE_OPT] +
> > SUBMIT_OPTS +
> > - [ENABLED_DISK_TEMPLATES_OPT, IPOLICY_STD_SPECS_OPT,
> > MODIFY_ETCHOSTS_OPT] +
> > + [ENABLED_DISK_TEMPLATES_OPT, IPOLICY_STD_SPECS_OPT,
> > MODIFY_ETCHOSTS_OPT,
> > + ENABLED_USER_SHUTDOWN_OPT] +
> > INSTANCE_POLICY_OPTS + [GLOBAL_FILEDIR_OPT,
> > GLOBAL_SHARED_FILEDIR_OPT],
> > "[opts...]",
> > "Alters the parameters of the cluster"),
> > diff --git a/lib/cmdlib/cluster.py b/lib/cmdlib/cluster.py
> > index ecba889..2c480ad 100644
> > --- a/lib/cmdlib/cluster.py
> > +++ b/lib/cmdlib/cluster.py
> > @@ -434,6 +434,7 @@ class LUClusterQuery(NoHooksLU):
> > "hidden_os": cluster.hidden_os,
> > "blacklisted_os": cluster.blacklisted_os,
> > "enabled_disk_templates": cluster.enabled_disk_templates,
> > + "enabled_user_shutdown": cluster.enabled_user_shutdown,
> > }
> >
> > return result
> > @@ -1396,6 +1397,9 @@ class LUClusterSetParams(LogicalUnit):
> > if self.op.use_external_mip_script is not None:
> > self.cluster.use_external_mip_script =
> > self.op.use_external_mip_script
> >
> > + if self.op.enabled_user_shutdown is not None:
> > + self.cluster.enabled_user_shutdown = self.op.enabled_user_shutdown
> > +
> > def helper_os(aname, mods, desc):
> > desc += " OS list"
> > lst = getattr(self.cluster, aname)
> > diff --git a/lib/objects.py b/lib/objects.py
> > index 125d1e5..3415e0c 100644
> > --- a/lib/objects.py
> > +++ b/lib/objects.py
> > @@ -1592,6 +1592,7 @@ class Cluster(TaggableObject):
> > "enabled_disk_templates",
> > "candidate_certs",
> > "max_running_jobs",
> > + "enabled_user_shutdown",
> > ] + _TIMESTAMPS + _UUID
> >
> > def UpgradeConfig(self):
> > @@ -1724,6 +1725,9 @@ class Cluster(TaggableObject):
> > if self.max_running_jobs is None:
> > self.max_running_jobs = constants.LUXID_MAXIMAL_RUNNING_JOBS_DEFAULT
> >
> > + if self.enabled_user_shutdown is None:
> > + self.enabled_user_shutdown = False
> > +
> > @property
> > def primary_hypervisor(self):
> > """The first hypervisor is the primary.
> > diff --git a/src/Ganeti/Objects.hs b/src/Ganeti/Objects.hs
> > index 18ca1f5..9fe1120 100644
> > --- a/src/Ganeti/Objects.hs
> > +++ b/src/Ganeti/Objects.hs
> > @@ -708,6 +708,7 @@ $(buildObject "Cluster" "cluster" $
> > , simpleField "enabled_disk_templates" [t| [DiskTemplate] |]
> > , simpleField "candidate_certs" [t| CandidateCertificates |]
> > , simpleField "max_running_jobs" [t| Int |]
> > + , simpleField "enabled_user_shutdown" [t| Bool |]
> > ]
> > ++ timeStampFields
> > ++ uuidFields
> > diff --git a/src/Ganeti/OpCodes.hs b/src/Ganeti/OpCodes.hs
> > index 8e7bf4f..b1964e4 100644
> > --- a/src/Ganeti/OpCodes.hs
> > +++ b/src/Ganeti/OpCodes.hs
> > @@ -236,6 +236,7 @@ $(genOpCode "OpCode"
> > , pClusterFileStorageDir
> > , pClusterSharedFileStorageDir
> > , pClusterGlusterStorageDir
> > + , pEnabledUserShutdown
> > ],
> > [])
> > , ("OpClusterRedistConf",
> > diff --git a/src/Ganeti/OpParams.hs b/src/Ganeti/OpParams.hs
> > index 1d077d1..54817d1 100644
> > --- a/src/Ganeti/OpParams.hs
> > +++ b/src/Ganeti/OpParams.hs
> > @@ -260,6 +260,7 @@ module Ganeti.OpParams
> > , pReason
> > , pSequential
> > , pEnabledDiskTemplates
> > + , pEnabledUserShutdown
> > , pAdminStateSource
> > ) where
> >
> > @@ -745,6 +746,12 @@ pEnabledDiskTemplates =
> > optionalField $
> > simpleField "enabled_disk_templates" [t| [DiskTemplate] |]
> >
> > +pEnabledUserShutdown :: Field
> > +pEnabledUserShutdown =
> > + withDoc "Whether user shutdown is enabled cluster wide" .
> > + optionalField $
> > + simpleField "enabled_user_shutdown" [t| Bool |]
> > +
> > pQueryWhat :: Field
> > pQueryWhat =
> > withDoc "Resource(s) to query for" $
> > diff --git a/src/Ganeti/Query/Server.hs b/src/Ganeti/Query/Server.hs
> > index bdf1fac..c0377bd 100644
> > --- a/src/Ganeti/Query/Server.hs
> > +++ b/src/Ganeti/Query/Server.hs
> > @@ -165,6 +165,8 @@ handleCall _ _ cdata QueryClusterInfo =
> > , ("hidden_os", showJSON $ clusterHiddenOs cluster)
> > , ("blacklisted_os", showJSON $ clusterBlacklistedOs cluster)
> > , ("enabled_disk_templates", showJSON diskTemplates)
> > + , ("enabled_user_shutdown",
> > + showJSON $ clusterEnabledUserShutdown cluster)
> > ]
> >
> > in case master of
> > diff --git a/test/hs/Test/Ganeti/OpCodes.hs
> > b/test/hs/Test/Ganeti/OpCodes.hs
> > index f677de3..b152ed7 100644
> > --- a/test/hs/Test/Ganeti/OpCodes.hs
> > +++ b/test/hs/Test/Ganeti/OpCodes.hs
> > @@ -183,7 +183,7 @@ instance Arbitrary OpCodes.OpCode where
> > emptyMUD <*> emptyMUD <*> arbitrary <*>
> > arbitrary <*> emptyMUD <*> arbitrary <*> arbitrary <*>
> > arbitrary <*>
> > arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
> > arbitrary <*>
> > - arbitrary <*> genMaybe genName <*> genMaybe genName
> > + arbitrary <*> genMaybe genName <*> genMaybe genName <*>
> > arbitrary
> > "OP_CLUSTER_REDIST_CONF" -> pure OpCodes.OpClusterRedistConf
> > "OP_CLUSTER_ACTIVATE_MASTER_IP" ->
> > pure OpCodes.OpClusterActivateMasterIp
> > diff --git a/test/py/cfgupgrade_unittest.py
> > b/test/py/cfgupgrade_unittest.py
> > index b56a8c5..240225d 100755
> > --- a/test/py/cfgupgrade_unittest.py
> > +++ b/test/py/cfgupgrade_unittest.py
> > @@ -47,6 +47,7 @@ def GetMinimalConfig():
> > "default_iallocator_params": {},
> > "ndparams": {},
> > "candidate_certs": {},
> > + "enabled_user_shutdown": False,
> > },
> > "instances": {},
> > "networks": {},
> > diff --git a/tools/cfgupgrade b/tools/cfgupgrade
> > index 654d193..a53ca90 100755
> > --- a/tools/cfgupgrade
> > +++ b/tools/cfgupgrade
> > @@ -152,6 +152,8 @@ def UpgradeCluster(config_data):
> > cluster["default_iallocator_params"] = {}
> > if not "candidate_certs" in cluster:
> > cluster["candidate_certs"] = {}
> > + if "enabled_user_shutdown" not in cluster:
> > + cluster["enabled_user_shutdown"] = False
> >
> >
> > def UpgradeGroups(config_data):
> > @@ -424,6 +426,8 @@ def DowngradeCluster(config_data):
> > del cluster[param]
> > if "max_running_jobs" in cluster:
> > del cluster["max_running_jobs"]
> > + if "enabled_user_shutdown" in cluster:
> > + del cluster["enabled_user_shutdown"]
> >
> > DowngradeInstances(config_data)
> >
> > --
> > 2.0.0.526.g5318336
> >
> >
--
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