[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Use DevController.allocateDeviceID rather than using a local variable.



# HG changeset patch
# User emellor@ewan
# Node ID 951c8ee275b72c0475924c3939db2b558d86cb11
# Parent  8f9dfc5fb51c6110c3b59d53ee9f40dec90a58ba
Use DevController.allocateDeviceID rather than using a local variable.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>

diff -r 8f9dfc5fb51c -r 951c8ee275b7 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Sun Sep 18 21:42:02 2005
+++ b/tools/python/xen/xend/XendDomain.py       Mon Sep 19 12:41:41 2005
@@ -275,8 +275,7 @@
         @param config: configuration
         @return: domain
         """
-        dominfo = XendDomainInfo.create(self.dbmap, config)
-        return dominfo
+        return XendDomainInfo.create(self.dbmap.getPath(), config)
 
     def domain_restart(self, dominfo):
         """Restart a domain.
@@ -309,8 +308,7 @@
         @param vmconfig: vm configuration
         """
         config = sxp.child_value(vmconfig, 'config')
-        dominfo = XendDomainInfo.restore(self.dbmap, config)
-        return dominfo
+        return XendDomainInfo.restore(self.dbmap.getPath(), config)
 
     def domain_restore(self, src, progress=False):
         """Restore a domain from file.
@@ -352,13 +350,12 @@
             dompath = self.domroot
         log.info("Creating entry for unknown xend domain: id=%d uuid=%s",
                  dom0, uuid)
-        db = self.dbmap.addChild("%s/xend" % uuid)
-        try:
-            dominfo = XendDomainInfo.recreate(uuid, dompath, dom0,
-                                              db, info)
-        except:
-            raise XendError("Error recreating xend domain info: id=%d" %
-                            dom0)
+        try:
+            dominfo = XendDomainInfo.recreate(uuid, dompath, info)
+        except Exception, exn:
+            log.exception(exn)
+            raise XendError("Error recreating xend domain info: id=%d: %s" %
+                            (dom0, str(exn)))
         self._add_domain(dominfo)
         return dominfo
         
diff -r 8f9dfc5fb51c -r 951c8ee275b7 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Sun Sep 18 21:42:02 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Mon Sep 19 12:41:41 2005
@@ -136,123 +136,179 @@
     """
     MINIMUM_RESTART_TIME = 20
 
-    def create(cls, parentdb, config):
+
+    def create(cls, parentdbpath, config):
         """Create a VM from a configuration.
 
-        @param parentdb:  parent db
+        @param parentdbpath:  parent db path
         @param config    configuration
         @raise: VmError for invalid configuration
         """
-        uuid = getUuid()
-        db = parentdb.addChild("%s/xend" % uuid)
-        path = parentdb.getPath()
-        vm = cls(uuid, path, db)
-        vm.construct(config)
-        vm.saveToDB(sync=True)
-
+
+        log.debug("XendDomainInfo.create(%s, ...)", parentdbpath)
+        
+        vm = cls(getUuid(), parentdbpath, cls.parseConfig(config))
+        vm.construct()
         return vm
 
     create = classmethod(create)
 
-    def recreate(cls, uuid, path, domid, db, info):
+
+    def recreate(cls, uuid, dompath, info):
         """Create the VM object for an existing domain.
 
-        @param db:        domain db
+        @param dompath:   The path to all domain information
         @param info:      domain info from xc
         """
-        vm = cls(uuid, path, db)
-        vm.setDomid(domid)
-        vm.name, vm.start_time = vm.gatherVm(("name", str),
-                                             ("start-time", float))
-        try:
-            db.readDB()
-        except: pass
-        vm.importFromDB()
-        config = vm.config
-        log.debug('info=' + str(info))
-        log.debug('config=' + prettyprintstring(config))
-
-        vm.memory = info['mem_kb'] / 1024
-        vm.target = info['mem_kb'] * 1024
-
+
+        log.debug("XendDomainInfo.recreate(%s, %s, ...)", uuid, dompath)
+
+        # ??? vm.setDomid(domid)
+#        vm.name, vm.start_time = vm.gatherVm(("name", str),
+#                                             ("start-time", float))
+#        config = vm.config
+#        log.debug('info=' + str(info))
+#        log.debug('config=' + prettyprintstring(config))
+
+#        vm.memory = info['mem_kb'] / 1024
+#        vm.target = info['mem_kb'] * 1024
+
+
+        # Parse the configuration in the store, but allow the info we've
+        # been given (from xc) to override it.
+        path = "%s/%s" % (dompath, uuid)
+        
+        config = xstransact.Read(path, 'config')
         if config:
-            try:
-                vm.recreate = True
-                vm.construct(config)
-            finally:
-                vm.recreate = False
-        else:
-            vm.setName("Domain-%d" % domid)
-
-        vm.exportToDB(save=True)
-        return vm
+            temp_info = cls.parseConfig(config)
+            temp_info.update(info)
+            info = temp_info
+            
+        return cls(uuid, dompath, info)
 
     recreate = classmethod(recreate)
 
-    def restore(cls, parentdb, config, uuid=None):
+
+    def restore(cls, parentdbpath, config, uuid = None):
         """Create a domain and a VM object to do a restore.
 
-        @param parentdb:  parent db
+        @param parentdbpath:  parent db
         @param config:    domain configuration
         @param uuid:      uuid to use
         """
+        
+        log.debug("XendDomainInfo.restore(%s, ..., %s)", parentdbpath, uuid)
+
         if not uuid:
             uuid = getUuid()
-        db = parentdb.addChild("%s/xend" % uuid)
-        path = parentdb.getPath()
-        vm = cls(uuid, path, db)
-        ssidref = int(sxp.child_value(config, 'ssidref'))
-        log.debug('restoring with ssidref='+str(ssidref))
-        id = xc.domain_create(ssidref = ssidref)
-        vm.setDomid(id)
+
+        try:
+            ssidref = int(sxp.child_value(config, 'ssidref'))
+        except TypeError, exn:
+            raise VmError('Invalid ssidref in config: %s' % exn)
+
+        log.debug('restoring with ssidref = %d' % ssidref)
+
+        vm = cls(uuid, parentdbpath, cls.parseConfig(config),
+                 xc.domain_create(ssidref = ssidref))
         vm.clear_shutdown()
+        return vm
+
+    restore = classmethod(restore)
+
+
+    def parseConfig(cls, config):
+        def get_cfg(name, default = None):
+            return sxp.child_value(config, name, default)
+
+        def int_get_cfg(name):
+            val = get_cfg(name)
+            if val:
+                return int(val)
+            else:
+                return None
+
+        def flo_get_cfg(name):
+            val = get_cfg(name)
+            if val:
+                return float(val)
+            else:
+                return None
+
+
+        log.debug("parseConfig: config is %s" % str(config))
+
+
+        result = {}
+        imagecfg = "()"
         try:
-            vm.restore = True
-            vm.construct(config)
-        finally:
-            vm.restore = False
-        vm.exportToDB(save=True, sync=True)
-        return vm
-
-    restore = classmethod(restore)
-
-    __exports__ = [
-        DBVar('config',        ty='sxpr'),
-        DBVar('state',         ty='str'),
-        DBVar('restart_mode',  ty='str'),
-        DBVar('restart_state', ty='str'),
-        DBVar('restart_time',  ty='float'),
-        DBVar('restart_count', ty='int'),
-        ]
+            result['name']         =     get_cfg('name')
+            result['ssidref']      = int_get_cfg('ssidref')
+            result['memory']       = int_get_cfg('memory')
+            result['maxmem']       = int_get_cfg('maxmem')
+            result['cpu']          = int_get_cfg('cpu')
+            result['cpu_weight']   = flo_get_cfg('cpu_weight')
+            result['bootloader']   =     get_cfg('bootloader')
+            result['restart_mode'] =     get_cfg('restart')
+
+            imagecfg = get_cfg('image')
+
+            if imagecfg:
+                result['image'] = imagecfg
+                result['vcpus'] = int(sxp.child_value(imagecfg, 'vcpus', 1))
+            else:
+                result['vcpus'] = 1
+
+            result['backend'] = []
+            for c in sxp.children(config, 'backend'):
+                result['backend'].append(sxp.name(sxp.child0(c)))
+
+            result['device'] = []
+            for d in sxp.children(config, 'device'):
+                c = sxp.child0(d)
+                result['device'].append((sxp.name(c), c))
+
+
+            log.debug("parseConfig: result is %s" % str(result))
+            return result
+
+        except TypeError, exn:
+            raise VmError(
+                'Invalid ssidref / memory / cpu / cpu_weight / vcpus value: %s 
%s %s %s %s: %s' %
+                (get_cfg('ssidref'),
+                 get_cfg('memory'),
+                 get_cfg('cpu'),
+                 get_cfg('cpu_weight'),
+                 sxp.child_value(imagecfg, 'vcpus', 1),
+                 str(exn)))
+
+    parseConfig = classmethod(parseConfig)
+
     
-    def __init__(self, uuid, path, db):
+    def __init__(self, uuid, parentpath, info, domid = None):
+
         self.uuid = uuid
-        self.path = path + "/" + uuid
-
-        self.db = db
-
-        self.recreate = 0
-        self.restore = 0
-        
-        self.config = None
-        self.domid = None
-        self.cpu_weight = 1
+        self.info = info
+
+        self.path = parentpath + "/" + uuid
+
+        if domid:
+            self.domid = domid
+        elif 'dom' in info:
+            self.domid = int(info['dom'])
+        else:
+            self.domid = None
+
+        self.validateInfo()
+
         self.start_time = None
-        self.name = None
-        self.memory = None
-        self.ssidref = None
         self.image = None
-
-        self.target = None
 
         self.store_channel = None
         self.store_mfn = None
         self.console_channel = None
         self.console_mfn = None
         
-        self.info = None
-        self.backend_flags = 0
-        
         #todo: state: running, suspended
         self.state = STATE_VM_OK
         self.state_updated = threading.Condition()
@@ -261,17 +317,69 @@
         #todo: set to migrate info if migrating
         self.migrate = None
         
-        self.restart_mode = RESTART_ONREBOOT
         self.restart_state = None
         self.restart_time = None
         self.restart_count = 0
         
-        self.vcpus = 1
-        self.bootloader = None
+        self.device_model_pid = 0
 
         self.writeVm("uuid", self.uuid)
         self.storeDom("vm", self.path)
 
+
+    def validateInfo(self):
+        """Validate and normalise the info block.  This has either been parsed
+        by parseConfig, or received from xc through recreate.
+        """
+        def defaultInfo(name, val):
+            if name not in self.info or self.info[name] is None:
+                self.info[name] = val()
+
+    
+        try:
+            defaultInfo('name',         lambda: "Domain-%d" % self.domid)
+            defaultInfo('memory',       lambda: self.info['mem_kb'] / 1024)
+            defaultInfo('maxmem',       lambda: self.info['memory'])
+            defaultInfo('restart_mode', lambda: RESTART_ONREBOOT)
+            defaultInfo('cpu_weight',   lambda: 1.0)
+            defaultInfo('bootloader',   lambda: None)
+            defaultInfo('backend',      lambda: [])
+            defaultInfo('device',       lambda: [])
+
+            #        vm.target = info['mem_kb'] * 1024
+
+            # !!! Consistency checks have the possibility of going wrong if
+            # xen updates us with a setting which should stay consistent with
+            # another.  We should be storing only one value instead.
+
+            # Validate the given backend names.
+            for s in self.info['backend']:
+                if s not in backendFlags:
+                    raise VmError('Invalid backend type: %s' % s)
+
+            for (n, c) in self.info['device']:
+                if not n or not c or n not in controllerClasses:
+                    raise VmError('invalid device (%s, %s)' %
+                                  (str(n), str(c)))
+
+            if self.info['restart_mode'] not in restart_modes:
+                raise VmError('invalid restart mode: ' +
+                              str(self.info['restart_mode']))
+
+            if self.info['memory'] <= 0:
+                # !!! memory / mem_kb consistency check
+                raise VmError('Invalid memory size: %d', self.info['memory'])
+
+            if 'cpumap' not in self.info:
+                if [self.info['vcpus'] == 1]:
+                    self.info['cpumap'] = [1];
+                else:
+                    raise VmError('Cannot create CPU map')
+
+        except KeyError, exn:
+            raise VmError('Unspecified domain detail: %s' % str(exn))
+
+
     def readVm(self, *args):
         return xstransact.Read(self.path, *args)
 
@@ -302,18 +410,27 @@
     def storeDom(self, *args):
         return xstransact.Store(self.path, *args)
 
-    def setDB(self, db):
-        self.db = db
-
-    def saveToDB(self, save=False, sync=False):
-        self.db.saveDB(save=save, sync=sync)
-
-    def exportToDB(self, save=False, sync=False):
-        self.db.exportToDB(self, fields=self.__exports__, save=save, sync=sync)
-
-    def importFromDB(self):
-        self.db.importFromDB(self, fields=self.__exports__)
-        self.store_channel = self.eventChannel("store/port")
+
+    def exportToDB(self, save=False):
+        to_store = {
+            'id':               str(self.domid),
+            'uuid':             self.uuid,
+            'config':           sxp.to_string(self.sxpr()),
+
+            'start_time':       str(self.start_time),
+            'state':            self.state,
+            'restart_time':     str(self.restart_time),
+            'restart_count':    str(self.restart_count),
+            'device_model_pid': str(self.device_model_pid)
+            }
+
+        for (k, v) in self.info.items():
+            to_store[k] = str(v)
+
+        log.debug("Storing %s" % str(to_store))
+
+        self.writeVm(to_store)
+
 
     def setDomid(self, domid):
         """Set the domain id.
@@ -327,11 +444,11 @@
         return self.domid
 
     def setName(self, name):
-        self.name = name
+        self.info['name'] = name
         self.storeVm("name", name)
 
     def getName(self):
-        return self.name
+        return self.info['name']
 
     def getPath(self):
         return self.path
@@ -340,14 +457,14 @@
         return self.uuid
 
     def getVCpuCount(self):
-        return self.vcpus
+        return self.info['vcpus']
 
     def getSsidref(self):
-        return self.ssidref
+        return self.info['ssidref']
 
     def getMemoryTarget(self):
         """Get this domain's target memory size, in MiB."""
-        return self.memory
+        return self.info['memory']
 
     def setStoreRef(self, ref):
         self.store_mfn = ref
@@ -355,7 +472,8 @@
 
 
     def getBackendFlags(self):
-        return self.backend_flags
+        return reduce(lambda x, y: x | backendFlags[y],
+                      self.info['backend'], 0)
 
 
     def closeStoreChannel(self):
@@ -379,18 +497,19 @@
     def setMemoryTarget(self, target):
         self.storeDom("memory/target", target)
 
-    def update(self, info=None):
-        """Update with  info from xc.domain_getinfo().
-        """
-        if info:
-            self.info = info
-        else:
-            di = dom_get(self.domid)
-            if not di:
+
+    def update(self, info = None):
+        """Update with info from xc.domain_getinfo().
+        """
+
+        if not info:
+            info = dom_get(self.domid)
+            if not info:
                 return
-            self.info = di 
-        self.memory = self.info['mem_kb'] / 1024
-        self.ssidref = self.info['ssidref']
+            
+        self.info.update(info)
+        self.validateInfo()
+
 
     def state_set(self, state):
         self.state_updated.acquire()
@@ -398,7 +517,7 @@
             self.state = state
             self.state_updated.notifyAll()
         self.state_updated.release()
-        self.saveToDB()
+        self.exportToDB()
 
     def state_wait(self, state):
         self.state_updated.acquire()
@@ -409,9 +528,9 @@
     def __str__(self):
         s = "<domain"
         s += " id=" + str(self.domid)
-        s += " name=" + self.name
-        s += " memory=" + str(self.memory)
-        s += " ssidref=" + str(self.ssidref)
+        s += " name=" + self.info['name']
+        s += " memory=" + str(self.info['memory'])
+        s += " ssidref=" + str(self.info['ssidref'])
         s += ">"
         return s
 
@@ -441,32 +560,43 @@
     def sxpr(self):
         sxpr = ['domain',
                 ['domid', self.domid],
-                ['name', self.name],
-                ['memory', self.memory],
-                ['ssidref', self.ssidref],
-                ['target', self.target] ]
+                ['name', self.info['name']],
+                ['memory', self.info['memory']],
+                ['ssidref', self.info['ssidref']]]
+#        ,                ['target', self.target] ]
         if self.uuid:
             sxpr.append(['uuid', self.uuid])
         if self.info:
-            sxpr.append(['maxmem', self.info['maxmem_kb']/1024 ])
-            run   = (self.info['running']  and 'r') or '-'
-            block = (self.info['blocked']  and 'b') or '-'
-            pause = (self.info['paused']   and 'p') or '-'
-            shut  = (self.info['shutdown'] and 's') or '-'
-            crash = (self.info['crashed']  and 'c') or '-'
-            state = run + block + pause + shut + crash
+            sxpr.append(['maxmem', self.info['maxmem']])
+
+            def stateChar(name):
+                if name in self.info:
+                    if self.info[name]:
+                        return name[0]
+                    else:
+                        return '-'
+                else:
+                    return '?'
+
+            state = reduce(
+                lambda x, y: x + y,
+                map(stateChar,
+                    ['running', 'blocked', 'paused', 'shutdown', 'crashed']))
+
             sxpr.append(['state', state])
-            if self.info['shutdown']:
+            if 'shutdown' in self.info and self.info['shutdown']:
                 reason = shutdown_reason(self.info['shutdown_reason'])
                 sxpr.append(['shutdown_reason', reason])
-            sxpr.append(['cpu', self.info['vcpu_to_cpu'][0]])
-            sxpr.append(['cpu_time', self.info['cpu_time']/1e9])    
+            if 'cpu_time' in self.info:
+                sxpr.append(['cpu_time', self.info['cpu_time']/1e9])    
             sxpr.append(['vcpus', self.info['vcpus']])
             sxpr.append(['cpumap', self.info['cpumap']])
-            # build a string, using '|' to seperate items, show only up
-            # to number of vcpus in domain, and trim the trailing '|'
-            sxpr.append(['vcpu_to_cpu', ''.join(map(lambda x: str(x)+'|',
-                        self.info['vcpu_to_cpu'][0:self.info['vcpus']]))[:-1]])
+            if 'vcpu_to_cpu' in self.info:
+                sxpr.append(['cpu', self.info['vcpu_to_cpu'][0]])
+                # build a string, using '|' to separate items, show only up
+                # to number of vcpus in domain, and trim the trailing '|'
+                sxpr.append(['vcpu_to_cpu', ''.join(map(lambda x: str(x)+'|',
+                            
self.info['vcpu_to_cpu'][0:self.info['vcpus']]))[:-1]])
             
         if self.start_time:
             up_time =  time.time() - self.start_time  
@@ -492,8 +622,8 @@
             sxpr.append(['restart_state', self.restart_state])
         if self.restart_time:
             sxpr.append(['restart_time', str(self.restart_time)])
-        if self.config:
-            sxpr.append(['config', self.config])
+#        if self.config:
+#            sxpr.append(['config', self.config])
         return sxpr
 
     def check_name(self, name):
@@ -504,7 +634,6 @@
         @param name: name
         @raise: VMerror if invalid
         """
-        if self.recreate: return
         if name is None or name == '':
             raise VmError('missing vm name')
         for c in name:
@@ -523,26 +652,49 @@
         if not self.domid or (dominfo.domid != self.domid):
             raise VmError('vm name clash: ' + name)
         
-    def construct(self, config):
+    def construct(self):
         """Construct the vm instance from its configuration.
 
         @param config: configuration
         @raise: VmError on error
         """
         # todo - add support for scheduling params?
-        self.config = config
         try:
             # Initial domain create.
-            self.setName(sxp.child_value(config, 'name'))
-            self.check_name(self.name)
-            self.init_image()
-            self.configure_cpus(config)
-            self.init_domain()
+            self.check_name(self.info['name'])
+            self.setName(self.info['name'])
+
+            if 'image' not in self.info:
+                raise VmError('Missing image in configuration')
+
+            self.image = ImageHandler.create(self, self.info['image'])
+
+            self.setMemoryTarget(self.info['memory'] * (1 << 20))
+
+            log.error('%s %s %s %s %s',
+                      str(self.domid),
+                      str(self.info['memory']),
+                      str(self.info['ssidref']),
+                      str(self.info['cpu']),
+                      str(self.info['cpu_weight']))
+
+            self.setDomid(self.image.initDomain(self.domid,
+                                                self.info['memory'],
+                                                self.info['ssidref'],
+                                                self.info['cpu'],
+                                                self.info['cpu_weight'],
+                                                self.info['bootloader']))
+            
+            if self.start_time is None:
+                self.start_time = time.time()
+                self.storeVm(("start-time", self.start_time))
+
+            log.debug('init_domain> Created domain=%d name=%s memory=%d',
+                      self.domid, self.info['name'], self.info['memory'])
+
             self.register_domain()
 
             # Create domain devices.
-            self.configure_backends()
-            self.configure_restart()
             self.construct_image()
             self.configure()
             self.exportToDB(save=True)
@@ -559,40 +711,11 @@
         xd._add_domain(self)
         self.exportToDB(save=True)
 
-    def configure_cpus(self, config):
-        try:
-            self.cpu_weight = float(sxp.child_value(config, 'cpu_weight', '1'))
-        except:
-            raise VmError('invalid cpu weight')
-        self.memory = int(sxp.child_value(config, 'memory'))
-        if self.memory is None:
-            raise VmError('missing memory size')
-        self.setMemoryTarget(self.memory * (1 << 20))
-        self.ssidref = int(sxp.child_value(config, 'ssidref'))
-        cpu = sxp.child_value(config, 'cpu')
-        if self.recreate and self.domid and cpu is not None and int(cpu) >= 0:
-            xc.domain_pincpu(self.domid, 0, 1<<int(cpu))
-        try:
-            image = sxp.child_value(self.config, 'image')
-            vcpus = sxp.child_value(image, 'vcpus')
-            if vcpus:
-                self.vcpus = int(vcpus)
-        except:
-            raise VmError('invalid vcpus value')
-
     def configure_vcpus(self, vcpus):
         d = {}
         for v in range(0, vcpus):
             d["cpu/%d/availability" % v] = "online"
         self.writeVm(d)
-
-    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')
-        self.image = ImageHandler.create(self, image)
 
     def construct_image(self):
         """Construct the boot image for the domain.
@@ -604,21 +727,17 @@
             IntroduceDomain(self.domid, self.store_mfn,
                             self.store_channel.port1, self.path)
         # get the configured value of vcpus and update store
-        self.configure_vcpus(self.vcpus)
+        self.configure_vcpus(self.info['vcpus'])
+
 
     def delete(self):
         """Delete the vm's db.
         """
-        self.domid = None
-        self.saveToDB(sync=True)
         try:
-            # Todo: eventually will have to wait for devices to signal
-            # destruction before can delete the db.
-            if self.db:
-                self.db.delete()
+            xstransact.Remove(self.path, 'id')
         except Exception, ex:
             log.warning("error in domain db delete: %s", ex)
-            pass
+
 
     def destroy_domain(self):
         """Destroy the vm's domain.
@@ -630,7 +749,7 @@
         try:
             xc.domain_destroy(dom=self.domid)
         except Exception, err:
-            log.exception("Domain destroy failed: %s", self.name)
+            log.exception("Domain destroy failed: %s", self.info['name'])
 
     def cleanup(self):
         """Cleanup vm resources: release devices.
@@ -653,11 +772,14 @@
                 pass
 
     def destroy(self):
-        """Clenup vm and destroy domain.
-        """
+        """Cleanup vm and destroy domain.
+        """
+
+        log.debug("XendDomainInfo.destroy")
+
         self.destroy_domain()
         self.cleanup()
-        self.saveToDB()
+        self.exportToDB()
         return 0
 
     def is_terminated(self):
@@ -670,6 +792,7 @@
         """
 
         t = xstransact("%s/device" % self.path)
+
         for n in controllerClasses.keys():
             for d in t.list(n):
                 try:
@@ -686,27 +809,10 @@
     def show(self):
         """Print virtual machine info.
         """
-        print "[VM dom=%d name=%s memory=%d ssidref=%d" % (self.domid, 
self.name, self.memory, self.ssidref)
+        print "[VM dom=%d name=%s memory=%d ssidref=%d" % (self.domid, 
self.info['name'], self.info['memory'], self.info['ssidref'])
         print "image:"
         sxp.show(self.image)
         print "]"
-
-    def init_domain(self):
-        """Initialize the domain memory.
-        """
-        if self.recreate:
-            return
-        if self.start_time is None:
-            self.start_time = time.time()
-            self.storeVm(("start-time", self.start_time))
-        try:
-            cpu = int(sxp.child_value(self.config, 'cpu', '-1'))
-        except:
-            raise VmError('invalid cpu')
-        id = self.image.initDomain(self.domid, self.memory, self.ssidref, cpu, 
self.cpu_weight)
-        log.debug('init_domain> Created domain=%d name=%s memory=%d',
-                  id, self.name, self.memory)
-        self.setDomid(id)
 
     def eventChannel(self, path=None):
         """Create an event channel to the domain.
@@ -731,14 +837,8 @@
         self.console_channel = self.eventChannel("console/port")
 
     def create_configured_devices(self):
-        devices = sxp.children(self.config, 'device')
-        for d in devices:
-            dev_config = sxp.child0(d)
-            if dev_config is None:
-                raise VmError('invalid device')
-            dev_type = sxp.name(dev_config)
-
-            self.createDevice(dev_type, dev_config)
+        for (n, c) in self.info['device']:
+            self.createDevice(n, c)
 
 
     def create_devices(self):
@@ -770,14 +870,6 @@
         self.configureDevice(deviceClass, devid, dev_config)
 
 
-    def configure_restart(self):
-        """Configure the vm restart mode.
-        """
-        r = sxp.child_value(self.config, 'restart', RESTART_ONREBOOT)
-        if r not in restart_modes:
-            raise VmError('invalid restart mode: ' + str(r))
-        self.restart_mode = r;
-
     def restart_needed(self, reason):
         """Determine if the vm needs to be restarted when shutdown
         for the given reason.
@@ -785,11 +877,11 @@
         @param reason: shutdown reason
         @return True if needs restart, False otherwise
         """
-        if self.restart_mode == RESTART_NEVER:
+        if self.info['restart_mode'] == RESTART_NEVER:
             return False
-        if self.restart_mode == RESTART_ALWAYS:
+        if self.info['restart_mode'] == RESTART_ALWAYS:
             return True
-        if self.restart_mode == RESTART_ONREBOOT:
+        if self.info['restart_mode'] == RESTART_ONREBOOT:
             return reason == 'reboot'
         return False
 
@@ -821,7 +913,7 @@
             tdelta = tnow - self.restart_time
             if tdelta < self.MINIMUM_RESTART_TIME:
                 self.restart_cancel()
-                msg = 'VM %s restarting too fast' % self.name
+                msg = 'VM %s restarting too fast' % self.info['name']
                 log.error(msg)
                 raise VmError(msg)
         self.restart_time = tnow
@@ -840,14 +932,13 @@
             self.exportToDB()
             self.restart_state = STATE_RESTART_BOOTING
             self.configure_bootloader()
-            self.construct(self.config)
-            self.saveToDB()
+            self.construct()
+            self.exportToDB()
         finally:
             self.restart_state = None
 
     def configure_bootloader(self):
-        self.bootloader = sxp.child_value(self.config, "bootloader")
-        if not self.bootloader:
+        if not self.info['bootloader']:
             return
         # if we're restarting with a bootloader, we need to run it
         # FIXME: this assumes the disk is the first device and
@@ -858,30 +949,13 @@
         if dev:
             disk = sxp.child_value(dev, "uname")
             fn = blkdev_uname_to_file(disk)
-            blcfg = bootloader(self.bootloader, fn, 1, self.vcpus)
+            blcfg = bootloader(self.info['bootloader'], fn, 1, 
self.info['vcpus'])
         if blcfg is None:
             msg = "Had a bootloader specified, but can't find disk"
             log.error(msg)
             raise VmError(msg)
         self.config = sxp.merge(['vm', ['image', blcfg]], self.config)
 
-    def configure_backends(self):
-        """Set configuration flags if the vm is a backend for netif or blkif.
-        Configure the backends to use for vbd and vif if specified.
-        """
-        for c in sxp.children(self.config, 'backend'):
-            v = sxp.child0(c)
-            name = sxp.name(v)
-            if name == 'blkif':
-                self.backend_flags |= SIF_BLK_BE_DOMAIN
-            elif name == 'netif':
-                self.backend_flags |= SIF_NET_BE_DOMAIN
-            elif name == 'usbif':
-                pass
-            elif name == 'tpmif':
-                self.backend_flags |= SIF_TPM_BE_DOMAIN
-            else:
-                raise VmError('invalid backend type:' + str(name))
 
     def configure(self):
         """Configure a vm.
@@ -899,19 +973,16 @@
         """
         return
 
+
     def configure_maxmem(self):
-        try:
-            maxmem = int(sxp.child_value(self.config, 'maxmem', self.memory))
-            xc.domain_setmaxmem(self.domid, maxmem_kb = maxmem * 1024)
-        except:
-            raise VmError("invalid maxmem: " +
-                          sxp.child_value(self.config, 'maxmem'))
+        xc.domain_setmaxmem(self.domid,
+                            maxmem_kb = self.info['maxmem'] * 1024)
 
 
     def vcpu_hotplug(self, vcpu, state):
         """Disable or enable VCPU in domain.
         """
-        if vcpu > self.vcpus:
+        if vcpu > self.info['vcpus']:
             log.error("Invalid VCPU %d" % vcpu)
             return
         if int(state) == 0:
@@ -1000,16 +1071,24 @@
 controllerClasses = {}
 
 
-def addControllerClass(device_class, cls):
+"""A map of backend names and the corresponding flag."""
+backendFlags = {}
+
+
+def addControllerClass(device_class, backend_name, backend_flag, cls):
     """Register a subclass of DevController to handle the named device-class.
+
+    @param backend_flag One of the SIF_XYZ_BE_DOMAIN constants, or None if
+    no flag is to be set.
     """
     cls.deviceClass = device_class
+    backendFlags[backend_name] = backend_flag
     controllerClasses[device_class] = cls
 
 
 from xen.xend.server import blkif, netif, tpmif, pciif, usbif
-addControllerClass('vbd',  blkif.BlkifController)
-addControllerClass('vif',  netif.NetifController)
-addControllerClass('vtpm', tpmif.TPMifController)
-addControllerClass('pci',  pciif.PciController)
-addControllerClass('usb',  usbif.UsbifController)
+addControllerClass('vbd',  'blkif', SIF_BLK_BE_DOMAIN, blkif.BlkifController)
+addControllerClass('vif',  'netif', SIF_NET_BE_DOMAIN, netif.NetifController)
+addControllerClass('vtpm', 'tpmif', SIF_TPM_BE_DOMAIN, tpmif.TPMifController)
+addControllerClass('pci',  'pciif', None,              pciif.PciController)
+addControllerClass('usb',  'usbif', None,              usbif.UsbifController)
diff -r 8f9dfc5fb51c -r 951c8ee275b7 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Sun Sep 18 21:42:02 2005
+++ b/tools/python/xen/xend/image.py    Mon Sep 19 12:41:41 2005
@@ -145,22 +145,21 @@
         except OSError, ex:
             log.warning("error removing bootloader file '%s': %s", f, ex)
 
-    def initDomain(self, dom, memory, ssidref, cpu, cpu_weight):
+    def initDomain(self, dom, memory, ssidref, cpu, cpu_weight, bootloading):
         """Initial domain create.
 
         @return domain id
         """
 
         mem_kb = self.getDomainMemory(memory)
-        if not self.vm.restore:
-            dom = xc.domain_create(dom = dom or 0, ssidref = ssidref)
-            # if bootloader, unlink here. But should go after buildDomain() ?
-            if self.vm.bootloader:
-                self.unlink(self.kernel)
-                self.unlink(self.ramdisk)
-            if dom <= 0:
-                raise VmError('Creating domain failed: name=%s' %
-                              self.vm.getName())
+        dom = xc.domain_create(dom = dom or 0, ssidref = ssidref)
+        # if bootloader, unlink here. But should go after buildDomain() ?
+        if bootloading:
+            self.unlink(self.kernel)
+            self.unlink(self.ramdisk)
+        if dom <= 0:
+            raise VmError('Creating domain failed: name=%s' %
+                          self.vm.getName())
         log.debug("initDomain: cpu=%d mem_kb=%d ssidref=%d dom=%d", cpu, 
mem_kb, ssidref, dom)
         xc.domain_setcpuweight(dom, cpu_weight)
         xc.domain_setmaxmem(dom, mem_kb)
@@ -184,9 +183,6 @@
     def createDomain(self):
         """Build the domain boot image.
         """
-        if self.vm.recreate or self.vm.restore:
-            return
-
         # Set params and call buildDomain().
         self.flags = self.vm.getBackendFlags()
 
diff -r 8f9dfc5fb51c -r 951c8ee275b7 tools/python/xen/xend/server/netif.py
--- a/tools/python/xen/xend/server/netif.py     Sun Sep 18 21:42:02 2005
+++ b/tools/python/xen/xend/server/netif.py     Mon Sep 19 12:41:41 2005
@@ -27,9 +27,6 @@
 from xen.xend.server.DevController import DevController
 
 
-next_devid = 1
-
-
 class NetifController(DevController):
     """Network interface controller. Handles all network devices for a domain.
     """
@@ -41,8 +38,6 @@
     def getDeviceDetails(self, config):
         """@see DevController.getDeviceDetails"""
 
-        global next_devid
-
         from xen.xend import XendRoot
         xroot = XendRoot.instance()
 
@@ -52,9 +47,6 @@
                 val.append(sxp.child0(ipaddr))
             return val
 
-        devid = next_devid
-        next_devid += 1
-
         script = os.path.join(xroot.network_script_dir,
                               sxp.child_value(config, 'script',
                                               xroot.get_vif_script()))
@@ -62,6 +54,8 @@
                                  xroot.get_vif_bridge())
         mac = sxp.child_value(config, 'mac')
         ipaddr = _get_config_ipaddr(config)
+
+        devid = self.allocateDeviceID()
 
         back = { 'script' : script,
                  'mac' : mac,

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.