WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] XendDomainInfo.py:

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] XendDomainInfo.py:
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Mon, 06 Jun 2005 16:09:57 +0000
Delivery-date: Thu, 09 Jun 2005 17:05:19 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1662.1.7, 2005/06/06 17:09:57+01:00, cl349@xxxxxxxxxxxxxxxxxxxx

        XendDomainInfo.py:
          Move guest image handling into seperate file.
        image.py:
          new file
        Signed-off-by: Mike Wray <mike.wray@xxxxxx>
        Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>



 XendDomainInfo.py |  289 +++++-----------------------------------------
 image.py          |  338 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 375 insertions(+), 252 deletions(-)


diff -Nru a/tools/python/xen/xend/XendDomainInfo.py 
b/tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   2005-06-09 13:06:18 -04:00
+++ b/tools/python/xen/xend/XendDomainInfo.py   2005-06-09 13:06:18 -04:00
@@ -114,25 +114,6 @@
     """
     return config_handlers.get(name)
 
-"""Table of handlers for virtual machine images.
-Indexed by image type.
-"""
-image_handlers = {}
-
-def add_image_handler(name, h):
-    """Add a handler for an image type
-    @param name:     image type
-    @param h:        handler: fn(config, name, memory, image)
-    """
-    image_handlers[name] = h
-
-def get_image_handler(name):
-    """Get the handler for an image type.
-    @param name:     image type
-    @return: handler or None
-    """
-    return image_handlers.get(name)
-
 """Table of handlers for devices.
 Indexed by device type.
 """
@@ -252,8 +233,6 @@
         self.name = None
         self.memory = None
         self.image = None
-        self.ramdisk = None
-        self.cmdline = None
 
         self.channel = None
         self.controllers = {}
@@ -278,8 +257,6 @@
         
         self.console_port = None
         self.savedinfo = None
-        self.image_handler = None
-        self.is_vmx = False
         self.vcpus = 1
         self.bootloader = None
 
@@ -330,8 +307,6 @@
         console = self.getConsole()
         if console:
             s += " console=" + str(console.console_port)
-        if self.image:
-            s += " image=" + self.image
         s += ""
         return s
 
@@ -484,8 +459,8 @@
             # Initial domain create.
             self.setName(sxp.child_value(config, 'name'))
             self.check_name(self.name)
+            self.init_image()
             self.configure_cpus(config)
-            self.find_image_handler()
             self.init_domain()
             self.register_domain()
             self.configure_bootloader()
@@ -527,29 +502,24 @@
         except:
             raise VmError('invalid vcpus value')
 
-    def find_image_handler(self):
-        """Construct the boot image for the domain.
-
-        @return vm
+    def init_image(self):
+        """Create boot image handler for the domain.
         """
         image = sxp.child_value(self.config, 'image')
         if image is None:
             raise VmError('missing image')
-        image_name = sxp.name(image)
-        if image_name is None:
-            raise VmError('missing image name')
-        if image_name == "vmx":
-            self.is_vmx = True
-        image_handler = get_image_handler(image_name)
-        if image_handler is None:
-            raise VmError('unknown image type: ' + image_name)
-        self.image_handler = image_handler
-        return self
+        self.image = ImageHandler.create(self, image)
 
     def construct_image(self):
-        image = sxp.child_value(self.config, 'image')
-        self.image_handler(self, image)
-        return self
+        """Construct the boot image for the domain.
+        """
+        self.create_channel()
+        self.image.createImage()
+        #self.image.exportToDB()
+        #if self.store_channel:
+        #    self.db.introduceDomain(self.id,
+        #                            self.store_mfn,
+        #                            self.store_channel)
 
     def config_devices(self, name):
         """Get a list of the 'device' nodes of a given type from the config.
@@ -596,7 +566,7 @@
         """Completely destroy the vm.
         """
         self.cleanup()
-        return self.destroy_domain()
+        self.destroy_domain()
 
     def destroy_domain(self):
         """Destroy the vm's domain.
@@ -606,9 +576,15 @@
         if self.channel:
             self.channel.close()
             self.channel = None
+        if self.image:
+            try:
+                self.image.destroy()
+                self.image = None
+            except:
+                pass
         if self.id is None: return 0
         try:
-            return xc.domain_destroy(dom=self.id)
+            xc.domain_destroy(dom=self.id)
         except Exception, err:
             log.exception("Domain destroy failed: %s", self.name)
 
@@ -661,80 +637,11 @@
             cpu = int(sxp.child_value(self.config, 'cpu', '-1'))
         except:
             raise VmError('invalid cpu')
-        cpu_weight = self.cpu_weight
-        memory = memory * 1024 + self.pgtable_size(memory)
-        dom = xc.domain_create(dom= dom)
-        if self.bootloader:
-            try:
-                if kernel: os.unlink(kernel)
-                if ramdisk: os.unlink(ramdisk)
-            except OSError, e:
-                log.warning('unable to unlink kernel/ramdisk: %s' %(e,))
-
-        if dom <= 0:
-            raise VmError('Creating domain failed: name=%s memory=%d'
-                          % (self.name, memory))
-        xc.domain_setcpuweight(dom, cpu_weight)
-        xc.domain_setmaxmem(dom, memory)
-        xc.domain_memory_increase_reservation(dom, memory)
-        if cpu != -1:
-            xc.domain_pincpu(dom, 0, 1<<int(cpu))
-        log.debug('init_domain> Created domain=%d name=%s memory=%d', dom, 
self.name, memory)
-        self.setdom(dom)
-
-    def build_domain(self, ostype, kernel, ramdisk, cmdline, memmap):
-        """Build the domain boot image.
-        """
-        if self.recreate or self.restore: return
-        if not os.path.isfile(kernel):
-            raise VmError('Kernel image does not exist: %s' % kernel)
-        if ramdisk and not os.path.isfile(ramdisk):
-            raise VmError('Kernel ramdisk does not exist: %s' % ramdisk)
-        if len(cmdline) >= 256:
-            log.warning('kernel cmdline too long, domain %d', self.id)
-        dom = self.id
-        buildfn = getattr(xc, '%s_build' % ostype)
-        flags = 0
-        if self.netif_backend: flags |= SIF_NET_BE_DOMAIN
-        if self.blkif_backend: flags |= SIF_BLK_BE_DOMAIN
-        #todo generalise this
-        if ostype == "vmx":
-            log.debug('building vmx domain')            
-            err = buildfn(dom            = dom,
-                          image          = kernel,
-                          control_evtchn = 0,
-                          memsize        = self.memory,
-                          memmap         = memmap,
-                          cmdline        = cmdline,
-                          ramdisk        = ramdisk,
-                          flags          = flags)
-        else:
-            log.debug('building dom with %d vcpus', self.vcpus)
-            err = buildfn(dom            = dom,
-                          image          = kernel,
-                          control_evtchn = self.channel.getRemotePort(),
-                          cmdline        = cmdline,
-                          ramdisk        = ramdisk,
-                          flags          = flags,
-                          vcpus          = self.vcpus)
-            if err != 0:
-                raise VmError('Building domain failed: type=%s dom=%d err=%d'
-                              % (ostype, dom, err))
-            
-    def create_domain(self, ostype, kernel, ramdisk, cmdline, memmap=''):
-        """Create a domain. Builds the image but does not configure it.
-
-        @param ostype:  OS type
-        @param kernel:  kernel image
-        @param ramdisk: kernel ramdisk
-        @param cmdline: kernel commandline
-        """
-
-        self.create_channel()
-        self.build_domain(ostype, kernel, ramdisk, cmdline, memmap)
-        self.image = kernel
-        self.ramdisk = ramdisk
-        self.cmdline = cmdline
+        dom = self.image.initDomain(self.id, self.memory, cpu, self.cpu_weight)
+        log.debug('init_domain> Created domain=%d name=%s memory=%d',
+                  dom, self.name, self.memory)
+        if not self.restore:
+            self.setdom(dom)
 
     def create_channel(self):
         """Create the control channel to the domain.
@@ -773,43 +680,6 @@
                 ctrl.initController(reboot=True)
         else:
             self.create_configured_devices()
-        if self.is_vmx:
-            self.create_vmx_model()
-
-    def create_vmx_model(self):
-        #todo: remove special case for vmx
-        device_model = sxp.child_value(self.config, 'device_model')
-        if not device_model:
-            raise VmError("vmx: missing device model")
-        device_config = sxp.child_value(self.config, 'device_config')
-        if not device_config:
-            raise VmError("vmx: missing device config")
-        #todo: self.memory?
-        memory = sxp.child_value(self.config, "memory")
-        # Create an event channel
-        device_channel = channel.eventChannel(0, self.id)
-        # see if a vncviewer was specified
-        # XXX RN: bit of a hack. should unify this, maybe stick in config space
-        vncconnect=""
-        image = sxp.child_value(self.config, "image")
-        args = sxp.child_value(image, "args")
-        if args:
-            arg_list = string.split(args)
-            for arg in arg_list:
-                al = string.split(arg, '=')
-                if al[0] == "VNC_VIEWER":
-                    vncconnect=" -v %s" % al[1]

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>