From: Sangwook Ha Date: Sun, 24 Oct 2021 23:56:45 +0000 (-0700) Subject: Support Silicon for retrieval of entity ownership information X-Git-Tag: pre-potassium~98 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=98aa061780a3c91ff90b01235b96fb776b3c8385;hp=0f3609949b4c0293e6922eaa1ff069e85670733e;p=integration%2Ftest.git Support Silicon for retrieval of entity ownership information ClusterEntities.py uses RPC introduced in Phosphorus to retrieve entity ownership information, hence Silicon or earlier versions, which store entity ownership information in the data store, are not supported. Fall back on the REST API calls to retrieve the information from the operational data store, if the status code for the RPC call is 400 (bad request), to support Silicon and earlier versions. Signed-off-by: Sangwook Ha Change-Id: I18c8d667554d25e5126770235ad33ff404cbe9fe --- diff --git a/csit/libraries/ClusterEntities.py b/csit/libraries/ClusterEntities.py index 92cb9231f5..b8023f105f 100644 --- a/csit/libraries/ClusterEntities.py +++ b/csit/libraries/ClusterEntities.py @@ -3,13 +3,15 @@ """ from logging import info +from requests import codes as status_codes +from requests import get from requests import post from sys import argv def get_entities(restconf_url): resp = post( - url=restconf_url + """/operations/odl-entity-owners:get-entities""", + url=restconf_url + "/operations/odl-entity-owners:get-entities", headers={ "Content-Type": "application/json", "Accept": "application/json", @@ -26,7 +28,7 @@ def get_entities(restconf_url): return resp.json() -def get_entity(restconf_url, type, name): +def get_entity(restconf_url, e_type, e_name): """Calls the get-entity rpc on the controller and returns the result in a dictionary that contains the parsed response in two keys: "candidates" and "owner" @@ -40,14 +42,14 @@ def get_entity(restconf_url, type, name): } } """ % ( - type, - name, + e_type, + e_name, ) info("Data %s", data) resp = post( - url=restconf_url + """/operations/odl-entity-owners:get-entity""", + url=restconf_url + "/operations/odl-entity-owners:get-entity", headers={ "Content-Type": "application/json", "Accept": "application/json", @@ -62,15 +64,22 @@ def get_entity(restconf_url, type, name): resp.json(), ) - result = { - "candidates": resp.json()["odl-entity-owners:output"]["candidate-nodes"], - "owner": resp.json()["odl-entity-owners:output"]["owner-node"], - } + if resp.status_code == status_codes["bad_request"]: + info( + "Status code is '%s' - trying operational data instead.", + resp.status_code, + ) + result = get_entity_data(restconf_url, e_type, e_name) + else: + result = { + "candidates": resp.json()["odl-entity-owners:output"]["candidate-nodes"], + "owner": resp.json()["odl-entity-owners:output"]["owner-node"], + } return result -def get_entity_owner(restconf_url, type, name): +def get_entity_owner(restconf_url, e_type, e_name): data = """ { "odl-entity-owners:input" : { @@ -79,14 +88,14 @@ def get_entity_owner(restconf_url, type, name): } } """ % ( - type, - name, + e_type, + e_name, ) info("Data %s", data) resp = post( - url=restconf_url + """/operations/odl-entity-owners:get-entity-owner""", + url=restconf_url + "/operations/odl-entity-owners:get-entity-owner", headers={ "Content-Type": "application/json", "Accept": "application/json", @@ -101,7 +110,75 @@ def get_entity_owner(restconf_url, type, name): resp, ) - return resp.json()["odl-entity-owners:output"]["owner-node"] + if resp.status_code == status_codes["bad_request"]: + info( + "Status code is '%s' - trying operational data instead.", + resp.status_code, + ) + result = get_entity_owner_data(restconf_url, e_type, e_name) + else: + result = resp.json()["odl-entity-owners:output"]["owner-node"] + + return result + + +def get_entity_type_data(restconf_url, e_type): + """ + Get the entity information for the given entity type from the datastore + for Silicon or earlier versions. + :param restconf_url: RESTCONF URL up to the RESTCONF root + :param e_type: entity type + :return: entity-type + """ + resp = get( + url=restconf_url + + "/data/entity-owners:entity-owners" + + "/entity-type=%s" % e_type, + headers={ + "Accept": "application/yang-data+json", + "User-Agent": "csit agent", + }, + auth=("admin", "admin"), + ) + + return resp.json()["entity-owners:entity-type"][0] + + +def get_entity_data(restconf_url, e_type, e_name): + """ + Get the entity owner & candidates for the given entity type + and entity name from the datastore for Silicon or earlier versions + :param restconf_url: RESTCONF URL up to the RESTCONF root + :param e_type: entity type + :param e_name: entity name + :return: entity owner & candidates + """ + entity_type = get_entity_type_data(restconf_url, e_type) + entity = [ + e + for e in entity_type["entity"] + if e["id"] == "/odl-general-entity:entity[name='%s']" % e_name + ][0] + + result = { + "candidates": [c["name"] for c in entity["candidate"]], + "owner": entity["owner"], + } + + return result + + +def get_entity_owner_data(restconf_url, e_type, e_name): + """ + Get the entity owner for the given entity type and entity name + from the datastore for Silicon or earlier versions + :param restconf_url: RESTCONF URL up to the RESTCONF root + :param e_type: entity type + :param e_name: entity name + :return: entity owner + """ + entity = get_entity_data(restconf_url, e_type, e_name) + return entity["owner"] def main(args): @@ -113,15 +190,15 @@ def main(args): elif args[0] == "get-entity": json = get_entity( restconf_url="http://127.0.0.1:8181/rests", - type=args[1], - name=args[2], + e_type=args[1], + e_name=args[2], ) print(json) elif args[0] == "get-entity-owner": json = get_entity_owner( restconf_url="http://127.0.0.1:8181/rests", - type=args[1], - name=args[2], + e_type=args[1], + e_name=args[2], ) print(json) else: