예제 #1
0
    def patch_one(self, zone_transfer_request_id):
        """Update ZoneTransferRequest"""
        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        if request.content_type == 'application/json-patch+json':
            raise NotImplemented('json-patch not implemented')

        # Fetch the existing zone_transfer_request
        zone_transfer_request = self.central_api.get_zone_transfer_request(
            context, zone_transfer_request_id)

        zone_transfer_request = DesignateAdapter.parse(
            'API_v2', body, zone_transfer_request)

        zone_transfer_request.validate()

        zone_transfer_request = self.central_api.update_zone_transfer_request(
            context, zone_transfer_request)

        response.status_int = 200

        return DesignateAdapter.render(
            'API_v2', zone_transfer_request, request=request, context=context)
예제 #2
0
    def post_all(self, zone_id):
        """Create RecordSet"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']

        body = request.body_dict

        recordset = DesignateAdapter.parse('API_v2', body, RecordSet())

        recordset.validate()

        # SOA recordsets cannot be created manually
        if recordset.type == 'SOA':
            raise exceptions.BadRequest(
                "Creating a SOA recordset is not allowed")

        # Create the recordset
        recordset = self.central_api.create_recordset(
            context, zone_id, recordset)

        # Prepare the response headers
        if recordset['status'] == 'PENDING':
            response.status_int = 202
        else:
            response.status_int = 201

        recordset = DesignateAdapter.render(
            'API_v2', recordset, request=request)

        response.headers['Location'] = recordset['links']['self']

        # Prepare and return the response body
        return recordset
예제 #3
0
    def post_all(self, zone_id):
        """Create ZoneTransferRequest"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        try:
            body = request.body_dict
        except Exception as e:
            if six.text_type(e) != 'TODO: Unsupported Content Type':
                raise
            else:
                # Got a blank body
                body = dict()

        body['zone_id'] = zone_id

        zone_transfer_request = DesignateAdapter.parse(
            'API_v2', body, ZoneTransferRequest())

        zone_transfer_request.validate()

        # Create the zone_transfer_request
        zone_transfer_request = self.central_api.create_zone_transfer_request(
            context, zone_transfer_request)
        response.status_int = 201

        zone_transfer_request = DesignateAdapter.render(
            'API_v2', zone_transfer_request, request=request, context=context)

        response.headers['Location'] = zone_transfer_request['links']['self']
        # Prepare and return the response body
        return zone_transfer_request
예제 #4
0
    def post_all(self):
        """Create a Pool"""

        LOG.warning(
            _LW("Use of this API Method is DEPRECATED. This will have "
                "unforeseen side affects when used with the "
                "designate-manage pool commands"))

        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        pool = DesignateAdapter.parse('API_v2', body, Pool())

        pool.validate()

        # Create the pool
        pool = self.central_api.create_pool(context, pool)

        LOG.info(_LI("Created %(pool)s"), {'pool': pool})

        pool = DesignateAdapter.render('API_v2', pool, request=request)
        response.status_int = 201

        response.headers['Location'] = pool['links']['self']

        # Prepare and return the response body
        return pool
예제 #5
0
    def patch_one(self, fip_key):
        """
        Set or unset a PTR
        """
        request = pecan.request
        response = pecan.response

        context = request.environ['context']
        try:
            body = request.body_dict
        except Exception as e:
            if e.message != 'TODO: Unsupported Content Type':
                raise
            else:
                # Got a blank body
                body = dict()

        region, id_ = fip_key_to_data(fip_key)

        fip = DesignateAdapter.parse('API_v2', body, objects.FloatingIP())

        fip.validate()

        fip = self.central_api.update_floatingip(context, region, id_, fip)

        response.status_int = 202

        if fip:
            return DesignateAdapter.render('API_v2', fip, request=request)
예제 #6
0
    def post_all(self):
        """Create a Pool"""

        LOG.warning(_LW("Use of this API Method is DEPRICATED. This will have "
                        "unforseen side affects when used with the "
                        "designate-manage pool commands"))

        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        pool = DesignateAdapter.parse('API_v2', body, Pool())

        pool.validate()

        # Create the pool
        pool = self.central_api.create_pool(context, pool)

        LOG.info(_LI("Created %(pool)s"), {'pool': pool})

        pool = DesignateAdapter.render('API_v2', pool, request=request)
        response.status_int = 201

        response.headers['Location'] = pool['links']['self']

        # Prepare and return the response body
        return pool
예제 #7
0
    def post_all(self):
        """Create ZoneTransferAccept"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        zone_transfer_accept = DesignateAdapter.parse(
            'API_v2', body, ZoneTransferAccept())

        zone_transfer_accept.validate()

        # Create the zone_transfer_request
        zone_transfer_accept = self.central_api.create_zone_transfer_accept(
            context, zone_transfer_accept)
        response.status_int = 201

        LOG.info(_LI("Created %(zone_transfer_accept)s"),
                 {'zone_transfer_accept': zone_transfer_accept})

        zone_transfer_accept = DesignateAdapter.render(
            'API_v2', zone_transfer_accept, request=request)

        response.headers['Location'] = zone_transfer_accept['links']['self']

        # Prepare and return the response body
        return zone_transfer_accept
예제 #8
0
    def post_all(self):
        """Create Blacklisted Zone"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        blacklist = DesignateAdapter.parse('API_v2', body, Blacklist())

        blacklist.validate()

        # Create the blacklist
        blacklist = self.central_api.create_blacklist(
            context, blacklist)

        LOG.info("Created %(blacklist)s", {'blacklist': blacklist})

        response.status_int = 201

        blacklist = DesignateAdapter.render(
            'API_v2', blacklist, request=request)

        response.headers['Location'] = blacklist['links']['self']

        # Prepare and return the response body
        return blacklist
예제 #9
0
    def post_all(self):
        """Create Zone Import"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        if six.PY2:
            body = request.body
        else:
            body = request.body.decode('utf-8')

        if request.content_type != 'text/dns':
            raise exceptions.UnsupportedContentType(
                'Content-type must be text/dns')

        # Create the zone_import
        zone_import = self.central_api.create_zone_import(
            context, body)
        response.status_int = 202

        LOG.info(_LI("Created %(zone_import)s"), {'zone_import': zone_import})

        zone_import = DesignateAdapter.render(
            'API_v2', zone_import, request=request)

        response.headers['Location'] = zone_import['links']['self']
        # Prepare and return the response body
        return zone_import
예제 #10
0
    def patch_one(self, pool_id):
        """Update the specific pool"""

        LOG.warning(_LW("Use of this API Method is DEPRICATED. This will have "
                        "unforseen side affects when used with the "
                        "designate-manage pool commands"))

        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        if request.content_type == 'application/json-patch+json':
            raise NotImplemented('json-patch not implemented')

        # Fetch the existing pool
        pool = self.central_api.get_pool(context, pool_id)

        pool = DesignateAdapter.parse('API_v2', body, pool)

        pool.validate()

        pool = self.central_api.update_pool(context, pool)

        LOG.info(_LI("Updated %(pool)s"), {'pool': pool})

        response.status_int = 202

        return DesignateAdapter.render('API_v2', pool, request=request)
예제 #11
0
    def get_all(self, **params):
        """List Zones"""
        request = pecan.request
        context = request.environ['context']

        marker, limit, sort_key, sort_dir = utils.get_paging_params(
            context, params, self.SORT_KEYS)

        # Extract any filter params.
        accepted_filters = (
            'name',
            'type',
            'email',
            'status',
            'description',
            'ttl',
        )

        criterion = self._apply_filter_params(params, accepted_filters, {})

        zones = self.central_api.find_zones(context, criterion, marker, limit,
                                            sort_key, sort_dir)

        LOG.info("Retrieved %(zones)s", {'zones': zones})

        return DesignateAdapter.render('API_v2', zones, request=request)
예제 #12
0
    def patch_one(self, tsigkey_id):
        """Update TsigKey"""
        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        if request.content_type == 'application/json-patch+json':
            raise NotImplemented('json-patch not implemented')

        # Fetch the existing tsigkey entry
        tsigkey = self.central_api.get_tsigkey(context, tsigkey_id)

        tsigkey = DesignateAdapter.parse('API_v2', body, tsigkey)

        # Validate the new set of data
        tsigkey.validate()

        # Update and persist the resource
        tsigkey = self.central_api.update_tsigkey(context, tsigkey)

        LOG.info("Updated %(tsigkey)s", {'tsigkey': tsigkey})

        response.status_int = 200

        return DesignateAdapter.render('API_v2', tsigkey, request=request)
예제 #13
0
    def patch_one(self, fip_key):
        """
        Set or unset a PTR
        """
        request = pecan.request
        response = pecan.response

        context = request.environ['context']
        try:
            body = request.body_dict
        except Exception as e:
            if e.message != 'TODO: Unsupported Content Type':
                raise
            else:
                # Got a blank body
                body = dict()

        region, id_ = fip_key_to_data(fip_key)

        fip = DesignateAdapter.parse('API_v2', body, objects.FloatingIP())

        fip.validate()

        LOG.info(_LI("Updated %(fip)s"), {'fip': fip})

        fip = self.central_api.update_floatingip(context, region, id_, fip)

        response.status_int = 202

        if fip:
            return DesignateAdapter.render('API_v2', fip, request=request)
예제 #14
0
    def post_all(self, zone_id):
        """Create RecordSet"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']

        body = request.body_dict

        recordset = DesignateAdapter.parse('API_v2', body, RecordSet())

        recordset.validate()

        # SOA recordsets cannot be created manually
        if recordset.type == 'SOA':
            raise exceptions.BadRequest(
                "Creating a SOA recordset is not allowed")

        # Create the recordset
        recordset = self.central_api.create_recordset(context, zone_id,
                                                      recordset)

        # Prepare the response headers
        if recordset['status'] == 'PENDING':
            response.status_int = 202
        else:
            response.status_int = 201

        recordset = DesignateAdapter.render('API_v2',
                                            recordset,
                                            request=request)

        response.headers['Location'] = recordset['links']['self']

        # Prepare and return the response body
        return recordset
예제 #15
0
    def post_all(self, zone_id):
        """Create ZoneTransferRequest"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        try:
            body = request.body_dict
        except exceptions.EmptyRequestBody:
            body = dict()

        zone = self.central_api.get_zone(context, zone_id)
        body['zone_name'] = zone.name
        body['zone_id'] = zone_id

        zone_transfer_request = DesignateAdapter.parse(
            'API_v2', body, ZoneTransferRequest())

        zone_transfer_request.validate()

        # Create the zone_transfer_request
        zone_transfer_request = self.central_api.create_zone_transfer_request(
            context, zone_transfer_request)
        response.status_int = 201

        LOG.info("Created %(zone_transfer_request)s",
                 {'zone_transfer_request': zone_transfer_request})

        zone_transfer_request = DesignateAdapter.render(
            'API_v2', zone_transfer_request, request=request, context=context)

        response.headers['Location'] = zone_transfer_request['links']['self']
        # Prepare and return the response body
        return zone_transfer_request
예제 #16
0
    def _handle_errors(self, request, exception):

        response = {}

        headers = [
            ('Content-Type', 'application/json'),
        ]

        rendered_errors = DesignateAdapter.render(
            self.api_version, exception.errors, failed_object=exception.object)

        url = getattr(request, 'url', None)

        response['code'] = exception.error_code

        response['type'] = exception.error_type or 'unknown'

        response['errors'] = rendered_errors

        # Return the new response
        if 'context' in request.environ:
            response['request_id'] = request.environ['context'].request_id

            notifications.send_api_fault(request.environ['context'], url,
                                         response['code'], exception)
        else:
            # TODO(ekarlso): Remove after verifying that there's actually a
            # context always set
            LOG.error('Missing context in request, please check.')

        return flask.Response(status=exception.error_code,
                              headers=headers,
                              response=jsonutils.dump_as_bytes(response))
예제 #17
0
    def post_all(self):
        """Create Blacklisted Zone"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        blacklist = DesignateAdapter.parse('API_v2', body, Blacklist())

        blacklist.validate()

        # Create the blacklist
        blacklist = self.central_api.create_blacklist(
            context, blacklist)

        LOG.info("Created %(blacklist)s", {'blacklist': blacklist})

        response.status_int = 201

        blacklist = DesignateAdapter.render(
            'API_v2', blacklist, request=request)

        response.headers['Location'] = blacklist['links']['self']

        # Prepare and return the response body
        return blacklist
예제 #18
0
    def post_all(self, zone_id):
        """Create ZoneTransferRequest"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        try:
            body = request.body_dict
        except exceptions.EmptyRequestBody:
            body = dict()

        body['zone_id'] = zone_id

        zone_transfer_request = DesignateAdapter.parse('API_v2', body,
                                                       ZoneTransferRequest())

        zone_transfer_request.validate()

        # Create the zone_transfer_request
        zone_transfer_request = self.central_api.create_zone_transfer_request(
            context, zone_transfer_request)
        response.status_int = 201

        zone_transfer_request = DesignateAdapter.render('API_v2',
                                                        zone_transfer_request,
                                                        request=request,
                                                        context=context)

        response.headers['Location'] = zone_transfer_request['links']['self']
        # Prepare and return the response body
        return zone_transfer_request
예제 #19
0
    def _handle_errors(self, request, exception):

        response = {}

        headers = [
            ('Content-Type', 'application/json'),
        ]

        rendered_errors = DesignateAdapter.render(
            self.api_version, exception.errors, failed_object=exception.object)

        url = getattr(request, 'url', None)

        response['code'] = exception.error_code

        response['type'] = exception.error_type or 'unknown'

        response['errors'] = rendered_errors

        # Return the new response
        if 'context' in request.environ:
            response['request_id'] = request.environ['context'].request_id

            notifications.send_api_fault(request.environ['context'], url,
                                         response['code'], exception)
        else:
            # TODO(ekarlso): Remove after verifying that there's actually a
            # context always set
            LOG.error(_LE('Missing context in request, please check.'))

        return flask.Response(status=exception.error_code, headers=headers,
                              response=json.dumps(response))
예제 #20
0
    def get_all(self, zone_id, **params):
        """List RecordSets"""
        request = pecan.request
        context = request.environ['context']

        # NOTE: We need to ensure the zone actually exists, otherwise we may
        #       return deleted recordsets instead of a zone not found
        self.central_api.get_zone(context, zone_id)

        # Extract the pagination params
        marker, limit, sort_key, sort_dir = utils.get_paging_params(
            params, self.SORT_KEYS)

        # Extract any filter params.
        accepted_filters = (
            'name', 'type', 'ttl', 'data', 'status', 'description', )
        criterion = self._apply_filter_params(
            params, accepted_filters, {})

        criterion['zone_id'] = zone_id

        recordsets = self.central_api.find_recordsets(
            context, criterion, marker, limit, sort_key, sort_dir)

        LOG.info(_LI("Retrieved %(recordsets)s"), {'recordsets': recordsets})

        return DesignateAdapter.render('API_v2', recordsets, request=request)
예제 #21
0
    def patch_one(self, tsigkey_id):
        """Update TsigKey"""
        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        if request.content_type == 'application/json-patch+json':
            raise NotImplemented('json-patch not implemented')

        # Fetch the existing tsigkey entry
        tsigkey = self.central_api.get_tsigkey(context, tsigkey_id)

        tsigkey = DesignateAdapter.parse('API_v2', body, tsigkey)

        # Validate the new set of data
        tsigkey.validate()

        # Update and persist the resource
        tsigkey = self.central_api.update_tsigkey(context, tsigkey)

        LOG.info("Updated %(tsigkey)s", {'tsigkey': tsigkey})

        response.status_int = 200

        return DesignateAdapter.render('API_v2', tsigkey, request=request)
예제 #22
0
    def post_all(self):
        """Create Zone Import"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        if six.PY2:
            body = request.body
        else:
            body = request.body.decode('utf-8')

        if request.content_type != 'text/dns':
            raise exceptions.UnsupportedContentType(
                'Content-type must be text/dns')

        # Create the zone_import
        zone_import = self.central_api.create_zone_import(context, body)
        response.status_int = 202

        LOG.info(_LI("Created %(zone_import)s"), {'zone_import': zone_import})

        zone_import = DesignateAdapter.render('API_v2',
                                              zone_import,
                                              request=request)

        response.headers['Location'] = zone_import['links']['self']
        # Prepare and return the response body
        return zone_import
예제 #23
0
    def post_all(self):
        request = pecan.request
        response = pecan.response
        context = request.environ['context']

        body = request.body_dict
        rbac_obj = DesignateAdapter.parse('API_v2', body, RBACBaseObject())
        
        rbac_obj.validate()

        # Create the blacklist
        rbac_obj = self.central_api.create_rbacrule(
            context, rbac_obj)

        LOG.info("Created %(rbac)s", {'rbac': rbac_obj})

        response.status_int = 201

        rbac_obj = DesignateAdapter.render(
            'API_v2', rbac_obj, request=request)

        #response.headers['Location'] = rbac_obj['links']['self']

        # Prepare and return the response body
        return rbac
예제 #24
0
    def get_all(self, **params):
        """List RBAC rules that comply with either object or project ids for a Tenant"""
        request = pecan.request
        context = request.environ['context']

        object_id = None
        project_id = None

        try:
            body = request.body_dict
            rbac_obj = DesignateAdapter.parse('API_v2', body, RBACBaseObject())
            object_id = rbac_obj.object_id
            project_id = rbac_obj.project_id
        except Exception as e:
            if str(e) != 'TODO: Unsupported Content Type':
                raise
            else:
                # Got a blank body
                body = dict() 

        rules = self.central_api.list_rbac_rules(object_id=object_id,
                                                 project_id=project_id)

        LOG.info("Retrieved %(rbacrules)s", {'rbacrules': rules})

        return DesignateAdapter.render('API_v2', rules, request=request)
예제 #25
0
    def patch_one(self, pool_id):
        """Update the specific pool"""

        LOG.warning(_LW("Use of this API Method is DEPRICATED. This will have "
                        "unforseen side affects when used with the "
                        "designate-manage pool commands"))

        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        if request.content_type == 'application/json-patch+json':
            raise NotImplemented('json-patch not implemented')

        # Fetch the existing pool
        pool = self.central_api.get_pool(context, pool_id)

        pool = DesignateAdapter.parse('API_v2', body, pool)

        pool.validate()

        pool = self.central_api.update_pool(context, pool)

        response.status_int = 202

        return DesignateAdapter.render('API_v2', pool, request=request)
예제 #26
0
    def post_all(self):
        """Create ZoneTransferAccept"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']
        body = request.body_dict

        zone_transfer_accept = DesignateAdapter.parse(
            'API_v2', body, ZoneTransferAccept())

        zone_transfer_accept.validate()

        # Create the zone_transfer_request
        zone_transfer_accept = self.central_api.create_zone_transfer_accept(
            context, zone_transfer_accept)
        response.status_int = 201

        LOG.info(_LI("Created %(zone_transfer_accept)s"),
                 {'zone_transfer_accept': zone_transfer_accept})

        zone_transfer_accept = DesignateAdapter.render(
            'API_v2', zone_transfer_accept, request=request)

        response.headers['Location'] = zone_transfer_accept['links']['self']

        # Prepare and return the response body
        return zone_transfer_accept
예제 #27
0
    def patch_one(self, zone_id):
        """Update Zone"""
        # TODO(kiall): This needs cleanup to say the least..
        request = pecan.request
        context = request.environ['context']
        body = request.body_dict
        response = pecan.response

        # TODO(kiall): Validate we have a sane UUID for zone_id

        # Fetch the existing zone
        zone = self.central_api.get_zone(context, zone_id)

        # Don't allow updates to zones that are being deleted
        if zone.action == "DELETE":
            raise exceptions.BadRequest('Can not update a deleting zone')

        if request.content_type == 'application/json-patch+json':
            # Possible pattern:
            #
            # 1) Load existing zone.
            # 2) Apply patch, maintain list of changes.
            # 3) Return changes, after passing through the code ^ for plain
            #    JSON.
            #
            # Difficulties:
            #
            # 1) "Nested" resources? records inside a recordset.
            # 2) What to do when a zone doesn't exist in the first place?
            # 3) ...?
            raise NotImplemented('json-patch not implemented')
        else:
            # Update the zone object with the new values
            zone = DesignateAdapter.parse('API_v2', body, zone)

            zone.validate()
            # If masters are specified then we set zone.transferred_at to None
            # which will cause a new transfer
            if 'attributes' in zone.obj_what_changed():
                zone.transferred_at = None

            # Update and persist the resource

            if zone.type == 'SECONDARY' and 'email' in zone.obj_what_changed():
                msg = "Changed email is not allowed."
                raise exceptions.InvalidObject(msg)

            increment_serial = zone.type == 'PRIMARY'
            zone = self.central_api.update_zone(
                context, zone, increment_serial=increment_serial)

        LOG.info(_LI("Updated %(zone)s"), {'zone': zone})

        if zone.status == 'PENDING':
            response.status_int = 202
        else:
            response.status_int = 200

        return DesignateAdapter.render('API_v2', zone, request=request)
예제 #28
0
파일: quotas.py 프로젝트: tzblic/designate
    def get_one(self, tenant_id):
        context = pecan.request.environ['context']

        quotas = self.central_api.get_quotas(context, tenant_id)

        quotas = QuotaList.from_dict(quotas)

        return DesignateAdapter.render('API_v2', quotas)
예제 #29
0
    def get_all(self, zone_id, **params):
        """List RecordSets"""
        request = pecan.request
        context = request.environ['context']
        recordsets = common.retrieve_matched_rrsets(context, self, zone_id,
                                                    **params)

        return DesignateAdapter.render('API_v2', recordsets, request=request)
예제 #30
0
    def get_all(self, **params):
        """List Floating IP PTRs for a Tenant"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.list_floatingips(context),
            request=request)
예제 #31
0
    def get_one(self, zone_id, recordset_id):
        """Get RecordSet"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render('API_v2',
                                       self.central_api.get_recordset(
                                           context, zone_id, recordset_id),
                                       request=request)
예제 #32
0
파일: pools.py 프로젝트: bias/designate
    def get_one(self, pool_id):
        """Get the specific Pool"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_pool(context, pool_id),
            request=request)
예제 #33
0
    def get_one(self, pool_id):
        """Get the specific Pool"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_pool(context, pool_id),
            request=request)
예제 #34
0
    def get_all(self, **params):
        """List Floating IP PTRs for a Tenant"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.list_floatingips(context),
            request=request)
예제 #35
0
    def get_all(self, zone_id, **params):
        """List RecordSets"""
        request = pecan.request
        context = request.environ['context']

        # NOTE: We need to ensure the domain actually exists, otherwise we may
        #       return deleted recordsets instead of a domain not found
        self.central_api.get_domain(context, zone_id)

        # Extract the pagination params
        marker, limit, sort_key, sort_dir = utils.get_paging_params(
            params, self.SORT_KEYS)

        # Extract any filter params.
        accepted_filters = (
            'name', 'type', 'ttl', 'data', 'status', 'description', )
        criterion = self._apply_filter_params(
            params, accepted_filters, {})

        criterion['domain_id'] = zone_id

        # Data must be filtered separately, through the Records table
        data = criterion.pop('data', None)
        status = criterion.pop('status', None)

        # Retrieve recordsets
        recordsets = self.central_api.find_recordsets(
            context, criterion, marker, limit, sort_key, sort_dir)

        # 'data' filter param: only return recordsets with matching data
        if data:
            records = self.central_api.find_records(
                context, criterion={'data': data, 'domain_id': zone_id})
            recordset_with_data_ids = set(record.recordset_id
                                          for record in records)

            new_rsets = RecordSetList()

            for recordset in recordsets:
                if recordset.id in recordset_with_data_ids:
                    new_rsets.append(recordset)

            recordsets = new_rsets
            recordsets.total_count = len(recordset_with_data_ids)

        # 'status' filter param: only return recordsets with matching status
        if status:
            new_rsets = RecordSetList()

            for recordset in recordsets:
                if recordset.status == status:
                    new_rsets.append(recordset)

            recordsets = new_rsets

        return DesignateAdapter.render('API_v2', recordsets, request=request)
예제 #36
0
    def get_one(self, blacklist_id):
        """Get Blacklist"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_blacklist(context, blacklist_id),
            request=request)
예제 #37
0
    def get_all(self, **params):
        """List RecordSets"""
        request = pecan.request
        context = request.environ['context']
        recordsets = common.retrieve_matched_rrsets(context, self, None,
                                                    **params)

        LOG.info(_LI("Retrieved %(recordsets)s"), {'recordsets': recordsets})

        return DesignateAdapter.render('API_v2', recordsets, request=request)
예제 #38
0
    def delete_one(self, zone_id):
        """Delete Zone"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']

        zone = self.central_api.delete_zone(context, zone_id)
        response.status_int = 202

        return DesignateAdapter.render('API_v2', zone, request=request)
예제 #39
0
    def get_all(self, **params):
        """List Floating IP PTRs for a Tenant"""
        request = pecan.request
        context = request.environ['context']

        fips = self.central_api.list_floatingips(context)

        LOG.info(_LI("Retrieved %(fips)s"), {'fips': fips})

        return DesignateAdapter.render('API_v2', fips, request=request)
예제 #40
0
    def get_one(self, zone_id, recordset_id):
        """Get RecordSet"""
        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_recordset(
                context, zone_id, recordset_id),
            request=request)
예제 #41
0
    def get_one(self, tld_id):
        """Get Tld"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render('API_v2',
                                       self.central_api.get_tld(
                                           context, tld_id),
                                       request=request)
예제 #42
0
    def get_one(self, blacklist_id):
        """Get Blacklist"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render('API_v2',
                                       self.central_api.get_blacklist(
                                           context, blacklist_id),
                                       request=request)
예제 #43
0
    def get_one(self, pool_id):
        """Get the specific Pool"""
        request = pecan.request
        context = request.environ['context']

        pool = self.central_api.get_pool(context, pool_id)

        LOG.info(_LI("Retrieved %(pool)s"), {'pool': pool})

        return DesignateAdapter.render('API_v2', pool, request=request)
예제 #44
0
    def get_all(self, **params):
        """List RecordSets"""
        request = pecan.request
        context = request.environ['context']
        recordsets = common.retrieve_matched_rrsets(context, self, None,
                                                    **params)

        LOG.info("Retrieved %(recordsets)s", {'recordsets': recordsets})

        return DesignateAdapter.render('API_v2', recordsets, request=request)
예제 #45
0
    def get_all(self, **params):
        """List Floating IP PTRs for a Tenant"""
        request = pecan.request
        context = request.environ['context']

        fips = self.central_api.list_floatingips(context)

        LOG.info("Retrieved %(fips)s", {'fips': fips})

        return DesignateAdapter.render('API_v2', fips, request=request)
예제 #46
0
    def get_one(self, pool_id):
        """Get the specific Pool"""
        request = pecan.request
        context = request.environ['context']

        pool = self.central_api.get_pool(context, pool_id)

        LOG.info(_LI("Retrieved %(pool)s"), {'pool': pool})

        return DesignateAdapter.render('API_v2', pool, request=request)
예제 #47
0
    def delete_one(self, zone_id):
        """Delete Zone"""
        request = pecan.request
        response = pecan.response
        context = request.environ['context']

        zone = self.central_api.delete_zone(context, zone_id)
        response.status_int = 202

        return DesignateAdapter.render('API_v2', zone, request=request)
예제 #48
0
    def get_one(self, tld_id):
        """Get Tld"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_tld(context, tld_id),
            request=request)
예제 #49
0
    def get_one(self, transfer_accept_id):
        """Get transfer_accepts"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_zone_transfer_accept(
                context, transfer_accept_id),
            request=request)
예제 #50
0
 def generate_file(self, file):
     try:
         pools = self.central_api.find_pools(self.context)
     except messaging.exceptions.MessagingTimeout:
         LOG.critical(
             _LC("No response recieved from designate-central. "
                 "Check it is running, and retry"))
     with open(file, 'w') as stream:
         yaml.dump(DesignateAdapter.render('YAML', pools),
                   stream,
                   default_flow_style=False)
예제 #51
0
    def get_one(self, import_id):
        """Get Zone Imports"""

        request = pecan.request
        context = request.environ['context']

        zone_import = self.central_api.get_zone_import(context, import_id)

        LOG.info(_LI("Retrived %(zone_import)s"), {'zone_import': zone_import})

        return DesignateAdapter.render('API_v2', zone_import, request=request)
예제 #52
0
    def get_one(self, blacklist_id):
        """Get Blacklist"""

        request = pecan.request
        context = request.environ['context']

        blacklist = self.central_api.get_blacklist(context, blacklist_id)

        LOG.info("Retrieved %(blacklist)s", {'blacklist': blacklist})

        return DesignateAdapter.render('API_v2', blacklist, request=request)
예제 #53
0
    def get_one(self, transfer_accept_id):
        """Get transfer_accepts"""

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_zone_transfer_accept(context,
                                                      transfer_accept_id),
            request=request)
예제 #54
0
    def get_one(self, zone_id):
        """Get Zone"""
        # TODO(kiall): Validate we have a sane UUID for zone_id

        request = pecan.request
        context = request.environ['context']

        return DesignateAdapter.render(
            'API_v2',
            self.central_api.get_zone(context, zone_id),
            request=request)
예제 #55
0
    def get_one(self, service_id):
        """Get Service Status"""
        request = pecan.request
        context = request.environ['context']

        criterion = {"id": service_id}
        service_status = self.central_api.find_service_status(
            context, criterion)

        return DesignateAdapter.render(
            'API_v2', service_status, request=request)