[CORD-2962] Refactoring vrouter and adding support for static routes

Change-Id: Ie2719ca94296559caee4a1e433631cbd43019bf9
diff --git a/xos/synchronizer/steps/sync_routes.py b/xos/synchronizer/steps/sync_routes.py
new file mode 100644
index 0000000..5086933
--- /dev/null
+++ b/xos/synchronizer/steps/sync_routes.py
@@ -0,0 +1,83 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import requests
+from requests.auth import HTTPBasicAuth
+from synchronizers.new_base.syncstep import SyncStep, DeferredException
+from synchronizers.new_base.modelaccessor import VRouterStaticRoute
+
+from helpers import Helpers
+from multistructlog import create_logger
+from xosconfig import Config
+
+log = create_logger(Config().get('logging'))
+
+class SyncRoutes(SyncStep):
+    provides = [VRouterStaticRoute]
+    observes = VRouterStaticRoute
+
+    # Get fabric service info
+    def get_onos_fabric_service(self, model):
+        vrouter_service = model.vrouter.owner
+        fabric_service = vrouter_service.subscriber_services[0]
+        onos_fabric_service = fabric_service.subscriber_services[0]
+
+        return onos_fabric_service
+
+    def sync_record(self, model):
+        onos_fabric_service = self.get_onos_fabric_service(model)
+
+        onos = Helpers.get_onos_info(onos_fabric_service.leaf_model)
+        onos_basic_auth = HTTPBasicAuth(onos['user'], onos['pass'])
+
+        data = {
+          "prefix": model.prefix,
+          "nextHop": model.next_hop
+        }
+
+        url = '%s:%s/onos/routeservice/routes' % (onos['url'], onos['port'])
+        request = requests.post(url, json=data, auth=onos_basic_auth)
+
+        if request.status_code != 204:
+            log.error("Request failed", response=request.text)
+            raise Exception("Failed to add static route %s via %s in ONOS" % (model.prefix, model.next_hop))
+        else:
+            try:
+                print request.json()
+            except Exception:
+                print request.text
+
+    def delete_record(self, model):
+        onos_fabric_service = self.get_onos_fabric_service(model)
+
+        onos = Helpers.get_onos_info(onos_fabric_service.leaf_model)
+        onos_basic_auth = HTTPBasicAuth(onos['user'], onos['pass'])
+
+        data = {
+          "prefix": model.prefix,
+          "nextHop": model.next_hop
+        }
+
+        url = '%s:%s/onos/routeservice/routes' % (onos['url'], onos['port'])
+        request = requests.delete(url, json=data, auth=onos_basic_auth)
+
+        if request.status_code != 204:
+            log.error("Request failed", response=request.text)
+            raise Exception("Failed to delete static route %s via %s in ONOS" % (model.prefix, model.next_hop))
+        else:
+            try:
+                print request.json()
+            except Exception:
+                print request.text