Implemented Partition start as part of spawn function
+ Implemented partition start flow as part of spawn function + Corrected minor errors with zhmcclient initialization, function declaration + Workaround to loop for partition status introduced to resolve DPM bug- Paritition status is not updated immediately after the Start partition API returning. Change-Id: I1a6262eb11b5a25a95e92deba96b0a8b2af55d65 blueprint: Start-Instance-spawn
This commit is contained in:
@@ -48,7 +48,7 @@ ALL_DPM_OPTS = [
|
||||
Maximum amount of memory available on CpcSubset"""),
|
||||
cfg.IntOpt('max_instances', help="""
|
||||
Maximum number of instances that can be created on CpcSubset"""),
|
||||
cfg.IntOpt('physical_storage_adapter_mappings', help="""
|
||||
cfg.StrOpt('physical_storage_adapter_mappings', help="""
|
||||
Physical storage adapter with port details for hba creation""")
|
||||
]
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ class CpcManager(BaseManager):
|
||||
|
||||
class Cpc(BaseResource):
|
||||
def __init__(self, manager, uri, properties):
|
||||
super(Cpc, self).__init__(manager, uri, properties,
|
||||
super(Cpc, self).__init__(manager, uri, None, properties,
|
||||
uri_prop='object-uri',
|
||||
name_prop='name')
|
||||
|
||||
@@ -200,7 +200,7 @@ class PartitionManager(BaseManager):
|
||||
class Partition(BaseResource):
|
||||
def __init__(self, manager, uri, properties):
|
||||
super(Partition, self).__init__(
|
||||
manager, uri, properties,
|
||||
manager, uri, None, properties,
|
||||
uri_prop='object-uri', name_prop='name')
|
||||
|
||||
def pull_full_properties(self):
|
||||
@@ -231,7 +231,7 @@ class NicManager(BaseManager):
|
||||
|
||||
class Nic(BaseResource):
|
||||
def __init__(self, manager, uri, properties):
|
||||
super(Nic, self).__init__(manager, uri, properties,
|
||||
super(Nic, self).__init__(manager, uri, None, properties,
|
||||
uri_prop='object-uri',
|
||||
name_prop='name')
|
||||
|
||||
@@ -263,7 +263,7 @@ class HbaManager(BaseManager):
|
||||
|
||||
class Hba(BaseResource):
|
||||
def __init__(self, manager, uri, properties):
|
||||
super(Hba, self).__init__(manager, uri, properties,
|
||||
super(Hba, self).__init__(manager, uri, None, properties,
|
||||
uri_prop='object-uri',
|
||||
name_prop='name')
|
||||
|
||||
@@ -296,7 +296,7 @@ class AdapterManager(BaseManager):
|
||||
class Adapter(BaseResource):
|
||||
|
||||
def __init__(self, manager, uri, properties):
|
||||
super(Adapter, self).__init__(manager, uri, properties,
|
||||
super(Adapter, self).__init__(manager, uri, None, properties,
|
||||
uri_prop='object-uri',
|
||||
name_prop='name')
|
||||
|
||||
|
||||
@@ -70,6 +70,12 @@ class DPMDriver(driver.ComputeDriver):
|
||||
self.volume_drivers = self._get_volume_drivers()
|
||||
|
||||
def _get_zhmclient(self, zhmc, userid, password):
|
||||
"""Lazy initialization for zhmcclient
|
||||
|
||||
This function helps in lazy loading zhmclient. The zhmcclient can
|
||||
otherwise be set to fakezhmcclient for unittest framework
|
||||
"""
|
||||
|
||||
LOG.debug("_get_zhmclient")
|
||||
# TODO(preethipy): The below line will be removed once the warnings are
|
||||
# supressed within zhmclient code
|
||||
@@ -245,4 +251,4 @@ class DPMDriver(driver.ComputeDriver):
|
||||
inst.attachHba(self._conf)
|
||||
inst._build_resources(context, instance, block_device_mapping)
|
||||
|
||||
# TODO(pranjank): implement start partition
|
||||
inst.launch()
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
Partition will map nova parameter to PRSM parameter
|
||||
"""
|
||||
import sys
|
||||
import time
|
||||
|
||||
from nova.compute import manager as compute_manager
|
||||
from nova.compute import power_state
|
||||
@@ -36,7 +37,7 @@ DPM_TO_NOVA_STATE = {
|
||||
utils.PartitionState.STOPPED: power_state.SHUTDOWN,
|
||||
utils.PartitionState.UNKNOWN: power_state.NOSTATE,
|
||||
utils.PartitionState.PAUSED: power_state.PAUSED,
|
||||
utils.PartitionState.STARTING: power_state.NOSTATE
|
||||
utils.PartitionState.STARTING: power_state.PAUSED
|
||||
}
|
||||
|
||||
OBJECT_ID = 'object-id'
|
||||
@@ -57,21 +58,28 @@ def _translate_vm_state(dpm_state):
|
||||
return nova_state
|
||||
|
||||
|
||||
def _get_zhmclient():
|
||||
"""Lazy initialization for zhmcclient
|
||||
|
||||
This function helps in lazy loading zhmclient. The zhmcclient can
|
||||
otherwise be set to fakezhmcclient for unittest framework
|
||||
"""
|
||||
|
||||
LOG.debug("_get_zhmclient")
|
||||
global zhmcclient
|
||||
if zhmcclient is None:
|
||||
zhmcclient = importutils.import_module('zhmcclient')
|
||||
|
||||
|
||||
class Instance(object):
|
||||
def __init__(self, instance, cpc, client, flavor=None):
|
||||
self._get_zhmclient()
|
||||
_get_zhmclient()
|
||||
self.instance = instance
|
||||
self.flavor = flavor
|
||||
self.cpc = cpc
|
||||
self.client = client
|
||||
self.partition = self.get_partition(self.cpc, self.instance)
|
||||
|
||||
def _get_zhmclient(self):
|
||||
LOG.debug("_get_zhmclient")
|
||||
global zhmcclient
|
||||
if zhmcclient is None:
|
||||
zhmcclient = importutils.import_module('zhmcclient')
|
||||
|
||||
def properties(self):
|
||||
properties = {}
|
||||
properties['name'] = self.instance.hostname
|
||||
@@ -86,7 +94,6 @@ class Instance(object):
|
||||
self.partition = partition_manager.create(properties)
|
||||
|
||||
def attach_nic(self, conf, network_info):
|
||||
# TODO(preethipy): This function can be moved to Partition.py
|
||||
# TODO(preethipy): Implement the listener flow to register for
|
||||
# nic creation events
|
||||
LOG.debug("Creating nic interface for the instance")
|
||||
@@ -172,11 +179,44 @@ class Instance(object):
|
||||
resources['block_device_info'] = block_device_info
|
||||
return resources
|
||||
|
||||
def get_hba_properties():
|
||||
def get_hba_properties(self):
|
||||
LOG.debug('Get Hba properties')
|
||||
|
||||
def launch(self):
|
||||
self.create()
|
||||
def launch(self, partition=None):
|
||||
LOG.debug('Partition launch triggered')
|
||||
self.instance.vm_state = vm_states.BUILDING
|
||||
self.instance.task_state = task_states.SPAWNING
|
||||
self.instance.save()
|
||||
bootproperties = self.get_boot_properties()
|
||||
self.partition.update_properties(properties=bootproperties)
|
||||
result = self.partition.start(True)
|
||||
# TODO(preethipy): The below method to be removed once the bug
|
||||
# on DPM is fixed to return correct status on API return
|
||||
self._loop_status_update(result, 5)
|
||||
|
||||
def _loop_status_update(self, result, iterations):
|
||||
# TODO(preethipy): This method loops until the partition goes out
|
||||
# of pause state or until the iterations complete. Introduced because
|
||||
# of the bug in DPM for having status populated correctly only
|
||||
# after 4-5 seconds
|
||||
self.partition.pull_full_properties()
|
||||
if (result['status'] == 'complete'):
|
||||
while (self.partition.properties['status'] == 'paused') and \
|
||||
(iterations):
|
||||
LOG.debug("sleep for 2 seconds every iteration for"
|
||||
" status check")
|
||||
time.sleep(2)
|
||||
iterations -= 1
|
||||
|
||||
def get_boot_properties(self):
|
||||
LOG.debug('Retrieving boot properties for partition')
|
||||
# TODO(preethipy): update the boot-device to storage-adapter
|
||||
# TODO(preethipy): update the boot-storage-device with valid
|
||||
# HBA uri
|
||||
# TODO(preethipy): update boot-logical-unit-number and
|
||||
# boot-world-wide-port-name
|
||||
bootProperties = {'boot-device': 'test-operating-system'}
|
||||
return bootProperties
|
||||
|
||||
def get_partition(self, cpc, instance):
|
||||
partition = None
|
||||
@@ -197,6 +237,7 @@ class InstanceInfo(object):
|
||||
"""
|
||||
|
||||
def __init__(self, instance, cpc):
|
||||
_get_zhmclient()
|
||||
self.instance = instance
|
||||
self.cpc = cpc
|
||||
self.partition = None
|
||||
@@ -205,6 +246,7 @@ class InstanceInfo(object):
|
||||
for partition in partition_lists:
|
||||
if partition.properties['name'] == self.instance.hostname:
|
||||
self.partition = partition
|
||||
self.partition.pull_full_properties()
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
|
||||
Reference in New Issue
Block a user