Revision f006f110 qa/qa_instance.py

b/qa/qa_instance.py
89 89

  
90 90
  @type instance: string
91 91
  @param instance: the instance name
92
  @return: a dictionary with two keys:
92
  @return: a dictionary with the following keys:
93 93
      - "nodes": instance nodes, a list of strings
94 94
      - "volumes": instance volume IDs, a list of strings
95
      - "drbd-minors": DRBD minors used by the instance, a dictionary where
96
        keys are nodes, and values are lists of integers (or an empty
97
        dictionary for non-DRBD instances)
95 98

  
96 99
  """
97 100
  master = qa_config.GetMasterNode()
......
106 109
  # FIXME This works with no more than 2 secondaries
107 110
  re_nodelist = re.compile(node_elem + "(?:," + node_elem + ")?$")
108 111
  re_vol = re.compile(r"^\s+logical_id:\s+(\S+)$")
112
  re_drbdnode = re.compile(r"^\s+node[AB]:\s+([^\s,]+),\s+minor=([0-9]+)$")
109 113
  nodes = []
110 114
  vols = []
115
  drbd_min = {}
111 116
  for line in info_out.splitlines():
112 117
    m = re_node.match(line)
113 118
    if m:
......
120 125
    m = re_vol.match(line)
121 126
    if m:
122 127
      vols.append(m.group(1))
128
    m = re_drbdnode.match(line)
129
    if m:
130
      node = m.group(1)
131
      minor = int(m.group(2))
132
      if drbd_min.get(node) is not None:
133
        drbd_min[node].append(minor)
134
      else:
135
        drbd_min[node] = [minor]
123 136
  assert vols
124 137
  assert nodes
125
  return {"nodes": nodes, "volumes": vols}
138
  return {"nodes": nodes, "volumes": vols, "drbd-minors": drbd_min}
126 139

  
127 140

  
128 141
def _DestroyInstanceVolumes(instance):
......
698 711
def TestBackupListFields():
699 712
  """gnt-backup list-fields"""
700 713
  qa_utils.GenericQueryFieldsTest("gnt-backup", query.EXPORT_FIELDS.keys())
714

  
715

  
716
def TestRemoveInstanceOfflineNode(instance, snode, set_offline, set_online):
717
  """gtn-instance remove with an off-line node
718

  
719
  @param instance: instance
720
  @param snode: secondary node, to be set offline
721
  @param set_offline: function to call to set the node off-line
722
  @param set_online: function to call to set the node on-line
723

  
724
  """
725
  info = _GetInstanceInfo(instance["name"])
726
  set_offline(snode)
727
  try:
728
    TestInstanceRemove(instance)
729
  finally:
730
    set_online(snode)
731
  # Clean up the disks on the offline node
732
  for minor in info["drbd-minors"][snode["primary"]]:
733
    AssertCommand(["drbdsetup", str(minor), "down"], node=snode)
734
  AssertCommand(["lvremove", "-f"] + info["volumes"], node=snode)

Also available in: Unified diff