86caa2ce28ce6468ac5f0224788eaebe15999b68
1 # -*- coding: utf-8 -*-
3 # Copyright 2018 Whitestack, LLC
4 # *************************************************************
6 # This file is part of OSM RO module
7 # All Rights Reserved to Whitestack, LLC
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
13 # http://www.apache.org/licenses/LICENSE-2.0
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
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact: bdiaz@whitestack.com or glavado@whitestack.com
27 from requests
.auth
import HTTPBasicAuth
29 from osm_ro
.wim
.sdnconn
import SdnConnectorBase
, SdnConnectorError
31 log
= logging
.getLogger(__name__
)
34 class OnosVpls(SdnConnectorBase
):
36 https://wiki.onosproject.org/display/ONOS/VPLS+User+Guide
39 def __init__(self
, wim
, wim_account
, config
=None, logger
=None):
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")
46 raise ValueError("'url' must be provided")
47 if not url
.startswith("http"):
49 if not url
.endswith("/"):
51 self
.url
= url
+ "onos/v1/network/configuration"
52 log
.info("ONOS VPLS Connector Initialized.")
54 def check_credentials(self
):
56 onos_config_req
= None
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
:
62 status_code
= onos_config_req
.status_code
63 log
.exception('Error checking credentials')
64 raise SdnConnectorError('Error checking credentials', http_code
=status_code
)
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
:
73 raise SdnConnectorError('VPLS %s not found' % service_uuid
, http_code
=404)
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()
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'] = {
88 for vpls
in onos_config
['apps']['org.onosproject.vpls']['vpls']['vplsList']:
89 if vpls
['name'] == service_uuid
:
90 raise SdnConnectorError('Network %s already exists.' % service_uuid
)
91 onos_config
['apps']['org.onosproject.vpls']['vpls']['vplsList'].append({
95 self
._pop
_last
_update
_time
(onos_config
)
97 onos_config
['apps'] = {
98 'org.onosproject.vpls': {
102 'name': service_uuid
,
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
116 def edit_connectivity_service(self
, service_uuid
,
117 conn_info
, connection_points
,
119 raise SdnConnectorError('Not supported', http_code
=501)
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
)
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()
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
)
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
)
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()
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'])
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()
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')
178 def _append_port_to_onos_config(self
, port
, onos_config
):
179 port_name
= 'of:%s/%s' % (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'][
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
)
191 onos_config
['ports'][port_name
] = {
192 'interfaces': [interface_config
]
196 if __name__
== '__main__':
198 # host = '198.204.228.85'
200 # onos_vpls = OnosVpls(host, port, 'onos', 'rocks')
203 # 'uuid': '0a43961d',
204 # 'switch_dpid': '0000000000000001',
205 # 'switch_port': '1',
209 # 'uuid': 'ade3eefc',
210 # 'switch_dpid': '0000000000000003',
211 # 'switch_port': '1',
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')