backing up
[vsorcdistro/.git] / ryu / build / lib.linux-armv7l-2.7 / ryu / app / sdnhub_apps / stateless_lb_rest.py
1 # Copyright (C) 2014 SDN Hub
2 #
3 # Licensed under the GNU GENERAL PUBLIC LICENSE, Version 3.
4 # You may not use this file except in compliance with this License.
5 # You may obtain a copy of the License at
6 #
7 #    http://www.gnu.org/licenses/gpl-3.0.txt
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12 # implied.
13
14 import logging
15
16 import json
17 from webob import Response
18 import os
19 import mimetypes
20
21 from ryu.base import app_manager
22 from ryu.controller import ofp_event
23 from ryu.controller import dpset
24 from ryu.controller.handler import MAIN_DISPATCHER
25 from ryu.controller.handler import set_ev_cls
26 from ryu.ofproto import ofproto_v1_0
27 from ryu.ofproto import ofproto_v1_3
28 from ryu.lib import ofctl_v1_0
29 from ryu.lib import ofctl_v1_3
30 from ryu.app.wsgi import ControllerBase, WSGIApplication
31 import stateless_lb, learning_switch
32 from ryu.ofproto import inet
33
34 LOG = logging.getLogger('ryu.app.sdnhub_apps.stateless_lb_rest')
35
36 # REST API
37 #
38 ############# Configure loadbalancer
39 #
40 # create loadbalancer filter
41 # POST /v1.0/loadbalancer/create
42 #
43 # delete loadbalancer filter
44 # DELETE /v1.0/loadbalancer/delete
45 #
46
47 import re, socket
48
49 def is_mac_valid(x):
50     if re.match("[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", x.lower()):
51         return True
52     else:
53         return False
54
55 def is_ip_valid(x):
56     y = x.split('/')
57     if len(y) > 2:
58         return False
59     try:
60         socket.inet_aton(y[0])
61         return True
62     except socket.error:
63        return False
64
65 class StatelessLBController(ControllerBase):
66     def __init__(self, req, link, data, **config):
67         super(StatelessLBController, self).__init__(req, link, data, **config)
68         self.stateless_lb = data['stateless_lb']
69         self.stateless_lb.set_learning_switch(data['learning_switch'])
70
71     def is_config_data_valid(self, lb_config):
72         if not is_ip_valid(lb_config['virtual_ip']):
73             return False
74         for server in lb_config['servers']:
75             if not is_ip_valid(server['ip']) or not is_mac_valid(server['mac']):
76                 return False
77         return True
78
79     def create_loadbalancer(self, req, **_kwargs):
80         try:
81             lb_config = eval(req.body)
82             if not self.is_config_data_valid(lb_config):
83                 return Response(status=400)
84
85             self.stateless_lb.set_virtual_ip(lb_config['virtual_ip'])
86             self.stateless_lb.set_server_pool(lb_config['servers'])
87             self.stateless_lb.set_rewrite_ip_flag(lb_config['rewrite_ip'])
88
89         except SyntaxError:
90             LOG.error('Invalid syntax %s', req.body)
91             return Response(status=400)
92
93         return Response(status=200,content_type='application/json',
94                     body=json.dumps({'status':'success'}))
95
96     def delete_loadbalancer(self, req, **_kwargs):
97         try:
98             lb_config = eval(req.body)
99             print lb_config
100             if not self.is_config_data_valid(lb_config):
101                 return Response(status=400)
102
103             self.stateless_lb.set_virtual_ip()
104             self.stateless_lb.set_server_pool()
105
106         except SyntaxError:
107             LOG.error('Invalid syntax %s', req.body)
108             return Response(status=400)
109
110         return Response(status=200,content_type='application/json',
111                     body=json.dumps({'status':'success'}))
112
113
114 class StatelessLBRestApi(app_manager.RyuApp):
115     OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION,
116                     ofproto_v1_3.OFP_VERSION]
117     _CONTEXTS = {
118         'wsgi': WSGIApplication,
119         'stateless_lb': stateless_lb.StatelessLB,
120         'learning_switch': learning_switch.L2LearningSwitch
121     }
122
123     def __init__(self, *args, **kwargs):
124         super(StatelessLBRestApi, self).__init__(*args, **kwargs)
125         stateless_lb = kwargs['stateless_lb']
126         learning_switch = kwargs['learning_switch']
127         wsgi = kwargs['wsgi']
128         self.waiters = {}
129         self.data = {}
130         self.data['waiters'] = self.waiters
131         self.data['stateless_lb'] = stateless_lb
132         self.data['learning_switch'] = learning_switch
133
134         wsgi.registory['StatelessLBController'] = self.data
135         mapper = wsgi.mapper
136
137         mapper.connect('loadbalancer', '/v1.0/loadbalancer/create',
138                        controller=StatelessLBController, action='create_loadbalancer',
139                        conditions=dict(method=['POST']))
140
141         mapper.connect('loadbalancer', '/v1.0/loadbalancer/delete',
142                        controller=StatelessLBController, action='delete_loadbalancer',
143                        conditions=dict(method=['POST']))
144
145