def create_target_if_needed(session, logger, target, dbdns_env): """ Create FQDNs in restricted domains. This is used to allow pointing CNAME and PTR records to DNS domains we otherwise don't manage. """ name, dbtarget_domain = parse_fqdn(session, target) dbtarget_domain.lock_row() q = session.query(Fqdn) q = q.filter_by(dns_environment=dbdns_env) q = q.filter_by(dns_domain=dbtarget_domain) q = q.filter_by(name=name) try: dbtarget = q.one() except NoResultFound: if not dbtarget_domain.restricted: raise NotFoundException( "Target FQDN {0} does not exist in {1:l}.".format( target, dbdns_env)) dbtarget = Fqdn(name=name, dns_domain=dbtarget_domain, dns_environment=dbdns_env) try: socket.gethostbyname(dbtarget.fqdn) except socket.gaierror, e: logger.warning("WARNING: Will create a reference to {0.fqdn!s}, " "but trying to resolve it resulted in an error: " "{1.strerror}.".format(dbtarget, e)) session.add(dbtarget) dbtarget_rec = ReservedName(fqdn=dbtarget) session.add(dbtarget_rec)