def ipxe_script(uuid): try: resource = VirtResource.by_instance_id(uuid) except (NoResultFound, ValueError): raise NotFound404('Instance is not known to Beaker') if resource.kernel_options is None: # recipe.provision() hasn't been called yet # We need to handle this case because the VM is created and boots up # *before* we generate the kickstart etc raise ServiceUnavailable503('Recipe has not been provisioned yet') distro_tree = resource.recipe.distro_tree distro_tree_url = distro_tree.url_in_lab(resource.lab_controller, scheme=['http', 'ftp']) kernel = distro_tree.image_by_type(ImageType.kernel, KernelType.by_name(u'default')) if not kernel: raise BadRequest400('Kernel image not found for distro tree %s' % distro_tree.id) initrd = resource.recipe.distro_tree.image_by_type(ImageType.initrd, KernelType.by_name(u'default')) if not initrd: raise BadRequest400('Initrd image not found for distro tree %s' % distro_tree.id) kernel_url = urlparse.urljoin(distro_tree_url, kernel.path) initrd_url = urlparse.urljoin(distro_tree_url, initrd.path) kernel_options = resource.kernel_options + ' netboot_method=ipxe' return ('#!ipxe\nkernel %s %s\ninitrd %s\nboot\n' % (kernel_url, kernel_options, initrd_url), 200, [('Content-Type', 'text/plain')])
def ipxe_script(uuid): try: resource = VirtResource.by_instance_id(uuid) except (NoResultFound, ValueError): raise NotFound404('Instance is not known to Beaker') if resource.kernel_options is None: # recipe.provision() hasn't been called yet # We need to handle this case because the VM is created and boots up # *before* we generate the kickstart etc raise ServiceUnavailable503('Recipe has not been provisioned yet') distro_tree = resource.recipe.distro_tree distro_tree_url = distro_tree.url_in_lab(resource.lab_controller, scheme=['http', 'ftp']) kernel = distro_tree.image_by_type(ImageType.kernel, KernelType.by_name(u'default')) if not kernel: raise BadRequest400('Kernel image not found for distro tree %s' % distro_tree.id) initrd = resource.recipe.distro_tree.image_by_type( ImageType.initrd, KernelType.by_name(u'default')) if not initrd: raise BadRequest400('Initrd image not found for distro tree %s' % distro_tree.id) kernel_url = urlparse.urljoin(distro_tree_url, kernel.path) initrd_url = urlparse.urljoin(distro_tree_url, initrd.path) kernel_options = resource.kernel_options + ' netboot_method=ipxe' return ('#!ipxe\nkernel %s %s\ninitrd %s\nboot\n' % (kernel_url, kernel_options, initrd_url), 200, [('Content-Type', 'text/plain')])
def create_distro_tree(distro=None, distro_name=None, osmajor=u'DansAwesomeLinux6', osminor=u'9', distro_tags=None, arch=u'i386', variant=u'Server', lab_controllers=None, urls=None, harness_dir=True, osmajor_installopts_arch=None, date_created=None, **kwargs): if distro is None: distro = create_distro(name=distro_name, osmajor=osmajor, osminor=osminor, tags=distro_tags, harness_dir=harness_dir, date_created=date_created) distro_tree = DistroTree.lazy_create(distro=distro, arch=Arch.lazy_create(arch=arch), variant=variant) if date_created is not None: distro_tree.date_created = date_created if distro_tree.arch not in distro.osversion.arches: distro.osversion.arches.append(distro_tree.arch) DistroTreeRepo.lazy_create(distro_tree=distro_tree, repo_id=variant, repo_type=u'variant', path=u'') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.kernel, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/vmlinuz') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.initrd, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/initrd') # make it available in all lab controllers by default if lab_controllers is None: lab_controllers = LabController.query for lc in lab_controllers: add_distro_tree_to_lab(distro_tree, lc, urls=urls) if osmajor_installopts_arch: io = OSMajorInstallOptions.lazy_create( osmajor_id=distro_tree.distro.osversion.osmajor.id, arch_id=distro_tree.arch.id) io.ks_meta = osmajor_installopts_arch.get('ks_meta', '') io.kernel_options = osmajor_installopts_arch.get('kernel_options', '') io.kernel_options_post = osmajor_installopts_arch.get( 'kernel_options_post', '') log.debug('Created distro tree %r', distro_tree) return distro_tree
def test_add_distro_tree(self): self.server.auth.login_password(self.lc.user.user_name, u'logmein') self.server.labcontrollers.add_distro_tree(self.distro_data) with session.begin(): distro = Distro.by_name(u'RHEL-6-U1') self.assertEquals(distro.osversion.osmajor.osmajor, u'RedHatEnterpriseLinux6') self.assertEquals(distro.osversion.osminor, u'1') self.assertEquals(distro.osversion.arches, [Arch.by_name(u'i386'), Arch.by_name(u'x86_64')]) self.assertEquals(distro.date_created, datetime.datetime(2011, 5, 10, 22, 53, 18)) distro_tree = DistroTree.query.filter_by(distro=distro, variant=u'Workstation', arch=Arch.by_name('x86_64')).one() self.assertEquals(distro_tree.date_created, datetime.datetime(2011, 5, 10, 22, 53, 18)) self.assertEquals(distro_tree.url_in_lab(self.lc, scheme='nfs'), 'nfs://example.invalid:/RHEL-6-Workstation/U1/x86_64/os/') self.assertEquals(distro_tree.repo_by_id('Workstation').path, '') self.assertEquals(distro_tree.repo_by_id('ScalableFileSystem').path, 'ScalableFileSystem/') self.assertEquals(distro_tree.repo_by_id('optional').path, '../../optional/x86_64/os/') self.assertEquals(distro_tree.repo_by_id('debuginfo').path, '../debug/') self.assertEquals(distro_tree.image_by_type(ImageType.kernel, KernelType.by_name(u'default')).path, 'images/pxeboot/vmlinuz') self.assertEquals(distro_tree.image_by_type(ImageType.initrd, KernelType.by_name(u'default')).path, 'images/pxeboot/initrd.img') self.assertEquals(distro_tree.activity[0].field_name, u'lab_controller_assocs') self.assertEquals(distro_tree.activity[0].action, u'Added') self.assert_(self.lc.fqdn in distro_tree.activity[0].new_value, distro_tree.activity[0].new_value) del distro, distro_tree # another lab controller adds the same distro tree self.server.auth.login_password(self.lc2.user.user_name, u'logmein') self.server.labcontrollers.add_distro_tree(self.distro_data) with session.begin(): distro = Distro.by_name(u'RHEL-6-U1') distro_tree = DistroTree.query.filter_by(distro=distro, variant=u'Workstation', arch=Arch.by_name('x86_64')).one() self.assertEquals(distro_tree.url_in_lab(self.lc2, scheme='nfs'), 'nfs://example.invalid:/RHEL-6-Workstation/U1/x86_64/os/') self.assertEquals(distro_tree.activity[0].field_name, u'lab_controller_assocs') self.assertEquals(distro_tree.activity[0].action, u'Added') self.assert_(self.lc2.fqdn in distro_tree.activity[0].new_value, distro_tree.activity[0].new_value) del distro, distro_tree
def test_add_distro_tree(self): self.server.auth.login_password(self.lc.user.user_name, u"logmein") self.server.labcontrollers.add_distro_tree(self.distro_data) with session.begin(): distro = Distro.by_name(u"RHEL-6-U1") self.assertEquals(distro.osversion.osmajor.osmajor, u"RedHatEnterpriseLinux6") self.assertEquals(distro.osversion.osminor, u"1") self.assertEquals(distro.osversion.arches, [Arch.by_name(u"i386"), Arch.by_name(u"x86_64")]) self.assertEquals(distro.date_created, datetime.datetime(2011, 5, 10, 22, 53, 18)) distro_tree = DistroTree.query.filter_by( distro=distro, variant=u"Workstation", arch=Arch.by_name("x86_64") ).one() self.assertEquals(distro_tree.date_created, datetime.datetime(2011, 5, 10, 22, 53, 18)) self.assertEquals( distro_tree.url_in_lab(self.lc, scheme="nfs"), "nfs://example.invalid:/RHEL-6-Workstation/U1/x86_64/os/" ) self.assertEquals(distro_tree.repo_by_id("Workstation").path, "") self.assertEquals(distro_tree.repo_by_id("ScalableFileSystem").path, "ScalableFileSystem/") self.assertEquals(distro_tree.repo_by_id("optional").path, "../../optional/x86_64/os/") self.assertEquals(distro_tree.repo_by_id("debuginfo").path, "../debug/") self.assertEquals( distro_tree.image_by_type(ImageType.kernel, KernelType.by_name(u"default")).path, "images/pxeboot/vmlinuz", ) self.assertEquals( distro_tree.image_by_type(ImageType.initrd, KernelType.by_name(u"default")).path, "images/pxeboot/initrd.img", ) self.assertEquals(distro_tree.activity[0].field_name, u"lab_controller_assocs") self.assertEquals(distro_tree.activity[0].action, u"Added") self.assert_(self.lc.fqdn in distro_tree.activity[0].new_value, distro_tree.activity[0].new_value) del distro, distro_tree # another lab controller adds the same distro tree self.server.auth.login_password(self.lc2.user.user_name, u"logmein") self.server.labcontrollers.add_distro_tree(self.distro_data) with session.begin(): distro = Distro.by_name(u"RHEL-6-U1") distro_tree = DistroTree.query.filter_by( distro=distro, variant=u"Workstation", arch=Arch.by_name("x86_64") ).one() self.assertEquals( distro_tree.url_in_lab(self.lc2, scheme="nfs"), "nfs://example.invalid:/RHEL-6-Workstation/U1/x86_64/os/", ) self.assertEquals(distro_tree.activity[0].field_name, u"lab_controller_assocs") self.assertEquals(distro_tree.activity[0].action, u"Added") self.assert_(self.lc2.fqdn in distro_tree.activity[0].new_value, distro_tree.activity[0].new_value) del distro, distro_tree
def test_creating_a_system_with_hardware_essentials(self): s = requests.Session() s.post(get_server_base() + 'login', data={ 'user_name': self.user.user_name, 'password': u'password' }).raise_for_status() fqdn = data_setup.unique_name(u'newsystem%s') data = { 'fqdn': fqdn, 'lab_controller_id': self.lc.id, 'arches': [u'i386', u'x86_64'], 'location': u'dummylocation', 'lender': u'dummylender', 'kernel_type': u'highbank' } response = post_json(get_server_base() + 'systems/', session=s, data=data) with session.begin(): system = System.by_fqdn(fqdn, self.user) self.assertEquals(system.fqdn, fqdn) self.assertEquals(system.lab_controller_id, self.lc.id) self.assertTrue(Arch.by_name(u'i386') in system.arch) self.assertTrue(Arch.by_name(u'x86_64') in system.arch) self.assertEquals(system.location, u'dummylocation') self.assertEquals(system.lender, u'dummylender') self.assertEquals(system.kernel_type, KernelType.by_name(u'highbank'))
def create_system(arch=u'i386', type=SystemType.machine, status=SystemStatus.automated, owner=None, fqdn=None, shared=True, exclude_osmajor=[], exclude_osversion=[], hypervisor=None, kernel_type=None, date_added=None, **kw): if owner is None: owner = create_user() if fqdn is None: fqdn = unique_name(u'system%s.testdata') if System.query.filter(System.fqdn == fqdn).count(): raise ValueError('Attempted to create duplicate system %s' % fqdn) system = System(fqdn=fqdn,type=type, owner=owner, status=status, **kw) if date_added is not None: system.date_added = date_added system.shared = shared system.arch.append(Arch.by_name(arch)) configure_system_power(system) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(arch), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(arch), osversion=osversion) for osversion in exclude_osversion) if hypervisor: system.hypervisor = Hypervisor.by_name(hypervisor) if kernel_type: system.kernel_type = KernelType.by_name(kernel_type) system.date_modified = datetime.datetime.utcnow() log.debug('Created system %r', system) return system
def create_distro_tree(distro=None, distro_name=None, osmajor=u'DansAwesomeLinux6', osminor=u'9', distro_tags=None, arch=u'i386', variant=u'Server', lab_controllers=None, urls=None, harness_dir=True, osmajor_installopts_arch=None): if distro is None: distro = create_distro(name=distro_name, osmajor=osmajor, osminor=osminor, tags=distro_tags, harness_dir=harness_dir) distro_tree = DistroTree.lazy_create(distro=distro, arch=Arch.lazy_create(arch=arch), variant=variant) if distro_tree.arch not in distro.osversion.arches: distro.osversion.arches.append(distro_tree.arch) DistroTreeRepo.lazy_create(distro_tree=distro_tree, repo_id=variant, repo_type=u'variant', path=u'') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.kernel, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/vmlinuz') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.initrd, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/initrd') existing_urls = [lc_distro_tree.url for lc_distro_tree in distro_tree.lab_controller_assocs] # make it available in all lab controllers by default if lab_controllers is None: lab_controllers = LabController.query for lc in lab_controllers: default_urls = [u'%s://%s%s/distros/%s/%s/%s/os/' % (scheme, lc.fqdn, scheme == 'nfs' and ':' or '', distro_tree.distro.name, distro_tree.variant, distro_tree.arch.arch) for scheme in ['nfs', 'http', 'ftp']] for url in (urls or default_urls): if url in existing_urls: break lab_controller_distro_tree = LabControllerDistroTree( lab_controller=lc, url=url) distro_tree.lab_controller_assocs.append(lab_controller_distro_tree) if osmajor_installopts_arch: io = OSMajorInstallOptions.lazy_create(osmajor_id=distro_tree.distro.osversion.osmajor.id, arch_id=distro_tree.arch.id) io.ks_meta = osmajor_installopts_arch.get('ks_meta', '') io.kernel_options = osmajor_installopts_arch.get('kernel_options', '') io.kernel_options_post = osmajor_installopts_arch.get('kernel_options_post', '') log.debug('Created distro tree %r', distro_tree) return distro_tree
def create_system(arch=u'i386', type=SystemType.machine, status=None, owner=None, fqdn=None, shared=True, exclude_osmajor=[], exclude_osversion=[], hypervisor=None, kernel_type=None, date_added=None, return_existing=False, private=False, with_power=True, lab_controller=None, **kw): if owner is None: owner = create_user() if fqdn is None: name = get_test_name() fqdn = unique_name(u'system%s.' + name.replace('_', '.')) if status is None: status = SystemStatus.automated if lab_controller is not None else SystemStatus.manual if System.query.filter(System.fqdn == fqdn).count(): if return_existing: system = System.query.filter(System.fqdn == fqdn).first() for property, value in kw.iteritems(): setattr(system, property, value) else: raise ValueError('Attempted to create duplicate system %s' % fqdn) else: system = System(fqdn=fqdn,type=type, owner=owner, status=status, lab_controller=lab_controller, **kw) session.add(system) if date_added is not None: system.date_added = date_added system.custom_access_policy = SystemAccessPolicy() if not private: system.custom_access_policy.add_rule(SystemPermission.view, everybody=True) if shared: system.custom_access_policy.add_rule( permission=SystemPermission.reserve, everybody=True) if isinstance(arch, list): for a in arch: system.arch.append(Arch.by_name(a)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(a), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(a), osversion=osversion) for osversion in exclude_osversion) else: system.arch.append(Arch.by_name(arch)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(arch), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(arch), osversion=osversion) for osversion in exclude_osversion) if with_power: configure_system_power(system) if hypervisor: system.hypervisor = Hypervisor.by_name(hypervisor) if kernel_type: system.kernel_type = KernelType.by_name(kernel_type) system.date_modified = datetime.datetime.utcnow() log.debug('Created system %r', system) return system
def create_system(arch=u'i386', type=SystemType.machine, status=SystemStatus.automated, owner=None, fqdn=None, shared=True, exclude_osmajor=[], exclude_osversion=[], hypervisor=None, kernel_type=None, date_added=None, return_existing=False, private=False, with_power=True, **kw): if owner is None: owner = create_user() if fqdn is None: fqdn = unique_name(u'system%s.testdata') if System.query.filter(System.fqdn == fqdn).count(): if return_existing: system = System.query.filter(System.fqdn == fqdn).first() for property, value in kw.iteritems(): setattr(system, property, value) else: raise ValueError('Attempted to create duplicate system %s' % fqdn) else: system = System(fqdn=fqdn,type=type, owner=owner, status=status, **kw) session.add(system) if date_added is not None: system.date_added = date_added system.custom_access_policy = SystemAccessPolicy() if not private: system.custom_access_policy.add_rule(SystemPermission.view, everybody=True) if shared: system.custom_access_policy.add_rule( permission=SystemPermission.reserve, everybody=True) if isinstance(arch, list): for a in arch: system.arch.append(Arch.by_name(a)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(a), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(a), osversion=osversion) for osversion in exclude_osversion) else: system.arch.append(Arch.by_name(arch)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(arch), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(arch), osversion=osversion) for osversion in exclude_osversion) if with_power: configure_system_power(system) if hypervisor: system.hypervisor = Hypervisor.by_name(hypervisor) if kernel_type: system.kernel_type = KernelType.by_name(kernel_type) system.date_modified = datetime.datetime.utcnow() log.debug('Created system %r', system) return system
def create_distro_tree(distro=None, distro_name=None, osmajor=u'DansAwesomeLinux6', osminor=u'9', distro_tags=None, arch=u'i386', variant=u'Server', lab_controllers=None, urls=None, harness_dir=True): if distro is None: distro = create_distro(name=distro_name, osmajor=osmajor, osminor=osminor, tags=distro_tags, harness_dir=harness_dir) distro_tree = DistroTree.lazy_create(distro=distro, arch=Arch.lazy_create(arch=arch), variant=variant) if distro_tree.arch not in distro.osversion.arches: distro.osversion.arches.append(distro_tree.arch) DistroTreeRepo.lazy_create(distro_tree=distro_tree, repo_id=variant, repo_type=u'variant', path=u'') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.kernel, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/vmlinuz') DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=ImageType.initrd, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/initrd') existing_urls = [lc_distro_tree.url for lc_distro_tree in distro_tree.lab_controller_assocs] # make it available in all lab controllers by default if lab_controllers is None: lab_controllers = LabController.query for lc in lab_controllers: default_urls = [u'%s://%s%s/distros/%s/%s/%s/os/' % (scheme, lc.fqdn, scheme == 'nfs' and ':' or '', distro_tree.distro.name, distro_tree.variant, distro_tree.arch.arch) for scheme in ['nfs', 'http', 'ftp']] for url in (urls or default_urls): if url in existing_urls: break lab_controller_distro_tree = LabControllerDistroTree( lab_controller=lc, url=url) distro_tree.lab_controller_assocs.append(lab_controller_distro_tree) log.debug('Created distro tree %r', distro_tree) return distro_tree
def create_distro_tree(distro=None, distro_name=None, osmajor=u'DansAwesomeLinux6', osminor=u'9', distro_tags=None, arch=u'i386', variant=u'Server', lab_controllers=None, urls=None, harness_dir=True, osmajor_installopts_arch=None, date_created=None, **kwargs): if distro is None: distro = create_distro(name=distro_name, osmajor=osmajor, osminor=osminor, tags=distro_tags, harness_dir=harness_dir, date_created=date_created) distro_tree = DistroTree(distro=distro, arch=Arch.lazy_create(arch=arch), variant=variant) if date_created is not None: distro_tree.date_created = date_created if distro_tree.arch not in distro.osversion.arches: distro.osversion.arches.append(distro_tree.arch) distro_tree.repos.append(DistroTreeRepo(repo_id=variant, repo_type=u'variant', path=u'')) distro_tree.images.append(DistroTreeImage( image_type=ImageType.kernel, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/vmlinuz')) distro_tree.images.append(DistroTreeImage( image_type=ImageType.initrd, kernel_type=KernelType.by_name(u'default'), path=u'pxeboot/initrd')) session.flush() # to get an id # make it available in all lab controllers by default if lab_controllers is None: lab_controllers = LabController.query for lc in lab_controllers: add_distro_tree_to_lab(distro_tree, lc, urls=urls) if osmajor_installopts_arch: io = OSMajorInstallOptions.lazy_create(osmajor_id=distro_tree.distro.osversion.osmajor.id, arch_id=distro_tree.arch.id) io.ks_meta = osmajor_installopts_arch.get('ks_meta', '') io.kernel_options = osmajor_installopts_arch.get('kernel_options', '') io.kernel_options_post = osmajor_installopts_arch.get('kernel_options_post', '') log.debug('Created distro tree %r', distro_tree) return distro_tree
def test_creating_a_system_with_hardware_essentials(self): s = requests.Session() s.post(get_server_base() + 'login', data={'user_name': self.user.user_name, 'password': u'password'}).raise_for_status() fqdn = data_setup.unique_name(u'newsystem%s') data = { 'fqdn': fqdn, 'lab_controller_id': self.lc.id, 'arches': [u'i386', u'x86_64'], 'location': u'dummylocation', 'lender': u'dummylender', 'kernel_type': u'highbank' } response = post_json(get_server_base() + 'systems/', session=s, data=data) with session.begin(): system = System.by_fqdn(fqdn, self.user) self.assertEquals(system.fqdn, fqdn) self.assertEquals(system.lab_controller_id, self.lc.id) self.assertTrue(Arch.by_name(u'i386') in system.arch) self.assertTrue(Arch.by_name(u'x86_64') in system.arch) self.assertEquals(system.location, u'dummylocation') self.assertEquals(system.lender, u'dummylender') self.assertEquals(system.kernel_type, KernelType.by_name(u'highbank'))
def create_system(arch=u'i386', type=SystemType.machine, status=None, owner=None, fqdn=None, shared=True, exclude_osmajor=[], exclude_osversion=[], hypervisor=None, kernel_type=None, date_added=None, return_existing=False, private=False, with_power=True, lab_controller=None, **kw): if owner is None: owner = create_user() if fqdn is None: name = get_test_name() fqdn = unique_name(u'system%s.' + name.replace('_', '.')) if status is None: status = SystemStatus.automated if lab_controller is not None else SystemStatus.manual if System.query.filter(System.fqdn == fqdn).count(): if return_existing: system = System.query.filter(System.fqdn == fqdn).first() for property, value in kw.iteritems(): setattr(system, property, value) else: raise ValueError('Attempted to create duplicate system %s' % fqdn) else: system = System(fqdn=fqdn,type=type, owner=owner, status=status, lab_controller=lab_controller, **kw) session.add(system) # Normally the system would be "idle" when first added, and then becomes # "pending" when a user flips it to Automated status. But for simplicity in # the tests, we will just force it back to "idle" here since we know we # just created it. This lets a subsequent call to the scheduler pick it up # immediately, without going through an iteration of # schedule_pending_systems() first. system.scheduler_status = SystemSchedulerStatus.idle if date_added is not None: system.date_added = date_added system.custom_access_policy = SystemAccessPolicy() if not private: system.custom_access_policy.add_rule(SystemPermission.view, everybody=True) if shared: system.custom_access_policy.add_rule( permission=SystemPermission.reserve, everybody=True) if isinstance(arch, list): for a in arch: system.arch.append(Arch.by_name(a)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(a), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(a), osversion=osversion) for osversion in exclude_osversion) elif arch is not None: system.arch.append(Arch.by_name(arch)) system.excluded_osmajor.extend(ExcludeOSMajor(arch=Arch.by_name(arch), osmajor=osmajor) for osmajor in exclude_osmajor) system.excluded_osversion.extend(ExcludeOSVersion(arch=Arch.by_name(arch), osversion=osversion) for osversion in exclude_osversion) if with_power: configure_system_power(system) if hypervisor: system.hypervisor = Hypervisor.by_name(hypervisor) if kernel_type: system.kernel_type = KernelType.by_name(kernel_type) system.date_modified = datetime.datetime.utcnow() log.debug('Created system %r', system) return system
def add_distro_tree(self, new_distro): lab_controller = identity.current.user.lab_controller variant = new_distro.get('variant') arch = Arch.lazy_create(arch=new_distro['arch']) osmajor = OSMajor.lazy_create(osmajor=new_distro['osmajor']) try: osmajor = OSMajor.by_alias(new_distro['osmajor']) except NoResultFound: pass else: raise BX( _('Cannot import distro as %s: it is configured as an alias for %s' % (new_distro['osmajor'], osmajor.osmajor))) osversion = OSVersion.lazy_create(osmajor=osmajor, osminor=new_distro['osminor']) if 'arches' in new_distro: for arch_name in new_distro['arches']: osversion.add_arch(Arch.lazy_create(arch=arch_name)) osversion.add_arch(arch) distro = Distro.lazy_create(name=new_distro['name'], osversion=osversion) # Automatically tag the distro if tags exists if 'tags' in new_distro: for tag in new_distro['tags']: distro.add_tag(tag) distro.date_created = datetime.utcfromtimestamp( float(new_distro['tree_build_time'])) distro_tree = DistroTree.lazy_create(distro=distro, variant=variant, arch=arch) distro_tree.date_created = datetime.utcfromtimestamp( float(new_distro['tree_build_time'])) if 'repos' in new_distro: for repo in new_distro['repos']: dtr = DistroTreeRepo.lazy_create(distro_tree=distro_tree, repo_id=repo['repoid'], repo_type=repo['type'], path=repo['path']) if 'kernel_options' in new_distro: distro_tree.kernel_options = new_distro['kernel_options'] if 'kernel_options_post' in new_distro: distro_tree.kernel_options_post = new_distro['kernel_options_post'] if 'ks_meta' in new_distro: distro_tree.ks_meta = new_distro['ks_meta'] if 'images' in new_distro: for image in new_distro['images']: try: image_type = ImageType.from_string(image['type']) except ValueError: continue # ignore if 'kernel_type' not in image: image['kernel_type'] = 'default' try: kernel_type = KernelType.by_name(image['kernel_type']) except ValueError: continue # ignore dti = DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=image_type, kernel_type=kernel_type, path=image['path']) DistroTrees.add_distro_urls(distro_tree, lab_controller, new_distro['urls']) return distro_tree.id
def add_distro_tree(self, new_distro): lab_controller = identity.current.user.lab_controller # osmajor is required if 'osmajor' in new_distro: osmajor = OSMajor.lazy_create(osmajor=new_distro['osmajor']) else: return '' if 'osminor' in new_distro: osversion = OSVersion.lazy_create(osmajor=osmajor, osminor=new_distro['osminor']) else: return '' if 'arches' in new_distro: for arch_name in new_distro['arches']: try: arch = Arch.by_name(arch_name) if arch not in osversion.arches: osversion.arches.append(arch) except NoResultFound: pass distro = Distro.lazy_create(name=new_distro['name'], osversion=osversion) arch = Arch.lazy_create(arch=new_distro['arch']) variant = new_distro.get('variant') distro_tree = DistroTree.lazy_create(distro=distro, variant=variant, arch=arch) # Automatically tag the distro if tags exists if 'tags' in new_distro: for tag in new_distro['tags']: if tag not in distro.tags: distro.tags.append(tag) if arch not in distro.osversion.arches: distro.osversion.arches.append(arch) distro_tree.date_created = datetime.utcfromtimestamp(float(new_distro['tree_build_time'])) distro.date_created = datetime.utcfromtimestamp(float(new_distro['tree_build_time'])) if 'repos' in new_distro: for repo in new_distro['repos']: dtr = distro_tree.repo_by_id(repo['repoid']) if dtr is None: dtr = DistroTreeRepo(repo_id=repo['repoid']) distro_tree.repos.append(dtr) dtr.repo_type = repo['type'] dtr.path = repo['path'] if 'kernel_options' in new_distro: distro_tree.kernel_options = new_distro['kernel_options'] if 'kernel_options_post' in new_distro: distro_tree.kernel_options_post = new_distro['kernel_options_post'] if 'ks_meta' in new_distro: distro_tree.ks_meta = new_distro['ks_meta'] if 'images' in new_distro: for image in new_distro['images']: try: image_type = ImageType.from_string(image['type']) except ValueError: continue # ignore if 'kernel_type' not in image: image['kernel_type'] = 'default' try: kernel_type = KernelType.by_name(image['kernel_type']) except NoResultFound: continue # ignore dti = distro_tree.image_by_type(image_type, kernel_type) if dti is None: dti = DistroTreeImage(image_type=image_type, kernel_type=kernel_type) distro_tree.images.append(dti) dti.path = image['path'] new_urls_by_scheme = dict((urlparse.urlparse(url).scheme, url) for url in new_distro['urls']) if None in new_urls_by_scheme: raise ValueError('URL %r is not absolute' % new_urls_by_scheme[None]) for lca in distro_tree.lab_controller_assocs: if lca.lab_controller == lab_controller: scheme = urlparse.urlparse(lca.url).scheme new_url = new_urls_by_scheme.pop(scheme, None) if new_url != None and lca.url != new_url: distro_tree.activity.append(DistroTreeActivity( user=identity.current.user, service=u'XMLRPC', action=u'Changed', field_name=u'lab_controller_assocs', old_value=u'%s %s' % (lca.lab_controller, lca.url), new_value=u'%s %s' % (lca.lab_controller, new_url))) lca.url = new_url for url in new_urls_by_scheme.values(): distro_tree.lab_controller_assocs.append(LabControllerDistroTree( lab_controller=lab_controller, url=url)) distro_tree.activity.append(DistroTreeActivity( user=identity.current.user, service=u'XMLRPC', action=u'Added', field_name=u'lab_controller_assocs', old_value=None, new_value=u'%s %s' % (lab_controller, url))) return distro_tree.id
def update_system(fqdn): system = _get_system_by_FQDN(fqdn) if not system.can_edit(identity.current.user): raise Forbidden403('Cannot edit system') data = read_json_request(request) # helper for recording activity below def record_activity(field, old, new, action=u'Changed'): system.record_activity(user=identity.current.user, service=u'HTTP', action=action, field=field, old=old, new=new) with convert_internal_errors(): # XXX what a nightmare... need to use a validation/conversion library, # and maybe simplify/relocate the activity recording stuff somehow changed = False renamed = False if 'fqdn' in data: new_fqdn = data['fqdn'].lower() if new_fqdn != system.fqdn: if System.query.filter(System.fqdn == new_fqdn).count(): raise Conflict409('System %s already exists' % new_fqdn) record_activity(u'FQDN', system.fqdn, new_fqdn) system.fqdn = new_fqdn changed = True renamed = True if 'owner' in data and data['owner'].get('user_name') != system.owner.user_name: if not system.can_change_owner(identity.current.user): raise Forbidden403('Cannot change owner') new_owner = User.by_user_name(data['owner'].get('user_name')) if new_owner is None: raise BadRequest400('No such user %s' % data['owner'].get('user_name')) record_activity(u'Owner', system.owner, new_owner) system.owner = new_owner changed = True if 'status' in data: new_status = SystemStatus.from_string(data['status']) if new_status != system.status: record_activity(u'Status', system.status, new_status) system.status = new_status if not new_status.bad and system.status_reason: # clear the status reason for "good" statuses record_activity(u'Status Reason', system.status_reason, None) system.status_reason = None changed = True if 'status_reason' in data: new_reason = data['status_reason'] or None if new_reason and not system.status.bad: raise ValueError('Cannot set status reason when status is %s' % system.status) if new_reason != system.status_reason: record_activity(u'Status Reason', system.status_reason, new_reason) system.status_reason = new_reason changed = True if 'type' in data: new_type = SystemType.from_string(data['type']) if new_type != system.type: record_activity(u'Type', system.type, new_type) system.type = new_type changed = True if 'arches' in data: new_arches = [Arch.by_name(a) for a in (data['arches'] or [])] added_arches = set(new_arches).difference(system.arch) removed_arches = set(system.arch).difference(new_arches) if added_arches or removed_arches: for added_arch in added_arches: record_activity(u'Arch', None, added_arch, u'Added') for removed_arch in removed_arches: record_activity(u'Arch', removed_arch, None, u'Removed') system.arch[:] = new_arches changed = True if 'lab_controller_id' in data: if data['lab_controller_id']: new_lc = LabController.by_id(data['lab_controller_id']) else: new_lc = None if new_lc != system.lab_controller: if system.open_reservation is not None: raise Conflict409('Unable to change lab controller while system ' 'is in use (return the system first)') record_activity(u'Lab Controller', system.lab_controller, new_lc) system.lab_controller = new_lc changed = True # If we're given any power-related keys, need to ensure system.power exists if not system.power and set(['power_type', 'power_address', 'power_user', 'power_password', 'power_id', 'power_quiescent_period'])\ .intersection(data.keys()): system.power = Power() if 'power_type' in data: new_power_type = PowerType.by_name(data['power_type']) if new_power_type != system.power.power_type: if not system.power.power_type: old_power_type = '' else: old_power_type = system.power.power_type.name record_activity(u'power_type', old_power_type, new_power_type.name) system.power.power_type = new_power_type changed = True if 'power_address' in data: new_power_address = data['power_address'] if not new_power_address: raise ValueError('Power address is required') if new_power_address != system.power.power_address: record_activity(u'power_address', system.power.power_address, data['power_address']) system.power.power_address = new_power_address changed = True if 'power_user' in data: new_power_user = data['power_user'] or u'' if new_power_user != (system.power.power_user or u''): record_activity(u'power_user', u'********', u'********') system.power.power_user = new_power_user changed = True if 'power_password' in data: new_power_password = data['power_password'] or u'' if new_power_password != (system.power.power_passwd or u''): record_activity(u'power_passwd', u'********', u'********') system.power.power_passwd = new_power_password changed = True if 'power_id' in data: new_power_id = data['power_id'] or u'' if new_power_id != (system.power.power_id or u''): record_activity(u'power_id', system.power.power_id, new_power_id) system.power.power_id = new_power_id changed = True if 'power_quiescent_period' in data: new_qp = int(data['power_quiescent_period']) if new_qp != system.power.power_quiescent_period: record_activity(u'power_quiescent_period', system.power.power_quiescent_period, new_qp) system.power.power_quiescent_period = new_qp changed = True if 'release_action' in data: new_release_action = ReleaseAction.from_string(data['release_action']) if new_release_action != (system.release_action or ReleaseAction.power_off): record_activity(u'release_action', (system.release_action or ReleaseAction.power_off), new_release_action) system.release_action = new_release_action changed = True if 'reprovision_distro_tree' in data: if (not data['reprovision_distro_tree'] or 'id' not in data['reprovision_distro_tree']): new_rpdt = None else: new_rpdt = DistroTree.by_id(data['reprovision_distro_tree']['id']) if new_rpdt != system.reprovision_distro_tree: record_activity(u'reprovision_distro_tree', unicode(system.reprovision_distro_tree), unicode(new_rpdt)) system.reprovision_distro_tree = new_rpdt changed = True if 'location' in data: new_location = data['location'] or None if new_location != system.location: record_activity(u'Location', system.location, new_location) system.location = new_location changed = True if 'lender' in data: new_lender = data['lender'] or None if new_lender != system.lender: record_activity(u'Lender', system.lender, new_lender) system.lender = new_lender changed = True if 'kernel_type' in data: new_kernel_type = KernelType.by_name(data['kernel_type']) if new_kernel_type != system.kernel_type: record_activity(u'Kernel Type', system.kernel_type, new_kernel_type) system.kernel_type = new_kernel_type changed = True if 'hypervisor' in data: if data['hypervisor']: new_hypervisor = Hypervisor.by_name(data['hypervisor']) else: new_hypervisor = None if new_hypervisor != system.hypervisor: record_activity(u'Hypervisor', system.hypervisor, new_hypervisor) system.hypervisor = new_hypervisor changed = True if 'vendor' in data: new_vendor = data['vendor'] or None if new_vendor != system.vendor: record_activity(u'Vendor', system.vendor, new_vendor) system.vendor = new_vendor changed = True if 'model' in data: new_model = data['model'] or None if new_model != system.model: record_activity(u'Model', system.model, new_model) system.model = new_model changed = True if 'serial_number' in data: new_serial_number = data['serial_number'] or None if new_serial_number != system.serial: record_activity(u'Serial Number', system.serial, new_serial_number) system.serial = new_serial_number changed = True if 'mac_address' in data: new_mac_address = data['mac_address'] or None if new_mac_address != system.mac_address: record_activity(u'MAC Address', system.mac_address, new_mac_address) system.mac_address = new_mac_address changed = True if 'memory' in data: new_memory = int(data['memory']) if data['memory'] else None if new_memory != system.memory: record_activity(u'Memory', system.memory, new_memory) system.memory = new_memory changed = True if 'numa_nodes' in data: new_numa_nodes = int(data['numa_nodes']) if data['numa_nodes'] else None if not system.numa: system.numa = Numa() if new_numa_nodes != system.numa.nodes: record_activity(u'NUMA/Nodes', system.numa.nodes, new_numa_nodes) system.numa.nodes = new_numa_nodes changed = True if changed: # XXX clear checksum!? system.date_modified = datetime.datetime.utcnow() response = jsonify(system.__json__()) if renamed: response.headers.add('Location', url('/view/%s' % system.fqdn)) return response
def add_distro_tree(self, new_distro): lab_controller = identity.current.user.lab_controller variant = new_distro.get('variant') arch = Arch.lazy_create(arch=new_distro['arch']) osmajor = OSMajor.lazy_create(osmajor=new_distro['osmajor']) try: osmajor = OSMajor.by_alias(new_distro['osmajor']) except NoResultFound: pass else: raise BX( _('Cannot import distro as %s: it is configured as an alias for %s' % (new_distro['osmajor'], osmajor.osmajor))) osversion = OSVersion.lazy_create(osmajor=osmajor, osminor=new_distro['osminor']) if 'arches' in new_distro: for arch_name in new_distro['arches']: osversion.add_arch(Arch.lazy_create(arch=arch_name)) osversion.add_arch(arch) distro = Distro.lazy_create(name=new_distro['name'], osversion=osversion) # Automatically tag the distro if tags exists if 'tags' in new_distro: for tag in new_distro['tags']: distro.add_tag(tag) distro.date_created = datetime.utcfromtimestamp( float(new_distro['tree_build_time'])) distro_tree = DistroTree.lazy_create(distro=distro, variant=variant, arch=arch) distro_tree.date_created = datetime.utcfromtimestamp( float(new_distro['tree_build_time'])) if 'repos' in new_distro: for repo in new_distro['repos']: dtr = DistroTreeRepo.lazy_create(distro_tree=distro_tree, repo_id=repo['repoid'], repo_type=repo['type'], path=repo['path']) if 'kernel_options' in new_distro: distro_tree.kernel_options = new_distro['kernel_options'] if 'kernel_options_post' in new_distro: distro_tree.kernel_options_post = new_distro['kernel_options_post'] if 'ks_meta' in new_distro: distro_tree.ks_meta = new_distro['ks_meta'] if 'images' in new_distro: for image in new_distro['images']: try: image_type = ImageType.from_string(image['type']) except ValueError: continue # ignore if 'kernel_type' not in image: image['kernel_type'] = 'default' try: kernel_type = KernelType.by_name(image['kernel_type']) except ValueError: continue # ignore dti = DistroTreeImage.lazy_create(distro_tree=distro_tree, image_type=image_type, kernel_type=kernel_type, path=image['path']) new_urls_by_scheme = dict( (urlparse.urlparse(url).scheme, url) for url in new_distro['urls']) if None in new_urls_by_scheme: raise ValueError('URL %r is not absolute' % new_urls_by_scheme[None]) for lca in distro_tree.lab_controller_assocs: if lca.lab_controller == lab_controller: scheme = urlparse.urlparse(lca.url).scheme new_url = new_urls_by_scheme.pop(scheme, None) if new_url != None and lca.url != new_url: distro_tree.activity.append( DistroTreeActivity(user=identity.current.user, service=u'XMLRPC', action=u'Changed', field_name=u'lab_controller_assocs', old_value=u'%s %s' % (lca.lab_controller, lca.url), new_value=u'%s %s' % (lca.lab_controller, new_url))) lca.url = new_url for url in new_urls_by_scheme.values(): distro_tree.lab_controller_assocs.append( LabControllerDistroTree(lab_controller=lab_controller, url=url)) distro_tree.activity.append( DistroTreeActivity(user=identity.current.user, service=u'XMLRPC', action=u'Added', field_name=u'lab_controller_assocs', old_value=None, new_value=u'%s %s' % (lab_controller, url))) return distro_tree.id
def update_system(fqdn): system = _get_system_by_FQDN(fqdn) if not system.can_edit(identity.current.user): raise Forbidden403('Cannot edit system') data = read_json_request(request) # helper for recording activity below def record_activity(field, old, new, action=u'Changed'): system.record_activity(user=identity.current.user, service=u'HTTP', action=action, field=field, old=old, new=new) with convert_internal_errors(): # XXX what a nightmare... need to use a validation/conversion library, # and maybe simplify/relocate the activity recording stuff somehow changed = False renamed = False if 'fqdn' in data: new_fqdn = data['fqdn'].lower() if new_fqdn != system.fqdn: if System.query.filter(System.fqdn == new_fqdn).count(): raise Conflict409('System %s already exists' % new_fqdn) record_activity(u'FQDN', system.fqdn, new_fqdn) system.fqdn = new_fqdn changed = True renamed = True if 'owner' in data and data['owner'].get( 'user_name') != system.owner.user_name: if not system.can_change_owner(identity.current.user): raise Forbidden403('Cannot change owner') new_owner = User.by_user_name(data['owner'].get('user_name')) if new_owner is None: raise BadRequest400('No such user %s' % data['owner'].get('user_name')) record_activity(u'Owner', system.owner, new_owner) system.owner = new_owner changed = True if 'status' in data: new_status = SystemStatus.from_string(data['status']) if new_status != system.status: record_activity(u'Status', system.status, new_status) system.status = new_status if not new_status.bad and system.status_reason: # clear the status reason for "good" statuses record_activity(u'Status Reason', system.status_reason, None) system.status_reason = None changed = True if 'status_reason' in data: new_reason = data['status_reason'] or None if new_reason and not system.status.bad: raise ValueError('Cannot set status reason when status is %s' % system.status) if new_reason != system.status_reason: record_activity(u'Status Reason', system.status_reason, new_reason) system.status_reason = new_reason changed = True if 'type' in data: new_type = SystemType.from_string(data['type']) if new_type != system.type: record_activity(u'Type', system.type, new_type) system.type = new_type changed = True if 'arches' in data: new_arches = [Arch.by_name(a) for a in (data['arches'] or [])] added_arches = set(new_arches).difference(system.arch) removed_arches = set(system.arch).difference(new_arches) if added_arches or removed_arches: for added_arch in added_arches: record_activity(u'Arch', None, added_arch, u'Added') for removed_arch in removed_arches: record_activity(u'Arch', removed_arch, None, u'Removed') system.arch[:] = new_arches changed = True if 'lab_controller_id' in data: if data['lab_controller_id']: new_lc = LabController.by_id(data['lab_controller_id']) else: new_lc = None if new_lc != system.lab_controller: if system.open_reservation is not None: raise Conflict409( 'Unable to change lab controller while system ' 'is in use (return the system first)') record_activity(u'Lab Controller', system.lab_controller, new_lc) system.lab_controller = new_lc changed = True # If we're given any power-related keys, need to ensure system.power exists if not system.power and set(['power_type', 'power_address', 'power_user', 'power_password', 'power_id', 'power_quiescent_period'])\ .intersection(data.keys()): system.power = Power() if 'power_type' in data: new_power_type = PowerType.by_name(data['power_type']) if new_power_type != system.power.power_type: if not system.power.power_type: old_power_type = '' else: old_power_type = system.power.power_type.name record_activity(u'power_type', old_power_type, new_power_type.name) system.power.power_type = new_power_type changed = True if 'power_address' in data: new_power_address = data['power_address'] if not new_power_address: raise ValueError('Power address is required') if new_power_address != system.power.power_address: record_activity(u'power_address', system.power.power_address, data['power_address']) system.power.power_address = new_power_address changed = True if 'power_user' in data: new_power_user = data['power_user'] or u'' if new_power_user != (system.power.power_user or u''): record_activity(u'power_user', u'********', u'********') system.power.power_user = new_power_user changed = True if 'power_password' in data: new_power_password = data['power_password'] or u'' if new_power_password != (system.power.power_passwd or u''): record_activity(u'power_passwd', u'********', u'********') system.power.power_passwd = new_power_password changed = True if 'power_id' in data: new_power_id = data['power_id'] or u'' if new_power_id != (system.power.power_id or u''): record_activity(u'power_id', system.power.power_id, new_power_id) system.power.power_id = new_power_id changed = True if 'power_quiescent_period' in data: new_qp = int(data['power_quiescent_period']) if new_qp != system.power.power_quiescent_period: record_activity(u'power_quiescent_period', system.power.power_quiescent_period, new_qp) system.power.power_quiescent_period = new_qp changed = True if 'release_action' in data: new_release_action = ReleaseAction.from_string( data['release_action']) if new_release_action != (system.release_action or ReleaseAction.power_off): record_activity( u'release_action', (system.release_action or ReleaseAction.power_off), new_release_action) system.release_action = new_release_action changed = True if 'reprovision_distro_tree' in data: if (not data['reprovision_distro_tree'] or 'id' not in data['reprovision_distro_tree']): new_rpdt = None else: new_rpdt = DistroTree.by_id( data['reprovision_distro_tree']['id']) if new_rpdt != system.reprovision_distro_tree: record_activity(u'reprovision_distro_tree', unicode(system.reprovision_distro_tree), unicode(new_rpdt)) system.reprovision_distro_tree = new_rpdt changed = True if 'location' in data: new_location = data['location'] or None if new_location != system.location: record_activity(u'Location', system.location, new_location) system.location = new_location changed = True if 'lender' in data: new_lender = data['lender'] or None if new_lender != system.lender: record_activity(u'Lender', system.lender, new_lender) system.lender = new_lender changed = True if 'kernel_type' in data: new_kernel_type = KernelType.by_name(data['kernel_type']) if new_kernel_type != system.kernel_type: record_activity(u'Kernel Type', system.kernel_type, new_kernel_type) system.kernel_type = new_kernel_type changed = True if 'hypervisor' in data: if data['hypervisor']: new_hypervisor = Hypervisor.by_name(data['hypervisor']) else: new_hypervisor = None if new_hypervisor != system.hypervisor: record_activity(u'Hypervisor', system.hypervisor, new_hypervisor) system.hypervisor = new_hypervisor changed = True if 'vendor' in data: new_vendor = data['vendor'] or None if new_vendor != system.vendor: record_activity(u'Vendor', system.vendor, new_vendor) system.vendor = new_vendor changed = True if 'model' in data: new_model = data['model'] or None if new_model != system.model: record_activity(u'Model', system.model, new_model) system.model = new_model changed = True if 'serial_number' in data: new_serial_number = data['serial_number'] or None if new_serial_number != system.serial: record_activity(u'Serial Number', system.serial, new_serial_number) system.serial = new_serial_number changed = True if 'mac_address' in data: new_mac_address = data['mac_address'] or None if new_mac_address != system.mac_address: record_activity(u'MAC Address', system.mac_address, new_mac_address) system.mac_address = new_mac_address changed = True if 'memory' in data: new_memory = int(data['memory']) if data['memory'] else None if new_memory != system.memory: record_activity(u'Memory', system.memory, new_memory) system.memory = new_memory changed = True if 'numa_nodes' in data: new_numa_nodes = int( data['numa_nodes']) if data['numa_nodes'] else None if not system.numa: system.numa = Numa() if new_numa_nodes != system.numa.nodes: record_activity(u'NUMA/Nodes', system.numa.nodes, new_numa_nodes) system.numa.nodes = new_numa_nodes changed = True if changed: # XXX clear checksum!? system.date_modified = datetime.datetime.utcnow() response = jsonify(system.__json__()) if renamed: response.headers.add('Location', url('/view/%s' % system.fqdn)) return response