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)
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
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()