-
Notifications
You must be signed in to change notification settings - Fork 2
/
patch_ofc_rest_knocker.py
70 lines (60 loc) · 2.26 KB
/
patch_ofc_rest_knocker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import json
import httplib2
import sys
import time
import logging
import logging.config
import re
import argparse
import patch_ofc_error
class L1PatchFlowThrower:
def __init__(self, base_url, port):
self.base_url = base_url
self.port = port
self._read_flow_rules_from_stdin()
self.rest_svr = httplib2.Http(".cache")
logging.config.fileConfig('logger.conf')
self.logger = logging.getLogger(__name__)
def _read_flow_rules_from_stdin(self):
self.flow_rules_dic = json.load(sys.stdin, encoding='utf-8')
def dump(self):
print json.dumps(self.flow_rules_dic, indent=2)
def put_all_flow_rules(self, path, method):
url = "http://" + self.base_url + ":" + str(self.port) + path
self.logger.info("Set API URL: %s" % url)
for dispatcher_name, flow_rules in self.flow_rules_dic.items():
for flow_rule in flow_rules:
self._put_flow_rule(url, dispatcher_name, method, flow_rule)
def _put_flow_rule(self, api_url, dispatcher_name, method, rule):
method = str(method).upper()
if not (method == 'PUT' or method == 'DELETE'):
msg = "Unknown method:%s to send OpenFlow Controller" % method
raise patch_ofc_error.PatchOfcRestError(msg)
time.sleep(0.1)
response, content = self.rest_svr.request(
api_url, method, json.dumps(rule)
)
log_level = logging.INFO
if not re.match(r"2\d\d", response["status"]):
log_level = logging.ERROR
self.logger.log(
log_level,
"Send %s: node:%s, rule:%s",
method, dispatcher_name, json.dumps(rule)
)
self.logger.log(log_level, "Response: %s", response)
self.logger.log(log_level, "Content: %s", content)
if __name__ == '__main__':
# parse options
arg_parser = argparse.ArgumentParser(
description="Send Flow Rule (REST json) to OpenFlow Controller"
)
arg_parser.add_argument(
'-m', '--method',
required=True, nargs=1, choices=["put", "delete"]
)
args = arg_parser.parse_args()
# run
flow_builder = L1PatchFlowThrower("localhost", 8080)
# flow_builder.dump()
flow_builder.put_all_flow_rules("/patch/flow", args.method[0])