示例#1
0
    def testParams(self):
        src = opcodes.OpTestDummy(priority=constants.OP_PRIO_HIGH,
                                  debug_level=3)

        res = mcpu._ProcessResult(
            self._Submit, src,
            cmdlib.ResultWithJobs([[
                opcodes.OpTestDelay(priority=constants.OP_PRIO_LOW),
            ], [
                opcodes.OpTestDelay(comment="foobar", debug_level=10),
            ]],
                                  other=True,
                                  value=range(10)))

        self.assertEqual(res, {
            constants.JOB_IDS_KEY: [200, 201],
            "other": True,
            "value": range(10),
        })

        (_, (op1, )) = self._submitted.pop(0)
        (_, (op2, )) = self._submitted.pop(0)
        self.assertRaises(IndexError, self._submitted.pop)

        self.assertEqual(op1.priority, constants.OP_PRIO_LOW)
        self.assertTrue("OP_TEST_DUMMY" in op1.comment)
        self.assertEqual(op1.debug_level, 3)

        # FIXME: as priority is mandatory, there is no way
        # of specifying "just inherit the priority".
        self.assertEqual(op2.comment, "foobar")
        self.assertEqual(op2.debug_level, 3)
示例#2
0
  def testOnNodeUuid(self):
    node_uuids = [self.master_uuid]
    op = opcodes.OpTestDelay(duration=DELAY_DURATION,
                             on_node_uuids=node_uuids)
    self.ExecOpCode(op)

    self.rpc.call_test_delay.assert_called_once_with(node_uuids, DELAY_DURATION)
示例#3
0
    def testOnNodeName(self):
        op = opcodes.OpTestDelay(duration=DELAY_DURATION,
                                 on_nodes=[self.master.name])
        self.ExecOpCode(op)

        self.rpc.call_test_delay.assert_called_once_with([self.master_uuid],
                                                         DELAY_DURATION)
示例#4
0
    def testRepeatedInvocation(self):
        op = opcodes.OpTestDelay(duration=DELAY_DURATION, repeat=3)
        self.ExecOpCode(op)

        self.assertLogContainsMessage(" - INFO: Test delay iteration 0/2")
        self.mcpu.assertLogContainsEntry(constants.ELOG_MESSAGE,
                                         " - INFO: Test delay iteration 1/2")
        self.assertLogContainsRegex("2/2$")
示例#5
0
    def testFailingRpc(self):
        op = opcodes.OpTestDelay(duration=DELAY_DURATION,
                                 on_nodes=[self.master.name])

        self.rpc.call_test_delay.return_value = \
          self.RpcResultsBuilder() \
            .AddFailedNode(self.master) \
            .Build()

        self.ExecOpCodeExpectOpExecError(op)
示例#6
0
  def testDefaults(self):
    src = opcodes.OpTestDummy()

    res = mcpu._ProcessResult(self._Submit, src, cmdlib.ResultWithJobs([[
      opcodes.OpTestDelay(),
      opcodes.OpTestDelay(),
      ], [
      opcodes.OpTestDelay(),
      ]]))

    self.assertEqual(res, {
      constants.JOB_IDS_KEY: [200, 201],
      })

    (_, (op1, op2)) = self._submitted.pop(0)
    (_, (op3, )) = self._submitted.pop(0)
    self.assertRaises(IndexError, self._submitted.pop)

    for op in [op1, op2, op3]:
      self.assertTrue("OP_TEST_DUMMY" in op.comment)
示例#7
0
def _TestJobDependency(opts):
  """Tests job dependencies.

  """
  ToStdout("Testing job dependencies")

  try:
    cl = cli.GetClient()
    SubmitOpCode(opcodes.OpTestDelay(duration=0, depends=[(-1, None)]), cl=cl)
  except errors.GenericError, err:
    if opts.debug:
      ToStdout("Ignoring error for 'wrong dependencies' test: %s", err)
示例#8
0
    def testSuccessfulRpc(self):
        op = opcodes.OpTestDelay(duration=DELAY_DURATION,
                                 on_nodes=[self.master.name])

        self.rpc.call_test_delay.return_value = \
          self.RpcResultsBuilder() \
            .AddSuccessfulNode(self.master) \
            .Build()

        self.ExecOpCode(op)

        self.rpc.call_test_delay.assert_called_once()
示例#9
0
def _TestJobSubmission(opts):
    """Tests submitting jobs.

  """
    ToStdout("Testing job submission")

    testdata = [
        (0, 0, constants.OP_PRIO_LOWEST),
        (0, 0, constants.OP_PRIO_HIGHEST),
    ]

    for priority in (constants.OP_PRIO_SUBMIT_VALID | frozenset(
        [constants.OP_PRIO_LOWEST, constants.OP_PRIO_HIGHEST])):
        for offset in [-1, +1]:
            testdata.extend([
                (0, 0, priority + offset),
                (3, 0, priority + offset),
                (0, 3, priority + offset),
                (4, 2, priority + offset),
            ])

    for before, after, failpriority in testdata:
        ops = []
        ops.extend([opcodes.OpTestDelay(duration=0) for _ in range(before)])
        ops.append(opcodes.OpTestDelay(duration=0, priority=failpriority))
        ops.extend([opcodes.OpTestDelay(duration=0) for _ in range(after)])

        try:
            cl = cli.GetClient()
            cl.SubmitJob(ops)
        except errors.GenericError as err:
            if opts.debug:
                ToStdout("Ignoring error for 'wrong priority' test: %s", err)
        else:
            raise errors.OpExecError(
                "Submitting opcode with priority %s did not"
                " fail when it should (allowed are %s)" %
                (failpriority, constants.OP_PRIO_SUBMIT_VALID))

        jobs = [
            [
                opcodes.OpTestDelay(duration=0),
                opcodes.OpTestDelay(duration=0, dry_run=False),
                opcodes.OpTestDelay(duration=0, dry_run=True)
            ],
            ops,
        ]
        try:
            cl = cli.GetClient()
            cl.SubmitManyJobs(jobs)
        except errors.GenericError as err:
            if opts.debug:
                ToStdout("Ignoring error for 'wrong priority' test: %s", err)
        else:
            raise errors.OpExecError(
                "Submitting manyjobs with an incorrect one"
                " did not fail when it should.")
    ToStdout("Job submission tests were successful")
示例#10
0
    def testMultipleNodes(self):
        node1 = self.cfg.AddNewNode()
        node2 = self.cfg.AddNewNode()
        op = opcodes.OpTestDelay(duration=DELAY_DURATION,
                                 on_nodes=[node1.name, node2.name])

        self.rpc.call_test_delay.return_value = \
          self.RpcResultsBuilder() \
            .AddSuccessfulNode(node1) \
            .AddSuccessfulNode(node2) \
            .Build()

        self.ExecOpCode(op)

        self.rpc.call_test_delay.assert_called_once_with(
            [node1.uuid, node2.uuid], DELAY_DURATION)
示例#11
0
文件: gnt_debug.py 项目: badp/ganeti
def Delay(opts, args):
    """Sleeps for a while

  @param opts: the command line options selected by the user
  @type args: list
  @param args: should contain only one element, the duration
      the sleep
  @rtype: int
  @return: the desired exit code

  """
    delay = float(args[0])
    op = opcodes.OpTestDelay(duration=delay,
                             on_master=opts.on_master,
                             on_nodes=opts.on_nodes,
                             repeat=opts.repeat)
    SubmitOrSend(op, opts)

    return 0
示例#12
0
  """
  ToStdout("Testing job dependencies")

  try:
    cl = cli.GetClient()
    SubmitOpCode(opcodes.OpTestDelay(duration=0, depends=[(-1, None)]), cl=cl)
  except errors.GenericError, err:
    if opts.debug:
      ToStdout("Ignoring error for 'wrong dependencies' test: %s", err)
  else:
    raise errors.OpExecError("Submitting plain opcode with relative job ID"
                             " did not fail as expected")

  # TODO: Test dependencies on errors
  jobs = [
    [opcodes.OpTestDelay(duration=1)],
    [opcodes.OpTestDelay(duration=1,
                         depends=[(-1, [])])],
    [opcodes.OpTestDelay(duration=1,
                         depends=[(-2, [constants.JOB_STATUS_SUCCESS])])],
    [opcodes.OpTestDelay(duration=1,
                         depends=[])],
    [opcodes.OpTestDelay(duration=1,
                         depends=[(-2, [constants.JOB_STATUS_SUCCESS])])],
    ]

  # Function for checking result
  check_fn = ht.TListOf(ht.TAnd(ht.TIsLength(2),
                                ht.TItems([ht.TBool,
                                           ht.TOr(ht.TNonEmptyString,
                                                  ht.TJobId)])))
示例#13
0
    def testInvalidDuration(self):
        op = opcodes.OpTestDelay(duration=-1)

        self.ExecOpCodeExpectOpPrereqError(op)
示例#14
0
def _TestJobDependency(opts):
    """Tests job dependencies.

  """
    ToStdout("Testing job dependencies")

    try:
        cl = cli.GetClient()
        SubmitOpCode(opcodes.OpTestDelay(duration=0, depends=[(-1, None)]),
                     cl=cl)
    except errors.GenericError as err:
        if opts.debug:
            ToStdout("Ignoring error for 'wrong dependencies' test: %s", err)
    else:
        raise errors.OpExecError("Submitting plain opcode with relative job ID"
                                 " did not fail as expected")

    # TODO: Test dependencies on errors
    jobs = [
        [opcodes.OpTestDelay(duration=1)],
        [opcodes.OpTestDelay(duration=1, depends=[(-1, [])])],
        [
            opcodes.OpTestDelay(duration=1,
                                depends=[(-2, [constants.JOB_STATUS_SUCCESS])])
        ],
        [opcodes.OpTestDelay(duration=1, depends=[])],
        [
            opcodes.OpTestDelay(duration=1,
                                depends=[(-2, [constants.JOB_STATUS_SUCCESS])])
        ],
    ]

    # Function for checking result
    check_fn = ht.TListOf(
        ht.TAnd(ht.TIsLength(2),
                ht.TItems([ht.TBool,
                           ht.TOr(ht.TNonEmptyString, ht.TJobId)])))

    cl = cli.GetClient()
    result = cl.SubmitManyJobs(jobs)
    if not check_fn(result):
        raise errors.OpExecError("Job submission doesn't match %s: %s" %
                                 (check_fn, result))

    # Wait for jobs to finish
    jex = JobExecutor(cl=cl, opts=opts)

    for (status, job_id) in result:
        jex.AddJobId(None, status, job_id)

    job_results = jex.GetResults()
    if not compat.all(row[0] for row in job_results):
        raise errors.OpExecError(
            "At least one of the submitted jobs failed: %s" % job_results)

    # Get details about jobs
    data = cl.QueryJobs([job_id for (_, job_id) in result],
                        ["id", "opexec", "ops"])
    data_job_id = [job_id for (job_id, _, _) in data]
    data_opexec = [opexec for (_, opexec, _) in data]
    data_op = [[opcodes.OpCode.LoadOpCode(op) for op in ops]
               for (_, _, ops) in data]

    assert compat.all(not op.depends or len(op.depends) == 1 for ops in data_op
                      for op in ops)

    # Check resolved job IDs in dependencies
    for (job_idx, res_jobdep) in [(1, data_job_id[0]), (2, data_job_id[0]),
                                  (4, data_job_id[2])]:
        if data_op[job_idx][0].depends[0][0] != res_jobdep:
            raise errors.OpExecError(
                "Job %s's opcode doesn't depend on correct job"
                " ID (%s)" % (job_idx, res_jobdep))

    # Check execution order
    if not (data_opexec[0] <= data_opexec[1]
            and data_opexec[0] <= data_opexec[2]
            and data_opexec[2] <= data_opexec[4]):
        raise errors.OpExecError("Jobs did not run in correct order: %s" %
                                 data)

    assert len(jobs) == 5 and compat.all(len(ops) == 1 for ops in jobs)

    ToStdout("Job dependency tests were successful")