1 # Copyright (C) 2014 SDN Hub
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
7 # http://www.gnu.org/licenses/gpl-3.0.txt
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
17 from webob import Response
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
34 LOG = logging.getLogger('ryu.app.sdnhub_apps.stateless_lb_rest')
38 ############# Configure loadbalancer
40 # create loadbalancer filter
41 # POST /v1.0/loadbalancer/create
43 # delete loadbalancer filter
44 # DELETE /v1.0/loadbalancer/delete
50 if re.match("[0-9a-f]{2}([-:])[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", x.lower()):
60 socket.inet_aton(y[0])
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'])
71 def is_config_data_valid(self, lb_config):
72 if not is_ip_valid(lb_config['virtual_ip']):
74 for server in lb_config['servers']:
75 if not is_ip_valid(server['ip']) or not is_mac_valid(server['mac']):
79 def create_loadbalancer(self, req, **_kwargs):
81 lb_config = eval(req.body)
82 if not self.is_config_data_valid(lb_config):
83 return Response(status=400)
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'])
90 LOG.error('Invalid syntax %s', req.body)
91 return Response(status=400)
93 return Response(status=200,content_type='application/json',
94 body=json.dumps({'status':'success'}))
96 def delete_loadbalancer(self, req, **_kwargs):
98 lb_config = eval(req.body)
100 if not self.is_config_data_valid(lb_config):
101 return Response(status=400)
103 self.stateless_lb.set_virtual_ip()
104 self.stateless_lb.set_server_pool()
107 LOG.error('Invalid syntax %s', req.body)
108 return Response(status=400)
110 return Response(status=200,content_type='application/json',
111 body=json.dumps({'status':'success'}))
114 class StatelessLBRestApi(app_manager.RyuApp):
115 OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION,
116 ofproto_v1_3.OFP_VERSION]
118 'wsgi': WSGIApplication,
119 'stateless_lb': stateless_lb.StatelessLB,
120 'learning_switch': learning_switch.L2LearningSwitch
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']
130 self.data['waiters'] = self.waiters
131 self.data['stateless_lb'] = stateless_lb
132 self.data['learning_switch'] = learning_switch
134 wsgi.registory['StatelessLBController'] = self.data
137 mapper.connect('loadbalancer', '/v1.0/loadbalancer/create',
138 controller=StatelessLBController, action='create_loadbalancer',
139 conditions=dict(method=['POST']))
141 mapper.connect('loadbalancer', '/v1.0/loadbalancer/delete',
142 controller=StatelessLBController, action='delete_loadbalancer',
143 conditions=dict(method=['POST']))