RIFT OSM R1 Initial Submission
[osm/SO.git] / rwlaunchpad / plugins / rwresmgr / test / rmmgr_test.py
diff --git a/rwlaunchpad/plugins/rwresmgr/test/rmmgr_test.py b/rwlaunchpad/plugins/rwresmgr/test/rmmgr_test.py
new file mode 100755 (executable)
index 0000000..87d11a2
--- /dev/null
@@ -0,0 +1,781 @@
+#!/usr/bin/env python3
+
+# 
+#   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 os
+import sys
+import types
+import unittest
+import uuid
+import random
+
+import xmlrunner
+
+import gi
+gi.require_version('CF', '1.0')
+gi.require_version('RwDts', '1.0')
+gi.require_version('RwMain', '1.0')
+gi.require_version('RwManifestYang', '1.0')
+gi.require_version('RwResourceMgrYang', '1.0')
+gi.require_version('RwcalYang', '1.0')
+gi.require_version('RwTypes', '1.0')
+gi.require_version('RwCal', '1.0')
+
+
+import gi.repository.CF as cf
+import gi.repository.RwDts as rwdts
+import gi.repository.RwMain as rwmain
+import gi.repository.RwManifestYang as rwmanifest
+import gi.repository.RwResourceMgrYang as rmgryang
+from gi.repository import RwcalYang
+from gi.repository import RwCloudYang
+from gi.repository.RwTypes import RwStatus
+
+import rw_peas
+import rift.tasklets
+import rift.test.dts
+
+if sys.version_info < (3, 4, 4):
+    asyncio.ensure_future = asyncio.async
+
+
+openstack_info = {
+    'username'      : 'pluto',
+    'password'      : 'mypasswd',
+    'auth_url'      : 'http://10.66.4.14:5000/v3/',
+    'project_name'  : 'demo',
+    'mgmt_network'  : 'private',
+    'image_id'      : '5cece2b1-1a49-42c5-8029-833c56574652',
+    'vms'           : ['res-test-1', 'res-test-2'],
+    'networks'      : ['testnet1', 'testnet2']}
+
+
+def create_mock_resource_temaplate():
+    ### Resource to be reuqested for 'mock'
+    resource_requests = {'compute': {}, 'network': {}}
+
+    ###### mycompute-0
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = str(uuid.uuid3(uuid.NAMESPACE_DNS, 'image-0'))
+    msg.vm_flavor.vcpu_count = 4
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 40
+    resource_requests['compute']['mycompute-0'] = msg
+
+    ###### mycompute-1
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = str(uuid.uuid3(uuid.NAMESPACE_DNS, 'image-1'))
+    msg.vm_flavor.vcpu_count = 2
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 20
+    resource_requests['compute']['mycompute-1'] = msg
+
+    ####### mynet-0
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-0'] = msg
+
+    ####### mynet-1
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-1'] = msg
+
+    return resource_requests
+
+
+def create_cloudsim_resource_template():
+    ### Resource to be reuqested for 'cloudsim'
+    resource_requests = {'compute': {}, 'network': {}}
+
+    ###### mycompute-0
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = "1"
+    msg.vm_flavor.vcpu_count = 4
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 40
+    resource_requests['compute']['mycompute-0'] = msg
+
+    ###### mycompute-1
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = "1"
+    msg.vm_flavor.vcpu_count = 2
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 20
+    resource_requests['compute']['mycompute-1'] = msg
+
+    ####### mynet-0
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-0'] = msg
+
+    ####### mynet-1
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-1'] = msg
+
+    return resource_requests
+
+def create_mock_resource_temaplate():
+    ### Resource to be reuqested for 'mock'
+    resource_requests = {'compute': {}, 'network': {}}
+
+    ###### mycompute-0
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = str(uuid.uuid3(uuid.NAMESPACE_DNS, 'image-0'))
+    msg.vm_flavor.vcpu_count = 4
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 40
+    resource_requests['compute']['mycompute-0'] = msg
+
+    ###### mycompute-1
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = str(uuid.uuid3(uuid.NAMESPACE_DNS, 'image-1'))
+    msg.vm_flavor.vcpu_count = 2
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 20
+    resource_requests['compute']['mycompute-1'] = msg
+
+    ####### mynet-0
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-0'] = msg
+
+    ####### mynet-1
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    resource_requests['network']['mynet-1'] = msg
+
+    return resource_requests
+
+
+def create_openstack_static_template():
+    ### Resource to be reuqested for 'openstack_static'
+    resource_requests = {'compute': {}, 'network': {}}
+
+    ###### mycompute-0
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = openstack_info['image_id']
+    msg.vm_flavor.vcpu_count = 4
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 80
+    resource_requests['compute']['mycompute-0'] = msg
+
+    ###### mycompute-1
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = openstack_info['image_id']
+    msg.vm_flavor.vcpu_count = 2
+    msg.vm_flavor.memory_mb = 4096
+    msg.vm_flavor.storage_gb = 40
+    resource_requests['compute']['mycompute-1'] = msg
+
+    ####### mynet-0
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    msg.provider_network.physical_network = 'PHYSNET1'
+    msg.provider_network.overlay_type = 'VLAN'
+    msg.provider_network.segmentation_id = 17
+    resource_requests['network']['mynet-0'] = msg
+
+    ####### mynet-1
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    msg.provider_network.physical_network = 'PHYSNET1'
+    msg.provider_network.overlay_type = 'VLAN'
+    msg.provider_network.segmentation_id = 18
+    resource_requests['network']['mynet-1'] = msg
+
+    return resource_requests
+
+
+def create_openstack_dynamic_template():
+    ### Resource to be reuqested for 'openstack_dynamic'
+    resource_requests = {'compute': {}, 'network': {}}
+
+    ###### mycompute-0
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = openstack_info['image_id']
+    msg.vm_flavor.vcpu_count = 2
+    msg.vm_flavor.memory_mb = 4096
+    msg.vm_flavor.storage_gb = 40
+    msg.guest_epa.mempage_size = 'LARGE'
+    msg.guest_epa.cpu_pinning_policy = 'DEDICATED'
+    msg.allocate_public_address = True
+
+    resource_requests['compute']['mycompute-0'] = msg
+
+    ###### mycompute-1
+    msg = rmgryang.VDUEventData_RequestInfo()
+    msg.image_id  = openstack_info['image_id']
+    msg.vm_flavor.vcpu_count = 4
+    msg.vm_flavor.memory_mb = 8192
+    msg.vm_flavor.storage_gb = 40
+    msg.guest_epa.mempage_size = 'LARGE'
+    msg.guest_epa.cpu_pinning_policy = 'DEDICATED'
+    msg.allocate_public_address = True
+
+    resource_requests['compute']['mycompute-1'] = msg
+
+    ####### mynet-0
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    #msg.provider_network.overlay_type = 'VXLAN'
+    #msg.provider_network.segmentation_id = 71
+
+    resource_requests['network']['mynet-0'] = msg
+
+    ####### mynet-1
+    msg = rmgryang.VirtualLinkEventData_RequestInfo()
+    #msg.provider_network.overlay_type = 'VXLAN'
+    #msg.provider_network.segmentation_id = 73
+    resource_requests['network']['mynet-1'] = msg
+
+    return resource_requests
+
+
+
+
+resource_requests = {
+    'mock' : create_mock_resource_temaplate(),
+    'openstack_static': create_openstack_static_template(),
+    'openstack_dynamic': create_openstack_dynamic_template(),
+    'cloudsim': create_cloudsim_resource_template(),
+}
+
+
+def get_cal_account(account_type):
+    """
+    Creates an object for class RwcalYang.CloudAccount()
+    """
+    account = RwcalYang.CloudAccount()
+    if account_type == 'mock':
+        account.name          = 'mock_account'
+        account.account_type  = "mock"
+        account.mock.username = "mock_user"
+    elif ((account_type == 'openstack_static') or (account_type == 'openstack_dynamic')):
+        account.name = 'openstack_cal'
+        account.account_type = 'openstack'
+        account.openstack.key = openstack_info['username']
+        account.openstack.secret       = openstack_info['password']
+        account.openstack.auth_url     = openstack_info['auth_url']
+        account.openstack.tenant       = openstack_info['project_name']
+        account.openstack.mgmt_network = openstack_info['mgmt_network']
+
+    elif account_type == 'cloudsim':
+        account.name          = 'cloudsim'
+        account.account_type  = "cloudsim_proxy"
+
+    return account
+
+def create_cal_plugin(account, log_hdl):
+    plugin_name = getattr(account, account.account_type).plugin_name
+    plugin = rw_peas.PeasPlugin(plugin_name, 'RwCal-1.0')
+    engine, info, extension = plugin()
+    rwcal = plugin.get_interface("Cloud")
+    try:
+        rc = rwcal.init(log_hdl)
+        assert rc == RwStatus.SUCCESS
+    except Exception as e:
+        raise
+    return rwcal
+
+
+class RMMgrTestCase(rift.test.dts.AbstractDTSTest):
+    rwcal = None
+    rwcal_acct_info = None
+
+    @classmethod
+    def configure_suite(cls, rwmain):
+        rm_dir = os.environ.get('RM_DIR')
+        cnt_mgr_dir = os.environ.get('CNTR_MGR_DIR')
+        cal_proxy_dir = os.environ.get('CAL_PROXY_DIR')
+
+        cls.rwmain.add_tasklet(cal_proxy_dir, 'rwcalproxytasklet')
+        cls.rwmain.add_tasklet(rm_dir, 'rwresmgrtasklet')
+        cls.rwmain.add_tasklet(cnt_mgr_dir, 'rwcntmgrtasklet')
+
+    @classmethod
+    def configure_schema(cls):
+        return rmgryang.get_schema()
+
+    @asyncio.coroutine
+    def wait_tasklets(self):
+        yield from asyncio.sleep(1, loop=self.loop)
+
+    @classmethod
+    def configure_timeout(cls):
+        return 360
+
+    def get_cloud_account_msg(self, acct_type):
+        cloud_account = RwCloudYang.CloudAccount()
+        acct = get_cal_account(acct_type)
+        cloud_account.from_dict(acct.as_dict())
+        cloud_account.name = acct.name
+        return cloud_account
+
+    def get_compute_pool_msg(self, name, pool_type, cloud_type):
+        pool_config = rmgryang.ResourcePools()
+        pool = pool_config.pools.add()
+        pool.name = name
+        pool.resource_type = "compute"
+        if pool_type == "static":
+            pool.pool_type = 'static'
+            acct = get_cal_account(cloud_type)
+            rwcal = create_cal_plugin(acct, self.tinfo.get_rwlog_ctx())
+            rc, rsp = rwcal.get_vdu_list(acct)
+            assert rc == RwStatus.SUCCESS
+
+            if cloud_type == 'openstack_static':
+                for vdu in rsp.vdu_info_list:
+                    if vdu.name in openstack_info['vms']:
+                        self.log.info("Adding the static compute resource: %s to compute pool", vdu.name)
+                        r = pool.resources.add()
+                        r.resource_id = vdu.vdu_id
+            else:
+                # 'mock', 'cloudsim' 'openstack_dynamic' etc
+                for vdu in rsp.vdu_info_list:
+                    self.log.info("Adding the static compute resource: %s to compute pool", vdu.name)
+                    r = pool.resources.add()
+                    r.resource_id = vdu.vdu_id
+        else:
+            pool.pool_type = 'dynamic'
+            pool.max_size = 10
+        return pool_config
+
+    def get_network_pool_msg(self, name, pool_type, cloud_type):
+        pool_config = rmgryang.ResourcePools()
+        pool = pool_config.pools.add()
+        pool.name = name
+        pool.resource_type = "network"
+        if pool_type == "static":
+            pool.pool_type = 'static'
+            acct = get_cal_account(cloud_type)
+            rwcal = create_cal_plugin(acct, self.tinfo.get_rwlog_ctx())
+            rc, rsp = rwcal.get_virtual_link_list(acct)
+            assert rc == RwStatus.SUCCESS
+            if cloud_type == 'openstack_static':
+                for vlink in rsp.virtual_link_info_list:
+                    if vlink.name in openstack_info['networks']:
+                        self.log.info("Adding the static network resource: %s to network pool", vlink.name)
+                        r = pool.resources.add()
+                        r.resource_id = vlink.virtual_link_id
+            else:
+                # 'mock', 'cloudsim', 'openstack_dynamic' etc
+                for vlink in rsp.virtual_link_info_list:
+                    self.log.info("Adding the static network resource: %s to network pool", vlink.name)
+                    r = pool.resources.add()
+                    r.resource_id = vlink.virtual_link_id
+        else:
+            pool.pool_type = 'dynamic'
+            pool.max_size = 4
+        return pool_config
+
+
+    def get_network_reserve_msg(self, name, cloud_type, xpath):
+        event_id = str(uuid.uuid4())
+        msg = rmgryang.VirtualLinkEventData()
+        msg.event_id = event_id
+        msg.request_info.name = name
+        attributes = ['physical_network', 'name', 'overlay_type', 'segmentation_id']
+
+        for attr in attributes:
+            if resource_requests[cloud_type]['network'][name].has_field('provider_network'):
+                if resource_requests[cloud_type]['network'][name].provider_network.has_field(attr):
+                    setattr(msg.request_info.provider_network, attr,
+                            getattr(resource_requests[cloud_type]['network'][name].provider_network ,attr))
+
+        return msg, xpath.format(event_id)
+
+    def get_compute_reserve_msg(self, name, cloud_type, xpath, vlinks):
+        event_id = str(uuid.uuid4())
+        msg = rmgryang.VDUEventData()
+        msg.event_id = event_id
+        msg.request_info.name = name
+        msg.request_info.image_id = resource_requests[cloud_type]['compute'][name].image_id
+        attributes = ['image_id', 'vcpu_count', 'memory_mb', 'storage_gb']
+
+        if resource_requests[cloud_type]['compute'][name].has_field('vm_flavor'):
+            for attr in attributes:
+                if resource_requests[cloud_type]['compute'][name].vm_flavor.has_field(attr):
+                    setattr(msg.request_info.vm_flavor,
+                            attr,
+                            getattr(resource_requests[cloud_type]['compute'][name].vm_flavor , attr))
+
+        attributes = ['mempage_size', 'cpu_pinning_policy']
+
+        if resource_requests[cloud_type]['compute'][name].has_field('guest_epa'):
+            for attr in attributes:
+                if resource_requests[cloud_type]['compute'][name].guest_epa.has_field(attr):
+                    setattr(msg.request_info.guest_epa,
+                            attr,
+                            getattr(resource_requests[cloud_type]['compute'][name].guest_epa , attr))
+
+        if resource_requests[cloud_type]['compute'][name].has_field('allocate_public_address'):
+            msg.request_info.allocate_public_address = resource_requests[cloud_type]['compute'][name].allocate_public_address
+
+        cnt = 0
+        for link in vlinks:
+            c1 = msg.request_info.connection_points.add()
+            c1.name = name+"-port-"+str(cnt)
+            cnt += 1
+            c1.virtual_link_id = link
+
+        self.log.info("Sending message :%s", msg)
+        return msg, xpath.format(event_id)
+
+    @asyncio.coroutine
+    def configure_cloud_account(self, dts, acct_type):
+        account_xpath = "C,/rw-cloud:cloud/account"
+        msg = self.get_cloud_account_msg(acct_type)
+        self.log.info("Configuring cloud-account: %s",msg)
+        yield from dts.query_create(account_xpath,
+                                    rwdts.XactFlag.ADVISE,
+                                    msg)
+
+    @asyncio.coroutine
+    def configure_compute_resource_pools(self, dts, resource_type, cloud_type):
+        pool_xpath = "C,/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools"
+        msg = self.get_compute_pool_msg("virtual-compute", resource_type, cloud_type)
+        self.log.info("Configuring compute-resource-pool: %s",msg)
+        yield from dts.query_create(pool_xpath,
+                                    rwdts.XactFlag.ADVISE,
+                                    msg)
+
+
+    @asyncio.coroutine
+    def configure_network_resource_pools(self, dts, resource_type, cloud_type):
+        pool_xpath = "C,/rw-resource-mgr:resource-mgr-config/rw-resource-mgr:resource-pools"
+        msg = self.get_network_pool_msg("virtual-network", resource_type, cloud_type)
+        self.log.info("Configuring network-resource-pool: %s",msg)
+        yield from dts.query_create(pool_xpath,
+                                    rwdts.XactFlag.ADVISE,
+                                    msg)
+
+    @asyncio.coroutine
+    def verify_resource_pools_config(self, dts):
+        pool_records_xpath = "D,/rw-resource-mgr:resource-pool-records"
+        self.log.debug("Verifying test_create_resource_pools results")
+        res_iter = yield from dts.query_read(pool_records_xpath,)
+        for result in res_iter:
+            response = yield from result
+            records = response.result.records
+            #self.assertEqual(len(records), 2)
+            #names = [i.name for i in records]
+            #self.assertTrue('virtual-compute' in names)
+            #self.assertTrue('virtual-network' in names)
+            for record in records:
+                self.log.debug("Received Pool Record, Name: %s, Resource Type: %s, Pool Status: %s, Pool Size: %d, Allocated Resources: %d, Free Resources: %d",
+                               record.name,
+                               record.resource_type,
+                               record.pool_status,
+                               record.total_resources,
+                               record.allocated_resources,
+                               record.free_resources)
+
+    @asyncio.coroutine
+    def read_resource(self, dts, xpath):
+        self.log.debug("Reading data for XPATH:%s", xpath)
+        result = yield from dts.query_read(xpath, rwdts.XactFlag.MERGE)
+        msg = None
+        for r in result:
+            msg = yield from r
+        self.log.debug("Received data: %s", msg.result)
+        return msg.result
+
+    @asyncio.coroutine
+    def reserve_network_resources(self, name, dts, cloud_type):
+        network_xpath = "D,/rw-resource-mgr:resource-mgmt/vlink-event/vlink-event-data[event-id='{}']"
+        msg,xpath = self.get_network_reserve_msg(name, cloud_type, network_xpath)
+        self.log.debug("Sending create event to network-event xpath %s with msg: %s" % (xpath, msg))
+        yield from dts.query_create(xpath, 0, msg)
+        return xpath
+
+
+    @asyncio.coroutine
+    def reserve_compute_resources(self, name, dts, cloud_type, vlinks = []):
+        compute_xpath = "D,/rw-resource-mgr:resource-mgmt/vdu-event/vdu-event-data[event-id='{}']"
+        msg,xpath = self.get_compute_reserve_msg(name, cloud_type, compute_xpath, vlinks)
+        self.log.debug("Sending create event to compute-event xpath %s with msg: %s" % (xpath, msg))
+        yield from dts.query_create(xpath, 0, msg)
+        return xpath
+
+    @asyncio.coroutine
+    def release_network_resources(self, dts, xpath):
+        self.log.debug("Initiating network resource release for  : %s ", xpath)
+        yield from dts.query_delete(xpath, 0)
+
+    @asyncio.coroutine
+    def release_compute_resources(self, dts, xpath):
+        self.log.debug("Initiating compute resource release for  : %s ", xpath)
+        yield from dts.query_delete(xpath, 0)
+
+    @unittest.skip("Skipping test_static_pool_resource_allocation")
+    def test_static_pool_resource_allocation(self):
+        self.log.debug("STARTING - test_static_pool_resource_allocation")
+        tinfo = self.new_tinfo('static_mock')
+        dts = rift.tasklets.DTS(tinfo, self.schema, self.loop)
+
+        @asyncio.coroutine
+        def run_test():
+            networks = []
+            computes = []
+            cloud_type = 'mock'
+            yield from self.wait_tasklets()
+            yield from self.configure_cloud_account(dts, cloud_type)
+
+            yield from self.configure_network_resource_pools(dts, "static", cloud_type)
+            yield from self.configure_compute_resource_pools(dts, "static", cloud_type)
+            yield from self.verify_resource_pools_config(dts)
+
+            r_xpath = yield from self.reserve_network_resources('mynet-0', dts, cloud_type)
+            r_info = yield from self.read_resource(dts,r_xpath)
+            networks.append((r_xpath, r_info.resource_info))
+
+            for i in range(2):
+                r_xpath = yield from self.reserve_compute_resources("mycompute-"+str(i),
+                                                                    dts,
+                                                                    cloud_type,
+                                                                    [networks[0][1].virtual_link_id])
+                r_info = yield from self.read_resource(dts,r_xpath)
+                computes.append((r_xpath, r_info))
+
+            yield from self.verify_resource_pools_config(dts)
+
+            for r in computes:
+                yield from self.release_compute_resources(dts, r[0])
+
+            yield from self.release_network_resources(dts,networks[0][0])
+            yield from self.verify_resource_pools_config(dts)
+
+        future = asyncio.ensure_future(run_test(), loop=self.loop)
+        self.run_until(future.done)
+        if future.exception() is not None:
+            self.log.error("Caught exception during test")
+            raise future.exception()
+
+        self.log.debug("DONE - test_static_pool_resource_allocation")
+
+    @unittest.skip("Skipping test_dynamic_pool_resource_allocation")
+    def test_dynamic_pool_resource_allocation(self):
+        self.log.debug("STARTING - test_dynamic_pool_resource_allocation")
+        tinfo = self.new_tinfo('dynamic_mock')
+        dts = rift.tasklets.DTS(tinfo, self.schema, self.loop)
+
+        @asyncio.coroutine
+        def run_test():
+            networks = []
+            computes = []
+            cloud_type = 'mock'
+            yield from self.wait_tasklets()
+            yield from self.configure_cloud_account(dts, cloud_type)
+            yield from self.configure_network_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.configure_compute_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.verify_resource_pools_config(dts)
+
+            r_xpath = yield from self.reserve_network_resources('mynet-0', dts, cloud_type)
+            r_info = yield from self.read_resource(dts,r_xpath)
+            networks.append((r_xpath, r_info.resource_info))
+
+            for i in range(2):
+                r_xpath = yield from self.reserve_compute_resources("mycompute-"+str(i),
+                                                                    dts,
+                                                                    cloud_type,
+                                                                    [networks[0][1].virtual_link_id])
+                r_info = yield from self.read_resource(dts,r_xpath)
+                computes.append((r_xpath, r_info))
+
+            yield from self.verify_resource_pools_config(dts)
+
+            for r in computes:
+                self.log.debug("Releasing compute resource with id: %s", r[1].resource_info.vdu_id)
+                yield from self.release_compute_resources(dts, r[0])
+
+            yield from self.release_network_resources(dts,networks[0][0])
+            yield from self.verify_resource_pools_config(dts)
+
+        future = asyncio.ensure_future(run_test(), loop=self.loop)
+        self.run_until(future.done)
+        if future.exception() is not None:
+            self.log.error("Caught exception during test")
+            raise future.exception()
+
+        self.log.debug("DONE - test_dynamic_pool_resource_allocation")
+
+    @unittest.skip("Skipping test_dynamic_pool_resource_allocation")
+    def test_dynamic_cloudsim_pool_resource_allocation(self):
+        self.log.debug("STARTING - test_dynamic_pool_resource_allocation")
+        tinfo = self.new_tinfo('dynamic_mock')
+        dts = rift.tasklets.DTS(tinfo, self.schema, self.loop)
+
+        @asyncio.coroutine
+        def run_test():
+            networks = []
+            computes = []
+            cloud_type = 'cloudsim'
+
+            yield from asyncio.sleep(120, loop=self.loop)
+            yield from self.configure_cloud_account(dts, cloud_type)
+            yield from self.configure_network_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.configure_compute_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.verify_resource_pools_config(dts)
+
+            r_xpath = yield from self.reserve_network_resources('mynet-0', dts, cloud_type)
+            r_info = yield from self.read_resource(dts,r_xpath)
+            networks.append((r_xpath, r_info.resource_info))
+
+            for i in range(2):
+                r_xpath = yield from self.reserve_compute_resources("mycompute-"+str(i),
+                                                                    dts,
+                                                                    cloud_type,
+                                                                    [networks[0][1].virtual_link_id])
+                r_info = yield from self.read_resource(dts,r_xpath)
+                computes.append((r_xpath, r_info))
+
+            yield from self.verify_resource_pools_config(dts)
+
+            for r in computes:
+                self.log.debug("Releasing compute resource with id: %s", r[1].resource_info.vdu_id)
+                yield from self.release_compute_resources(dts, r[0])
+
+            yield from self.release_network_resources(dts,networks[0][0])
+            yield from self.verify_resource_pools_config(dts)
+
+        future = asyncio.ensure_future(run_test(), loop=self.loop)
+        self.run_until(future.done)
+        if future.exception() is not None:
+            self.log.error("Caught exception during test")
+            raise future.exception()
+
+        self.log.debug("DONE - test_dynamic_pool_resource_allocation")
+
+    @unittest.skip("Skipping test_static_pool_openstack_resource_allocation")
+    def test_static_pool_openstack_resource_allocation(self):
+        self.log.debug("STARTING - test_static_pool_openstack_resource_allocation")
+        tinfo = self.new_tinfo('static_openstack')
+        dts = rift.tasklets.DTS(tinfo, self.schema, self.loop)
+
+        @asyncio.coroutine
+        def run_test():
+            networks = []
+            computes = []
+            cloud_type = 'openstack_static'
+            yield from self.wait_tasklets()
+            yield from self.configure_cloud_account(dts, cloud_type)
+            yield from self.configure_network_resource_pools(dts, "static", cloud_type)
+            yield from self.configure_compute_resource_pools(dts, "static", cloud_type)
+            yield from self.verify_resource_pools_config(dts)
+
+            self.log.debug("Creating virtual-network-resources in openstack")
+            r_xpath = yield from self.reserve_network_resources('mynet-0', dts, cloud_type)
+            r_info = yield from self.read_resource(dts,r_xpath)
+            networks.append((r_xpath, r_info.resource_info))
+            self.log.debug("virtual-network-resources successfully created in openstack")
+
+            self.log.debug("Creating virtual-network-compute in openstack")
+            for i in range(2):
+                r_xpath = yield from self.reserve_compute_resources("mycompute-" + str(i),
+                                                                    dts,
+                                                                    cloud_type,
+                                                                    [networks[0][1].virtual_link_id])
+                r_info = yield from self.read_resource(dts,r_xpath)
+                computes.append((r_xpath, r_info))
+
+            yield from self.verify_resource_pools_config(dts)
+            for r in computes:
+                self.log.debug("Releasing compute resource with id: %s", r[1].resource_info.vdu_id)
+                yield from self.release_compute_resources(dts, r[0])
+
+            yield from self.release_network_resources(dts,networks[0][0])
+            yield from self.verify_resource_pools_config(dts)
+            self.log.debug("Openstack static resource allocation completed")
+
+        future = asyncio.ensure_future(run_test(), loop=self.loop)
+        self.run_until(future.done)
+        if future.exception() is not None:
+            self.log.error("Caught exception during test")
+            raise future.exception()
+
+        self.log.debug("DONE - test_static_pool_openstack_resource_allocation")
+
+    #@unittest.skip("Skipping test_dynamic_pool_openstack_resource_allocation")
+    def test_dynamic_pool_openstack_resource_allocation(self):
+        self.log.debug("STARTING - test_dynamic_pool_openstack_resource_allocation")
+        tinfo = self.new_tinfo('dynamic_openstack')
+        dts = rift.tasklets.DTS(tinfo, self.schema, self.loop)
+
+        @asyncio.coroutine
+        def run_test():
+            networks = []
+            computes = []
+            cloud_type = 'openstack_dynamic'
+            yield from self.wait_tasklets()
+            yield from self.configure_cloud_account(dts, cloud_type)
+            yield from self.configure_network_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.configure_compute_resource_pools(dts, "dynamic", cloud_type)
+            yield from self.verify_resource_pools_config(dts)
+
+            self.log.debug("Creating virtual-network-resources in openstack")
+            r_xpath = yield from self.reserve_network_resources('mynet-0', dts, cloud_type)
+            r_info = yield from self.read_resource(dts,r_xpath)
+            networks.append((r_xpath, r_info.resource_info))
+            self.log.debug("virtual-network-resources successfully created in openstack")
+
+            self.log.debug("Creating virtual-network-compute in openstack")
+            for i in range(2):
+                r_xpath = yield from self.reserve_compute_resources("mycompute-" + str(i),
+                                                                    dts,
+                                                                    cloud_type,
+                                                                    [networks[0][1].virtual_link_id])
+                r_info = yield from self.read_resource(dts,r_xpath)
+                computes.append((r_xpath, r_info))
+
+            yield from self.verify_resource_pools_config(dts)
+            for r in computes:
+                self.log.debug("Releasing compute resource with id: %s", r[1].resource_info.vdu_id)
+                #yield from self.release_compute_resources(dts, r[0])
+
+            self.log.debug("Releasing network resource with id: %s", r[1].resource_info.vdu_id)
+            #yield from self.release_network_resources(dts,networks[0][0])
+            #yield from self.verify_resource_pools_config(dts)
+            self.log.debug("Openstack dynamic resource allocation completed")
+
+        future = asyncio.ensure_future(run_test(), loop=self.loop)
+        self.run_until(future.done)
+        if future.exception() is not None:
+            self.log.error("Caught exception during test")
+            raise future.exception()
+
+        self.log.debug("DONE - test_dynamic_pool_openstack_resource_allocation")
+
+
+def main():
+    plugin_dir = os.path.join(os.environ["RIFT_INSTALL"], "usr/lib/rift/plugins")
+
+    if 'MESSAGE_BROKER_DIR' not in os.environ:
+        os.environ['MESSAGE_BROKER_DIR'] = os.path.join(plugin_dir, 'rwmsgbroker-c')
+
+    if 'ROUTER_DIR' not in os.environ:
+        os.environ['ROUTER_DIR'] = os.path.join(plugin_dir, 'rwdtsrouter-c')
+
+    if 'RM_DIR' not in os.environ:
+        os.environ['RM_DIR'] = os.path.join(plugin_dir, 'rwresmgrtasklet')
+
+    if 'CAL_PROXY_DIR' not in os.environ:
+        os.environ['CAL_PROXY_DIR'] = os.path.join(plugin_dir, 'rwcalproxytasklet')
+
+    if 'CNTR_MGR_DIR' not in os.environ:
+        os.environ['CNTR_MGR_DIR'] = os.path.join(plugin_dir, 'rwcntmgrtasklet')
+
+    runner = xmlrunner.XMLTestRunner(output=os.environ["RIFT_MODULE_TEST"])
+    unittest.main(testRunner=runner)
+
+if __name__ == '__main__':
+    main()
+