Newer
Older
from flask import Blueprint, Response, current_app, jsonify
from lxml import etree
from inventory_provider import juniper
routes = Blueprint("inventory-data-testing-support-routes", __name__)
@routes.route("flushdb", methods=['GET', 'POST'])
def flushdb():
common.get_redis().flushdb()
return Response('OK')
@routes.route("update-interfaces-to-services", methods=['GET', 'POST'])
def update_interfaces_to_services():
worker.update_interfaces_to_services.delay()
return Response('OK')
@routes.route("update-service-hierarchy")
def update_service_hierarchy():
worker.update_circuit_hierarchy.delay()
return Response('OK')
@routes.route("update-equipment-locations", methods=['GET', 'POST'])
def update_equipment_location():
worker.update_equipment_locations.delay()
return Response('OK')
@routes.route("update-interface-statuses", methods=['GET', 'POST'])
def update_interface_statuses():
worker.update_interface_statuses.delay()
return Response('OK')
@routes.route("juniper-server-addresses", methods=['GET', 'POST'])
@common.require_accepts_json
def juniper_addresses():
# TODO: this route (and corant, infinera routes) can be removed
r = common.get_redis()
routers = []
for k in r.keys('junosspace:*'):
info = r.get(k.decode('utf-8'))
assert info # sanity: value shouldn't be empty
info = json.loads(info.decode('utf-8'))
routers.append(info['address'])
return jsonify(routers)
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
@routes.route("opsdb/interfaces")
def get_all_interface_details():
r = common.get_redis()
result = collections.defaultdict(list)
for k in r.keys('opsdb:interface_services:*'):
m = re.match(
r'^opsdb:interface_services:([^:]+):(.*)$',
k.decode('utf-8'))
assert m
result[m.group(1)].append(m.group(2))
return jsonify(result)
@routes.route("opsdb/interfaces/<equipment_name>")
def get_interface_details_for_equipment(equipment_name):
r = common.get_redis()
result = []
for k in r.keys('opsdb:interface_services:%s:*' % equipment_name):
m = re.match(
r'^opsdb:interface_services:%s:(.*)$' % equipment_name,
k.decode('utf-8'))
assert m
result.append(m.group(1))
return jsonify(result)
@routes.route("opsdb/interfaces/<equipment_name>/<path:interface>")
def get_interface_details(equipment_name, interface):
r = common.get_redis()
key = 'opsdb:interface_services:%s:%s' % (equipment_name, interface)
# TODO: handle None (return 404)
return jsonify(json.loads(r.get(key).decode('utf-8')))
@routes.route("opsdb/equipment-location")
def get_all_equipment_locations():
r = common.get_redis()
result = {}
for k in r.keys('opsdb:location:*'):
k = k.decode('utf-8')
m = re.match(r'^opsdb:location:(.*)$', k)
assert m
result[m.group(1)] = json.loads(r.get(k).decode('utf-8'))
return jsonify(result)
@routes.route("opsdb/equipment-location/<path:equipment_name>")
def get_equipment_location(equipment_name):
r = common.get_redis()
result = r.get('opsdb:location:' + equipment_name)
# TODO: handle None (return 404)
return jsonify(json.loads(result.decode('utf-8')))
@routes.route("opsdb/circuit-hierarchy/children/<int:parent_id>")
def get_children(parent_id):
r = common.get_redis()
result = r.get('opsdb:services:children:%d' % parent_id)
# TODO: handle None (return 404)
return jsonify(json.loads(result.decode('utf-8')))
@routes.route("opsdb/circuit-hierarchy/parents/<int:child_id>")
def get_parents(child_id):
r = common.get_redis()
result = r.get('opsdb:services:parents:%d' % child_id)
# TODO: handle None (return 404)
return jsonify(json.loads(result.decode('utf-8')))
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
@routes.route("bgp/<hostname>", methods=['GET', 'POST'])
@common.require_accepts_json
def bgp_configs(hostname):
r = common.get_redis()
netconf_string = r.get('netconf:' + hostname)
if not netconf_string:
return Response(
response="no available info for '%s'" % hostname,
status=404,
mimetype="text/html")
routes = list(juniper.list_bgp_routes(
etree.XML(netconf_string.decode('utf-8'))))
if not routes:
return Response(
response="no interfaces found for '%s'" % hostname,
status=404,
mimetype="text/html")
return jsonify(routes)
@routes.route("snmp/<hostname>", methods=['GET', 'POST'])
@common.require_accepts_json
def snmp_ids(hostname):
r = common.get_redis()
ifc_data_string = r.get('snmp-interfaces:' + hostname)
if not ifc_data_string:
return Response(
response="no available info for '%s'" % hostname,
status=404,
mimetype="text/html")
def _ifc_name(ifc):
if 'v4InterfaceName' in ifc:
return ifc['v4InterfaceName']
if 'v6InterfaceName' in ifc:
return ifc['v6InterfaceName']
assert False, "sanity failure: no interface name found"
ifc_data = json.loads(ifc_data_string.decode('utf-8'))
result = [
{'index': i['index'], 'name': _ifc_name(i)}
for i in ifc_data]
return jsonify(result)
# TODO: remove all alarmsdb i/o, and then remove the following
# @routes.route("/interfaces/status/<hostname>/<path:interface>",
# methods=['GET', 'POST'])
# @common.require_accepts_json
# def interface_statuses(hostname, interface):
# r = common.get_redis()
# status = r.get(
# 'alarmsdb:interface_status:%s:%s'
# % (hostname, interface))
# if not status:
# return Response(
# response="no available info for {} {}".format(
# hostname, interface),
# status=404,
# mimetype="text/html")
# return jsonify({"status": status.decode('utf-8')})
#
#
# @routes.route("/services/<hostname>/<path:interface>",
# methods=['GET', 'POST'])
# @common.require_accepts_json
# def services_for_interface(hostname, interface):
# r = common.get_redis()
# services = r.get(
# 'opsdb:interface_services:%s:%s'
# % (hostname, interface))
# if not services:
# return Response(
# response="no available info for {} {}".format(
# hostname, interface),
# status=404,
# mimetype="text/html")
# return jsonify(json.loads(services.decode('utf-8')))