Volume ref support
Change-Id: I52c328564fa9eb2d5d95049f033ba5c6c2af19a5
Signed-off-by: chamarty <ravi.chamarty@riftio.com>
diff --git a/models/plugins/yang/mano-types.yang b/models/plugins/yang/mano-types.yang
index 03c27a1..1013595 100644
--- a/models/plugins/yang/mano-types.yang
+++ b/models/plugins/yang/mano-types.yang
@@ -2029,7 +2029,7 @@
}
- leaf device_bus {
+ leaf device-bus {
description "Type of disk-bus on which this disk is exposed to guest";
type enumeration {
enum ide;
@@ -2039,7 +2039,7 @@
}
}
- leaf device_type {
+ leaf device-type {
description "The type of device as exposed to guest";
type enumeration {
enum disk;
diff --git a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py
index ffab014..c7ed119 100644
--- a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py
+++ b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_drv.py
@@ -223,8 +223,15 @@
self.log.info("Discovering images")
self.glance_cache['images'] = self._cache_populate(self.glance_image_list,
list())
+
return self.glance_cache['images']
+ def _build_cinder_volume_list(self):
+ self.log.info("Discovering volumes")
+ vollist = self.cinder_volume_list()
+ self.cinder_cache['volumes'] = self._cache_populate(self.cinder_volume_list,
+ list())
+ return self.cinder_cache['volumes']
def build_nova_resource_cache(self):
self.log.info("Building nova resource cache")
@@ -239,8 +246,8 @@
self._build_neutron_subnet_prefix_list()
def build_cinder_resource_cache(self):
- pass
-
+ self.log.info("Building cinder resource cache")
+ self._build_cinder_volume_list()
def build_glance_resource_cache(self):
self.log.info("Building glance resource cache")
@@ -293,6 +300,13 @@
else:
return self._build_glance_image_list()
+ @property
+ def _cinder_volume_list(self):
+ if 'volumes' in self.cinder_cache:
+ return self.cinder_cache['volumes']
+ else:
+ return self._build_cinder_volume_list()
+
def validate_account_creds(self):
try:
self.sess_drv.invalidate_auth_token()
diff --git a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/utils/compute.py b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/utils/compute.py
index 5538201..6a800de 100644
--- a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/utils/compute.py
+++ b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/utils/compute.py
@@ -173,6 +173,30 @@
%(image_name, checksum))
return image['id']
+ def resolve_volume_n_validate(self, volume_ref):
+ """
+ Resolve the volume reference
+
+ Arguments:
+ volume_ref (string): Name of volume reference
+
+ Raises VolumeValidateError in case of Errors
+ """
+
+ for vol in self.driver._cinder_volume_list:
+ voldict = vol.to_dict()
+ if voldict['display_name'] == volume_ref:
+ if 'status' in voldict and voldict['status'] == 'available':
+ return voldict['id']
+ else:
+ self.log.error("Volume %s not in available state. Current state: %s",
+ volume_ref, voldict['status'])
+ raise VolumeValidateError("Volume with name %s found in incorrect (%s) state"
+ %(volume_ref, vol['status']))
+
+ self.log.info("No volume found with matching name: %s ", volume_ref)
+ raise VolumeValidateError("No volume found with matching name: %s " %(volume_ref))
+
def make_vdu_volume_args(self, volume, vdu_params):
"""
Arguments:
@@ -186,23 +210,24 @@
"""
kwargs = dict()
- if volume.has_field('volume_ref'):
- self.log.error("Unsupported option <Volume Reference> found for volume: %s", volume.name)
- raise VolumeValidateError("Unsupported option <Volume Reference> found for volume: %s"
- %(volume.name))
-
kwargs['boot_index'] = volume.boot_priority
if volume.has_field("image"):
# Support image->volume
kwargs['source_type'] = "image"
kwargs['uuid'] = self.resolve_image_n_validate(volume.image, volume.image_checksum)
+ kwargs['delete_on_termination'] = True
+ elif "volume_ref" in volume:
+ # Support volume-ref->volume (only ref)
+ kwargs['source_type'] = "volume"
+ kwargs['uuid'] = self.resolve_volume_n_validate(volume.volume_ref)
+ kwargs['delete_on_termination'] = False
else:
# Support blank->volume
kwargs['source_type'] = "blank"
+ kwargs['delete_on_termination'] = True
kwargs['device_name'] = volume.name
kwargs['destination_type'] = "volume"
kwargs['volume_size'] = volume.size
- kwargs['delete_on_termination'] = True
if volume.has_field('device_type'):
if volume.device_type in ['cdrom', 'disk']:
diff --git a/rwcal/test/test_rwcal_openstack.py b/rwcal/test/test_rwcal_openstack.py
index 654e1a3..339a2b4 100644
--- a/rwcal/test/test_rwcal_openstack.py
+++ b/rwcal/test/test_rwcal_openstack.py
@@ -973,6 +973,136 @@
return vdu
+ def _get_rbsh_vdu_request_info(self, vlink_list):
+ """
+ Returns object of type RwcalYang.VDUInitParams
+ """
+ vdu = RwcalYang.VDUInitParams()
+ vdu.name = "cal_rbsh_vdu"
+ vdu.vm_flavor.memory_mb = 2048
+ vdu.vm_flavor.vcpu_count = 1
+ vdu.vm_flavor.storage_gb = 10
+ vdu.flavor_id = self._flavor.id
+ vdu.allocate_public_address = True
+ ctr = 0
+ for vl in vlink_list:
+ c1 = vdu.connection_points.add()
+ c1.name = "c_point" + str(ctr)
+ ctr += 1
+ c1.virtual_link_id = vl
+ c1.type_yang = 'VIRTIO'
+
+ vol0 = vdu.volumes.add()
+ vol0.name = "vda"
+ vol0.image = "mgmt.img"
+ vol0.size = 40
+ vol0.boot_priority = 0
+ vol0.device_bus = "virtio"
+ vol0.device_type = "disk"
+
+ vol1 = vdu.volumes.add()
+ vol1.name = "vdb"
+ vol1.image = "segstore.img"
+ vol1.size = 60
+ vol1.boot_priority = 1
+ vol1.device_bus = "virtio"
+ vol1.device_type = "disk"
+
+ # blank disk
+ vol2 = vdu.volumes.add()
+ vol2.name = "vdc"
+ vol2.size = 10
+ vol2.boot_priority = 2
+ vol2.device_bus = "virtio"
+ vol2.device_type = "disk"
+
+ # existing volume disk
+ vol3 = vdu.volumes.add()
+ vol3.name = "vdd"
+ vol3.size = 10
+ vol3.volume_ref = "volume-ref1"
+ vol3.boot_priority = 3
+ vol3.device_bus = "virtio"
+ vol3.device_type = "disk"
+ return vdu
+
+ @unittest.skip("Skipping test_create_rbsh_vdu")
+ def test_create_rbsh_vdu(self):
+ """
+ Test to create VDU with mgmt port and 3 additional connection points
+ """
+ logger.info("Openstack-CAL-Test: Test Create Virtual Link API")
+ vlink_list = []
+ for ctr in range(3):
+ vlink = RwcalYang.VirtualLinkReqParams()
+ vlink.name = 'rift.cal.virtual_link' + str(ctr)
+ vlink.subnet = '11.0.{}.0/24'.format(str(1 + ctr))
+
+ rc, rsp = self.cal.create_virtual_link(self._acct, vlink)
+ self.assertEqual(rc.status, RwStatus.SUCCESS)
+ logger.info("Openstack-CAL-Test: Created virtual_link with Id: %s" %rsp)
+ vlink_id = rsp
+
+ #Check if virtual_link create is successful
+ rc, rsp = self.cal.get_virtual_link(self._acct, rsp)
+ self.assertEqual(rc, RwStatus.SUCCESS)
+ self.assertEqual(rsp.virtual_link_id, vlink_id)
+ vlink_list.append(vlink_id)
+
+
+ # Now create VDU
+ vdu_req = self._get_rbsh_vdu_request_info(vlink_list)
+ logger.info("Openstack-CAL-Test: Test Create RB steelhead VDU API (w/ mgmt port) and 3 CPs")
+
+ rc, rsp = self.cal.create_vdu(self._acct, vdu_req)
+ logger.debug("Openstack-CAL-Test: rc %s rsp %s" % (rc, rsp))
+ self.assertEqual(rc.status, RwStatus.SUCCESS)
+ logger.info("Openstack-CAL-Test: Created vdu with Id: %s" %rsp)
+
+ test_vdu_id = rsp
+
+ ## Check if VDU get is successful
+ rc, rsp = self.cal.get_vdu(self._acct, test_vdu_id)
+ logger.debug("Get VDU response %s", rsp)
+ self.assertEqual(rsp.vdu_id, test_vdu_id)
+
+ ### Wait until vdu_state is active
+ logger.debug("Waiting 10 secs")
+ time.sleep(10)
+ #{'name': 'dp0vhost7', 'connection_point_id': 'dp0vhost7', 'state': 'active', 'virtual_link_id': 'rift.cal.virtual_link', 'ip_address': '192.168.100.6'}
+ vdu_state = 'inactive'
+ cp_state = 'inactive'
+ for i in range(15):
+ rc, rsp = self.cal.get_vdu(self._acct, test_vdu_id)
+ self.assertEqual(rc, RwStatus.SUCCESS)
+ logger.info("Openstack-CAL-Test: Iter %d VDU with id : %s. Reached State : %s, mgmt ip %s" %(i, test_vdu_id, rsp.state, rsp.management_ip))
+ if (rsp.state == 'active') and ('management_ip' in rsp) and ('public_ip' in rsp):
+ vdu_state = 'active'
+ #'connection_points': [{'name': 'dp0vhost7', 'connection_point_id': 'dp0vhost7', 'state': 'active', 'virtual_link_id': 'rift.cal.virtual_link', 'ip_address': '192.168.100.6'}]
+ for cp in rsp.connection_points:
+ logger.info("Openstack-CAL-Test: Iter %d VDU with id : %s. Reached State : %s CP state %s" %(i, test_vdu_id, rsp.state, cp))
+ logger.debug("Waiting another 5 secs")
+ time.sleep(5)
+
+ self.assertEqual(rc, RwStatus.SUCCESS)
+ self.assertEqual(rsp.state, 'active')
+ self.assertEqual(vdu_state, 'active')
+ logger.info("Openstack-CAL-Test: VDU with id : %s reached expected state : %s IP: %s" %(test_vdu_id, rsp.state, rsp.management_ip))
+ logger.info("Openstack-CAL-Test: VDUInfo: %s" %(rsp))
+ logger.info("Waiting for 30 secs before deletion")
+ time.sleep(30)
+
+ ### Check vdu list as well
+ rc, rsp = self.cal.get_vdu_list(self._acct)
+ self.assertEqual(rc, RwStatus.SUCCESS)
+ found = False
+ logger.debug("Get VDU response %s", rsp)
+ for vdu in rsp.vdu_info_list:
+ if vdu.vdu_id == test_vdu_id:
+ found = True
+ self.assertEqual(found, True)
+ logger.info("Openstack-CAL-Test: Passed VDU list" )
+
#@unittest.skip("Skipping test_create_delete_virtual_link_and_vdu")
def test_create_delete_virtual_link_and_vdu(self):
"""
@@ -1027,10 +1157,10 @@
vlink_id2= rsp
### Now exercise the modify_vdu_api
- vdu_modify = self._get_vdu_modify_request_info(vdu_id, vlink_id2)
- rc = self.cal.modify_vdu(self._acct, vdu_modify)
- self.assertEqual(rc, RwStatus.SUCCESS)
- logger.info("Openstack-CAL-Test: Modified vdu with Id: %s" %vdu_id)
+ #vdu_modify = self._get_vdu_modify_request_info(vdu_id, vlink_id2)
+ #rc = self.cal.modify_vdu(self._acct, vdu_modify)
+ #self.assertEqual(rc, RwStatus.SUCCESS)
+ #logger.info("Openstack-CAL-Test: Modified vdu with Id: %s" %vdu_id)
### Lets delete the VDU
self.cal.delete_vdu(self._acct, vdu_id)