[Kimchi-devel] [PATCH 4/5] Create guests asynchronously: Backend

Christy Perez christy at linux.vnet.ibm.com
Tue Mar 3 14:20:18 UTC 2015



On 03/03/2015 03:04 AM, Royce Lv wrote:
> I think we may need to do a work around in UI as debug report did.
> If a user clicked "+" on VM page, then this request get 202 response.
> but after next round of GET /vms query, this VM may still not displayed
> in VM tab, making user want to issue create again or wander if POST
> request properly handled.
> 
> So we may want to display a vm creating in progress icon to users in UI.

Definitely. I just had to leave that part implemented since I'm not so
UI-savy.

> 
> On 02/27/2015 10:41 AM, Christy Perez wrote:
>> Signed-off-by: Christy Perez <christy at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/control/vms.py |  4 ++--
>>   src/kimchi/model/vms.py   | 28 +++++++++++++++++++++++++---
>>   2 files changed, 27 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/kimchi/control/vms.py b/src/kimchi/control/vms.py
>> index 5068b7c..8a31dc0 100644
>> --- a/src/kimchi/control/vms.py
>> +++ b/src/kimchi/control/vms.py
>> @@ -17,13 +17,13 @@
>>   # License along with this library; if not, write to the Free Software
>>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
>> 02110-1301 USA
>>
>> -from kimchi.control.base import Collection, Resource
>> +from kimchi.control.base import AsyncCollection, Resource
>>   from kimchi.control.utils import internal_redirect, UrlSubNode
>>   from kimchi.control.vm import sub_nodes
>>
>>
>>   @UrlSubNode('vms', True)
>> -class VMs(Collection):
>> +class VMs(AsyncCollection):
>>       def __init__(self, model):
>>           super(VMs, self).__init__(model)
>>           self.resource = VM
>> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
>> index 078e63e..8b55278 100644
>> --- a/src/kimchi/model/vms.py
>> +++ b/src/kimchi/model/vms.py
>> @@ -78,6 +78,7 @@ def __init__(self, **kargs):
>>           self.conn = kargs['conn']
>>           self.objstore = kargs['objstore']
>>           self.caps = CapabilitiesModel(**kargs)
>> +        self.task = TaskModel(**kargs)
>>
>>       @staticmethod
>>       def _update_guests_stats(names, conn):
>> @@ -181,7 +182,6 @@ def _get_disk_io_rate(vm_uuid, dom, seconds):
>>                                  'diskWrKB': diskWrKB})
>>
>>       def create(self, params):
>> -        conn = self.conn.get()
>>           t_name = template_name_from_uri(params['template'])
>>           vm_uuid = str(uuid.uuid4())
>>           vm_list = self.get_list()
>> @@ -203,6 +203,26 @@ def create(self, params):
>>
>>           t.validate()
>>
>> +        taskid = add_task(u'/vms/%s' % name, 'create',
>> +                          self._create_task, self.objstore,
>> +                          {'vm_uuid': vm_uuid, 'template': t, 'name':
>> name})
>> +
>> +        return self.task.lookup(taskid)
>> +
>> +    def _create_task(self, cb, params):
>> +        """
>> +        params: A dict with the following values:
>> +            - vm_uuid: The UUID of the VM being created
>> +            - template: The template being used to create the VM
>> +            - name: The name for the new VM
>> +        """
>> +
>> +        vm_uuid = params['vm_uuid']
>> +        t = params['template']
>> +        name = params['name']
>> +        conn = self.conn.get()
>> +
>> +        cb('Storing VM icon')
>>           # Store the icon for displaying later
>>           icon = t.info.get('icon')
>>           if icon:
>> @@ -217,6 +237,7 @@ def create(self, params):
>>
>>           # If storagepool is SCSI, volumes will be LUNs and must be
>> passed by
>>           # the user from UI or manually.
>> +        cb('Provisioning storage for new VM')
>>           vol_list = []
>>           if t._get_storage_type() not in ["iscsi", "scsi"]:
>>               vol_list = t.fork_vm_storage(vm_uuid)
>> @@ -229,6 +250,7 @@ def create(self, params):
>>                             graphics=graphics,
>>                             volumes=vol_list)
>>
>> +        cb('Defining new VM')
>>           try:
>>               conn.defineXML(xml.encode('utf-8'))
>>           except libvirt.libvirtError as e:
>> @@ -239,10 +261,10 @@ def create(self, params):
>>               raise OperationFailed("KCHVM0007E", {'name': name,
>>                                                    'err':
>> e.get_error_message()})
>>
>> +        cb('Updating VM metadata')
>>           VMModel.vm_update_os_metadata(VMModel.get_vm(name,
>> self.conn), t.info,
>>                                         self.caps.metadata_support)
>> -
>> -        return name
>> +        cb('OK', True)
>>
>>       def get_list(self):
>>           return VMsModel.get_vms(self.conn)
> 
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
> 




More information about the Kimchi-devel mailing list