2 Utility library for retrieving entity related data from ODL.
5 from logging import info
6 from requests import codes as status_codes
7 from requests import get
8 from requests import post
12 def get_entities(restconf_url):
14 url=restconf_url + "/operations/odl-entity-owners:get-entities",
16 "Content-Type": "application/json",
17 "Accept": "application/json",
18 "User-Agent": "csit agent",
20 auth=("admin", "admin"),
33 if resp.status_code == status_codes["bad_request"]:
35 "Status code is '%s' - trying operational data instead.",
38 result = get_entities_data(restconf_url)
45 def get_entity_name(e_type, e_name):
47 Get the effective entity name for the given entity type.
48 If the entity type is not for odl-general-entity, entity name
49 should be the full instance identifier.
50 :param e_type: entity type
51 :param e_name: entity name
52 :return: updated entity name
55 "ovsdb": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='%s']",
58 if e_type in name_templates:
59 return name_templates[e_type] % e_name
64 def get_entity(restconf_url, e_type, e_name):
65 """Calls the get-entity rpc on the controller and returns the result in a
66 dictionary that contains the parsed response in two keys:
67 "candidates" and "owner"
72 "odl-entity-owners:input" : {
79 get_entity_name(e_type, e_name),
85 url=restconf_url + "/operations/odl-entity-owners:get-entity",
87 "Content-Type": "application/json",
88 "Accept": "application/json",
89 "User-Agent": "csit agent",
92 auth=("admin", "admin"),
105 if resp.status_code == status_codes["bad_request"]:
107 "Status code is '%s' - trying operational data instead.",
110 result = get_entity_data(restconf_url, e_type, e_name)
113 "candidates": resp.json()["odl-entity-owners:output"]["candidate-nodes"],
114 "owner": resp.json()["odl-entity-owners:output"]["owner-node"],
120 def get_entity_owner(restconf_url, e_type, e_name):
123 "odl-entity-owners:input" : {
130 get_entity_name(e_type, e_name),
133 info("Data %s", data)
136 url=restconf_url + "/operations/odl-entity-owners:get-entity-owner",
138 "Content-Type": "application/json",
139 "Accept": "application/json",
140 "User-Agent": "csit agent",
143 auth=("admin", "admin"),
156 if resp.status_code == status_codes["bad_request"]:
158 "Status code is '%s' - trying operational data instead.",
161 result = get_entity_owner_data(restconf_url, e_type, e_name)
163 result = resp.json()["odl-entity-owners:output"]["owner-node"]
168 def get_entities_data(restconf_url):
170 Get the entity information from the datastore for Silicon
172 :param restconf_url: RESTCONF URL up to the RESTCONF root
175 url=restconf_url + "/data/entity-owners:entity-owners",
177 "Accept": "application/yang-data+json",
178 "User-Agent": "csit agent",
180 auth=("admin", "admin"),
196 def get_entity_type_data(restconf_url, e_type):
198 Get the entity information for the given entity type from the datastore
199 for Silicon or earlier versions.
200 :param restconf_url: RESTCONF URL up to the RESTCONF root
201 :param e_type: entity type
206 + "/data/entity-owners:entity-owners"
207 + "/entity-type=%s" % e_type,
209 "Accept": "application/yang-data+json",
210 "User-Agent": "csit agent",
212 auth=("admin", "admin"),
225 return resp.json()["entity-owners:entity-type"][0]
228 def get_entity_data(restconf_url, e_type, e_name):
230 Get the entity owner & candidates for the given entity type
231 and entity name from the datastore for Silicon or earlier versions
232 :param restconf_url: RESTCONF URL up to the RESTCONF root
233 :param e_type: entity type
234 :param e_name: entity name
235 :return: entity owner & candidates
238 "org.opendaylight.mdsal.ServiceEntityType": "/odl-general-entity:entity[name='%s']",
239 "org.opendaylight.mdsal.AsyncServiceCloseEntityType": "/odl-general-entity:entity[name='%s']",
240 "ovsdb": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='%s']",
242 id_template = id_templates[e_type]
244 entity_type = get_entity_type_data(restconf_url, e_type)
245 entity = [e for e in entity_type["entity"] if e["id"] == id_template % e_name][0]
248 "candidates": [c["name"] for c in entity["candidate"]],
249 "owner": entity["owner"],
255 def get_entity_owner_data(restconf_url, e_type, e_name):
257 Get the entity owner for the given entity type and entity name
258 from the datastore for Silicon or earlier versions
259 :param restconf_url: RESTCONF URL up to the RESTCONF root
260 :param e_type: entity type
261 :param e_name: entity name
262 :return: entity owner
264 entity = get_entity_data(restconf_url, e_type, e_name)
265 return entity["owner"]
269 if args[0] == "get-entities":
271 restconf_url="http://127.0.0.1:8181/rests",
274 elif args[0] == "get-entity":
276 restconf_url="http://127.0.0.1:8181/rests",
281 elif args[0] == "get-entity-owner":
282 json = get_entity_owner(
283 restconf_url="http://127.0.0.1:8181/rests",
289 raise Exception("Unhandled argument %s" % args[0])
292 if __name__ == "__main__":
293 # i.e. main does not depend on name of the binary