コード例 #1
0
def TestEmptyCluster():
    """Testing remote API on an empty cluster.

  """
    master = qa_config.GetMasterNode()
    master_full = qa_utils.ResolveNodeName(master)

    def _VerifyInfo(data):
        AssertIn("name", data)
        AssertIn("master", data)
        AssertEqual(data["master"], master_full)

    def _VerifyNodes(data):
        master_entry = {
            "id": master_full,
            "uri": "/2/nodes/%s" % master_full,
        }
        AssertIn(master_entry, data)

    def _VerifyNodesBulk(data):
        for node in data:
            for entry in NODE_FIELDS:
                AssertIn(entry, node)

    def _VerifyGroups(data):
        default_group = {
            "name": constants.INITIAL_NODE_GROUP_NAME,
            "uri": "/2/groups/" + constants.INITIAL_NODE_GROUP_NAME,
        }
        AssertIn(default_group, data)

    def _VerifyGroupsBulk(data):
        for group in data:
            for field in GROUP_FIELDS:
                AssertIn(field, group)

    _DoTests([
        ("/", None, "GET", None),
        ("/2/info", _VerifyInfo, "GET", None),
        ("/2/tags", None, "GET", None),
        ("/2/nodes", _VerifyNodes, "GET", None),
        ("/2/nodes?bulk=1", _VerifyNodesBulk, "GET", None),
        ("/2/groups", _VerifyGroups, "GET", None),
        ("/2/groups?bulk=1", _VerifyGroupsBulk, "GET", None),
        ("/2/instances", [], "GET", None),
        ("/2/instances?bulk=1", [], "GET", None),
        ("/2/os", None, "GET", None),
    ])

    # Test HTTP Not Found
    for method in ["GET", "PUT", "POST", "DELETE"]:
        try:
            _DoTests([("/99/resource/not/here/99", None, method, None)])
        except rapi.client.GanetiApiError, err:
            AssertEqual(err.code, 404)
        else:
            raise qa_error.Error(
                "Non-existent resource didn't return HTTP 404")
コード例 #2
0
def TestOutOfBand():
  """gnt-node power"""
  master = qa_config.GetMasterNode()

  node = qa_config.AcquireNode(exclude=master)

  master_name = master.primary
  node_name = node.primary
  full_node_name = qa_utils.ResolveNodeName(node)

  (oob_path, verify_path,
   data_path, exit_code_path) = _CreateOobScriptStructure()

  try:
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
                   "oob_program=%s" % oob_path])

    # No data, exit 0
    _UpdateOobFile(exit_code_path, "0")

    AssertCommand(["gnt-node", "power", "on", node_name])
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)

    AssertCommand(["gnt-node", "power", "-f", "off", node_name])
    _AssertOobCall(verify_path, "power-off %s" % full_node_name)

    # Power off on master without options should fail
    AssertCommand(["gnt-node", "power", "-f", "off", master_name], fail=True)
    # With force master it should still fail
    AssertCommand(["gnt-node", "power", "-f", "--ignore-status", "off",
                   master_name],
                  fail=True)

    # Verify we can't transform back to online when not yet powered on
    AssertCommand(["gnt-node", "modify", "-O", "no", node_name],
                  fail=True)
    # Now reset state
    AssertCommand(["gnt-node", "modify", "-O", "no", "--node-powered", "yes",
                   node_name])

    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name])
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)

    # Those commands should fail as they expect output which isn't provided yet
    # But they should have called the oob helper nevermind
    AssertCommand(["gnt-node", "power", "status", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)

    AssertCommand(["gnt-node", "health", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "health %s" % full_node_name)

    AssertCommand(["gnt-node", "health"], fail=True)

    # Correct Data, exit 0
    _UpdateOobFile(data_path, serializer.DumpJson({"powered": True}))

    AssertCommand(["gnt-node", "power", "status", node_name])
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)

    _UpdateOobFile(data_path, serializer.DumpJson([["temp", "OK"],
                                                   ["disk0", "CRITICAL"]]))

    AssertCommand(["gnt-node", "health", node_name])
    _AssertOobCall(verify_path, "health %s" % full_node_name)

    AssertCommand(["gnt-node", "health"])

    # Those commands should fail as they expect no data regardless of exit 0
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)

    try:
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
    finally:
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])

    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)

    # Data, exit 1 (all should fail)
    _UpdateOobFile(exit_code_path, "1")

    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)

    try:
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
    finally:
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])

    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)

    AssertCommand(["gnt-node", "power", "status", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)

    AssertCommand(["gnt-node", "health", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "health %s" % full_node_name)

    AssertCommand(["gnt-node", "health"], fail=True)

    # No data, exit 1 (all should fail)
    _UpdateOobFile(data_path, "")
    AssertCommand(["gnt-node", "power", "on", node_name], fail=True)
    _AssertOobCall(verify_path, "power-on %s" % full_node_name)

    try:
      AssertCommand(["gnt-node", "power", "-f", "off", node_name], fail=True)
      _AssertOobCall(verify_path, "power-off %s" % full_node_name)
    finally:
      AssertCommand(["gnt-node", "modify", "-O", "no", node_name])

    AssertCommand(["gnt-node", "power", "-f", "cycle", node_name], fail=True)
    _AssertOobCall(verify_path, "power-cycle %s" % full_node_name)

    AssertCommand(["gnt-node", "power", "status", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "power-status %s" % full_node_name)

    AssertCommand(["gnt-node", "health", node_name],
                  fail=True)
    _AssertOobCall(verify_path, "health %s" % full_node_name)

    AssertCommand(["gnt-node", "health"], fail=True)

    # Different OOB script for node
    verify_path2 = qa_utils.UploadData(master.primary, "")
    oob_script = ("#!/bin/sh\n"
                  "echo \"$@\" > %s\n") % verify_path2
    oob_path2 = qa_utils.UploadData(master.primary, oob_script, mode=0700)

    try:
      AssertCommand(["gnt-node", "modify", "--node-parameters",
                     "oob_program=%s" % oob_path2, node_name])
      AssertCommand(["gnt-node", "power", "on", node_name])
      _AssertOobCall(verify_path2, "power-on %s" % full_node_name)
    finally:
      AssertCommand(["gnt-node", "modify", "--node-parameters",
                     "oob_program=default", node_name])
      AssertCommand(["rm", "-f", oob_path2, verify_path2])
  finally:
    AssertCommand(["gnt-cluster", "modify", "--node-parameters",
                   "oob_program="])
    AssertCommand(["rm", "-f", oob_path, verify_path, data_path,
                   exit_code_path])
コード例 #3
0
ファイル: qa_rapi.py プロジェクト: vanloswang/ganeti
def TestRapiQuery():
    """Testing resource queries via remote API.

  """
    # FIXME: the tests are failing if no LVM is enabled, investigate
    # if it is a bug in the QA or in the code
    if not qa_config.IsStorageTypeSupported(constants.ST_LVM_VG):
        return

    master_name = qa_utils.ResolveNodeName(qa_config.GetMasterNode())
    rnd = random.Random(7818)

    for what in constants.QR_VIA_RAPI:
        namefield = {
            constants.QR_JOB: "id",
            constants.QR_EXPORT: "export",
            constants.QR_FILTER: "uuid",
        }.get(what, "name")

        all_fields = query.ALL_FIELDS[what].keys()
        rnd.shuffle(all_fields)

        # No fields, should return everything
        result = _rapi_client.QueryFields(what)
        qresult = objects.QueryFieldsResponse.FromDict(result)
        AssertEqual(len(qresult.fields), len(all_fields))

        # One field
        result = _rapi_client.QueryFields(what, fields=[namefield])
        qresult = objects.QueryFieldsResponse.FromDict(result)
        AssertEqual(len(qresult.fields), 1)

        # Specify all fields, order must be correct
        result = _rapi_client.QueryFields(what, fields=all_fields)
        qresult = objects.QueryFieldsResponse.FromDict(result)
        AssertEqual(len(qresult.fields), len(all_fields))
        AssertEqual([fdef.name for fdef in qresult.fields], all_fields)

        # Unknown field
        result = _rapi_client.QueryFields(what, fields=["_unknown!"])
        qresult = objects.QueryFieldsResponse.FromDict(result)
        AssertEqual(len(qresult.fields), 1)
        AssertEqual(qresult.fields[0].name, "_unknown!")
        AssertEqual(qresult.fields[0].kind, constants.QFT_UNKNOWN)

        # Try once more, this time without the client
        _DoTests([
            ("/2/query/%s/fields" % what, None, "GET", None),
            ("/2/query/%s/fields?fields=%s,%s,%s" %
             (what, namefield, namefield, all_fields[0]), None, "GET", None),
        ])

        # Try missing query argument
        try:
            _DoTests([
                ("/2/query/%s" % what, None, "GET", None),
            ])
        except rapi.client.GanetiApiError, err:
            AssertEqual(err.code, 400)
        else:
            raise qa_error.Error(
                "Request missing 'fields' parameter didn't fail")

        def _Check(exp_fields, data):
            qresult = objects.QueryResponse.FromDict(data)
            AssertEqual([fdef.name for fdef in qresult.fields], exp_fields)
            if not isinstance(qresult.data, list):
                raise qa_error.Error("Query did not return a list")

        _DoTests([
            # Specify fields in query
            ("/2/query/%s?fields=%s" % (what, ",".join(all_fields)),
             compat.partial(_Check, all_fields), "GET", None),
            ("/2/query/%s?fields=%s" % (what, namefield),
             compat.partial(_Check, [namefield]), "GET", None),

            # Note the spaces
            ("/2/query/%s?fields=%s,%%20%s%%09,%s%%20" %
             (what, namefield, namefield, namefield),
             compat.partial(_Check, [namefield] * 3), "GET", None)
        ])

        if what in constants.QR_VIA_RAPI_PUT:
            _DoTests([
                # PUT with fields in query
                ("/2/query/%s?fields=%s" % (what, namefield),
                 compat.partial(_Check, [namefield]), "PUT", {}),
                ("/2/query/%s" % what, compat.partial(_Check, [namefield] * 4),
                 "PUT", {
                     "fields": [namefield] * 4,
                 }),
                ("/2/query/%s" % what, compat.partial(_Check,
                                                      all_fields), "PUT", {
                                                          "fields": all_fields,
                                                      }),
                ("/2/query/%s" % what, compat.partial(_Check, [namefield] * 4),
                 "PUT", {
                     "fields": [namefield] * 4
                 })
            ])

        if what in constants.QR_VIA_RAPI_PUT:
            trivial_filter = {
                constants.QR_JOB: [qlang.OP_GE, namefield, 0],
            }.get(what, [qlang.OP_REGEXP, namefield, ".*"])

            _DoTests([
                # With filter
                ("/2/query/%s" % what, compat.partial(_Check,
                                                      all_fields), "PUT", {
                                                          "fields": all_fields,
                                                          "filter":
                                                          trivial_filter
                                                      }),
            ])

        if what == constants.QR_NODE:
            # Test with filter
            (nodes, ) = _DoTests([("/2/query/%s" % what,
                                   compat.partial(_Check, ["name", "master"]),
                                   "PUT", {
                                       "fields": ["name", "master"],
                                       "filter": [qlang.OP_TRUE, "master"],
                                   })])
            qresult = objects.QueryResponse.FromDict(nodes)
            AssertEqual(qresult.data, [
                [[constants.RS_NORMAL, master_name],
                 [constants.RS_NORMAL, True]],
            ])
コード例 #4
0
ファイル: qa_rapi.py プロジェクト: sajalcody/ganeti
def TestEmptyCluster():
    """Testing remote API on an empty cluster.

  """
    master = qa_config.GetMasterNode()
    master_full = qa_utils.ResolveNodeName(master)

    def _VerifyInfo(data):
        AssertIn("name", data)
        AssertIn("master", data)
        AssertEqual(data["master"], master_full)

    def _VerifyNodes(data):
        master_entry = {
            "id": master_full,
            "uri": "/2/nodes/%s" % master_full,
        }
        AssertIn(master_entry, data)

    def _VerifyNodesBulk(data):
        for node in data:
            for entry in NODE_FIELDS:
                AssertIn(entry, node)

    def _VerifyGroups(data):
        default_group = {
            "name": constants.INITIAL_NODE_GROUP_NAME,
            "uri": "/2/groups/" + constants.INITIAL_NODE_GROUP_NAME,
        }
        AssertIn(default_group, data)

    def _VerifyGroupsBulk(data):
        for group in data:
            for field in GROUP_FIELDS:
                AssertIn(field, group)

    def _VerifyFiltersBulk(data):
        for group in data:
            for field in FILTER_FIELDS:
                AssertIn(field, group)

    _DoTests([
        ("/", None, "GET", None),
        ("/2/info", _VerifyInfo, "GET", None),
        ("/2/tags", None, "GET", None),
        ("/2/nodes", _VerifyNodes, "GET", None),
        ("/2/nodes?bulk=1", _VerifyNodesBulk, "GET", None),
        ("/2/groups", _VerifyGroups, "GET", None),
        ("/2/groups?bulk=1", _VerifyGroupsBulk, "GET", None),
        ("/2/instances", [], "GET", None),
        ("/2/instances?bulk=1", [], "GET", None),
        ("/2/os", None, "GET", None),
        ("/2/filters", [], "GET", None),
        ("/2/filters?bulk=1", _VerifyFiltersBulk, "GET", None),
    ])

    # Test HTTP Not Found
    for method in ["GET", "PUT", "POST", "DELETE"]:
        try:
            _DoTests([("/99/resource/not/here/99", None, method, None)])
        except rapi.client.GanetiApiError as err:
            AssertEqual(err.code, 404)
        else:
            raise qa_error.Error(
                "Non-existent resource didn't return HTTP 404")

    # Test HTTP Not Implemented
    for method in ["PUT", "POST", "DELETE"]:
        try:
            _DoTests([("/version", None, method, None)])
        except rapi.client.GanetiApiError as err:
            AssertEqual(err.code, 501)
        else:
            raise qa_error.Error("Non-implemented method didn't fail")

    # Test GET/PUT symmetry
    LEGITIMATELY_MISSING = [
        "force",  # Standard option
        "add_uids",  # Modifies UID pool, is not a param itself
        "remove_uids",  # Same as above
        "osparams_private_cluster",  # Should not be returned
    ]
    NOT_EXPOSED_YET = ["hv_state", "disk_state", "modify_etc_hosts"]
    # The nicparams are returned under the default entry, yet accepted as they
    # are - this is a TODO to fix!
    DEFAULT_ISSUES = ["nicparams"]
    # Cannot be set over RAPI due to security issues
    FORBIDDEN_PARAMS = ["compression_tools"]

    _DoGetPutTests("/2/info",
                   "/2/modify",
                   opcodes.OpClusterSetParams.OP_PARAMS,
                   exceptions=(LEGITIMATELY_MISSING + NOT_EXPOSED_YET),
                   set_exceptions=DEFAULT_ISSUES + FORBIDDEN_PARAMS)