Example #1
0
def move_server_sg(db_session, server_name, sg_name=None):
    """
    Move a server between SGs
    """
    server_sm = find_server_byname(db_session, server_name)
    if not server_sm.is_disabled():
        raise ServerNotDisabled(server_sm.name)
    if not sg_name:
        sg_name = zone_cfg.get_row_exc(db_session, 'default_sg')
    if not sg_name in list_all_sgs(db_session):
        raise NoSgFound(sg_name)
    sg = find_sg_byname(db_session, sg_name, raise_exc=True)
    server_sm.set_sg(sg)
Example #2
0
def new_server(db_session,
               server_name,
               address,
               sg_name,
               server_type=None,
               ssh_address=None):
    """
    Create a new server
    """
    server_name = server_name.lower()
    if server_name.endswith('.'):
        server_name = server_name[:-1]
    if not sg_name:
        sg_name = zone_cfg.get_row_exc(db_session, 'default_sg')
    if not sg_name in list_all_sgs(db_session):
        raise NoSgFound(sg_name)
    try:
        server_list = db_session.query(ServerSM)\
                        .filter(ServerSM.name == server_name).all()
        if len(server_list):
            raise ServerExists(server_name)
    except NoResultFound:
        pass
    if not server_type:
        server_type = zone_cfg.get_row(db_session,
                                       'default_stype',
                                       raise_exc=True)
    server_sm = ServerSM(server_name, address, sg_name, server_type,
                         ssh_address)
    try:
        db_session.add(server_sm)
        db_session.flush()
    except IntegrityError as exc:
        raise ServerAddressExists(address)
    sg = find_sg_byname(db_session, sg_name, raise_exc=True)
    server_sm.set_sg(sg)
    db_session.flush()
    return server_sm
Example #3
0
    def nuke_zones(self, *names, include_deleted=False, toggle_deleted=False, 
            sg_name=None, reference=None):
        """
        Destroy multiple zones.  Multiple names may be given.  Wildcards
        can be used for partial matches.

        This is mainly a command for testing, or cleaning up after a large
        batch zone load goes awry.

        Zones being nuked have their deleted_start set to 1/1/1970, midnight.
        This means they will be immediately reaped by the next vacuum_zones
        command.
        """
        # Deal with SA auto-BEGIN - want fresh transaction to see fresh data
        self._begin_op()
        if not names:
            # No arguments
            self._finish_op()
            raise NoZonesFound('')
       
        db_session = self.db_session
        db_query_slice = get_numeric_setting('db_query_slice', int)
        # We were given some arguments
        zones = []
        # We keep domains and labels in database lowercase
        names = [x.lower() for x in names]
        name_pattern = ' '.join(names)
        names = [x.replace('*', '%') for x in names]
        names = [x.replace('?', '_') for x in names]
        for name in names:
            if not name.endswith('.') and not name.endswith('%'):
                name += '.'
            query = db_session.query(ZoneSM)\
                    .filter(ZoneSM.name.like(name))
            # Don't delete any reverse zones with this command
            query = query.filter(not_(ZoneSM.name.like('%.in-addr.arpa.')))\
                    .filter(not_(ZoneSM.name.like('%.ip6.arpa.')))
            if reference:
                query = query.join(Reference)\
                        .filter(Reference.reference.ilike(reference))
            if sg_name and self.sectag.sectag == settings['admin_sectag']:
                if sg_name not in list_all_sgs(self.db_session):
                    raise NoSgFound(sg_name)
                query = query.join(ServerGroup, ZoneSM.sg_id 
                                    == ServerGroup.id_)\
                        .filter(ServerGroup.name == sg_name)
            if include_deleted:
                pass
            elif toggle_deleted:
                query = query.filter(ZoneSM.state == ZSTATE_DELETED)
            else:
                query = query.filter(ZoneSM.state != ZSTATE_DELETED)
            query = query.yield_per(db_query_slice)
            # The following gives less RAM piggery even though it is slower
            for z in query:
                zones.append(z)
        # Take note of security tags
        if self.sectag.sectag != settings['admin_sectag']:
            zones = [x for x in zones if self.sectag in x.sectags]
        if not zones:
            if len(name_pattern) > 240:
                name_pattern = '* - %s names' % len(names)
            raise NoZonesFound(name_pattern)
        # Mark them all as deleted.
        for zone in zones:
            exec_zonesm(zone, ZoneSMNukeStart)
        self._finish_op()