[Tutor] Another OO modeling question

jamie hu jamiehu17 at yandex.com
Tue Dec 22 18:47:31 EST 2015


   *
   *
   22.12.2015, 15:26, "Alan Gauld" <alan.gauld at btinternet.com>:

     On 22/12/15 22:06, jamie hu wrote:

       *****
       *****
       ****I am trying to write down class and object definition for a
       Virtual
       ****Machine type. For example, I would like to create a Virtual
       Machine
       ****(object) that can have actions like launch, terminate, stop,
       add_disk,
       ****remove_disk etc..
       *****

     Seems reasonable.

       ****My confusion here is that VirtualMachine object doesn't exist
       until it is
       ****actually launched successfully.

     Most objects don't exist until they are created, so it looks like
     your init() method may need to call the launch code.

       *So should the launch method be part of
       ****VirtualMachine class or some other VirtualMachineConfigurator
       class?

     Sounds like you just include it as part of the creation mechanism.
     Alternatively you can use a class method that returns a new machine
     instance.

       ****Should*VirtualMachineConfigurator.launch() return VirtualMachine
       object

     In general objects should do it to themselves so I'd suggest you either
     1) include the configuration as part of construction
     2) configure the machine when you create it then launch(start) it
     ***after the object comes into existence
     3 If (and only if) all instances will share configuration you can make
     the config mechanism a class method and the config settings class
     attributes, but that seems very unlikely.

       ****Example class blueprint that I've been thinking:
       *****
       ****class VirtualMachineConfigurator():
       ***** def __init__(self,memory,vcpu,network,base_image):
       ***** * * self.memory = memory
       ***** * * self.vcpu = vcpu
       ***** * * self.network = network
       ***** * * self.base_image = base_image
       *****
       ****def launch(self)
       ***** """ Launches Virtual Machine and returns VirtualMachine object
       """
       ***** try:
       ***** * vm = hypervisor_conn.launch_vm(self.memory, self.vcpu,
       self.network,
       ****self.base_image)
       ***** * return vm
       ***** except Exception as e:
       ***** * raise e

     Just put that code into your VirtualMachine class.

       ****class VirtualMachine():
       ***** def __init__(self, vmid):
       ***** * self.vmid = vmid

     and add the init() code to launch() above

       ***** def stop(self):
       ***** * """ Stops VM"""
       ***** **
       ***** def attach_disk(self):

     *

     --
     Alan G

   *
   Thanks for the reply Alan. If init code calls launch method then I would
   have problems in looking up objects afterwards.
   *
   For example:
   1. First or initial calls to VirtualMachine(memory, vcpu, network,
   base_image) will try to launch a VM and return a vmid string.
   2. Now if I need to terminate all VMs with a specific base_image then I
   will use VirtualMachine.find_by_baseimage() method. This needs to
   return*VirtualMachine objects with matching base image.
   3. If this data was stored in a database then, before returning this data
   I will need to call init method again.
   *
   As init is calling launch method, wouldn't this trigger VM launch again?
   *
   Or am I missing something here?
   *
   -*jM
   *
   *


More information about the Tutor mailing list