RIFT OSM R1 Initial Submission
[osm/SO.git] / common / python / rift / mano / ncclient.py
diff --git a/common/python/rift/mano/ncclient.py b/common/python/rift/mano/ncclient.py
new file mode 100644 (file)
index 0000000..9b87030
--- /dev/null
@@ -0,0 +1,104 @@
+
+# 
+#   Copyright 2016 RIFT.IO Inc
+#
+#   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 time
+import asyncio
+import ncclient
+import ncclient.asyncio_manager
+
+from gi.repository import RwYang
+class ProxyConnectionError(Exception):
+    pass
+
+
+class NcClient(object):
+    '''Class representing a Netconf Session'''
+
+    OPERATION_TIMEOUT_SECS = 240
+
+    def __init__(self, host, port, username, password, loop):
+        '''Initialize a new Netconf Session instance
+
+        Arguments:
+            host - host ip
+            port - host port
+            username - credentials for accessing the host, username
+            password - credentials for accessing the host, password
+
+        Returns:
+            A newly initialized Netconf session instance
+        '''
+        self.host = host
+        self.port = port
+        self.username = username
+        self.password = password
+        self.loop = loop
+        self._nc_mgr = None
+
+        self._model = RwYang.Model.create_libncx()
+
+    @asyncio.coroutine
+    def connect(self, timeout=240):
+        '''Connect Netconf Session
+
+        Arguments:
+            timeout - maximum time allowed before connect fails [default 30s]
+        '''
+        # logger.info("Connecting to confd (%s) SSH port (%s)", self.host, self.port)
+        if self._nc_mgr:
+            return
+
+        start_time = time.time()
+        while (time.time() - start_time) < timeout:
+            try:
+                self._nc_mgr = yield from ncclient.asyncio_manager.asyncio_connect(
+                    loop=self.loop,
+                    host=self.host,
+                    port=self.port,
+                    username=self.username,
+                    password=self.password,
+                    # Setting allow_agent and look_for_keys to false will skip public key
+                    # authentication, and use password authentication.
+                    allow_agent=False,
+                    look_for_keys=False,
+                    hostkey_verify=False)
+
+                # logger.info("Successfully connected to confd (%s) SSH port (%s)", self.host, self.port)
+                self._nc_mgr.timeout = NcClient.OPERATION_TIMEOUT_SECS
+                return
+
+            except ncclient.NCClientError as e:
+                # logger.debug("Could not connect to (%s) confd ssh port (%s): %s",
+                #         self.host, self.port, str(e))
+                pass
+
+            yield from asyncio.sleep(5, loop=self.loop)
+
+        raise ProxyConnectionError("Could not connect to Confd ({}) ssh port ({}): within the timeout {} sec.".format(
+                self.host, self.port, timeout))
+
+    def convert_to_xml(self, module, yang_obj):
+        schema =  getattr(module, "get_schema")
+        self._model.load_schema_ypbc(schema())
+
+        get_xml = getattr(yang_obj, "to_xml_v2")
+
+        return get_xml(self._model)
+
+    @property
+    def manager(self):
+        return self._nc_mgr