commit 28863008bdc4ae56440af23f8bbf92da250c588d
Merge: ac77262 1c5456b
Author: Hrvoje Ribicic <[email protected]>
Date:   Thu Mar 19 15:08:41 2015 +0000

    Merge branch 'stable-2.11' into stable-2.12

    * stable-2.11
      Improve speed of Xen hypervisor unit tests
      Improve Xen instance state handling

    * stable-2.10
      Make QA fail if KVM hotplugging fails
      Always preserve QA command output
      Don't lose stdout/stderr in AssertCommand
      qa_utils: Allow passing fail=None to AssertCommand
      qa_utils: Make AssertCommand return stdout/stderr as well
      Allow plain/DRBD conversions regardless of lack of disks
      Add support for ipolicy modifications to mock config

    Conflicts:
    lib/cmdlib/instance.py
    qa/qa_instance.py
    test/py/cmdlib/testsupport/config_mock.py
    Resolution:
    instance.py: Keep new testing logic, modify snode fetch.
    qa_instance.py: Reenable hotplug tests.
            config_mock.py: Combine all changes.

    Signed-off-by: Hrvoje Ribicic <[email protected]>

diff --cc lib/cmdlib/instance.py
index 8508ae8,5bb47db..d5b2c6b
--- a/lib/cmdlib/instance.py
+++ b/lib/cmdlib/instance.py
@@@ -3678,17 -3282,20 +3678,23 @@@ class LUInstanceSetParams(LogicalUnit)
      """Converts an instance from drbd to plain.

      """
 +    secondary_nodes =
self.cfg.GetInstanceSecondaryNodes(self.instance.uuid)
-     assert len(secondary_nodes) == 1
++
      assert self.instance.disk_template == constants.DT_DRBD8
 -    assert len(self.instance.secondary_nodes) == 1 or not
self.instance.disks
++    assert len(secondary_nodes) == 1 or not self.instance.disks

      pnode_uuid = self.instance.primary_node
-     snode_uuid = secondary_nodes[0]
+
+     # it will not be possible to calculate the snode_uuid later
+     snode_uuid = None
 -    if self.instance.secondary_nodes:
 -      snode_uuid = self.instance.secondary_nodes[0]
++    if secondary_nodes:
++      snode_uuid = secondary_nodes[0]
+
      feedback_fn("Converting template to plain")

 -    old_disks = AnnotateDiskParams(self.instance, self.instance.disks,
self.cfg)
 -    new_disks = [d.children[0] for d in self.instance.disks]
 +    disks = self.cfg.GetInstanceDisks(self.instance.uuid)
 +    old_disks = AnnotateDiskParams(self.instance, disks, self.cfg)
 +    new_disks = [d.children[0] for d in disks]

      # copy over size, mode and name
      for parent, child in zip(old_disks, new_disks):
diff --cc qa/qa_instance.py
index b98cf0a,482f024..6cbe96e
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@@ -611,23 -585,8 +630,14 @@@ def TestInstanceModify(instance)
        ])
    elif default_hv == constants.HT_KVM and \
      qa_config.TestEnabled("instance-device-hotplug"):
-     # FIXME: Fix issue 885 and then re-enable the tests below
-     #args.extend([
-     #  ["--net", "-1:add", "--hotplug"],
-     #  ["--net", "-1:modify,mac=aa:bb:cc:dd:ee:ff", "--hotplug",
"--force"],
-     #  ["--net", "-1:remove", "--hotplug"],
-     #  ])
-     args.extend([
-       ["--disk", "-1:add,size=1G", "--hotplug"],
-       ["--disk", "-1:remove", "--hotplug"],
-       ])
+     _TestKVMHotplug(instance)

 +  url = "http://example.com/busybox.img";
 +  args.extend([
 +      ["--os-parameters", "os-image=" + url],
 +      ["--os-parameters", "os-image=default"]
 +      ])
 +
    for alist in args:
      AssertCommand(["gnt-instance", "modify"] + alist + [instance.name])

diff --cc test/py/cmdlib/testsupport/config_mock.py
index 2fe8f67,f90a8e5..57ca73f
--- a/test/py/cmdlib/testsupport/config_mock.py
+++ b/test/py/cmdlib/testsupport/config_mock.py
@@@ -572,16 -549,27 +572,36 @@@ class ConfigMock(config.ConfigWriter)
      cluster.enabled_disk_templates = list(enabled_disk_templates)
      cluster.ipolicy[constants.IPOLICY_DTS] = list(enabled_disk_templates)

 +  def ComputeDRBDMap(self):
 +    return dict((node_uuid, {}) for node_uuid in self._ConfigData().nodes)
 +
 +  def AllocateDRBDMinor(self, node_uuids, inst_uuid):
 +    return map(lambda _: 0, node_uuids)
 +
 +  def _UnlockedReleaseDRBDMinors(self, inst_uuid):
 +    pass
 +
+   def SetIPolicyField(self, category, field, value):
+     """Set a value of a desired ipolicy field.
+
+     @type category: one of L{constants.ISPECS_MAX},
L{constants.ISPECS_MIN},
+       L{constants.ISPECS_STD}
+     @param category: Whether to change the default value, or the upper or
lower
+       bound.
+     @type field: string
+     @param field: The field to change.
+     @type value: any
+     @param value: The value to assign.
+
+     """
+     if category not in [constants.ISPECS_MAX, constants.ISPECS_MIN,
+                         constants.ISPECS_STD]:
+       raise ValueError("Invalid ipolicy category %s" % category)
+
+     ipolicy_dict =
self.GetClusterInfo().ipolicy[constants.ISPECS_MINMAX][0]
+     ipolicy_dict[category][field] = value
+
 -  def _OpenConfig(self, accept_foreign):
 +  def _CreateConfig(self):
      self._config_data = objects.ConfigData(
        version=constants.CONFIG_VERSION,
        cluster=None,

Reply via email to