Merge branch 'stable-2.10' into stable-2.11
authorHrvoje Ribicic <riba@google.com>
Thu, 10 Apr 2014 11:31:17 +0000 (11:31 +0000)
committerHrvoje Ribicic <riba@google.com>
Thu, 10 Apr 2014 11:57:14 +0000 (11:57 +0000)
* stable-2.10
  Revision bump for 2.10.3
  Update NEWS file for 2.10.3
  Warn in UPGRADE about not tar'ing exported insts
  Fix non-running test and remove custom_nicparams rename
  Acccount for NODE_RES lock in opportunistic locking
  Fix request flooding of noded during disk sync

* stable-2.9
  Allow QA asserts to produce more messages
  Add messages about skipped QA disk template tests
  Fix list-drbd QA test
  Update installation guide wrt to DRBD version
  Update NEWS for 2.9.6
  Revision bump for 2.9.6

Conflicts:
NEWS: Used both entries
configure.ac: Taken 2.11 version numbers
qa/ganeti-qa.py: Moved coloring into ReportTestSkip

Signed-off-by: Hrvoje Ribicic <riba@google.com>
Reviewed-by: Thomas Thrainer <thomasth@google.com>

1  2 
NEWS
UPGRADE
doc/install.rst
lib/cmdlib/instance.py
lib/cmdlib/instance_storage.py
lib/rapi/rlib2.py
qa/ganeti-qa.py
qa/qa_node.py
qa/qa_utils.py
test/py/ganeti.rapi.rlib2_unittest.py

diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,97 -2,30 +2,121 @@@ New
  ====
  
  
 +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
  --------------
  
diff --cc UPGRADE
Simple merge
diff --cc doc/install.rst
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc qa/ganeti-qa.py
@@@ -107,10 -97,25 +107,27 @@@ def RunTest(fn, *args, **kwargs)
    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):
diff --cc qa/qa_node.py
Simple merge
diff --cc qa/qa_utils.py
Simple merge
Simple merge