[CORD-1324-1328-1330-1331] Models for refactored Global ECORD service
Change-Id: Ib9c02d25bd65729c7faaa48d40b54a2ce6ffffac
diff --git a/xos/synchronizer/Dockerfile.synchronizer b/xos/synchronizer/Dockerfile.synchronizer
index 9440751..3ff2ebc 100644
--- a/xos/synchronizer/Dockerfile.synchronizer
+++ b/xos/synchronizer/Dockerfile.synchronizer
@@ -6,4 +6,4 @@
WORKDIR "/opt/xos/synchronizers/metro-net"
-CMD bash -c "cd /opt/xos/synchronizers/metro-net; ./run-from-api.sh
\ No newline at end of file
+CMD bash -c "cd /opt/xos/synchronizers/metro-net; ./run-from-api.sh"
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/invoker.py b/xos/synchronizer/invokers/invoker.py
deleted file mode 100644
index e645285..0000000
--- a/xos/synchronizer/invokers/invoker.py
+++ /dev/null
@@ -1,25 +0,0 @@
-class Invoker(object):
-
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- return None
-
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def postsave(self, obj):
- return None
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/invokerfactory.py b/xos/synchronizer/invokers/invokerfactory.py
deleted file mode 100644
index b3628fe..0000000
--- a/xos/synchronizer/invokers/invokerfactory.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from services.metronetwork.models import *
-from synchronizers.metronetwork.invokers.networkmultipointtomultipointinvoker import NetworkMultipointToMultipointInvoker
-from synchronizers.metronetwork.invokers.networkedgetoedgepointinvoker import NetworkEdgeToEdgePointInvoker
-from synchronizers.metronetwork.invokers.networkedgetomultipointinvoker import NetworkEdgeToMultipointInvoker
-from synchronizers.metronetwork.invokers.servicespokeinvoker import ServiceSpokeInvoker
-from synchronizers.metronetwork.invokers.vnodglobalserviceinvoker import VnodGlobalServiceInvoker
-from synchronizers.metronetwork.invokers.remoteportinvoker import RemotePortInvoker
-
-
-class InvokerFactory(object):
- @staticmethod
- def getinvoker(obj):
- #
- # Here is where we build various invokers
- #
- if isinstance(obj, NetworkMultipointToMultipointConnection):
- return NetworkMultipointToMultipointInvoker()
- elif isinstance(obj, NetworkEdgeToEdgePointConnection):
- return NetworkEdgeToEdgePointInvoker()
- elif isinstance(obj, NetworkEdgeToMultipointConnection):
- return NetworkEdgeToMultipointInvoker()
- elif isinstance(obj, ServiceSpoke):
- return ServiceSpokeInvoker()
- elif isinstance(obj, VnodGlobalService):
- return VnodGlobalServiceInvoker()
- elif isinstance(obj, RemotePort):
- return RemotePortInvoker()
- else:
- return None
diff --git a/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py b/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
deleted file mode 100644
index 2c30d79..0000000
--- a/xos/synchronizer/invokers/networkedgetoedgepointinvoker.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkEdgePort
-
-
-class NetworkEdgeToEdgePointInvoker(Invoker):
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- # Now that the Ports are created - get a proper reference to them and update the
- # src and dst fields
- if hasattr(obj, 'uni1_createbuffer'):
- uni1port = NetworkEdgePort.objects.get(pid=obj.uni1_createbuffer)
- uni2port = NetworkEdgePort.objects.get(pid=obj.uni2_createbuffer)
- obj.uni1 = uni1port
- obj.uni2 = uni2port
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- pass
diff --git a/xos/synchronizer/invokers/networkedgetomultipointinvoker.py b/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
deleted file mode 100644
index 9b8e88b..0000000
--- a/xos/synchronizer/invokers/networkedgetomultipointinvoker.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkEdgeToMultipointConnection, NetworkEdgePort
-
-class NetworkEdgeToMultipointInvoker(Invoker):
-
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- # Now that the Ports are created - get a proper reference to them and update the
- # root field
- if hasattr(obj, 'root_createbuffer'):
- rootEdgePort = NetworkEdgePort.objects.get(pid=obj.root_createbuffer)
- obj.root = rootEdgePort
-
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- #
- # Ok - we need to handle the multipoint many-to-many relationships in here
- #
- # By design convnetion we will look for them in the 'backend_register' object field
- # this is a json field that is general purpose - we will expect to find a JSON array
- # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
- #
- #
- if hasattr(obj, 'eps_createbuffer'):
- scratchpad = json.loads(obj.eps_createbuffer)
- eps = scratchpad['eps']
-
- for ep in eps:
- port = NetworkEdgePort.objects.get(pid=ep)
- obj.eps.add(port)
diff --git a/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py b/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
deleted file mode 100644
index 6b2ab42..0000000
--- a/xos/synchronizer/invokers/networkmultipointtomultipointinvoker.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import NetworkMultipointToMultipointConnection, NetworkEdgePort
-
-class NetworkMultipointToMultipointInvoker(Invoker):
-
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- pass
-
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- #
- # Ok - we need to handle the multipoint many-to-many relationships in here
- #
- # By design convnetion we will look for them in the 'backend_register' object field
- # this is a json field that is general purpose - we will expect to find a JSON array
- # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
- #
- #
- if hasattr(obj, 'eps_createbuffer'):
- scratchpad = json.loads(obj.eps_createbuffer)
- eps = scratchpad['eps']
-
- for ep in eps:
- port = NetworkEdgePort.objects.get(pid=ep)
- obj.eps.add(port)
diff --git a/xos/synchronizer/invokers/remoteportinvoker.py b/xos/synchronizer/invokers/remoteportinvoker.py
deleted file mode 100644
index 1061dc4..0000000
--- a/xos/synchronizer/invokers/remoteportinvoker.py
+++ /dev/null
@@ -1,35 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from core.models import Site
-from services.metronetwork.models import NetworkEdgePort
-
-class RemotePortInvoker(Invoker):
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- # Now that the Site and EdgePorts are created set the foreign keys
- if hasattr(obj, 'sitename'):
- site = Site.objects.get(login_base=obj.sitename)
- obj.remoteportsite = site
-
- if hasattr(obj, 'edgeportname'):
- edgeport = NetworkEdgePort.objects.get(pid=obj.edgeportname)
- obj.edgeport = edgeport
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- pass
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/servicespokeinvoker.py b/xos/synchronizer/invokers/servicespokeinvoker.py
deleted file mode 100644
index 8470cf5..0000000
--- a/xos/synchronizer/invokers/servicespokeinvoker.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from core.models import Site
-from services.metronetwork.models import RemotePort
-
-
-class ServiceSpokeInvoker(Invoker):
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
- # Now that the Ports are created - get a proper reference to them and update the
- # src and dst fields
- if hasattr(obj, 'sitename'):
- site = Site.objects.get(login_base=obj.sitename)
- obj.vnodlocalsite = site
-
- if hasattr(obj, 'remoteportname'):
- remoteport = RemotePort.objects.get(name=obj.remoteportname)
- obj.vnodlocalport = remoteport
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- pass
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/vnodglobalserviceinvoker.py b/xos/synchronizer/invokers/vnodglobalserviceinvoker.py
deleted file mode 100644
index a313171..0000000
--- a/xos/synchronizer/invokers/vnodglobalserviceinvoker.py
+++ /dev/null
@@ -1,50 +0,0 @@
-import json
-from synchronizers.metronetwork.invokers.invoker import Invoker
-from services.metronetwork.models import ServiceSpoke
-from services.metronetwork.models import BandwidthProfile
-from services.metronetwork.models import NetworkEdgeToEdgePointConnection
-
-class VnodGlobalServiceInvoker(Invoker):
-
- def __init__(self, **args):
- pass
-
- # Method for handline pre save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - None - this is a pure invoke() call, return type is None
- #
- def presave(self, obj):
-
- if hasattr(obj, 'bwpname'):
- bwprofile = BandwidthProfile.objects.get(name=obj.bwpname)
- obj.bandwidthProfile = bwprofile
-
- if hasattr(obj, 'pointtopointsid'):
- connection = NetworkEdgeToEdgePointConnection.objects.get(sid=obj.pointtopointsid)
- obj.metronetworkpointtopoint = connection
-
- # Method for handline post save semantics
- # content here would be model specific but could include handling Many-to-Many relationship
- # creation - which must occur post save
- #
- # obj - Whatever obj was just saved
- # returns - N/A - this is a pure invoke() call
- #
- def postsave(self, obj):
- #
- # Ok - we need to handle the multipoint many-to-many relationships in here
- #
- # By design convnetion we will look for them in the 'backend_register' object field
- # this is a json field that is general purpose - we will expect to find a JSON array
- # called 'eps' that just containts a reference to a bunch of NetworkEdgePorts
- #
- if hasattr(obj, 'spokes_createbuffer'):
- scratchpad = json.loads(obj.spokes_createbuffer)
- spokes = scratchpad['spokes']
-
- for spokeid in spokes:
- spoke = ServiceSpoke.objects.get(name=spokeid)
- obj.spokes.add(spoke)
diff --git a/xos/synchronizer/manifest b/xos/synchronizer/manifest
index 03f1088..4a4ccfe 100644
--- a/xos/synchronizer/manifest
+++ b/xos/synchronizer/manifest
@@ -1,23 +1,7 @@
metronetwork-synchronizer.py
__init__.py
model-deps
-providers/metronetworktestprovider.py
-providers/metronetworkrestprovider.py
-providers/providerfactory.py
-providers/__init__.py
-providers/metronetworkprovider.py
-run_devel.sh
-metronetwork-synchronizer-devel.py
manifest
-steps/sync_metronetworkservice.py
-invokers/servicespokeinvoker.py
-invokers/networkedgetoedgepointinvoker.py
-invokers/vnodglobalserviceinvoker.py
-invokers/networkmultipointtomultipointinvoker.py
-invokers/__init__.py
-invokers/invoker.py
-invokers/networkedgetomultipointinvoker.py
-invokers/invokerfactory.py
-invokers/remoteportinvoker.py
-run.sh
+steps/sync_metroneteline.py
+run-from-api.sh
metronetwork_synchronizer_config
diff --git a/xos/synchronizer/metronetwork-synchronizer-devel.py b/xos/synchronizer/metronetwork-synchronizer-devel.py
deleted file mode 100755
index df697ec..0000000
--- a/xos/synchronizer/metronetwork-synchronizer-devel.py
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-
-#observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../../synchronizers/base")
-sys.path.append("/opt/xos/synchronizers/base")
-print sys.path
-mod = importlib.import_module("xos-synchronizer")
-mod.main()
diff --git a/xos/synchronizer/providers/__init__.py b/xos/synchronizer/providers/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/xos/synchronizer/providers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/xos/synchronizer/providers/metronetworkprovider.py b/xos/synchronizer/providers/metronetworkprovider.py
deleted file mode 100644
index c316815..0000000
--- a/xos/synchronizer/providers/metronetworkprovider.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from xos.logger import Logger, logging
-from services.metronetwork.models import *
-
-logger = Logger(level=logging.INFO)
-
-
-class MetroNetworkProvider(object):
- networkdevice = None
-
- def __init__(self, networkdevice, **args):
- self.networkdevice = networkdevice
- pass
-
- # Methods to support for Synchronization - effectively list all interfaces
- #
- # Method for retrieving all network ports from the backend system
- # Intended for use when doing a re-sync
- def get_network_ports(self):
- # Default method needs to be overriden
- logger.debug("get_network_ports default called - should be overriden")
-
- # Method for getting a list of network ports to delete
- # The default imnplementation just gets a list from the local DB
- # Intended for use when doing a re-sync
- def get_network_ports_for_deletion(self):
- # Default method needs to be overriden
- logger.debug("get_network_ports for deletion called - default is all ports in the db related to this id")
- objs = []
- return objs
-
- # Method for retrieving all network links from the backend system
- # Includes Connectivity Objects
- # Intended for use when doing a re-sync
- def get_network_links(self):
- # Default method needs to be overriden
- logger.debug("get_network_links default called - should be overriden")
- objs = []
- return objs
-
- # Method for getting a list of network links to delete
- # Includes Connectivity Objects
- # Intended for use when doing a re-sync
- def get_network_links_for_deletion(self):
- # Default method needs to be overriden
- logger.debug("get_network_links for deletion called - should be overidden")
- objs = []
- return objs
-
- # Methods to support Event Management - movement of changes from the Domain to XOS
- #
- # Method for Create and Update - Create and Update are together given the base design
- def get_updated_or_created_objects(self):
- # Default method needs to be overriden
- logger.debug("get_updated_or_created_objects default called - should be overriden")
- objs = []
- return objs
-
- # Method for Delete - Create and Update are together given the base design
- def get_deleted_objects(self):
- # Default method needs to be overriden
- logger.debug("get_deleted_objects default called - should be overriden")
- objs = []
- return objs
-
- # Methods to support Movement of changes from XOS into the Domain
- #
- # Method for creating point to point connectivity object
- #
- # obj - Connection object - with all configuration variables set
- # returns - Boolean - indicating whether or not the request succeeded - in either case the Admin/Oper
- # states are assigned - if False the backend_status field
- # should be assigned with the appropriate error code - in the case of True the
- # backend_status will be assigned by the system and should be unassigned
-
- def create_point_to_point_connectivity(self, obj):
- # Default method needs to be overriden
- logger.debug("create_point_to_point_connectivity called - should be overriden")
- return False
-
- # Method for deleting point to point connectivity object
- #
- # obj - Connection object
- # returns - Boolean - indicating whether or not the request succeeded - in either case the Admin/Oper
- # states are assigned - if False the backend_status field
- # should be assigned with the appropriate error code - in the case of True the
- # backend_status will be assigned by the system and should be unassigned
- def delete_point_to_point_connectivity(self, obj):
- # Default method needs to be overriden
- logger.debug("delete_point_to_point_connectivity called - should be overriden")
- return False
diff --git a/xos/synchronizer/providers/metronetworkrestprovider.py b/xos/synchronizer/providers/metronetworkrestprovider.py
deleted file mode 100644
index 2cb03ab..0000000
--- a/xos/synchronizer/providers/metronetworkrestprovider.py
+++ /dev/null
@@ -1,472 +0,0 @@
-from xos.logger import Logger, logging
-from services.metronetwork.models import *
-from synchronizers.metronetwork.providers.metronetworkprovider import MetroNetworkProvider
-
-import requests, json
-from requests.auth import HTTPBasicAuth
-
-logger = Logger(level=logging.INFO)
-
-
-class MetroNetworkRestProvider(MetroNetworkProvider):
- def __init__(self, networkdevice, **args):
- MetroNetworkProvider.__init__(self, networkdevice, **args)
-
- def get_network_ports(self):
-
- objs = []
-
- restCtrlUrl = self.networkdevice.restCtrlUrl
- username = self.networkdevice.username
- password = self.networkdevice.password
-
- resp = requests.get("{}/mef-sca-api/SCA_ETH_FPP_UNI_N".format(restCtrlUrl),
- auth=HTTPBasicAuth(username, password))
-
- if resp.status_code == 200:
- for uni in resp.json():
- hostname = uni['transportPort']['Hostname']
- port = uni['transportPort']['Port']
-
- # Default values
- bwpCfgCbs = 0
- bwpCfgEbs = 0
- bwpCfgCir = 0
- bwpCfgEir = 0
-
- if 'interfaceCfgIngressBwp' in uni:
- bwpCfgCbs = uni['interfaceCfgIngressBwp']['bwpCfgCbs']
- bwpCfgEbs = uni['interfaceCfgIngressBwp']['bwpCfgEbs']
- bwpCfgCir = uni['interfaceCfgIngressBwp']['bwpCfgCir']
- bwpCfgEir = uni['interfaceCfgIngressBwp']['bwpCfgEir']
-
- uniPort = NetworkEdgePort()
- uniPort.element = self.networkdevice
- uniPort.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)
- uniPort.bwpCfgCbs = bwpCfgCbs
- uniPort.bwpCfgEbs = bwpCfgEbs
- uniPort.bwpCfgCir = bwpCfgCir
- uniPort.bwpCfgEir = bwpCfgEir
-
- objs.append(uniPort)
-
- return objs
-
- else:
- raise Exception("OnosApiError: get_network_ports()")
-
- def get_network_ports(self):
-
- objs = []
-
- restCtrlUrl = self.networkdevice.restCtrlUrl
- username = self.networkdevice.username
- password = self.networkdevice.password
-
- resp = requests.get("{}/mef-sca-api/SCA_ETH_FPP_UNI_N".format(restCtrlUrl),
- auth=HTTPBasicAuth(username, password))
-
- if resp.status_code == 200:
- for uni in resp.json():
- hostname = uni['transportPort']['Hostname']
- port = uni['transportPort']['Port']
-
- # Default values
- bwpCfgCbs = 0
- bwpCfgEbs = 0
- bwpCfgCir = 0
- bwpCfgEir = 0
-
- if 'interfaceCfgIngressBwp' in uni:
- bwpCfgCbs = uni['interfaceCfgIngressBwp']['bwpCfgCbs']
- bwpCfgEbs = uni['interfaceCfgIngressBwp']['bwpCfgEbs']
- bwpCfgCir = uni['interfaceCfgIngressBwp']['bwpCfgCir']
- bwpCfgEir = uni['interfaceCfgIngressBwp']['bwpCfgEir']
-
- uniPort = NetworkEdgePort()
- uniPort.element = self.networkdevice
- uniPort.pid = "{}.{}/{}".format(self.networkdevice.id, hostname, port)
- uniPort.bwpCfgCbs = bwpCfgCbs
- uniPort.bwpCfgEbs = bwpCfgEbs
- uniPort.bwpCfgCir = bwpCfgCir
- uniPort.bwpCfgEir = bwpCfgEir
-
- objs.append(uniPort)
-
- return objs
-
- else:
- raise Exception("OnosApiError: get_network_ports()")
-
- def get_network_eline_link(self, networkDevice, evc):
-
- sid = evc['id']
- uni1 = evc['SCA_ETH_Flow_Points'][0]
- hostname = uni1['scaEthFppUniN']['transportPort']['Hostname']
- port = uni1['scaEthFppUniN']['transportPort']['Port']
-
- edgePort1 = NetworkEdgePort()
- edgePort1.element = networkDevice
- edgePort1.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)
-
- if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:
- edgePort1.bwpCfgCbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']
- edgePort1.bwpCfgEbs = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']
- edgePort1.bwpCfgCir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']
- edgePort1.bwpCfgEir = uni1['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']
-
- uni2 = evc['SCA_ETH_Flow_Points'][1]
- hostname = uni2['scaEthFppUniN']['transportPort']['Hostname']
- port = uni2['scaEthFppUniN']['transportPort']['Port']
-
- edgePort2 = NetworkEdgePort()
- edgePort2.element = networkDevice
- edgePort2.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)
-
- if 'interfaceCfgIngressBwp' in uni1['scaEthFppUniN']:
- edgePort2.bwpCfgCbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']
- edgePort2.bwpCfgEbs = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']
- edgePort2.bwpCfgCir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']
- edgePort2.bwpCfgEir = uni2['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']
-
- edgeToEdgeConnectivity = NetworkEdgeToEdgePointConnection()
- edgeToEdgeConnectivity.sid = sid
- edgeToEdgeConnectivity.type = "Point_To_Point"
- edgeToEdgeConnectivity.uni1 = edgePort1
- edgeToEdgeConnectivity.uni2 = edgePort2
- edgeToEdgeConnectivity.operstate = "active"
- edgeToEdgeConnectivity.adminstate = "enabled"
-
- return(edgeToEdgeConnectivity)
-
- def get_network_elan_link(self, networkDevice, evc):
-
- sid = evc['id']
- eps = []
-
- for ep in evc['SCA_ETH_Flow_Points']:
- hostname = ep['scaEthFppUniN']['transportPort']['Hostname']
- port = ep['scaEthFppUniN']['transportPort']['Port']
-
- edgePort = NetworkEdgePort()
- edgePort.element = networkDevice
- edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)
-
- if 'interfaceCfgIngressBwp' in ep['scaEthFppUniN']:
- edgePort.bwpCfgCbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']
- edgePort.bwpCfgEbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']
- edgePort.bwpCfgCir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']
- edgePort.bwpCfgEir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']
-
- eps.append(edgePort)
-
- multipointToMultipointConnectivity = NetworkMultipointToMultipointConnection()
- multipointToMultipointConnectivity.sid = sid
- multipointToMultipointConnectivity.type = "Multipoint_To_Multipoint"
- multipointToMultipointConnectivity.eps = eps
- multipointToMultipointConnectivity.operstate = "active"
- multipointToMultipointConnectivity.adminstate = "enabled"
-
- return(multipointToMultipointConnectivity)
-
- def get_network_etree_link(self, networkDevice, evc):
-
- sid = evc['id']
- eps = []
-
- root = evc['SCA_ETH_Flow_Points'][0]
- hostname = root['scaEthFppUniN']['transportPort']['Hostname']
- port = root['scaEthFppUniN']['transportPort']['Port']
-
- edgePort = NetworkEdgePort()
- edgePort.element = networkDevice
- edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)
-
- if 'interfaceCfgIngressBwp' in root['scaEthFppUniN']:
- edgePort.bwpCfgCbs = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']
- edgePort.bwpCfgEbs = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']
- edgePort.bwpCfgCir = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']
- edgePort.bwpCfgEir = root['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']
-
- edgeToMultipointConnectivity = NetworkEdgeToMultipointConnection()
- edgeToMultipointConnectivity.sid = sid
- edgeToMultipointConnectivity.type = "Root_Multipoint"
- edgeToMultipointConnectivity.root = edgePort
-
- for ep in evc['SCA_ETH_Flow_Points'][1:]:
- hostname = ep['scaEthFppUniN']['transportPort']['Hostname']
- port = ep['scaEthFppUniN']['transportPort']['Port']
-
- edgePort = NetworkEdgePort()
- edgePort.element = networkDevice
- edgePort.pid = "{}.{}/{}".format(networkDevice.id, hostname, port)
-
- if 'interfaceCfgIngressBwp' in ep['scaEthFppUniN']:
- edgePort.bwpCfgCbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCbs']
- edgePort.bwpCfgEbs = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEbs']
- edgePort.bwpCfgCir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgCir']
- edgePort.bwpCfgEir = ep['scaEthFppUniN']['interfaceCfgIngressBwp']['bwpCfgEir']
-
- eps.append(edgePort)
-
- edgeToMultipointConnectivity.eps = eps
- edgeToMultipointConnectivity.operstate = "active"
- edgeToMultipointConnectivity.adminstate = "enabled"
-
- return(edgeToMultipointConnectivity)
-
- def get_network_links(self):
-
- objs = []
-
- networkDevice = self.networkdevice
- restCtrlUrl = self.networkdevice.restCtrlUrl
- username = self.networkdevice.username
- password = self.networkdevice.password
-
- resp = requests.get("{}/mef-sca-api/SCA_ETH_FDFr_EC/findByState?state=Active".format(restCtrlUrl),
- auth=HTTPBasicAuth(username, password))
-
- if resp.status_code == 200:
- for evc in resp.json():
- evcServiceType = evc['evcServiceType']
- if (evcServiceType == "Point_To_Point"):
- objs.append(self.get_network_eline_link(networkDevice, evc))
- elif (evcServiceType == "Multipoint_To_Multipoint"):
- objs.append(self.get_network_elan_link(networkDevice, evc))
- elif (evcServiceType == "Root_Multipoint"):
- objs.append(self.get_network_etree_link(networkDevice, evc))
- else:
- raise Exception("OnosApiError: get_network_links() - unknown link type")
- else:
- raise Exception("OnosApiError: get_network_links()")
-
- return objs
-
- def create_point_to_point_connectivity_json_data(self, obj):
-
- p2p_json_data = {}
- p2p_json_data["evcServiceType"] = "Point_To_Point"
-
- uni1 = obj.uni1
- uni1Id = uni1.pid
- uni1IdToken = (uni1Id.split('.', 1))[1].split('/', 1)
- uni1Hostname = uni1IdToken[0]
- uni1Port = uni1IdToken[1]
- uni1BwpCfgCbs = uni1.bwpCfgCbs
- uni1BwpCfgEbs = uni1.bwpCfgEbs
- uni1BwpCfgCir = uni1.bwpCfgCir
- uni1BwpCfgEir = uni1.bwpCfgEir
-
- uni1_json_data = {}
- uni1_json_data['scaEthFppUniN'] = {}
- uni1_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid
- uni1_json_data['scaEthFppUniN']["transportPort"] = {}
- uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}
-
- uni1_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uni1Hostname
- uni1_json_data['scaEthFppUniN']["transportPort"]["Port"] = uni1Port
- uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uni1BwpCfgCbs
- uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uni1BwpCfgEbs
- uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uni1BwpCfgCir
- uni1_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uni1BwpCfgEir
-
- uni2 = obj.uni2
- uni2Id = uni2.pid
- uni2IdToken = (uni2Id.split('.', 1))[1].split('/', 1)
- uni2Hostname = uni2IdToken[0]
- uni2Port = uni2IdToken[1]
- uni2BwpCfgCbs = uni2.bwpCfgCbs
- uni2BwpCfgEbs = uni2.bwpCfgEbs
- uni2BwpCfgCir = uni2.bwpCfgCir
- uni2BwpCfgEir = uni2.bwpCfgEir
-
- uni2_json_data = {}
- uni2_json_data['scaEthFppUniN'] = {}
- uni2_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid
- uni2_json_data['scaEthFppUniN']["transportPort"] = {}
- uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}
-
- uni2_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uni2Hostname
- uni2_json_data['scaEthFppUniN']["transportPort"]["Port"] = uni2Port
- uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uni2BwpCfgCbs
- uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uni2BwpCfgEbs
- uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uni2BwpCfgCir
- uni2_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uni2BwpCfgEir
-
- p2p_json_data["SCA_ETH_Flow_Points"] = []
- p2p_json_data["SCA_ETH_Flow_Points"].append(uni1_json_data)
- p2p_json_data["SCA_ETH_Flow_Points"].append(uni2_json_data)
-
- return p2p_json_data
-
- # nchoi: create elan service json data
- def create_multipoint_to_multipoint_connectivity_json_data(self, obj):
-
- mp2mp_json_data = {}
- mp2mp_json_data["evcServiceType"] = "Multipoint_To_Multipoint"
- mp2mp_json_data["SCA_ETH_Flow_Points"] = []
-
- for ep in obj.eps.all():
- uniId = ep.pid
- uniIdToken = (uniId.split('.', 1))[1].split('/', 1)
- uniHostname = uniIdToken[0]
- uniPort = uniIdToken[1]
- uniBwpCfgCbs = ep.bwpCfgCbs
- uniBwpCfgEbs = ep.bwpCfgEbs
- uniBwpCfgCir = ep.bwpCfgCir
- uniBwpCfgEir = ep.bwpCfgEir
-
- uni_json_data = {}
- uni_json_data['scaEthFppUniN'] = {}
- uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid
- uni_json_data['scaEthFppUniN']["transportPort"] = {}
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}
-
- uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname
- uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir
-
- mp2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)
-
- return mp2mp_json_data
-
- # nchoi: create etree service json data
- def create_root_multipoint_connectivity_json_data(self, obj):
-
- r2mp_json_data = {}
- r2mp_json_data["evcServiceType"] = "Root_Multipoint"
- r2mp_json_data["SCA_ETH_Flow_Points"] = []
-
- root = obj.root
- uniId = root.pid
- uniIdToken = (uniId.split('.', 1))[1].split('/', 1)
- uniHostname = uniIdToken[0]
- uniPort = uniIdToken[1]
- uniBwpCfgCbs = root.bwpCfgCbs
- uniBwpCfgEbs = root.bwpCfgEbs
- uniBwpCfgCir = root.bwpCfgCir
- uniBwpCfgEir = root.bwpCfgEir
-
- uni_json_data = {}
- uni_json_data['scaEthFppUniN'] = {}
- uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid
- uni_json_data['scaEthFppUniN']["transportPort"] = {}
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}
-
- uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname
- uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir
-
- r2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)
-
- for ep in obj.eps.all():
- uniId = ep.pid
- uniIdToken = (uniId.split('.', 1))[1].split('/', 1)
- uniHostname = uniIdToken[0]
- uniPort = uniIdToken[1]
- uniBwpCfgCbs = ep.bwpCfgCbs
- uniBwpCfgEbs = ep.bwpCfgEbs
- uniBwpCfgCir = ep.bwpCfgCir
- uniBwpCfgEir = ep.bwpCfgEir
-
- uni_json_data = {}
- uni_json_data['scaEthFppUniN'] = {}
- uni_json_data['scaEthFppUniN']['ceVlanId'] = obj.vlanid
- uni_json_data['scaEthFppUniN']["transportPort"] = {}
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"] = {}
-
- uni_json_data['scaEthFppUniN']["transportPort"]["Hostname"] = uniHostname
- uni_json_data['scaEthFppUniN']["transportPort"]["Port"] = uniPort
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCbs"] = uniBwpCfgCbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEbs"] = uniBwpCfgEbs
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgCir"] = uniBwpCfgCir
- uni_json_data['scaEthFppUniN']["interfaceCfgIngressBwp"]["bwpCfgEir"] = uniBwpCfgEir
-
- r2mp_json_data["SCA_ETH_Flow_Points"].append(uni_json_data)
-
- return r2mp_json_data
-
- def create_network_connectivity(self, obj):
-
- restCtrlUrl = self.networkdevice.restCtrlUrl
- username = self.networkdevice.username
- password = self.networkdevice.password
-
- evcServiceType = obj.type
- if (evcServiceType == "Point_To_Point"):
- network_connectivity_json_data = self.create_point_to_point_connectivity_json_data(obj)
- elif (evcServiceType == "Multipoint_To_Multipoint"):
- network_connectivity_json_data = self.create_multipoint_to_multipoint_connectivity_json_data(obj)
- elif (evcServiceType == "Root_Multipoint"):
- network_connectivity_json_data = self.create_root_multipoint_connectivity_json_data(obj)
- else:
- raise Exception("OnosApiError: get_network_links() - unknown link type")
-
- headers = {'Content-Type': 'application/json'}
- resp = requests.post('{}/mef-sca-api/SCA_ETH_FDFr_EC'.format(restCtrlUrl),
- data=json.dumps(network_connectivity_json_data), headers=headers, auth=HTTPBasicAuth(username, password))
-
- if resp.status_code == 201:
- result = resp.json()
- message = result['message']
-
- msg_token = message.split()
- for i, token in enumerate(msg_token):
- if token == 'id':
- service_id = msg_token[i + 1]
- obj.sid = service_id
- obj.adminstate = "enabled"
- obj.operstate = "active"
-
- return True
-
- elif resp.status_code == 204:
- obj.adminstate = "invalid" # what's the meaning?
- obj.operstate = "inactive"
- obj.backend_status = '204 - No network resource'
-
- return False
-
- elif resp.status_code == 500:
- obj.adminstate = "enabled"
- obj.operstate = "inactive"
- obj.backend_status = '500 - Internal Server Error'
- return False
-
- else:
- raise Exception("OnosApiError: create_network_connectivity()")
-
- def delete_network_connectivity(self, obj):
-
- restCtrlUrl = self.networkdevice.restCtrlUrl
- username = self.networkdevice.username
- password = self.networkdevice.password
- evcId = obj.sid
-
- resp = requests.delete("{}/mef-sca-api/SCA_ETH_FDFr_EC/{}".format(restCtrlUrl, evcId),
- auth=HTTPBasicAuth(username, password))
-
- if resp.status_code == 200:
- obj.adminstate = 'disabled'
- obj.operstate = 'inactive'
- return True
-
- elif resp.status_code == 204:
- obj.adminstate = "invalid" # what's the meaning?
- obj.backend_status = '204 - No such network resource: {}'.format(evcId)
- return False
-
- elif resp.status_code == 500:
- obj.adminstate = "disabled"
- obj.backend_status = '500 - Internal Server Error'
- return False
-
- else:
- raise Exception("OnosApiError: delete_network_connectivity()")
diff --git a/xos/synchronizer/providers/metronetworktestprovider.py b/xos/synchronizer/providers/metronetworktestprovider.py
deleted file mode 100644
index 3bcbb92..0000000
--- a/xos/synchronizer/providers/metronetworktestprovider.py
+++ /dev/null
@@ -1,339 +0,0 @@
-import random
-import json
-
-from xos.logger import Logger, logging
-from services.metronetwork.models import *
-from core.models import Site
-from synchronizers.metronetwork.providers.metronetworkprovider import MetroNetworkProvider
-
-logger = Logger(level=logging.INFO)
-
-
-class MetroNetworkTestProvider(MetroNetworkProvider):
- def __init__(self, networkdevice, **args):
- MetroNetworkProvider.__init__(self, networkdevice, **args)
-
- # Method for retrieving all network ports from the backend system
- def get_network_ports(self):
- #
- # Our Test Network Consists of one NetworkDevice (which correspond to ONOS instance):
- #
- # 8 Ports
- # 1 Eline (2 ports)
- # 1 Etree (3 ports)
- # 1 Elan (3 ports)
- #
- # 2 Sites - Representing Two R-CORD Pods
- # 2 Ports, One-per-site
- # 1 Bandwidth Profile
- # 2 Service Spokes
- # 1 VnodGlobalService
-
- objs = []
-
- # For The Test Provider we don't handle re-sync for anything but the Metro Test Network
- if self.networkdevice.id != 'TestMetroNet':
- return objs
-
- # Set the parent device id to just be the Test NetworkDevice
- device1 = NetworkDevice()
- device1.id = self.networkdevice.id
-
- port1 = NetworkEdgePort()
- port1.element = device1
- port1.pid = device1.id + "." + "of:000000001/1"
- port1.bwpCfgCbs = 1000000
- port1.bwpCfgEbs = 1000000
- port1.bwpCfgEir = 1000000
- port1.bwpCfgCir = 1000000
- port1.location = "San Francisco"
- port1.name = "Central Office 1"
- port1.latlng = "[-122.419416, 37.774929]"
- objs.append(port1)
-
- port2 = NetworkEdgePort()
- port2.element = device1
- port2.pid = device1.id + "." + "of:000000001/2"
- port2.bwpCfgCbs = 1000000
- port2.bwpCfgEbs = 1000000
- port2.bwpCfgEir = 1000000
- port2.bwpCfgCir = 1000000
- port2.location = "San Jose"
- port2.name = "Central Office 2"
- port2.latlng = "[-121.886329, 37.338208]"
- objs.append(port2)
-
- port3 = NetworkEdgePort()
- port3.element = device1
- port3.pid = device1.id + "." + "of:000000001/3"
- port3.bwpCfgCbs = 1000000
- port3.bwpCfgEbs = 1000000
- port3.bwpCfgEir = 1000000
- port3.bwpCfgCir = 1000000
- port3.location = "Palo Alto"
- port3.name = "Central Office 3"
- port3.latlng = "[-122.143019, 37.441883]"
- objs.append(port3)
-
- port4 = NetworkEdgePort()
- port4.element = device1
- port4.pid = device1.id + "." + "of:000000001/4"
- port4.bwpCfgCbs = 1000000
- port4.bwpCfgEbs = 1000000
- port4.bwpCfgEir = 1000000
- port4.bwpCfgCir = 1000000
- port4.location = "Oakland"
- port4.name = "Central Office 4"
- port4.latlng = "[-122.271114, 37.804364]"
- objs.append(port4)
-
- port5 = NetworkEdgePort()
- port5.element = device1
- port5.pid = device1.id + "." + "of:000000001/5"
- port5.bwpCfgCbs = 1000000
- port5.bwpCfgEbs = 1000000
- port5.bwpCfgEir = 1000000
- port5.bwpCfgCir = 1000000
- port5.location = "San Rafael"
- port5.name = "Central Office 5"
- port5.latlng = "[-122.531087, 37.973535]"
- objs.append(port5)
-
- port6 = NetworkEdgePort()
- port6.element = device1
- port6.pid = device1.id + "." + "of:000000001/6"
- port6.bwpCfgCbs = 1000000
- port6.bwpCfgEbs = 1000000
- port6.bwpCfgEir = 1000000
- port6.bwpCfgCir = 1000000
- port6.location = "San Mateo"
- port6.name = "Central Office 6"
- port6.latlng = "[-122.325525, 37.562992]"
- objs.append(port6)
-
- port7 = NetworkEdgePort()
- port7.element = device1
- port7.pid = device1.id + "." + "of:000000001/7"
- port7.bwpCfgCbs = 1000000
- port7.bwpCfgEbs = 1000000
- port7.bwpCfgEir = 1000000
- port7.bwpCfgCir = 1000000
- port7.location = "Hayward"
- port7.name = "Central Office 7"
- port7.latlng = "[-122.080796, 37.668821]"
- objs.append(port7)
-
- port8 = NetworkEdgePort()
- port8.element = device1
- port8.pid = device1.id + "." + "of:000000001/8"
- port8.bwpCfgCbs = 1000000
- port8.bwpCfgEbs = 1000000
- port8.bwpCfgEir = 1000000
- port8.bwpCfgCir = 1000000
- port8.location = "Fremont"
- port8.name = "Central Office 8"
- port8.latlng = "[-121.988572, 37.548270]"
- objs.append(port8)
-
- return objs
-
- def get_network_ports_for_deletion(self):
-
- objs = []
-
- # For The Test Provider we don't handle re-sync for anything but the Metro Test Network
- if self.networkdevice.id != 'TestMetroNet':
- return objs
-
- allports = MetroNetworkProvider.get_network_ports_for_deletion(self)
-
- for port in allports:
- objs.append(port)
-
- return objs
-
- def get_network_links(self):
-
- objs = []
-
- # Connectivity object - Point to Point
- cordpod1device = NetworkDevice()
- cordpod1device.id = self.networkdevice.id
-
- # Edge to Edge Point Connectivity Objects
- edgetoedgeconnectivity = NetworkEdgeToEdgePointConnection()
- edgetoedgeconnectivity.uni1_createbuffer = cordpod1device.id + "." + "of:000000001/1"
- edgetoedgeconnectivity.uni2_createbuffer = cordpod1device.id + "." + "of:000000001/2"
- edgetoedgeconnectivity.type = 'direct'
- edgetoedgeconnectivity.operstate = 'active'
- edgetoedgeconnectivity.adminstate = 'enabled'
- edgetoedgeconnectivity.sid = 'EdgeToEdgePointConnectivity_1'
- objs.append(edgetoedgeconnectivity)
-
-
- # Multipoint to Multipoint Connectivity Objects
- multipoint2multipointconnectivity=NetworkMultipointToMultipointConnection()
- multipoint2multipointconnectivity.operstate = 'active'
- multipoint2multipointconnectivity.adminstate = 'enabled'
- multipoint2multipointconnectivity.type = 'ethernet'
- multipoint2multipointconnectivity.sid = 'MultipointToMultipointConnectivity_1'
-
- #
- # Create JSON array for post-save behaviour
- #
- eps = []
- eps.append(cordpod1device.id + "." + "of:000000001/3")
- eps.append(cordpod1device.id + "." + "of:000000001/4")
- eps.append(cordpod1device.id + "." + "of:000000001/5")
-
- myjsonstr = {'eps': eps, 'foo':0, 'bar':0}
- multipoint2multipointconnectivity.eps_createbuffer = json.dumps(myjsonstr)
- objs.append(multipoint2multipointconnectivity)
-
- # Edge to Multipoint Connectivity Objects
- edge2multipointconnectivity = NetworkEdgeToMultipointConnection()
- edge2multipointconnectivity.operstate = 'active'
- edge2multipointconnectivity.adminstate = 'enabled'
- edge2multipointconnectivity.type = 'ethernet'
- edge2multipointconnectivity.sid = 'EdgeToMultipointConnectivity_1'
- edge2multipointconnectivity.root_createbuffer = cordpod1device.id + "." + "of:000000001/7"
- #
- # Create JSON array for post-save behaviour
- #
- eps = []
- eps.append(cordpod1device.id + "." + "of:000000001/6")
- eps.append(cordpod1device.id + "." + "of:000000001/8")
-
- myjsonstr = {'eps': eps, 'foo': 0, 'bar': 0}
- edge2multipointconnectivity.eps_createbuffer = json.dumps(myjsonstr)
- objs.append(edge2multipointconnectivity)
-
- # Create Objects for VnodGlobal Sort of Testing
-
- # Bandwidth Profile
-
- bwprofile = BandwidthProfile()
- bwprofile.bwpcfgcbs = 0
- bwprofile.bwpcfgcir = 0
- bwprofile.bwpcfgebs = 0
- bwprofile.bwpcfgeir = 0
- bwprofile.name = 'TestBWP'
- objs.append(bwprofile)
-
- # Two Sites
- site1 = Site()
- site1.name = 'CORDPod1'
- site1.login_base = 'CordPod1'
- site1.site_url = 'http://1.2.3.4:8080/VnodLocalApi'
- objs.append(site1)
-
- site2 = Site()
- site2.name = 'CORDPod2'
- site2.login_base = 'CordPod2'
- site2.site_url = 'http://10.11.12.13:8080/VnodLocalApi'
- objs.append(site2)
-
- # Two Ports - one per Site
-
- remoteport1 = RemotePort()
- remoteport1.name = "CORDPOD1:Port1"
- remoteport1.sitename = 'CordPod1'
- remoteport1.edgeportname = cordpod1device.id + "." + "of:000000001/1"
- objs.append(remoteport1)
-
- remoteport2 = RemotePort()
- remoteport2.name = "CORDPOD2:Port1"
- remoteport2.sitename = 'CordPod2'
- remoteport2.edgeportname = cordpod1device.id + "." + "of:000000001/2"
- objs.append(remoteport2)
-
- # One Spoke/Site
- spoke1 = ServiceSpoke()
- spoke1.name = 'TestSpoke1'
- spoke1.remoteportname = "CORDPOD1:Port1"
- spoke1.remotevnodid = 'CORDPod1:VnodLocal:1'
- spoke1.operstate = 'inactive'
- spoke1.adminstate = 'enabled'
- spoke1.sitename = 'CordPod1'
- objs.append(spoke1)
-
- spoke2 = ServiceSpoke()
- spoke2.name = 'TestSpoke2'
- spoke2.remoteportname = "CORDPOD2:Port1"
- spoke2.remotevnodid = 'CORDPod2:VnodLocal:1'
- spoke2.operstate = 'active'
- spoke2.adminstate = 'enabled'
- spoke2.sitename = 'CordPod2'
- objs.append(spoke2)
-
- # One VnodGlobal Service
- vnodglobal = VnodGlobalService()
- vnodglobal.name = 'VnodGlobalPtToPtTest1'
- vnodglobal.type = 'eline'
- vnodglobal.vlanid = '100'
- vnodglobal.operstate = 'active'
- vnodglobal.adminstate = 'enabled'
- vnodglobal.servicehandle = 'testhandle1'
- vnodglobal.pointtopointsid = 'onos_eline_id'
- vnodglobal.bwpname = 'TestBWP'
-
- # Create JSON array for post-save behaviour
- #
- spokes = ['TestSpoke1', 'TestSpoke2']
- myjsonstr = {'spokes': spokes}
- vnodglobal.spokes_createbuffer = json.dumps(myjsonstr)
- objs.append(vnodglobal)
-
- return objs
-
- def get_network_links_for_deletion(self):
-
- # For now we'll rely on cascade deletes in the port area - so from the test provider nothing to do
- objs = []
- return objs
-
- def create_point_to_point_connectivity(self, obj):
-
- # Ok - here is what we'll do to simulate the 'real world' - get a random number between 1 and 10
- # 1-7 is considered 'successful' 8 is considered a transient error - 9 is a configuration problem
- # 10 is a - resource exhausted problem - there you go!!
- scenario = random.randint(1, 10)
-
- if (scenario >= 1 and scenario <= 7):
- obj.adminstate = 'enabled'
- obj.operstate = 'active'
- return True
- elif (scenario == 8):
- obj.adminstate = 'enabled'
- obj.operstate = 'inactive'
- obj.backend_status = '8 - Transient Server Error'
- return False
- elif (scenario == 9):
- obj.adminstate = 'invalid'
- obj.operstate = 'inactive'
- obj.backend_status = '9 - Configuration Error'
- return False
- else:
- obj.adminstate = 'enabled'
- obj.operstate = 'inactive'
- obj.backend_status = '10 - Resource Exhaustion'
- return False
-
- def delete_point_to_point_connectivity(self, obj):
-
- # Ok - here is what we'll do to simulate the 'real world' - get a random number between 1 and 10
- # 1-8 is considered 'successful' 8 is considered a transient error - 9 is a configuration problem
- scenario = random.randint(1, 10)
-
- if (scenario >= 1 and scenario <= 8):
- obj.adminstate = 'disabled'
- obj.operstate = 'inactive'
- return True
- elif (scenario == 9):
- obj.adminstate = 'disabled'
- obj.backend_status = '8 - Transient Server Error'
- return False
- else:
- obj.adminstate = 'invalid'
- obj.backend_status = '9 - Configuration Error'
- return False
diff --git a/xos/synchronizer/providers/providerfactory.py b/xos/synchronizer/providers/providerfactory.py
deleted file mode 100644
index 9ef6cb8..0000000
--- a/xos/synchronizer/providers/providerfactory.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import sys
-
-from synchronizers.metronetwork.providers.metronetworktestprovider import MetroNetworkTestProvider
-from synchronizers.metronetwork.providers.metronetworkrestprovider import MetroNetworkRestProvider
-
-
-class ProviderFactory(object):
- @staticmethod
- def getprovider(networkdevice):
-
- undertest = False
-
- # We either return Test or Rest
- # By convention a NetworkDevice with name TestDomain will use test objects
- if networkdevice.id == 'TestMetroNet' or networkdevice.id == 'TestCORD1Net' or networkdevice.id == 'TestCORD2Net':
- undertest = True
-
- if undertest:
- return MetroNetworkTestProvider(networkdevice)
- else:
- return MetroNetworkRestProvider(networkdevice)
diff --git a/xos/synchronizer/run-from-api.sh b/xos/synchronizer/run-from-api.sh
old mode 100644
new mode 100755
index 95ba5dd..73f5eec
--- a/xos/synchronizer/run-from-api.sh
+++ b/xos/synchronizer/run-from-api.sh
@@ -1,2 +1,3 @@
+#!/usr/bin/env bash
export XOS_DIR=/opt/xos
python metronetwork-synchronizer.py -C $XOS_DIR/synchronizers/metro-net/metronetwork_from_api_config
\ No newline at end of file
diff --git a/xos/synchronizer/invokers/__init__.py b/xos/synchronizer/steps/__init__.py
similarity index 100%
rename from xos/synchronizer/invokers/__init__.py
rename to xos/synchronizer/steps/__init__.py
diff --git a/xos/synchronizer/steps/sync_metroneteline.py b/xos/synchronizer/steps/sync_metroneteline.py
new file mode 100644
index 0000000..bd0bfef
--- /dev/null
+++ b/xos/synchronizer/steps/sync_metroneteline.py
@@ -0,0 +1,89 @@
+import os
+import sys
+import requests
+import json
+from synchronizers.new_base.syncstep import SyncStep
+from synchronizers.new_base.modelaccessor import *
+#from xos.logger import Logger, logging
+
+from requests.auth import HTTPBasicAuth
+#logger = Logger(level=logging.INFO)
+
+parentdir = os.path.join(os.path.dirname(__file__), "..")
+sys.path.insert(0, parentdir)
+
+
+class SyncMetroNetEline(SyncStep):
+ provides = [ELine]
+
+ observes = ELine
+
+ requested_interval = 0
+
+ def __init__(self, *args, **kwargs):
+ super(SyncMetroNetEline, self).__init__(*args, **kwargs)
+
+ def get_onos_global_addr(self, onos):
+ #Fetching ip and port from the Global ONOS, append the CE specif API
+
+ onos_url = "http://%s:%s/onos/" % (onos.onos_ip, onos.onos_port)
+ evc_endpoint = "carrierethernet/evc"
+ return onos_url + evc_endpoint
+
+ def get_onos_global_auth(self, onos):
+ #Fetching username and password from the Global ONOS
+
+ return HTTPBasicAuth(onos.onos_username, onos.onos_password)
+
+ def sync_record(self, evc):
+ print "POST %s " % (evc)
+ #logger.info("Syncing Edited EVC: %s" % evc.name)
+ # Fetch the bwp from the DB
+ bwp = BandwidthProfile.objects.get(name=evc.bwp)
+
+ # json to configure ONOS to start the EVC.
+ # {
+ # "evcId": "evc1",
+ # "evcCfgId": "evpl1",
+ # "uniList": [
+ # "netconf:192.168.56.10:830/0",
+ # "netconf:192.168.56.20:830/0"
+ # ],
+ # "evcType": "POINT_TO_POINT",
+ # "vlanId": 100,
+ # "cir": "400",
+ # "eir": "200",
+ # "cbs": "3000",
+ # "ebs": "2000"
+ # }
+
+ data = {}
+ data["evcId"] = evc.name
+ data["evcCfgId"] = evc.name
+ data["uniList"] = [evc.connect_point_1_id, evc.connect_point_2_id]
+ data["evcType"] = "POINT_TO_POINT"
+ data["vlanId"] = evc.vlanids.split(",")
+ data["cbs"] = bwp.cbs
+ data["ebs"] = bwp.ebs
+ data["cir"] = bwp.cir
+ data["eir"] = bwp.eir
+ print "data %s" % data
+ # assuming that the CPEs are controller by the fabric ONOS
+ onos = OnosModel.objects.get(onos_type="global")
+ onos_addr = self.get_onos_global_addr(onos)
+
+ # FIXME - hardcoded auth
+ auth = self.get_onos_global_auth(onos)
+
+ print "POST %s for app %s, data = %s" % (onos_addr, evc.name, data)
+
+ r = requests.post(onos_addr, data=json.dumps(data), auth=auth)
+ #TODO XOS might fail to connect to ONOS.
+ if (r.status_code != 200):
+ print r
+ raise Exception("Received error from EVC Installation update (%d)" % r.status_code)
+
+ def delete_record(self, evc):
+ # TODO evaluate what to in this case.
+ print "Syncing delete EVC: %s" % evc.name
+ #logger.info("Syncing delete EVC: %s" % evc.name)
diff --git a/xos/synchronizer/steps/sync_metronetworkservice.py b/xos/synchronizer/steps/sync_metronetworkservice.py
deleted file mode 100644
index 3468d2b..0000000
--- a/xos/synchronizer/steps/sync_metronetworkservice.py
+++ /dev/null
@@ -1,254 +0,0 @@
-import os, sys
-from itertools import chain
-
-from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible #if needed
-from synchronizers.new_base.ansible_helper import run_template_ssh #if needed
-from synchronizers.new_base.modelaccessor import *
-from xos.logger import Logger, logging
-from synchronizers.metronetwork.providers.providerfactory import ProviderFactory
-from synchronizers.metronetwork.invokers.invokerfactory import InvokerFactory
-
-# metronetwork will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__), "..")
-sys.path.insert(0, parentdir)
-
-logger = Logger(level=logging.INFO)
-
-
-class SyncMetroNetworkSystem(SyncStep):
- provides = [MetroNetworkSystem]
- observes = MetroNetworkSystem
- requested_interval = 0
- initialized = False
-
- def __init__(self, **args):
- SyncStep.__init__(self, **args)
-
- def fetch_pending(self, deletion=False):
-
- # The general idea:
- # We do one of two things in here:
- # 1. Full Synchronization of the DBS (XOS <-> MetroONOS)
- # 2. Look for updates between the two stores
- # The first thing is potentially a much bigger
- # operation and should not happen as often
- #
- # The Sync operation must take into account the 'deletion' flag
-
- objs = []
-
- # Get the NetworkSystem object - if it exists it will test us
- # whether we should do a full sync or not - it all has our config
- # information about the REST interface
-
- metronetworksystem = self.get_metronetwork_system()
- if not metronetworksystem:
- logger.debug("No Service configured")
- return objs
-
- # Check to make sure the Metro Network System is enabled
- metronetworksystem = self.get_metronetwork_system()
- if metronetworksystem.administrativeState == 'disabled':
- # Nothing to do
- logger.debug("MetroService configured - state is Disabled")
- return objs
-
- # The Main Loop - retrieve all the NetworkDevice objects - for each of these
- # Apply synchronization aspects
- networkdevices = NetworkDevice.objects.all()
-
- for dev in networkdevices:
-
- # Set up the provider
- provider = ProviderFactory.getprovider(dev)
-
- # First check is for the AdminState of Disabled - do nothing
- if dev.administrativeState == 'disabled':
- # Nothing to do with this device
- logger.debug("NetworkDevice %s: administrativeState set to Disabled - continuing" % dev.id)
-
- # Now to the main options - are we syncing - deletion portion
- elif dev.administrativeState == 'syncrequested' and deletion is True:
-
- logger.info("NetworkDevice %s: administrativeState set to SyncRequested" % dev.id)
-
- # Kill Links
- networklinks = provider.get_network_links_for_deletion()
- for link in networklinks:
- objs.append(link)
-
- # Kill Ports
- allports = provider.get_network_ports_for_deletion()
- for port in allports:
- objs.append(port)
-
- logger.info("NetworkDevice %s: Deletion part of Sync completed" % dev.id)
- dev.administrativeState = 'syncinprogress'
- dev.save(update_fields=['administrativeState'])
-
- # Now to the main options - are we syncing - creation portion
- elif dev.administrativeState == 'syncinprogress' and deletion is False:
-
- logger.info("NetworkDevice %s: administrativeState set to SyncRequested" % dev.id)
- # Reload objects in the reverse order of deletion
-
- # Add Ports
- networkports = provider.get_network_ports()
- for port in networkports:
- objs.append(port)
-
- # Add Links
- networklinks = provider.get_network_links()
- for link in networklinks:
- objs.append(link)
-
- logger.info("NetworkDevice %s: Creation part of Sync completed" % dev.id)
- dev.administrativeState = 'enabled'
- dev.save(update_fields=['administrativeState'])
-
- # If we are enabled - then check for events - in either direction and sync
- elif dev.administrativeState == 'enabled' and deletion is False:
- logger.debug("NetworkDevice: administrativeState set to Enabled - non deletion phase")
-
- # This should be the 'normal running state' when we are not deleting - a few things to do in here
-
- # Get the changed objects from the provider - deletions are handled separately
- eventobjs = provider.get_updated_or_created_objects()
- for eventobj in eventobjs:
- # Simply put in the queue for update - this will handle both new and changed objects
- objs.append(eventobj)
-
- # Handle changes XOS -> ONOS
- # Check for ConnectivityObjects that are in acticationequested state - creates to the backend
- p2pactivatereqs = NetworkEdgeToEdgePointConnection.objects.filter(adminstate='activationrequested')
- mp2mpactivatereqs = NetworkMultipointToMultipointConnection.objects.filter(adminstate='activationrequested')
- r2mpactivatereqs = NetworkEdgeToMultipointConnection.objects.filter(adminstate='activationrequested')
- activatereqs = list(chain(p2pactivatereqs, mp2mpactivatereqs, r2mpactivatereqs))
- for activatereq in activatereqs:
-
- # Call the XOS Interface to create the service
- logger.debug("Attempting to create EdgePointToEdgePointConnectivity: %s" % activatereq.id)
- if (provider.create_network_connectivity(activatereq)):
- # Everyting is OK, lets let the system handle the persist
- objs.append(activatereq)
- else:
- # In the case of an error we persist the state of the object directly to preserve
- # the error code - and because that is how the base synchronizer is designed
- activatereq.save()
-
- # Check for ConnectivityObjects that are in deacticationequested state - deletes to the backend
- p2pdeactivatereqs = NetworkEdgeToEdgePointConnection.objects.filter(adminstate='deactivationrequested')
- mp2mpdeactivatereqs = NetworkMultipointToMultipointConnection.objects.filter(adminstate='deactivationrequested')
- r2mpdeactivatereqs = NetworkEdgeToMultipointConnection.objects.filter(adminstate='deactivationrequested')
- deactivatereqs = list(chain(p2pdeactivatereqs, mp2mpdeactivatereqs, r2mpdeactivatereqs))
- for deactivatereq in deactivatereqs:
-
- # Call the XOS Interface to delete the service
- logger.debug("Attempting to delete EdgePointToEdgePointConnectivity: %s" % deactivatereq.id)
- if provider.delete_network_connectivity(deactivatereq):
- # Everyting is OK, lets let the system handle the persist
- objs.append(deactivatereq)
- else:
- # In the case of an error we persist the state of the object directly to preserve
- # the error code - and because that is how the base synchronizer is designed
- deactivatereq.save()
-
- # If we are enabled - and in our deletion pass then look for objects waiting for deletion
- elif dev.administrativeState == 'enabled' and deletion is True:
- logger.debug("NetworkDevice: administrativeState set to Enabled - deletion phase")
-
- # Any object that is simply deleted in the model gets removed automatically - the synchronizer
- # doesn't get involved - we just need to check for deleted objects in the domain and reflect that
- # in the model
- #
- # Get the deleted objects from the provider
- eventobjs = provider.get_deleted_objects()
- for eventobj in eventobjs:
- # Simply put in the queue for update - this will handle both new and changed objects
- objs.append(eventobj)
-
- # Handle the case where we have deleted Eline Services from our side - if the Service is in
- # enabled state then we call the provider, otherwise just queue it for deletion
- elinedeletedobjs = NetworkEdgeToEdgePointConnection.deleted_objects.all()
- for elinedeletedobj in elinedeletedobjs:
- if elinedeletedobj.adminstate == 'enabled':
- provider.delete_network_connectivity(elinedeletedobj)
- # Either way queue it for deletion
- objs.append(elinedeletedobj)
-
- # Handle the case where we have deleted Etree Services from our side - if the Service is in
- # enabled state then we call the provider, otherwise just queue it for deletion
- etreedeletedobjs = NetworkEdgeToMultipointConnection.deleted_objects.all()
- for etreedeletedobj in etreedeletedobjs:
- # TODO: Handle the case where its connected, we need to disconnect first
- if etreedeletedobj.adminstate == 'enabled':
- provider.delete_network_connectivity(etreedeletedobj)
- # Either way queue it for deletion
- objs.append(etreedeletedobj)
-
- # Handle the case where we have deleted Elan Services from our side - if the Service is in
- # enabled state then we call the provider, otherwise just queue it for deletion
- elandeletedobjs = NetworkMultipointToMultipointConnection.deleted_objects.all()
- for elandeletedobj in elandeletedobjs:
- # TODO: Handle the case where its connected, we need to disconnect first
- if elandeletedobj.adminstate == 'enabled':
- provider.delete_network_connectivity(elandeletedobj)
- # Either way queue it for deletion
- objs.append(elandeletedobj)
-
- # Handle the case where we have deleted VnodGlobal Services from our side - if there is
- # an attached Eline/Etree/Elan we set that to deleted
- vnodbloaldeletedobjs = VnodGlobalService.deleted_objects.all()
- for vnodbloaldeletedobj in vnodbloaldeletedobjs:
- # Check for dependent eline service
- if vnodbloaldeletedobj.metronetworkpointtopoint is not None:
- elineobj = vnodbloaldeletedobj.metronetworkpointtopoint
- elineobj.deleted = True
- objs.append(elineobj)
- # Check for dependent elan service
- if vnodbloaldeletedobj.metronetworkmultipoint is not None:
- elanobj = vnodbloaldeletedobj.metronetworkmultipoint
- elanobj.deleted = True
- objs.append(elanobj)
- # Check for dependent etree service
- if vnodbloaldeletedobj.metronetworkroottomultipoint is not None:
- etreeobj = vnodbloaldeletedobj.metronetworkroottomultipoint
- etreeobj.deleted = True
- objs.append(etreeobj)
-
- objs.append(vnodbloaldeletedobj)
-
- # In add cases return the objects we are interested in
- return objs
-
- def sync_record(self, o):
-
- # First we call and see if there is an invoker for this object - the idea of the invoker
- # is to wrap the save with a pre/post paradigm to handle special cases
- # It will only exist for a subset of ojbects
- invoker = InvokerFactory.getinvoker(o)
-
- # Call Pre-save on the inovker (if it exists)
- if invoker is not None:
- invoker.presave(o)
-
- # Simply save the record to the DB - both updates and adds are handled the same way
- o.save()
-
- # Call Post-save on the inovker (if it exists)
- if invoker is not None:
- invoker.postsave(o)
-
- def delete_record(self, o):
- # Overriden to customize our behaviour - the core sync step for will remove the record directly
- # We just log and return
- logger.debug("deleting Object %s" % str(o), extra=o.tologdict())
-
- def get_metronetwork_system(self):
- # We only expect to have one of these objects in the system in the curent design
- # So get the first element from the query
- metronetworksystem = MetroNetworkSystem.objects.all()
- if not metronetworksystem:
- return None
-
- return metronetworksystem[0]