RIFT OSM R1 Initial Submission
[osm/SO.git] / rwlaunchpad / plugins / rwresmgr / rift / tasklets / rwresmgrtasklet / rwresmgrtasklet.py
diff --git a/rwlaunchpad/plugins/rwresmgr/rift/tasklets/rwresmgrtasklet/rwresmgrtasklet.py b/rwlaunchpad/plugins/rwresmgr/rift/tasklets/rwresmgrtasklet/rwresmgrtasklet.py
new file mode 100755 (executable)
index 0000000..cdcadc7
--- /dev/null
@@ -0,0 +1,232 @@
+
+# 
+#   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 asyncio
+import logging
+import sys
+
+import gi
+gi.require_version('RwDts', '1.0')
+gi.require_version('RwYang', '1.0')
+gi.require_version('RwResourceMgrYang', '1.0')
+gi.require_version('RwLaunchpadYang', '1.0')
+gi.require_version('RwcalYang', '1.0')
+from gi.repository import (
+    RwDts as rwdts,
+    RwYang,
+    RwResourceMgrYang,
+    RwLaunchpadYang,
+    RwcalYang,
+)
+
+import rift.tasklets
+
+from . import rwresmgr_core as Core
+from . import rwresmgr_config as Config
+from . import rwresmgr_events as Event
+
+
+class ResourceManager(object):
+    def __init__(self, log, log_hdl, loop, dts):
+        self._log            = log
+        self._log_hdl        = log_hdl
+        self._loop           = loop
+        self._dts            = dts
+        self.config_handler  = Config.ResourceMgrConfig(self._dts, self._log, self._log_hdl, self._loop, self)
+        self.event_handler   = Event.ResourceMgrEvent(self._dts, self._log, self._loop, self)
+        self.core            = Core.ResourceMgrCore(self._dts, self._log, self._log_hdl, self._loop, self)
+
+    @asyncio.coroutine
+    def register(self):
+        yield from self.config_handler.register()
+        yield from self.event_handler.register()
+
+    def add_cloud_account_config(self, account):
+        self._log.debug("Received Cloud-Account add config event for account: %s", account.name)
+        self.core.add_cloud_account(account)
+
+    def update_cloud_account_config(self, account):
+        self._log.debug("Received Cloud-Account update config event for account: %s", account.name)
+        self.core.update_cloud_account(account)
+
+    def delete_cloud_account_config(self, account_name, dry_run=False):
+        self._log.debug("Received Cloud-Account delete event for account (dry_run: %s): %s",
+                        dry_run, account_name)
+        self.core.delete_cloud_account(account_name, dry_run)
+
+    def get_cloud_account_names(self):
+        cloud_account_names = self.core.get_cloud_account_names()
+        return cloud_account_names
+
+    def pool_add(self, cloud_account_name, pool):
+        self._log.debug("Received Pool add event for cloud account %s pool: %s",
+                        cloud_account_name, pool.name)
+        self.core.add_resource_pool(cloud_account_name, pool)
+
+    def pool_modify(self, cloud_account_name, pool):
+        self._log.debug("Received Pool modify event for cloud account %s pool: %s",
+                        cloud_account_name, pool.name)
+        self.core.modify_resource_pool(cloud_account_name, pool)
+
+    def pool_delete(self, cloud_account_name, pool_name):
+        self._log.debug("Received Pool delete event for cloud account %s pool: %s",
+                        cloud_account_name, pool_name)
+        self.core.delete_resource_pool(cloud_account_name, pool_name)
+
+    def get_pool_list(self, cloud_account_name):
+        return self.core.get_resource_pool_list(cloud_account_name)
+
+    def get_pool_info(self, cloud_account_name, pool_name):
+        self._log.debug("Received get-pool-info event for cloud account %s pool: %s",
+                        cloud_account_name, pool_name)
+        return self.core.get_resource_pool_info(cloud_account_name, pool_name)
+
+    def lock_pool(self, cloud_account_name, pool_name):
+        self._log.debug("Received pool unlock event for pool: %s",
+                        cloud_account_name, pool_name)
+        self.core.lock_resource_pool(cloud_account_name, pool_name)
+
+    def unlock_pool(self, cloud_account_name, pool_name):
+        self._log.debug("Received pool unlock event for pool: %s",
+                        cloud_account_name, pool_name)
+        self.core.unlock_resource_pool(cloud_account_name, pool_name)
+
+    @asyncio.coroutine
+    def allocate_virtual_network(self, event_id, cloud_account_name, request):
+        self._log.info("Received network resource allocation request with event-id: %s", event_id)
+        resource = yield from self.core.allocate_virtual_resource(event_id, cloud_account_name, request, 'network')
+        return resource
+
+    @asyncio.coroutine
+    def reallocate_virtual_network(self, event_id, cloud_account_name, request, resource):
+        self._log.info("Received network resource allocation request with event-id: %s", event_id)
+        resource = yield from self.core.reallocate_virtual_resource(event_id, cloud_account_name, request, 'network', resource)
+        return resource
+
+    @asyncio.coroutine
+    def release_virtual_network(self, event_id):
+        self._log.info("Received network resource release request with event-id: %s", event_id)
+        yield from self.core.release_virtual_resource(event_id, 'network')
+
+    @asyncio.coroutine
+    def read_virtual_network_info(self, event_id):
+        self._log.info("Received network resource read request with event-id: %s", event_id)
+        info = yield from self.core.read_virtual_resource(event_id, 'network')
+        return info
+
+    @asyncio.coroutine
+    def allocate_virtual_compute(self, event_id, cloud_account_name, request):
+        self._log.info("Received compute resource allocation request "
+                       "(cloud account: %s) with event-id: %s",
+                       cloud_account_name, event_id)
+        resource = yield from self.core.allocate_virtual_resource(
+                event_id, cloud_account_name, request, 'compute',
+                )
+        return resource
+
+    @asyncio.coroutine
+    def reallocate_virtual_compute(self, event_id, cloud_account_name, request, resource):
+        self._log.info("Received compute resource allocation request "
+                       "(cloud account: %s) with event-id: %s",
+                       cloud_account_name, event_id)
+        resource = yield from self.core.reallocate_virtual_resource(
+                event_id, cloud_account_name, request, 'compute', resource, 
+                )
+        return resource
+
+    @asyncio.coroutine
+    def release_virtual_compute(self, event_id):
+        self._log.info("Received compute resource release request with event-id: %s", event_id)
+        yield from self.core.release_virtual_resource(event_id, 'compute')
+
+    @asyncio.coroutine
+    def read_virtual_compute_info(self, event_id):
+        self._log.info("Received compute resource read request with event-id: %s", event_id)
+        info = yield from self.core.read_virtual_resource(event_id, 'compute')
+        return info
+
+
+class ResMgrTasklet(rift.tasklets.Tasklet):
+    def __init__(self, *args, **kwargs):
+        super(ResMgrTasklet, self).__init__(*args, **kwargs)
+        self.rwlog.set_category("rw-resource-mgr-log")
+        self._dts = None
+        self._resource_manager = None
+
+    def start(self):
+        super(ResMgrTasklet, self).start()
+        self.log.info("Starting ResMgrTasklet")
+
+        self.log.debug("Registering with dts")
+
+        self._dts = rift.tasklets.DTS(self.tasklet_info,
+                                      RwResourceMgrYang.get_schema(),
+                                      self.loop,
+                                      self.on_dts_state_change)
+
+        self.log.debug("Created DTS Api GI Object: %s", self._dts)
+
+    def stop(self):
+      try:
+         self._dts.deinit()
+      except Exception:
+         print("Caught Exception in RESMGR stop:", sys.exc_info()[0])
+         raise
+
+    def on_instance_started(self):
+        self.log.debug("Got instance started callback")
+
+    @asyncio.coroutine
+    def init(self):
+        self._log.info("Initializing the Resource Manager tasklet")
+        self._resource_manager = ResourceManager(self.log,
+                                                 self.log_hdl,
+                                                 self.loop,
+                                                 self._dts)
+        yield from self._resource_manager.register()
+
+    @asyncio.coroutine
+    def run(self):
+        pass
+
+    @asyncio.coroutine
+    def on_dts_state_change(self, state):
+        """Take action according to current dts state to transition
+        application into the corresponding application state
+
+        Arguments
+            state - current dts state
+        """
+        switch = {
+            rwdts.State.INIT: rwdts.State.REGN_COMPLETE,
+            rwdts.State.CONFIG: rwdts.State.RUN,
+        }
+
+        handlers = {
+            rwdts.State.INIT: self.init,
+            rwdts.State.RUN: self.run,
+        }
+
+        # Transition application to next state
+        handler = handlers.get(state, None)
+        if handler is not None:
+            yield from handler()
+
+        # Transition dts to next state
+        next_state = switch.get(state, None)
+        if next_state is not None:
+            self._dts.handle.set_state(next_state)