[Pkg-ganeti-devel] [SCM] Ganeti packaging branch, master, updated. debian/2.1.1-1-10-g9e079db

Iustin Pop iustin at debian.org
Sun May 23 22:37:08 UTC 2010


The following commit has been merged in the master branch:
commit 6f56a3c1fbb9b380fdc07c93bdc16428e917fbc1
Author: Iustin Pop <iustin at debian.org>
Date:   Sun May 23 22:15:08 2010 +0200

    Removed cfgupgrade12 patch (imported upstream)

diff --git a/debian/patches/import-cfgupgrade12.patch b/debian/patches/import-cfgupgrade12.patch
deleted file mode 100644
index c2b1464..0000000
--- a/debian/patches/import-cfgupgrade12.patch
+++ /dev/null
@@ -1,467 +0,0 @@
-From: Iustin Pop <iustin at google.com>
-Date: Wed, 14 Apr 2010 16:27:03 +0000 (+0200)
-Subject: Forward-port the ganeti 2.0 cfgupgrade
-X-Git-Url: http://git.ganeti.org/?p=ganeti.git;a=commitdiff_plain;h=b5672ea0712e91e1a45bb53413f0223b718bf1e6
-
-Forward-port the ganeti 2.0 cfgupgrade
-
-2.1's cfgupgrade doesn't support upgrading from 1.2, only from 2.0.
-However, it's trivial to forward-port the 2.0 cfgupgrade to work with
-2.1, thus providing an upgrade path for 1.2 users directly to 2.1,
-without the intermediate step of installing 2.0.
-
-The new cfgupgrade12 file has just a few trivial changes from 2.0, and
-skipping the load of the config file.
-
-Signed-off-by: Iustin Pop <iustin at google.com>
-Reviewed-by: René Nussbaumer <rn at google.com>
-
-(Modified slightly for Debian:
- - quilt refresh to apply cleanly without fuzz
- - removed doc/admin.rst changes to not need doc rebuild
- - modified Makefile.in to not require re-running autoconf
-)
-
----
-
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -233,6 +233,7 @@
- 	tools/burnin \
- 	tools/cfgshell \
- 	tools/cfgupgrade \
-+	tools/cfgupgrade12 \
- 	tools/cluster-merge \
- 	tools/lvmstrap
- 
---- /dev/null
-+++ b/tools/cfgupgrade12
-@@ -0,0 +1,418 @@
-+#!/usr/bin/python
-+#
-+
-+# Copyright (C) 2007, 2008, 2009 Google Inc.
-+#
-+# This program is free software; you can redistribute it and/or modify
-+# it under the terms of the GNU General Public License as published by
-+# the Free Software Foundation; either version 2 of the License, or
-+# (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful, but
-+# WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+# General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-+# 02110-1301, USA.
-+
-+# pylint: disable-msg=C0103,E1103
-+
-+# C0103: invalid name NoDefault
-+# E1103: Instance of 'foor' has no 'bar' member (but some types could
-+# not be inferred)
-+
-+
-+"""Tool to upgrade the configuration file.
-+
-+This code handles only the types supported by simplejson. As an
-+example, 'set' is a 'list'.
-+
-+ at note: this has lots of duplicate content with C{cfgupgrade}. Ideally, it
-+should be merged.
-+
-+"""
-+
-+
-+import os
-+import os.path
-+import sys
-+import optparse
-+import logging
-+import errno
-+
-+from ganeti import constants
-+from ganeti import serializer
-+from ganeti import utils
-+from ganeti import cli
-+from ganeti import bootstrap
-+
-+
-+options = None
-+args = None
-+
-+# Unique object to identify calls without default value
-+NoDefault = object()
-+
-+# Dictionary with instance old keys, and new hypervisor keys
-+INST_HV_CHG = {
-+  'hvm_pae': constants.HV_PAE,
-+  'vnc_bind_address': constants.HV_VNC_BIND_ADDRESS,
-+  'initrd_path': constants.HV_INITRD_PATH,
-+  'hvm_nic_type': constants.HV_NIC_TYPE,
-+  'kernel_path': constants.HV_KERNEL_PATH,
-+  'hvm_acpi': constants.HV_ACPI,
-+  'hvm_cdrom_image_path': constants.HV_CDROM_IMAGE_PATH,
-+  'hvm_boot_order': constants.HV_BOOT_ORDER,
-+  'hvm_disk_type': constants.HV_DISK_TYPE,
-+  }
-+
-+# Instance beparams changes
-+INST_BE_CHG = {
-+  'vcpus': constants.BE_VCPUS,
-+  'memory': constants.BE_MEMORY,
-+  'auto_balance': constants.BE_AUTO_BALANCE,
-+  }
-+
-+# Field names
-+F_SERIAL = 'serial_no'
-+
-+
-+class Error(Exception):
-+  """Generic exception"""
-+  pass
-+
-+
-+def SsconfName(key):
-+  """Returns the file name of an (old) ssconf key.
-+
-+  """
-+  return "%s/ssconf_%s" % (options.data_dir, key)
-+
-+
-+def ReadFile(file_name, default=NoDefault):
-+  """Reads a file.
-+
-+  """
-+  logging.debug("Reading %s", file_name)
-+  try:
-+    fh = open(file_name, 'r')
-+  except IOError, err:
-+    if default is not NoDefault and err.errno == errno.ENOENT:
-+      return default
-+    raise
-+
-+  try:
-+    return fh.read()
-+  finally:
-+    fh.close()
-+
-+
-+def WriteFile(file_name, data):
-+  """Writes a configuration file.
-+
-+  """
-+  logging.debug("Writing %s", file_name)
-+  utils.WriteFile(file_name=file_name, data=data, mode=0600,
-+                  dry_run=options.dry_run, backup=True)
-+
-+
-+def GenerateSecret(all_secrets):
-+  """Generate an unique DRBD secret.
-+
-+  This is a copy from ConfigWriter.
-+
-+  """
-+  retries = 64
-+  while retries > 0:
-+    secret = utils.GenerateSecret()
-+    if secret not in all_secrets:
-+      break
-+    retries -= 1
-+  else:
-+    raise Error("Can't generate unique DRBD secret")
-+  return secret
-+
-+
-+def SetupLogging():
-+  """Configures the logging module.
-+
-+  """
-+  formatter = logging.Formatter("%(asctime)s: %(message)s")
-+
-+  stderr_handler = logging.StreamHandler()
-+  stderr_handler.setFormatter(formatter)
-+  if options.debug:
-+    stderr_handler.setLevel(logging.NOTSET)
-+  elif options.verbose:
-+    stderr_handler.setLevel(logging.INFO)
-+  else:
-+    stderr_handler.setLevel(logging.CRITICAL)
-+
-+  root_logger = logging.getLogger("")
-+  root_logger.setLevel(logging.NOTSET)
-+  root_logger.addHandler(stderr_handler)
-+
-+
-+def Cluster12To20(cluster):
-+  """Upgrades the cluster object from 1.2 to 2.0.
-+
-+  """
-+  logging.info("Upgrading the cluster object")
-+  # Upgrade the configuration version
-+  if 'config_version' in cluster:
-+    del cluster['config_version']
-+
-+  # Add old ssconf keys back to config
-+  logging.info(" - importing ssconf keys")
-+  for key in ('master_node', 'master_ip', 'master_netdev', 'cluster_name'):
-+    if key not in cluster:
-+      cluster[key] = ReadFile(SsconfName(key)).strip()
-+
-+  if 'default_hypervisor' not in cluster:
-+    old_hyp = ReadFile(SsconfName('hypervisor')).strip()
-+    if old_hyp == "xen-3.0":
-+      hyp = "xen-pvm"
-+    elif old_hyp == "xen-hvm-3.1":
-+      hyp = "xen-hvm"
-+    elif old_hyp == "fake":
-+      hyp = "fake"
-+    else:
-+      raise Error("Unknown old hypervisor name '%s'" % old_hyp)
-+
-+    logging.info("Setting the default and enabled hypervisor")
-+    cluster['default_hypervisor'] = hyp
-+    cluster['enabled_hypervisors'] = [hyp]
-+
-+  # hv/be params
-+  if 'hvparams' not in cluster:
-+    logging.info(" - adding hvparams")
-+    cluster['hvparams'] = constants.HVC_DEFAULTS
-+  if 'beparams' not in cluster:
-+    logging.info(" - adding beparams")
-+    cluster['beparams'] = {constants.PP_DEFAULT: constants.BEC_DEFAULTS}
-+
-+  # file storage
-+  if 'file_storage_dir' not in cluster:
-+    cluster['file_storage_dir'] = constants.DEFAULT_FILE_STORAGE_DIR
-+
-+  # candidate pool size
-+  if 'candidate_pool_size' not in cluster:
-+    cluster['candidate_pool_size'] = constants.MASTER_POOL_SIZE_DEFAULT
-+
-+
-+def Node12To20(node):
-+  """Upgrades a node from 1.2 to 2.0.
-+
-+  """
-+  logging.info("Upgrading node %s", node['name'])
-+  if F_SERIAL not in node:
-+    node[F_SERIAL] = 1
-+  if 'master_candidate' not in node:
-+    node['master_candidate'] = True
-+  for key in 'offline', 'drained':
-+    if key not in node:
-+      node[key] = False
-+
-+
-+def Instance12To20(drbd_minors, secrets, hypervisor, instance):
-+  """Upgrades an instance from 1.2 to 2.0.
-+
-+  """
-+  if F_SERIAL not in instance:
-+    instance[F_SERIAL] = 1
-+
-+  if 'hypervisor' not in instance:
-+    instance['hypervisor'] = hypervisor
-+
-+  # hvparams changes
-+  if 'hvparams' not in instance:
-+    instance['hvparams'] = hvp = {}
-+  for old, new in INST_HV_CHG.items():
-+    if old in instance:
-+      if (instance[old] is not None and
-+          instance[old] != constants.VALUE_DEFAULT and # no longer valid in 2.0
-+          new in constants.HVC_DEFAULTS[hypervisor]):
-+        hvp[new] = instance[old]
-+      del instance[old]
-+
-+  # beparams changes
-+  if 'beparams' not in instance:
-+    instance['beparams'] = bep = {}
-+  for old, new in INST_BE_CHG.items():
-+    if old in instance:
-+      if instance[old] is not None:
-+        bep[new] = instance[old]
-+      del instance[old]
-+
-+  # disk changes
-+  for disk in instance['disks']:
-+    Disk12To20(drbd_minors, secrets, disk)
-+
-+  # other instance changes
-+  if 'status' in instance:
-+    instance['admin_up'] = instance['status'] == 'up'
-+    del instance['status']
-+
-+
-+def Disk12To20(drbd_minors, secrets, disk):
-+  """Upgrades a disk from 1.2 to 2.0.
-+
-+  """
-+  if 'mode' not in disk:
-+    disk['mode'] = constants.DISK_RDWR
-+  if disk['dev_type'] == constants.LD_DRBD8:
-+    old_lid = disk['logical_id']
-+    for node in old_lid[:2]:
-+      if node not in drbd_minors:
-+        raise Error("Can't find node '%s' while upgrading disk" % node)
-+      drbd_minors[node] += 1
-+      minor = drbd_minors[node]
-+      old_lid.append(minor)
-+    old_lid.append(GenerateSecret(secrets))
-+    del disk['physical_id']
-+  if disk['children']:
-+    for child in disk['children']:
-+      Disk12To20(drbd_minors, secrets, child)
-+
-+
-+def main():
-+  """Main program.
-+
-+  """
-+  # pylint: disable-msg=W0603
-+  global options, args
-+
-+  program = os.path.basename(sys.argv[0])
-+
-+  # Option parsing
-+  parser = optparse.OptionParser(usage="%prog [--debug|--verbose] [--force]")
-+  parser.add_option('--dry-run', dest='dry_run',
-+                    action="store_true",
-+                    help="Try to do the conversion, but don't write"
-+                         " output file")
-+  parser.add_option(cli.FORCE_OPT)
-+  parser.add_option(cli.DEBUG_OPT)
-+  parser.add_option(cli.VERBOSE_OPT)
-+  parser.add_option('--path', help="Convert configuration in this"
-+                    " directory instead of '%s'" % constants.DATA_DIR,
-+                    default=constants.DATA_DIR, dest="data_dir")
-+  (options, args) = parser.parse_args()
-+
-+  # We need to keep filenames locally because they might be renamed between
-+  # versions.
-+  options.CONFIG_DATA_PATH = options.data_dir + "/config.data"
-+  options.SERVER_PEM_PATH = options.data_dir + "/server.pem"
-+  options.KNOWN_HOSTS_PATH = options.data_dir + "/known_hosts"
-+  options.RAPI_CERT_FILE = options.data_dir + "/rapi.pem"
-+
-+  SetupLogging()
-+
-+  # Option checking
-+  if args:
-+    raise Error("No arguments expected")
-+
-+  if not options.force:
-+    usertext = ("%s MUST be run on the master node. Is this the master"
-+                " node and are ALL instances down?" % program)
-+    if not cli.AskUser(usertext):
-+      sys.exit(1)
-+
-+  # Check whether it's a Ganeti configuration directory
-+  if not (os.path.isfile(options.CONFIG_DATA_PATH) and
-+          os.path.isfile(options.SERVER_PEM_PATH) or
-+          os.path.isfile(options.KNOWN_HOSTS_PATH)):
-+    raise Error(("%s does not seem to be a known Ganeti configuration"
-+                 " directory") % options.data_dir)
-+
-+  config_version = ReadFile(SsconfName('config_version'), "1.2").strip()
-+  logging.info("Found configuration version %s", config_version)
-+
-+  config_data = serializer.LoadJson(ReadFile(options.CONFIG_DATA_PATH))
-+
-+  # Ganeti 1.2?
-+  if config_version == "1.2":
-+    logging.info("Found a Ganeti 1.2 configuration")
-+
-+    cluster = config_data["cluster"]
-+
-+    old_config_version = cluster.get("config_version", None)
-+    logging.info("Found old configuration version %s", old_config_version)
-+    if old_config_version not in (3, ):
-+      raise Error("Unsupported configuration version: %s" %
-+                  old_config_version)
-+    if 'version' not in config_data:
-+      config_data['version'] = constants.BuildVersion(2, 0, 0)
-+    if F_SERIAL not in config_data:
-+      config_data[F_SERIAL] = 1
-+
-+    # Make sure no instance uses remote_raid1 anymore
-+    remote_raid1_instances = []
-+    for instance in config_data["instances"].values():
-+      if instance["disk_template"] == "remote_raid1":
-+        remote_raid1_instances.append(instance["name"])
-+    if remote_raid1_instances:
-+      for name in remote_raid1_instances:
-+        logging.error("Instance %s still using remote_raid1 disk template",
-+                      name)
-+      raise Error("Unable to convert configuration as long as there are"
-+                  " instances using remote_raid1 disk template")
-+
-+    # Build content of new known_hosts file
-+    cluster_name = ReadFile(SsconfName('cluster_name')).rstrip()
-+    cluster_key = cluster['rsahostkeypub']
-+    known_hosts = "%s ssh-rsa %s\n" % (cluster_name, cluster_key)
-+
-+    Cluster12To20(cluster)
-+
-+    # Add node attributes
-+    logging.info("Upgrading nodes")
-+    # stable-sort the names to have repeatable runs
-+    for node_name in utils.NiceSort(config_data['nodes'].keys()):
-+      Node12To20(config_data['nodes'][node_name])
-+
-+    # Instance changes
-+    logging.info("Upgrading instances")
-+    drbd_minors = dict.fromkeys(config_data['nodes'], 0)
-+    secrets = set()
-+    # stable-sort the names to have repeatable runs
-+    for instance_name in utils.NiceSort(config_data['instances'].keys()):
-+      Instance12To20(drbd_minors, secrets, cluster['default_hypervisor'],
-+                     config_data['instances'][instance_name])
-+
-+  else:
-+    logging.info("Found a Ganeti 2.0 configuration")
-+
-+    if "config_version" in config_data["cluster"]:
-+      raise Error("Inconsistent configuration: found config_data in"
-+                  " configuration file")
-+
-+    known_hosts = None
-+
-+  try:
-+    logging.info("Writing configuration file")
-+    WriteFile(options.CONFIG_DATA_PATH, serializer.DumpJson(config_data))
-+
-+    if known_hosts is not None:
-+      logging.info("Writing SSH known_hosts file (%s)", known_hosts.strip())
-+      WriteFile(options.KNOWN_HOSTS_PATH, known_hosts)
-+
-+    if not options.dry_run:
-+      if not os.path.exists(options.RAPI_CERT_FILE):
-+        logging.debug("Writing RAPI certificate to %s", options.RAPI_CERT_FILE)
-+        bootstrap.GenerateSelfSignedSslCert(options.RAPI_CERT_FILE)
-+
-+  except:
-+    logging.critical("Writing configuration failed. It is probably in an"
-+                     " inconsistent state and needs manual intervention.")
-+    raise
-+
-+  logging.info("Configuration file updated.")
-+
-+
-+if __name__ == "__main__":
-+  main()
-+
-+# vim: set foldmethod=marker :
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -393,6 +393,7 @@
- 	tools/burnin \
- 	tools/cfgshell \
- 	tools/cfgupgrade \
-+	tools/cfgupgrade12 \
- 	tools/cluster-merge \
- 	tools/lvmstrap
- 
diff --git a/debian/patches/series b/debian/patches/series
index 52eba52..2c35a61 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,4 @@
 fix-startup-with-old-config.patch
-import-cfgupgrade12.patch
 cfgupgrade12-remove-old-ssconf.patch
 fix-check-man.patch
 fix-watcher-hooks-warning.patch

-- 
Ganeti packaging



More information about the Pkg-ganeti-devel mailing list