Exemple #1
0
    def update_record(self, request, pk=None):
        serializer = RecordSetAlterSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))

        try:
            recordsets = designate.recordsets.update(
                zone=pk,
                recordset=request.data.get('pk'),
                values=serializer.validated_data)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Zone or record not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to update record, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to update record. Please contact support for more info'
                  )
            })
        else:
            return Response(recordsets, status=HTTP_200_OK)
Exemple #2
0
    def list_records(self, request, pk=None):
        serializer = RecordSetListSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))

        try:
            serializer.validated_data['sort_key'] = 'type'
            recordsets = designate.recordsets.list(
                zone=pk, criterion=serializer.validated_data)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Zone not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to list records, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to list records. Please contact support for more info'
                  )
            })
        else:
            response = ListRecordsSerializer(instance=recordsets).data
            response['record_types'] = [
                x[0] for x in RECORD_TYPES if x[0] != 'SOA'
            ]
            return Response(response)
Exemple #3
0
    def list(self, request):
        """List all dns zones belonging to a region"""
        serializer = DnsFilterSerializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))
        search_params, page_limit, custom_filtering_params = get_filter_params(
            request)
        criterion = {**search_params, **serializer.validated_data}

        try:
            zones = designate.zones.list(criterion=criterion, limit=page_limit)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('No zones found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to list zones, reason {0}'.format(e))
            raise ValidationError(detail=_(
                'Unable to list zones. Please contact support for more info'))
        else:
            rsp = {
                'objects':
                DnsSerializer(instance=zones, many=True).data,
                'permissions':
                permissions_cache.get_view_permissions(request.user,
                                                       self.basename),
                'hasMore':
                zones.next_page
            }
            return Response(rsp)
Exemple #4
0
    def retrieve(self, request, pk=None):
        """Fetches a dns zone"""
        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=request.query_params.get(
                                         'region_name', None))

        try:
            zone = designate.zones.get(zone=pk)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Zone not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to fetch zone, reason {0}'.format(e))
            raise ValidationError(detail=_(
                'Unable to fetch zone. Please contact support for more info'))

        return Response(DnsSerializer(instance=zone).data)
Exemple #5
0
    def create_records(self, request, pk=None):
        serializer = RecordSetCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))

        try:
            records = designate.recordsets.create(zone=pk,
                                                  **serializer.validated_data)
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to create record in zone {0}, reason {1}'.format(
                pk, e))
            raise ValidationError(detail=_(
                'Unable to create record. Please contact support for more info'
            ))
        else:
            return Response(records, status=HTTP_201_CREATED)
Exemple #6
0
    def delete_record(self, request, pk=None):
        api_session = get_api_session(request)
        designate = designate_client(
            api_session, region_name=request.data.get('region_name'))

        try:
            recordsets = designate.recordsets.delete(
                zone=pk, recordset=request.data.get('pk'))
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Record not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to delete record, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to delete record. Please contact support for more info'
                  )
            })
        else:
            return Response(recordsets, status=HTTP_204_NO_CONTENT)
Exemple #7
0
    def create(self, request):
        """Create a dns zone"""

        if not validate_cloud_objects_limit():
            raise APIBadRequest(
                _('Failed to create DNS zone. Please contact support.'))

        serializer = DnsCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))

        try:
            zone = designate.zones.create(**serializer.validated_data)
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to create zone, reason {0}'.format(e))
            raise ValidationError({'detail': e})
        else:
            return Response(zone, status=HTTP_201_CREATED)
Exemple #8
0
    def update(self, request, pk=None):
        """Updates a dns zone"""

        serializer = DnsUpdateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=serializer.validated_data.pop(
                                         'region_name', None))

        try:
            zone = designate.zones.update(zone=pk,
                                          values=serializer.validated_data)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Zone not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to update zone, reason {0}'.format(e))
            raise ValidationError({'detail': e})
        else:
            return Response(zone, status=HTTP_200_OK)
Exemple #9
0
    def destroy(self, request, pk=None):
        """Delete a dns zone"""

        api_session = get_api_session(request)
        designate = designate_client(api_session,
                                     region_name=request.query_params.get(
                                         'region_name', None))

        try:
            designate.zones.delete(zone=pk)
        except (designate_exceptions.NotFound,
                designate_exceptions.ResourceNotFound) as e:
            LOG.error(e)
            raise NotFound(detail=_('Zone not found'))
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to delete zone, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to delete zone. Please contact support for more info'
                  )
            })
        else:
            return Response({'detail': _('Zone deleted')},
                            status=HTTP_204_NO_CONTENT)
Exemple #10
0
 def openstack_user_session(self):
     # TODO: use os_api here to get session
     return get_api_session(self.request)
Exemple #11
0
    def synchronize_records(self, request, pk):
        serializer = SyncRecordSetsSerializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        current_recordsets = serializer.validated_data
        for recordset_i in current_recordsets:
            for recordset_j in current_recordsets:
                if recordset_i['id'] == recordset_j['id']:
                    continue
                if recordset_i['name'] == recordset_j['name'] and recordset_i[
                        'type'] == recordset_j['type']:
                    raise ValidationError({
                        'detail':
                        _('More than one recordset exists with the same subdomain '
                          '{subd} and type {type} exist'.format(
                              subd=recordset_i['name'],
                              type=recordset_i['type']))
                    })

        api_session = get_api_session(request)
        designate = designate_client(api_session)

        try:
            recordset_default_limit = getattr(
                settings, 'OPENSTACK_DESIGNATE_RECORDSET_LIMIT', 100000)
            existing_recordsets = designate.recordsets.list(
                zone=pk, limit=recordset_default_limit)
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to list records, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to list records. Please contact support for more info'
                  )
            })

        # create, update and delete recordsets
        create_recordsets, update_recordsets, delete_recordsets = \
            get_recordsets_changes(current_recordsets, existing_recordsets)

        # TODO(erno): make a celery task for this, refactor frontend too
        errors = {}
        create_errors = ''
        for recordset in create_recordsets:
            try:
                designate.recordsets.create(zone=pk,
                                            name=recordset['name'],
                                            type_=recordset['type'],
                                            records=recordset['records'],
                                            ttl=recordset['ttl'])
            except (designate_exceptions.Base, ClientException) as e:
                create_errors += '{}\n'.format(remove_unicode(str(e)))
        if create_errors:
            errors['detail'] = create_errors

        for recordset in update_recordsets:
            try:
                designate.recordsets.update(zone=pk,
                                            recordset=recordset['id'],
                                            values={
                                                'records':
                                                recordset['records'],
                                                'ttl': recordset['ttl']
                                            })
            except (designate_exceptions.Base, ClientException) as e:
                errors[recordset['id']] = remove_unicode(str(e))

        for record_id in delete_recordsets:
            try:
                designate.recordsets.delete(zone=pk, recordset=record_id)
            except (designate_exceptions.Base, ClientException) as e:
                errors[record_id] = remove_unicode(str(e))

        if errors:
            raise ValidationError(errors)

        try:
            recordsets = designate.recordsets.list(zone=pk)
        except (designate_exceptions.Base, ClientException) as e:
            LOG.error('Unable to list records, reason {0}'.format(e))
            raise ValidationError({
                'detail':
                _('Unable to list records. Please contact support for more info'
                  )
            })
        else:
            response = ListRecordsSerializer(instance=recordsets).data
            response['record_types'] = [
                x[0] for x in RECORD_TYPES if x[0] != 'SOA'
            ]
            response['detail'] = _('Recordsets update scheduled')
            return Response(response)