Adds onos_vpls to install in Dockerfile-local
[osm/RO.git] / RO-SDN-onos_vpls / osm_rosdn_onos_vpls / sdn_assist_onos_vpls.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
5
6 # This file is part of OSM RO module
7 # All Rights Reserved to Whitestack, LLC
8
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
12
13 # http://www.apache.org/licenses/LICENSE-2.0
14
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
19 # under the License.
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: bdiaz@whitestack.com or glavado@whitestack.com
22 ##
23 import logging
24 import uuid
25
26 import requests
27 from requests.auth import HTTPBasicAuth
28
29 from osm_ro.wim.sdnconn import SdnConnectorBase, SdnConnectorError
30
31 log = logging.getLogger(__name__)
32
33
34 class OnosVpls(SdnConnectorBase):
35 """
36 https://wiki.onosproject.org/display/ONOS/VPLS+User+Guide
37 """
38
39 def __init__(self, wim, wim_account, config=None, logger=None):
40
41 super().__init__(wim, wim_account, config, log)
42 self.user = wim_account.get("user")
43 self.password = wim_account.get("password")
44 url = wim_account.get("wim_url")
45 if not url:
46 raise ValueError("'url' must be provided")
47 if not url.startswith("http"):
48 url = "http://" + url
49 if not url.endswith("/"):
50 url = url + "/"
51 self.url = url + "onos/v1/network/configuration"
52 log.info("ONOS VPLS Connector Initialized.")
53
54 def check_credentials(self):
55 status_code = 503
56 onos_config_req = None
57 try:
58 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
59 onos_config_req.raise_for_status()
60 except Exception as e:
61 if onos_config_req:
62 status_code = onos_config_req.status_code
63 log.exception('Error checking credentials')
64 raise SdnConnectorError('Error checking credentials', http_code=status_code)
65
66 def get_connectivity_service_status(self, service_uuid, conn_info=None):
67 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
68 onos_config_req.raise_for_status()
69 onos_config = onos_config_req.json()
70 for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
71 if vpls['name'] == service_uuid:
72 return vpls
73 raise SdnConnectorError('VPLS {} not found'.format(service_uuid), http_code=404)
74
75 def create_connectivity_service(self, service_type, connection_points):
76 if service_type.lower() != 'elan':
77 raise SdnConnectorError('Only ELAN network type is supported by ONOS VPLS.')
78 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
79 onos_config_req.raise_for_status()
80 onos_config = onos_config_req.json()
81 service_uuid = uuid.uuid4()
82
83 if 'org.onosproject.vpls' in onos_config['apps']:
84 if 'vpls' not in onos_config['apps']['org.onosproject.vpls']:
85 onos_config['apps']['org.onosproject.vpls']['vpls'] = {
86 'vplsList': []
87 }
88 for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
89 if vpls['name'] == service_uuid:
90 raise SdnConnectorError('Network {} already exists.'.format(service_uuid))
91 onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList'].append({
92 'name': service_uuid,
93 'interfaces': []
94 })
95 self._pop_last_update_time(onos_config)
96 else:
97 onos_config['apps'] = {
98 'org.onosproject.vpls': {
99 'vpls': {
100 "vplsList": [
101 {
102 'name': service_uuid,
103 'interfaces': []
104 }
105 ]
106 }
107 }
108 }
109 response = requests.post(self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password))
110 log.info(onos_config)
111 response.raise_for_status()
112 for connection_point in connection_points:
113 self._add_network_port(service_uuid, connection_point)
114 return service_uuid, onos_config
115
116 def edit_connectivity_service(self, service_uuid,
117 conn_info, connection_points,
118 **kwargs):
119 raise SdnConnectorError('Not supported', http_code=501)
120
121 def delete_connectivity_service(self, service_uuid, conn_info=None):
122 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
123 onos_config_req.raise_for_status()
124 onos_config = onos_config_req.json()
125 # Removes ports used by network from onos config
126 for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
127 if vpls['name'] == service_uuid:
128 for interface in vpls['interfaces']:
129 for port in onos_config['ports'].values():
130 for port_interface in port['interfaces']:
131 if port_interface['name'] == interface:
132 port['interfaces'].remove(port_interface)
133 onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList'].remove(vpls)
134 break
135 self._pop_last_update_time(onos_config)
136 response = requests.post(self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password))
137 response.raise_for_status()
138
139 def _delete_network_port(self, net_id, port):
140 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
141 onos_config_req.raise_for_status()
142 onos_config = onos_config_req.json()
143 for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
144 if vpls['name'] == net_id:
145 for interface in vpls['interfaces']:
146 if interface == port['service_endpoint_id']:
147 vpls['interfaces'].remove(interface)
148 break
149 for onos_port in onos_config['ports'].values():
150 for port_interface in onos_port['interfaces']:
151 if port_interface['name'] == port['service_endpoint_id']:
152 onos_port['interfaces'].remove(port_interface)
153 break
154 self._pop_last_update_time(onos_config)
155 response = requests.post(self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password))
156 response.raise_for_status()
157
158 def _add_network_port(self, net_id, port):
159 onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
160 onos_config_req.raise_for_status()
161 onos_config = onos_config_req.json()
162 self._append_port_to_onos_config(port, onos_config)
163 # Interfaces need to be registered before adding them to VPLS
164 response = requests.post(self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password))
165 response.raise_for_status()
166 for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
167 if vpls['name'] == net_id:
168 vpls['interfaces'].append(port['service_endpoint_id'])
169 break
170 self._pop_last_update_time(onos_config)
171 response = requests.post(self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password))
172 response.raise_for_status()
173
174 def _pop_last_update_time(self, onos_config):
175 if 'lastUpdateTime' in onos_config['apps']['org.onosproject.vpls']['vpls']:
176 onos_config['apps']['org.onosproject.vpls']['vpls'].pop('lastUpdateTime')
177
178 def _append_port_to_onos_config(self, port, onos_config):
179 port_name = 'of:{}/{}'.format(port['service_endpoint_encapsulation_info']['switch_dpid'],
180 port['service_endpoint_encapsulation_info']['switch_port'])
181 interface_config = {'name': port['service_endpoint_id']}
182 if 'vlan' in port['service_endpoint_encapsulation_info'] and port['service_endpoint_encapsulation_info'][
183 'vlan']:
184 interface_config['vlan'] = port['service_endpoint_encapsulation_info']['vlan']
185 if port_name in onos_config['ports'] and 'interfaces' in onos_config['ports'][port_name]:
186 for interface in onos_config['ports'][port_name]['interfaces']:
187 if interface['name'] == port['service_endpoint_id']:
188 onos_config['ports'][port_name]['interfaces'].remove(interface)
189 onos_config['ports'][port_name]['interfaces'].append(interface_config)
190 else:
191 onos_config['ports'][port_name] = {
192 'interfaces': [interface_config]
193 }
194
195
196 if __name__ == '__main__':
197 pass
198 # host = '198.204.228.85'
199 # port = 8181
200 # onos_vpls = OnosVpls(host, port, 'onos', 'rocks')
201 # ports = [
202 # {
203 # 'uuid': '0a43961d',
204 # 'switch_dpid': '0000000000000001',
205 # 'switch_port': '1',
206 # 'vlan': 100
207 # },
208 # {
209 # 'uuid': 'ade3eefc',
210 # 'switch_dpid': '0000000000000003',
211 # 'switch_port': '1',
212 # 'vlan': 100
213 # }
214 # ]
215 # onos_vpls.create_network('94979b37-3875-4f77-b620-01ff78f9c4fa', 'data')
216 # onos_vpls.add_network_port('94979b37-3875-4f77-b620-01ff78f9c4fa', ports[0])
217 # onos_vpls.add_network_port('94979b37-3875-4f77-b620-01ff78f9c4fa', ports[1])
218 # onos_vpls.delete_network_port('94979b37-3875-4f77-b620-01ff78f9c4fa', ports[1])
219 # onos_vpls.delete_network('94979b37-3875-4f77-b620-01ff78f9c4fa')