- onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
- onos_config_req.raise_for_status()
- onos_config = onos_config_req.json()
- for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
- if vpls['name'] == service_uuid:
- return vpls
- raise SdnConnectorError('VPLS {} not found'.format(service_uuid), http_code=404)
-
- def create_connectivity_service(self, service_type, connection_points):
- if service_type.lower() != 'elan':
- raise SdnConnectorError('Only ELAN network type is supported by ONOS VPLS.')
- onos_config_req = requests.get(self.url, auth=HTTPBasicAuth(self.user, self.password))
- onos_config_req.raise_for_status()
- onos_config = onos_config_req.json()
- service_uuid = uuid.uuid4()
-
- if 'org.onosproject.vpls' in onos_config['apps']:
- if 'vpls' not in onos_config['apps']['org.onosproject.vpls']:
- onos_config['apps']['org.onosproject.vpls']['vpls'] = {
- 'vplsList': []
- }
- for vpls in onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList']:
- if vpls['name'] == service_uuid:
- raise SdnConnectorError('Network {} already exists.'.format(service_uuid))
- onos_config['apps']['org.onosproject.vpls']['vpls']['vplsList'].append({
- 'name': service_uuid,
- 'interfaces': []
- })
- self._pop_last_update_time(onos_config)
- else:
- onos_config['apps'] = {
- 'org.onosproject.vpls': {
- 'vpls': {
- "vplsList": [
- {
- 'name': service_uuid,
- 'interfaces': []
- }
- ]
+ try:
+ onos_config = self._get_onos_netconfig()
+ vpls_config = onos_config.get("apps", {}).get("org.onosproject.vpls")
+ if vpls_config:
+ for vpls in vpls_config.get("vpls", {}).get("vplsList"):
+ if vpls.get("name") == service_uuid:
+ return {"sdn_status": "ACTIVE", "sdn_info": vpls}
+
+ return {"sdn_status": "ERROR", "sdn_info": "not found"}
+ except Exception as e:
+ self.logger.error("Exception getting connectivity service info: %s", e)
+
+ return {"sdn_status": "ERROR", "error_msg": str(e)}
+
+ def _get_onos_netconfig(self):
+ try:
+ onos_config_req = requests.get(
+ self.url, auth=HTTPBasicAuth(self.user, self.password)
+ )
+ status_code = onos_config_req.status_code
+
+ if status_code == requests.codes.ok:
+ return onos_config_req.json()
+ else:
+ self.logger.info(
+ "Error obtaining network config, status code: {}".format(
+ status_code
+ )
+ )
+
+ raise SdnConnectorError(
+ "Error obtaining network config status code: {}".format(
+ status_code
+ ),
+ http_code=status_code,
+ )
+ except requests.exceptions.ConnectionError as e:
+ self.logger.info("Exception connecting to onos: %s", e)
+
+ raise SdnConnectorError("Error connecting to onos: {}".format(e))
+ except Exception as e:
+ self.logger.error("Exception getting onos network config: %s", e)
+
+ raise SdnConnectorError(
+ "Exception getting onos network config: {}".format(e)
+ )
+
+ def _post_onos_netconfig(self, onos_config):
+ try:
+ onos_config_resp = requests.post(
+ self.url, json=onos_config, auth=HTTPBasicAuth(self.user, self.password)
+ )
+ status_code = onos_config_resp.status_code
+
+ if status_code != requests.codes.ok:
+ self.logger.info(
+ "Error updating network config, status code: {}".format(status_code)
+ )
+
+ raise SdnConnectorError(
+ "Error obtaining network config status code: {}".format(
+ status_code
+ ),
+ http_code=status_code,
+ )
+ except requests.exceptions.ConnectionError as e:
+ self.logger.info("Exception connecting to onos: %s", e)
+
+ raise SdnConnectorError("Error connecting to onos: {}".format(e))
+ except Exception as e:
+ self.logger.info("Exception posting onos network config: %s", e)
+
+ raise SdnConnectorError(
+ "Exception posting onos network config: {}".format(e)
+ )
+
+ def _delete_onos_hosts(self, onos_host_list):
+ try:
+ for host_id in onos_host_list:
+ url = f"{self.hosts_url}/{host_id}"
+ onos_resp = requests.delete(
+ url, auth=HTTPBasicAuth(self.user, self.password)
+ )
+ status_code = onos_resp.status_code
+
+ if status_code != requests.codes.ok:
+ self.logger.info(
+ "Error deleting ONOS host, status code: {}".format(status_code)
+ )
+
+ raise SdnConnectorError(
+ "Error deleting ONOS host, status code: {}".format(status_code),
+ http_code=status_code,
+ )
+ except requests.exceptions.ConnectionError as e:
+ self.logger.info("Exception connecting to onos: %s", e)
+
+ raise SdnConnectorError("Error connecting to onos: {}".format(e))
+ except Exception as e:
+ self.logger.info("Exception posting onos network config: %s", e)
+
+ raise SdnConnectorError(
+ "Exception posting onos network config: {}".format(e)
+ )
+
+ def create_connectivity_service(self, service_type, connection_points, **kwargs):
+ self.logger.debug(
+ "create_connectivity_service, service_type: {}, connection_points: {}".format(
+ service_type, connection_points
+ )
+ )
+
+ if service_type.lower() == "etree":
+ raise SdnConnectorError(
+ "Only ELINE/ELAN network type is supported by ONOS VPLS."
+ )
+
+ # FIXME ¿must check number of connection_points?
+ service_uuid = str(uuid.uuid4())
+
+ # Obtain current configuration
+ onos_config_orig = self._get_onos_netconfig()
+ # self.logger.debug("onos config: %s", onos_config_orig)
+ onos_config = copy.deepcopy(onos_config_orig)
+
+ try:
+ # Create missing interfaces, append to created_items if returned, append_port_to_onos_config
+ # returns null if it was already created
+ created_items = []
+
+ for port in connection_points:
+ created_ifz = self._append_port_to_onos_config(port, onos_config)
+ if created_ifz:
+ created_items.append(created_ifz[1])
+
+ self._post_onos_netconfig(onos_config)
+
+ # Add vpls service to config
+ encapsulation = self._get_encapsulation(connection_points)
+ interfaces = [port.get("service_endpoint_id") for port in connection_points]
+
+ if "org.onosproject.vpls" in onos_config["apps"]:
+ if "vpls" not in onos_config["apps"]["org.onosproject.vpls"]:
+ onos_config["apps"]["org.onosproject.vpls"]["vpls"] = {
+ "vplsList": []
+ }
+
+ for vpls in onos_config["apps"]["org.onosproject.vpls"]["vpls"][
+ "vplsList"
+ ]:
+ if vpls["name"] == service_uuid:
+ raise SdnConnectorError(
+ "Network {} already exists.".format(service_uuid)
+ )
+
+ onos_config["apps"]["org.onosproject.vpls"]["vpls"]["vplsList"].append(
+ {
+ "name": service_uuid,
+ "interfaces": interfaces,
+ "encapsulation": encapsulation,
+ }
+ )
+ self._pop_last_update_time(onos_config)
+ else:
+ onos_config["apps"] = {
+ "org.onosproject.vpls": {
+ "vpls": {
+ "vplsList": [
+ {
+ "name": service_uuid,
+ "interfaces": interfaces,
+ "encapsulation": encapsulation,
+ }
+ ]
+ }