====
+Version 2.11.0 rc1
+------------------
+
+*(Released Thu, 20 Mar 2014)*
+
+Incompatible/important changes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- ``gnt-node list`` no longer shows disk space information for shared file
+ disk templates because it is not a node attribute. (For example, if you have
+ both the file and shared file disk templates enabled, ``gnt-node list`` now
+ only shows information about the file disk template.)
+- The shared file disk template is now in the new 'sharedfile' storage type.
+ As a result, ``gnt-node list-storage -t file`` now only shows information
+ about the file disk template and you may use ``gnt-node list-storage -t
+ sharedfile`` to query storage information for the shared file disk template.
+- Over luxi, syntactially incorrect queries are now rejected as a whole;
+ before, a 'SumbmitManyJobs' request was partially executed, if the outer
+ structure of the request was syntactically correct. As the luxi protocol
+ is internal (external applications are expected to use RAPI), the impact
+ of this incompatible change should be limited.
+- Queries for nodes, instances, groups, backups and networks are now
+ exclusively done via the luxi daemon. Legacy python code was removed,
+ as well as the --enable-split-queries configuration option.
+- Orphan volumes errors are demoted to warnings and no longer affect the exit
+ code of ``gnt-cluster verify``.
+- RPC security got enhanced by using different client SSL certificates
+ for each node. In this context 'gnt-cluster renew-crypto' got a new
+ option '--renew-node-certificates', which renews the client
+ certificates of all nodes. After a cluster upgrade from pre-2.11, run
+ this to create client certificates and activate this feature.
+
+New features
+~~~~~~~~~~~~
+
+- Instance moves, backups and imports can now use compression to transfer the
+ instance data.
+- Node groups can be configured to use an SSH port different than the
+ default 22.
+- Added experimental support for Gluster distributed file storage as the
+ ``gluster`` disk template under the new ``sharedfile`` storage type through
+ automatic management of per-node FUSE mount points. You can configure the
+ mount point location at ``gnt-cluster init`` time by using the new
+ ``--gluster-storage-dir`` switch.
+- Job scheduling is now handled by luxid, and the maximal number of jobs running
+ in parallel is a run-time parameter of the cluster.
+
+New dependencies
+~~~~~~~~~~~~~~~~
+
+The following new dependencies have been added:
+
+For Haskell:
+
+- ``zlib`` library (http://hackage.haskell.org/package/base64-bytestring)
+
+- ``base64-bytestring`` library (http://hackage.haskell.org/package/zlib),
+ at least version 1.0.0.0
+
+Since 2.11.0 beta1
+~~~~~~~~~~~~~~~~~~
+
+This was the first RC release of the 2.11 series. Since 2.11.0 beta1:
+
+- Convert int to float when checking config. consistency
+- Rename compression option in gnt-backup export
+
+Inherited from the 2.9 branch:
+
+- Fix error introduced during merge
+- gnt-cluster copyfile: accept relative paths
+
+Inherited from the 2.8 branch:
+
+- Improve RAPI detection of the watcher
+- Add patching QA configuration files on buildbots
+- Enable a timeout for instance shutdown
+- Allow KVM commands to have a timeout
+- Allow xen commands to have a timeout
+- Fix wrong docstring
+
+
+Version 2.11.0 beta1
+--------------------
+
+*(Released Wed, 5 Mar 2014)*
+
+This was the first beta release of the 2.11 series. All important changes
+are listed in the latest 2.11 entry.
+
+
+ Version 2.10.3
+ --------------
+
+ *(Released Mon, 14 Apr 2014)*
+
+ - Fix filtering of pending jobs with -o id (issue 778)
+ - Make RAPI API calls more symmetric (issue 770)
+ - Make parsing of old cluster configuration more robust (issue 783)
+ - Fix wrong output of gnt-instance info after migrations
+ - Fix reserved PCI slots for KVM hotplugging
+ - Use runtime hypervisor parameters to calculate bockdevice options for KVM
+ - Fix high node daemon load during disk sync if the sync is paused manually
+ (issue 792)
+ - Improve opportunistic locking during instance creation (issue 791)
+
+ Inherited from the 2.9 branch:
+
+ - Make watcher submit queries low priority (issue 772)
+ - Add reason parameter to RAPI client functions (issue 776)
+ - Fix failing gnt-node list-drbd command (issue 777)
+ - Properly display fake job locks in gnt-debug.
+ - small fixes in documentation
+
+
Version 2.10.2
--------------
finally:
tstop = datetime.datetime.now()
tdelta = tstop - tstart
- print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc))
+ print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc),
+ color=colors.MAGENTA, mark=">")
+ def ReportTestSkip(desc, testnames):
+ """Reports that tests have been skipped.
+
+ @type desc: string
+ @param desc: string
+ @type testnames: string or list of string
+ @param testnames: either a single test name in the configuration
+ file, or a list of testnames (which will be AND-ed together)
+
+ """
+ tstart = datetime.datetime.now()
+ # TODO: Formatting test names when non-string names are involved
+ print _FormatHeader("%s skipping %s, test(s) %s disabled" %
- (tstart, desc, testnames))
++ (tstart, desc, testnames),
++ color=colors.BLUE, mark="*")
+
+
def RunTestIf(testnames, fn, *args, **kwargs):
"""Runs a test conditionally.
if qa_config.TestEnabled(testnames):
RunTest(fn, *args, **kwargs)
else:
- tstart = datetime.datetime.now()
desc = _DescriptionOf(fn)
- # TODO: Formatting test names when non-string names are involved
- print _FormatHeader("%s skipping %s, test(s) %s disabled" %
- (tstart, desc, testnames),
- color=colors.BLUE, mark="*")
+ ReportTestSkip(desc, testnames)
-def RunEnvTests():
- """Run several environment tests.
+def RunTestBlock(fn, *args, **kwargs):
+ """Runs a block of tests after printing a header.
"""
- RunTestIf("env", qa_env.TestSshConnection)
- RunTestIf("env", qa_env.TestIcmpPing)
- RunTestIf("env", qa_env.TestGanetiCommands)
+ tstart = datetime.datetime.now()
+ desc = _DescriptionOf(fn)
-def _LookupRapiSecret(rapi_user):
- """Find the RAPI secret for the given user.
+ print
+ print _FormatHeader("BLOCK %s start %s" % (tstart, desc),
+ color=[colors.YELLOW, colors.BOLD], mark="v")
+
+ try:
+ return fn(*args, **kwargs)
+ except Exception, e:
+ print _FormatHeader("BLOCK FAILED %s: %s" % (desc, e),
+ color=[colors.RED, colors.BOLD])
+ raise
+ finally:
+ tstop = datetime.datetime.now()
+ tdelta = tstop - tstart
+ print _FormatHeader("BLOCK %s time=%s %s" % (tstop, tdelta, desc),
+ color=[colors.MAGENTA, colors.BOLD], mark="^")
- @param rapi_user: Login user
- @return: Login secret for the user
+
+def RunEnvTests():
+ """Run several environment tests.
"""
- CTEXT = "{CLEARTEXT}"
- master = qa_config.GetMasterNode()
- cmd = ["cat", qa_utils.MakeNodePath(master, pathutils.RAPI_USERS_FILE)]
- file_content = qa_utils.GetCommandOutput(master.primary,
- utils.ShellQuoteArgs(cmd))
- users = ParsePasswordFile(file_content)
- entry = users.get(rapi_user)
- if not entry:
- raise qa_error.Error("User %s not found in RAPI users file" % rapi_user)
- secret = entry.password
- if secret.upper().startswith(CTEXT):
- secret = secret[len(CTEXT):]
- elif secret.startswith("{"):
- raise qa_error.Error("Unsupported password schema for RAPI user %s:"
- " not a clear text password" % rapi_user)
- return secret
+ RunTestIf("env", qa_env.TestSshConnection)
+ RunTestIf("env", qa_env.TestIcmpPing)
+ RunTestIf("env", qa_env.TestGanetiCommands)
def SetupCluster(rapi_user):