Ejemplo n.º 1
0
 def setUp(self):
     super(DesignateDriverTest, self).setUp()
     self.domains = [
         Domain(name='www.example.com',
                id='11111111-1111-1111-1111-111111111111',
                email='*****@*****.**'),
         Domain(name='www.trove.com',
                id='22222222-2222-2222-2222-222222222222',
                email='*****@*****.**'),
         Domain(name='www.openstack.com',
                id='33333333-3333-3333-3333-333333333333',
                email='*****@*****.**')
     ]
     self.records = [
         Record(name='record1',
                type='A',
                data='10.0.0.1',
                ttl=3600,
                priority=1),
         Record(name='record2',
                type='CNAME',
                data='10.0.0.2',
                ttl=1800,
                priority=2),
         Record(name='record3',
                type='A',
                data='10.0.0.3',
                ttl=3600,
                priority=1)
     ]
     self.create_des_client_patch = patch.object(
         driver, 'create_designate_client', MagicMock(return_value=None))
     self.create_des_client_mock = self.create_des_client_patch.start()
     self.addCleanup(self.create_des_client_patch.stop)
Ejemplo n.º 2
0
    def execute(self, parsed_args):
        domain_id = self.find_resourceid_by_name_or_id(
            'domains', parsed_args.domain_id)

        if not parsed_args.name.endswith('.'):
            # Relative name?
            domain_name = self.client.domains.get(domain_id)['name']
            absolute = parsed_args.name + '.'
            relative = absolute + domain_name
            if absolute.endswith('.' + domain_name):
                # Relative name or absolute name missing final period?
                msg = ('"%s" is a relative name but looks like an absolute '
                       'name, use --name "%s" or "%s"'
                       % (parsed_args.name, absolute, relative))
                raise ValueError(msg)
            parsed_args.name = relative

        record = Record(
            name=parsed_args.name,
            type=parsed_args.type,
            data=parsed_args.data,
        )

        if parsed_args.ttl is not None:
            record.ttl = parsed_args.ttl

        if parsed_args.priority is not None:
            record.priority = parsed_args.priority

        if parsed_args.description:
            record.description = parsed_args.description

        return self.client.records.create(domain_id, record)
Ejemplo n.º 3
0
    def execute(self, parsed_args):
        domain_id = self.find_resourceid_by_name_or_id('domains',
                                                       parsed_args.domain_id)

        if not parsed_args.name.endswith('.'):
            # Relative name?
            domain_name = self.client.domains.get(domain_id)['name']
            absolute = parsed_args.name + '.'
            relative = absolute + domain_name
            if absolute.endswith('.' + domain_name):
                # Relative name or absolute name missing final period?
                msg = ('"%s" is a relative name but looks like an absolute '
                       'name, use --name "%s" or "%s"' %
                       (parsed_args.name, absolute, relative))
                raise ValueError(msg)
            parsed_args.name = relative

        record = Record(
            name=parsed_args.name,
            type=parsed_args.type,
            data=parsed_args.data,
        )

        if parsed_args.ttl is not None:
            record.ttl = parsed_args.ttl

        if parsed_args.priority:
            record.priority = parsed_args.priority

        if parsed_args.description:
            record.description = parsed_args.description

        return self.client.records.create(domain_id, record)
Ejemplo n.º 4
0
 def setUp(self):
     super(DesignateDriverTest, self).setUp()
     self.domains = [
         Domain(name='www.example.com',
                id='11111111-1111-1111-1111-111111111111',
                email='*****@*****.**'),
         Domain(name='www.trove.com',
                id='22222222-2222-2222-2222-222222222222',
                email='*****@*****.**'),
         Domain(name='www.openstack.com',
                id='33333333-3333-3333-3333-333333333333',
                email='*****@*****.**')
     ]
     self.records = [
         Record(name='record1',
                type='A',
                data='10.0.0.1',
                ttl=3600,
                priority=1),
         Record(name='record2',
                type='CNAME',
                data='10.0.0.2',
                ttl=1800,
                priority=2),
         Record(name='record3',
                type='A',
                data='10.0.0.3',
                ttl=3600,
                priority=1)
     ]
Ejemplo n.º 5
0
    def execute(self, parsed_args):
        record = Record(
            name=parsed_args.name,
            type=parsed_args.type,
            data=parsed_args.data,
        )

        if parsed_args.ttl:
            record.ttl = parsed_args.ttl

        if parsed_args.priority:
            record.priority = parsed_args.priority

        return self.client.records.create(parsed_args.domain_id, record)
Ejemplo n.º 6
0
 def test_convert_record_to_entry(self):
     name = 'test.example.com'
     id = '4f3439ef-fc8b-4098-a1aa-a66ed01102b9'
     domain_id = '39413651-3b9e-41f1-a4df-e47d5e9f67be'
     domain_name = 'example.com'
     type = 'CNAME'
     data = '127.0.0.1'
     ttl = 3600
     priority = 1
     zone = driver.DesignateDnsZone(domain_id, domain_name)
     record = Record(name=name,
                     id=id,
                     domain_id=domain_id,
                     type=type,
                     data=data,
                     priority=priority,
                     ttl=ttl)
     converter = driver.DesignateObjectConverter()
     converted_record = converter.record_to_entry(record, zone)
     self.assertEqual(name, converted_record.name)
     self.assertEqual(data, converted_record.content)
     self.assertEqual(type, converted_record.type)
     self.assertEqual(priority, converted_record.priority)
     self.assertEqual(ttl, converted_record.ttl)
     self.assertEqual(zone, converted_record.dns_zone)
Ejemplo n.º 7
0
def record_create(request, domain_id, **kwargs):
    d_client = designateclient(request)
    if d_client is None:
        return []

    record = Record(**kwargs)
    return d_client.records.create(domain_id, record)
Ejemplo n.º 8
0
    def execute(self, parsed_args):
        record = Record(
            name=parsed_args.name,
            type=parsed_args.type,
            data=parsed_args.data,
        )

        if parsed_args.ttl:
            record.ttl = parsed_args.ttl

        if parsed_args.priority:
            record.priority = parsed_args.priority

        if parsed_args.description:
            record.description = parsed_args.description

        return self.client.records.create(parsed_args.domain_id, record)
Ejemplo n.º 9
0
 def create_entry(self, entry, content):
     """Creates the entry in the driver at the given dns zone."""
     dns_zone = entry.dns_zone or self.default_dns_zone
     if not dns_zone.id:
         raise TypeError("The entry's dns_zone must have an ID specified.")
     name = entry.name
     LOG.debug("Creating DNS entry %s." % name)
     client = self.dns_client
     # Record name has to end with a '.' by dns standard
     record = Record(name=entry.name + '.',
                     type=entry.type,
                     data=content,
                     ttl=entry.ttl,
                     priority=entry.priority)
     client.records.create(dns_zone.id, record)
Ejemplo n.º 10
0
def record_update(request, domain_id, record_id, **kwargs):
    d_client = designateclient(request)
    if d_client is None:
        return []

    # A quirk of the designate client is that you need to start with a
    # base record and then update individual fields in order to persist
    # the data. The designate client will only send the 'changed' fields.
    record = Record(id=record_id, type='A', name='', data='')

    record.type = kwargs.get('type', None)
    record.name = kwargs.get('name', None)
    record.data = kwargs.get('data', None)
    record.priority = kwargs.get('priority', None)
    record.ttl = kwargs.get('ttl', None)
    record.description = kwargs.get('description', None)

    return d_client.records.update(domain_id, record)
Ejemplo n.º 11
0
def record(request, domain_id='', record_id=''):
  client = Client(
    auth_url="http://keystone:5000/v2.0/",
    username="******",
    password="******",
    tenant_name="service",
    endpoint="http://designate:9001/v1"
  )
  if request.method == "GET":
    print(domain_id)
    print(record_id)
    if record_id:
      try:
        return HttpResponse(change_response(client.records.get(domain_id, record_id)))
      except:
        return HttpResponse("Not found", status=404)
    else:
      return HttpResponse(change_response(client.records.list(domain_id)))
  elif request.method == "POST":
    if 'priority' not in request.POST:
      defined_priority = None
    else:
      defined_priority = int(request.POST['priority'])
    if 'ttl' not in request.POST:
      defined_ttl = 3600
    else:
      defined_ttl = int(request.POST['ttl'])
    if 'description' not in request.POST:
      defined_description = None
    else:
      defined_description = request.POST['description']
    record = Record(name=request.POST['name'], type=request.POST['type'], data=request.POST['data'], priority=defined_priority, ttl=defined_ttl, description=defined_description)
    return HttpResponse(change_response(client.records.create(domain_id, record)))
  elif request.method == "PUT":
    params = QueryDict(request.body, encoding=request._encoding)
    record = client.records.get(domain_id, record_id)    
    if 'name' in params:
      record.name = params['name']
    if 'type' in params:
      record.type = params['type']
    if 'data' in params:
      record.data = params['data']
    if 'priority' in params:
      record.priority = int(params['priority'])
    if 'ttl' in params:
      record.ttl = int(params['ttl'])
    if 'description' in params:
      domain.description = params['description']
    return HttpResponse(change_response(client.records.update(domain_id, record)))
  elif request.method == "DELETE":
    client.records.delete(domain_id, record_id)
    return HttpResponse("OK", status=200)
Ejemplo n.º 12
0
def record_update(request, domain_id, record_id, **kwargs):
    d_client = designateclient(request)
    if d_client is None:
        return []

    # A quirk of the designate client is that you need to start with a
    # base record and then update individual fields in order to persist
    # the data. The designate client will only send the 'changed' fields.
    record = Record(
        id=record_id,
        type='A',
        name='',
        data='')

    record.type = kwargs.get('type', None)
    record.name = kwargs.get('name', None)
    record.data = kwargs.get('data', None)
    record.priority = kwargs.get('priority', None)
    record.ttl = kwargs.get('ttl', None)
    record.description = kwargs.get('description', None)

    return d_client.records.update(domain_id, record)
def main(argv):
    cli_utils.setup_logging()
    parser = argparse.ArgumentParser()
    parser.add_argument('-r',
                        '--resolver',
                        help='Resolver address. '
                        'Usually designate-bind address.',
                        required=False)
    parser.add_argument('-d',
                        '--domain_name',
                        help='DNS Domain Name. '
                        'Must end in a .',
                        default='mojo.serverstack.')
    parser.add_argument('-e',
                        '--email',
                        help='Email address',
                        default='*****@*****.**')
    parser.add_argument('-b',
                        '--bind-service',
                        help='Bind Service Name',
                        default='designate-bind')

    options = parser.parse_args()
    bind_service_name = cli_utils.parse_arg(options, 'bind_service')
    resolver = cli_utils.parse_arg(options, 'resolver')

    bind_unit = mojo_utils.get_juju_units(bind_service_name)[0]
    if not resolver:
        resolver = mojo_utils.get_juju_unit_ip(bind_unit)
    domain_name = cli_utils.parse_arg(options, 'domain_name')
    email = cli_utils.parse_arg(options, 'email')
    nameserver = 'ns1.{}'.format(domain_name)

    logging.info('Setting up designate {} {}'.format(nameserver, resolver))

    os_version = openstack_utils.get_current_os_versions(
        'keystone')['keystone']
    try:
        cacert = os.path.join(os.environ.get('MOJO_LOCAL_DIR'), 'cacert.pem')
        os.stat(cacert)
    except FileNotFoundError:
        cacert = None
    keystone_session = openstack_utils.get_overcloud_keystone_session(
        verify=cacert)
    neutronc = openstack_utils.get_neutron_session_client(keystone_session)

    if os_version >= 'queens':
        designatec = mojo_os_utils.get_designate_session_client(
            keystone_session, client_version='2')
        zone = mojo_os_utils.create_or_return_zone(designatec, domain_name,
                                                   email)
        mojo_os_utils.create_or_return_recordset(designatec, zone['id'], 'www',
                                                 'A', [resolver])
    else:
        designatec = mojo_os_utils.get_designate_session_client(
            keystone_session, client_version='1')
        if not mojo_os_utils.get_designate_server_id(designatec, nameserver):
            logging.info('Creating server {}'.format(nameserver))
            server = Server(name=nameserver)
            server_id = designatec.servers.create(server)
            assert (server_id is not None)
        else:
            logging.info('{} server already exists.'.format(nameserver))

        domain_id = mojo_os_utils.get_designate_domain_id(
            designatec, domain_name)
        if not domain_id:
            logging.info('Creating domain {}'.format(domain_name))
            domain = Domain(name=domain_name, email=email)
            domain_id = designatec.domains.create(domain)
            assert (domain_id is not None)
        else:
            logging.info('{} domain already exists.'.format(domain_name))

        if not mojo_os_utils.get_designate_record_id(designatec, domain_id,
                                                     nameserver):
            logging.info('Creating NS record {}'.format(nameserver))
            ns_record = Record(name=nameserver, type="A", data=resolver)
            record_id = designatec.records.create(domain_id, ns_record)
            assert (record_id is not None)
        else:
            logging.info('{} record already exists.'.format(nameserver))

    logging.info('Update network to use domain {}'.format(domain_name))
    net_uuid = openstack_utils.get_net_uuid(neutronc, 'private')
    mojo_os_utils.update_network_dns(neutronc, net_uuid, domain_name)
Ejemplo n.º 14
0
    def handle(self, request, data):
        proxyip = socket.gethostbyname(
            urlparse.urlparse(base.url_for(request, 'proxy')).hostname)
        if data.get('domain') == 'wmflabs.org.':
            auth = identity_generic.Password(
                auth_url=base.url_for(request, 'identity'),
                username=getattr(settings, "WMFLABSDOTORG_ADMIN_USERNAME", ''),
                password=getattr(settings, "WMFLABSDOTORG_ADMIN_PASSWORD", ''),
                tenant_name='wmflabsdotorg',
                user_domain_id='default',
                project_domain_id='default')
            c = designateclientv2.Client(session=keystone_session.Session(
                auth=auth))

            LOG.warn('Got create client')
            # Create the record in the wmflabsdotorg project. This is needed
            # since wmflabs.org lives in that project and designate prevents
            # subdomain creation elsewhere.
            zoneid = None
            for zone in c.zones.list():
                if zone['name'] == 'wmflabs.org.':
                    zoneid = zone['id']
                    break
            else:
                raise Exception("No zone ID")
            LOG.warn('Got zone ID')
            c.recordsets.create(zoneid,
                                data.get('record') + '.wmflabs.org.', 'A',
                                [proxyip])
        else:
            # TODO: Move this to designate v2 API, reuse some code
            c = designateapi.designateclient(request)
            domainid = None
            for domain in c.domains.list():
                if domain.name == data.get('domain'):
                    domainid = domain.id
                    break
            else:
                raise Exception("No domain ID")
            record = Record(name=data.get('record') + '.' + data.get('domain'),
                            type='A',
                            data=proxyip)
            c.records.create(domainid, record)

        d = {
            "backends": [
                'http://%s:%s' %
                (data.get('backendInstance'), data.get('backendPort'))
            ],
            "domain":
            data.get('record') + '.' + data.get('domain').rstrip('.')
        }

        try:
            resp = requests.put(base.url_for(request, 'proxy') + '/mapping',
                                data=json.dumps(d))
            if resp:
                return True
            else:
                raise Exception("Got status: " + resp.status_code)
        except Exception:
            exceptions.handle(self.request,
                              _("Unable to create proxy: " + resp.text))
            return False
Ejemplo n.º 15
0
def main(argv):
    mojo_utils.setup_logging()
    parser = argparse.ArgumentParser()
    parser.add_argument('-r', '--resolver',
                        help='Resolver address. '
                             'Usually designate-bind address.',
                        required=False)
    parser.add_argument('-d', '--domain_name', help='DNS Domain Name. '
                                                    'Must end in a .',
                        default='mojo.serverstack.')
    parser.add_argument('-e', '--email', help='Email address',
                        default='*****@*****.**')
    parser.add_argument('-b', '--bind-service', help='Bind Service Name',
                        default='designate-bind')

    options = parser.parse_args()
    bind_service_name = mojo_utils.parse_mojo_arg(options, 'bind_service')
    resolver = mojo_utils.parse_mojo_arg(options, 'resolver')
    bind_unit = mojo_utils.get_juju_units(service=bind_service_name)[0]
    if not resolver:
        resolver = mojo_utils.get_juju_unit_ip(bind_unit)
    domain_name = mojo_utils.parse_mojo_arg(options, 'domain_name')
    email = mojo_utils.parse_mojo_arg(options, 'email')
    nameserver = 'ns1.{}'.format(domain_name)

    logging.info('Setting up designate {} {}'.format(nameserver, resolver))

    overcloud_novarc = mojo_utils.get_overcloud_auth()
    os_version = mojo_os_utils.get_current_os_versions('keystone')['keystone']
    # Keystone policy.json shipped the charm with liberty requires a domain
    # scoped token. Bug #1649106
    if os_version == 'liberty':
        scope = 'DOMAIN'
    else:
        scope = 'PROJECT'
    keystone_session = mojo_os_utils.get_keystone_session(overcloud_novarc,
                                                          scope=scope)
    neutronc = mojo_os_utils.get_neutron_session_client(keystone_session)

    if os_version >= 'queens':
        designatec = mojo_os_utils.get_designate_session_client(
            keystone_session,
            client_version='2')
        zone = mojo_os_utils.create_or_return_zone(
            designatec,
            domain_name,
            email)
        rs = mojo_os_utils.create_or_return_recordset(
            designatec,
            zone['id'],
            'www',
            'A',
            [resolver])
    else:
        designatec = mojo_os_utils.get_designate_session_client(
            keystone_session,
            client_version='1')
        if not mojo_os_utils.get_designate_server_id(designatec, nameserver):
            logging.info('Creating server {}'.format(nameserver))
            server = Server(name=nameserver)
            server_id = designatec.servers.create(server)
            assert(server_id is not None)
        else:
            logging.info('{} server already exists.'.format(nameserver))

        domain_id = mojo_os_utils.get_designate_domain_id(
            designatec,
            domain_name)
        if not domain_id:
            logging.info('Creating domain {}'.format(domain_name))
            domain = Domain(name=domain_name, email=email)
            domain_id = designatec.domains.create(domain)
            assert(domain_id is not None)
        else:
            logging.info('{} domain already exists.'.format(domain_name))

        if not mojo_os_utils.get_designate_record_id(designatec, domain_id,
                                                     nameserver):
            logging.info('Creating NS record {}'.format(nameserver))
            ns_record = Record(
                name=nameserver,
                type="A",
                data=resolver)
            record_id = designatec.records.create(domain_id, ns_record)
            assert(record_id is not None)
        else:
            logging.info('{} record already exists.'.format(nameserver))

    logging.info('Update network to use domain {}'.format(domain_name))
    net_uuid = mojo_os_utils.get_net_uuid(neutronc, 'private')
    mojo_os_utils.update_network_dns(neutronc, net_uuid, domain_name)