コード例 #1
0
ファイル: __init__.py プロジェクト: volans-/ganeti
def _VerifyDisks(cl, uuid, nodes, instances):
    """Run a per-group "gnt-cluster verify-disks".

  """
    op = opcodes.OpGroupVerifyDisks(group_name=uuid,
                                    priority=constants.OP_PRIO_LOW)
    op.reason = [(constants.OPCODE_REASON_SRC_WATCHER,
                  "Verifying disks of group %s" % uuid, utils.EpochNano())]
    job_id = cl.SubmitJob([op])
    ((_, offline_disk_instances, _), ) = \
      cli.PollJob(job_id, cl=cl, feedback_fn=logging.debug)
    try:
        cl.ArchiveJob(job_id)
    except Exception as err:
        logging.exception("Error while archiving job %d" % job_id)

    if not offline_disk_instances:
        # nothing to do
        logging.debug("Verify-disks reported no offline disks, nothing to do")
        return

    logging.debug("Will activate disks for instance(s) %s",
                  utils.CommaJoin(offline_disk_instances))

    # We submit only one job, and wait for it. Not optimal, but this puts less
    # load on the job queue.
    job = []
    for name in offline_disk_instances:
        try:
            inst = instances[name]
        except KeyError:
            logging.info("Can't find instance '%s', maybe it was ignored",
                         name)
            continue

        if inst.status in HELPLESS_STATES or _CheckForOfflineNodes(
                nodes, inst):
            logging.info(
                "Skipping instance '%s' because it is in a helpless state"
                " or has offline secondaries", name)
            continue

        op = opcodes.OpInstanceActivateDisks(instance_name=name)
        op.reason = [(constants.OPCODE_REASON_SRC_WATCHER,
                      "Activating disks for instance %s" % name,
                      utils.EpochNano())]
        job.append(op)

    if job:
        job_id = cli.SendJob(job, cl=cl)

        try:
            cli.PollJob(job_id, cl=cl, feedback_fn=logging.debug)
        except Exception:  # pylint: disable=W0703
            logging.exception("Error while activating disks")
コード例 #2
0
ファイル: group_unittest.py プロジェクト: nh2/ganeti-test-1
    def testDrbdDisk(self):
        node1 = self.cfg.AddNewNode()
        node2 = self.cfg.AddNewNode()
        node3 = self.cfg.AddNewNode()
        node4 = self.cfg.AddNewNode()

        valid_disk = self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
                                         primary_node=node1,
                                         secondary_node=node2)
        broken_disk = self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
                                          primary_node=node1,
                                          secondary_node=node2)
        failing_node_disk = self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
                                                primary_node=node3,
                                                secondary_node=node4)

        self.cfg.AddNewInstance(disks=[valid_disk, broken_disk],
                                primary_node=node1,
                                admin_state=constants.ADMINST_UP)
        self.cfg.AddNewInstance(disks=[failing_node_disk],
                                primary_node=node3,
                                admin_state=constants.ADMINST_UP)

        lv_list_result = dict(("/".join(disk.logical_id), (None, None, True))
                              for disk in itertools.chain(
                                  valid_disk.children, broken_disk.children))
        self.rpc.call_lv_list.return_value = \
          self.RpcResultsBuilder() \
            .AddSuccessfulNode(node1, lv_list_result) \
            .AddSuccessfulNode(node2, lv_list_result) \
            .AddFailedNode(node3) \
            .AddFailedNode(node4) \
            .Build()

        def GetDrbdNeedsActivationResult(node_uuid, *_):
            if node_uuid == node1.uuid:
                return self.RpcResultsBuilder() \
                         .CreateSuccessfulNodeResult(node1, [])
            elif node_uuid == node2.uuid:
                return self.RpcResultsBuilder() \
                         .CreateSuccessfulNodeResult(node2, [broken_disk.uuid])
            elif node_uuid == node3.uuid or node_uuid == node4.uuid:
                return self.RpcResultsBuilder() \
                         .CreateFailedNodeResult(node_uuid)

        self.rpc.call_drbd_needs_activation.side_effect = \
          GetDrbdNeedsActivationResult

        op = opcodes.OpGroupVerifyDisks(group_name=self.group.name)

        (nerrors, offline, missing) = self.ExecOpCode(op)

        self.assertEqual(2, len(nerrors))
        self.assertEqual(1, len(offline))
        self.assertEqual(1, len(missing))
コード例 #3
0
ファイル: group_unittest.py プロジェクト: nh2/ganeti-test-1
    def testOfflineAndFailingNode(self):
        node = self.cfg.AddNewNode(offline=True)
        self.cfg.AddNewInstance(primary_node=node,
                                admin_state=constants.ADMINST_UP)
        self.cfg.AddNewInstance(admin_state=constants.ADMINST_UP)
        self.rpc.call_lv_list.return_value = \
          self.RpcResultsBuilder() \
            .AddFailedNode(self.master) \
            .AddOfflineNode(node) \
            .Build()

        op = opcodes.OpGroupVerifyDisks(group_name=self.group.name)

        (nerrors, offline, missing) = self.ExecOpCode(op)

        self.assertEqual(1, len(nerrors))
        self.assertEqual(0, len(offline))
        self.assertEqual(2, len(missing))
コード例 #4
0
ファイル: group_unittest.py プロジェクト: nh2/ganeti-test-1
    def testValidNodeResult(self):
        self.cfg.AddNewInstance(disks=[
            self.cfg.CreateDisk(dev_type=constants.DT_PLAIN),
            self.cfg.CreateDisk(dev_type=constants.DT_PLAIN)
        ],
                                admin_state=constants.ADMINST_UP)
        self.rpc.call_lv_list.return_value = \
          self.RpcResultsBuilder() \
            .AddSuccessfulNode(self.master, {
              "mockvg/mock_disk_1": (None, None, True),
              "mockvg/mock_disk_2": (None, None, False)
            }) \
            .Build()

        op = opcodes.OpGroupVerifyDisks(group_name=self.group.name)

        (nerrors, offline, missing) = self.ExecOpCode(op)

        self.assertEqual(0, len(nerrors))
        self.assertEqual(1, len(offline))
        self.assertEqual(0, len(missing))
コード例 #5
0
ファイル: group_unittest.py プロジェクト: nh2/ganeti-test-1
    def testNoInstances(self):
        op = opcodes.OpGroupVerifyDisks(group_name=self.group.name)

        self.ExecOpCode(op)

        self.mcpu.assertLogIsEmpty()