示例#1
0
class MachineManager(object):
    def __init__(self, session):
        self.session = session
        self.keymanager = SaltKeyManager(self.session)

    def _query(self):
        return self.session.query(Machine)

    def get(self, id):
        return self._query().get(id)

    def _get_one_by(self, **kw):
        return self._query().filter_by(**kw).one()
    
    def get_by_name(self, name):
        return self._get_one_by(name=name)
    
    def get_by_uuid(self, uuid):
        return self._get_one_by(uuid=uuid)

    def does_machine_exist(self, uuid):
        try:
            m = self.get_by_uuid(uuid)
            return True
        except NoResultFound:
            return False
        
    def add(self, name, uuid, autoinstall=False, recipe=None,
            arch=None):
        with transaction.manager:
            machine = Machine()
            machine.name = name
            machine.uuid = uuid
            machine.autoinstall = autoinstall
            if arch is not None:
                machine.arch = arch
            if recipe is not None:
                machine.recipe_id = recipe.id
            self.session.add(machine)
            machine = self.session.merge(machine)
            keydata = self.keymanager.generate_minion_keys(name)
            skey = self.keymanager.add_keypair_no_txn(machine.id, keydata)
        return self.session.merge(machine)

    def accept_machine(self, machine, id=None, name=None):
        self.keymanager.accept_machine(machine)

    

    def update(self, machine, name=None, autoinstall=None,
               recipe=None, ostype=None, release=None, arch=None,
               imagepath=None):
        with transaction.manager:
            if name is not None or autoinstall is not None \
                    or recipe is not None or ostype is not None \
                    or release is not None or arch is not None \
                    or imagepath is not None:
                if name is not None:
                    machine.name = name
                if autoinstall is not None:
                    machine.autoinstall = autoinstall
                if recipe is not None:
                    machine.recipe_id = recipe.id
                if ostype is not None:
                    machine.ostype = ostype
                if release is not None:
                    machine.release = release
                if arch is not None:
                    machine.arch = arch
                if imagepath is not None:
                    machine.imagepath = imagepath
                self.session.add(machine)
        return self.session.merge(machine)

    def list_machines(self):
        return [m.name for m in self._query()]
    
    def delete(self, machine):
        with transaction.manager:
            self.session.delete(machine)
示例#2
0
 def __init__(self, session):
     self.session = session
     self.keymanager = SaltKeyManager(self.session)
示例#3
0
class MachineManager(object):
    def __init__(self, session):
        self.session = session
        self.keymanager = SaltKeyManager(self.session)

    def query(self):
        return self.session.query(Machine)

    def get(self, id):
        return self.query().get(id)

    def _get_one_by(self, **kw):
        return self.query().filter_by(**kw).one()
    
    def get_by_name(self, name):
        return self._get_one_by(name=name)
    
    def get_by_uuid(self, uuid):
        return self._get_one_by(uuid=uuid)

    def does_machine_exist(self, uuid):
        try:
            m = self.get_by_uuid(uuid)
            return True
        except NoResultFound:
            return False
        
    def add(self, name, uuid, autoinstall=False, recipe=None,
            arch=None):
        with transaction.manager:
            machine = Machine()
            machine.name = name
            machine.uuid = uuid
            machine.autoinstall = autoinstall
            if arch is not None:
                machine.arch = arch
            if recipe is not None:
                machine.recipe_id = recipe.id
            self.session.add(machine)
            machine = self.session.merge(machine)
            keydata = self.keymanager.generate_minion_keys(name)
            skey = self.keymanager.add_keypair_no_txn(machine.id, keydata)
        return self.session.merge(machine)

    def accept_machine(self, machine, id=None, name=None, force=False):
        self.keymanager.accept_machine(machine, force=force)

    

    def update(self, machine, name=None, autoinstall=None,
               recipe=None, ostype=None, release=None, arch=None,
               imagepath=None, raid_recipe=None, iface=None,
               delete_recipe=False, delete_raid_recipe=False):
        with transaction.manager:
            # merge machine before update
            machine = self.session.merge(machine)
            updated = False
            if name is not None:
                machine.name = name
                updated = True
            if autoinstall is not None:
                machine.autoinstall = autoinstall
                updated = True
            log.info('MANAGERl: recipe is %s' % recipe)
            log.info('MANAGER: machine.recipe_id is %s' % machine.recipe_id)
            # partition recipe
            if recipe is not None:
                machine.recipe_id = recipe.id
                updated = True
            if delete_recipe:
                log.info("MANAGER---> delete_recipe:")
                machine.recipe_id = None
                updated = True

                    
            # raid recipe
            if raid_recipe is not None:
                machine.raid_recipe_id = raid_recipe.id
                updated = True
            if delete_raid_recipe:
                log.info("MANAGER---> delete_raid_recipe:")
                machine.raid_recipe_id = None
                updated = True

            if ostype is not None:
                machine.ostype = ostype
                updated = True
            if release is not None:
                machine.release = release
                updated = True
            if arch is not None:
                machine.arch = arch
                updated = True
            if imagepath is not None:
                machine.imagepath = imagepath
                updated = True
            if iface is not None:
                machine.iface = iface
                updated = True
            if updated:
                self.session.add(machine)
        return self.session.merge(machine)

    def list_machines(self, names=False):
        if names:
            return [m.name for m in self.query()]
        return [m.serialize() for m in self.query()]
    
    def delete(self, machine):
        with transaction.manager:
            self.session.delete(machine)

    def export(self, name):
        machine = self.get_by_name(name)
        return self._export(machine)

    def _export(self, machine):
        data = machine.serialize()
        data['minion_keys'] = self.keymanager.get(machine.id).serialize()
        if machine.recipe_id is not None:
            mgr = PartmanRecipeManager(self.session)
            data['recipe'] = mgr.get(machine.recipe_id).serialize()
        if machine.raid_recipe_id is not None:
            mgr = PartmanRaidRecipeManager(self.session)
            data['raid_recipe'] = mgr.get(machine.raid_recipe_id).serialize()
        return data