Example #1
0
class FloatingIP(base.DictObjectMixin, base.PersistentObjectMixin,
                 base.DesignateObject):
    fields = {
        "address":
        fields.IPV4AddressField(nullable=True),
        "description":
        fields.StringFields(nullable=True, maxLength=160),
        "ptrdname":
        fields.DomainField(nullable=True),
        "ttl":
        fields.IntegerFields(nullable=True, minimum=1, maximum=2147483647),
        "region":
        fields.StringFields(nullable=True),
        "action":
        fields.EnumField(['CREATE', 'DELETE', 'UPDATE', 'NONE'],
                         nullable=True),
        "status":
        fields.EnumField(['ACTIVE', 'PENDING', 'ERROR'], nullable=True)
    }

    STRING_KEYS = ['key', 'address', 'ptrdname']

    @property
    def key(self):
        return '%s:%s' % (self.region, self.id)
Example #2
0
class TsigKey(base.DictObjectMixin, base.PersistentObjectMixin,
              base.DesignateObject):
    def __init__(self, *args, **kwargs):
        super(TsigKey, self).__init__(*args, **kwargs)

    fields = {
        'name': fields.StringFields(nullable=False, maxLength=160),
        'algorithm': fields.EnumField(nullable=False,
            valid_values=[
                'hmac-md5',
                'hmac-sha1',
                'hmac-sha224',
                'hmac-sha256',
                'hmac-sha384',
                'hmac-sha512'
            ]
        ),
        'secret': fields.StringFields(maxLength=160),
        'scope': fields.EnumField(nullable=False,
            valid_values=['POOL', 'ZONE']
        ),
        'resource_id': fields.UUIDFields(nullable=False)
    }

    STRING_KEYS = [
        'id', 'name', 'algorithm', 'scope', 'resource_id'
    ]
Example #3
0
class Record(base.DesignateObject, base.PersistentObjectMixin,
             base.DictObjectMixin):
    def __init__(self, *args, **kwargs):
        super(Record, self).__init__(*args, **kwargs)

    fields = {
        'shard':
        fields.IntegerFields(nullable=True, minimum=0, maximum=4095),
        'data':
        fields.AnyField(nullable=True),
        'zone_id':
        fields.UUIDFields(nullable=True),
        'managed':
        fields.BooleanField(nullable=True),
        'managed_resource_type':
        fields.StringFields(nullable=True, maxLength=160),
        'managed_resource_id':
        fields.UUIDFields(nullable=True),
        'managed_plugin_name':
        fields.StringFields(nullable=True, maxLength=160),
        'managed_plugin_type':
        fields.StringFields(nullable=True, maxLength=160),
        'hash':
        fields.StringFields(nullable=True, maxLength=32),
        'description':
        fields.StringFields(nullable=True, maxLength=160),
        'status':
        fields.EnumField(
            valid_values=['ACTIVE', 'PENDING', 'ERROR', 'DELETED'],
            nullable=True),
        'tenant_id':
        fields.StringFields(nullable=True),
        'recordset_id':
        fields.UUIDFields(nullable=True),
        'managed_tenant_id':
        fields.StringFields(nullable=True),
        'managed_resource_region':
        fields.StringFields(nullable=True, maxLength=160),
        'managed_extra':
        fields.StringFields(nullable=True, maxLength=160),
        'action':
        fields.EnumField(valid_values=['CREATE', 'DELETE', 'UPDATE', 'NONE'],
                         nullable=True),
        'serial':
        fields.IntegerFields(nullable=True, minimum=1, maximum=4294967295),
    }

    @classmethod
    def get_recordset_schema_changes(cls):
        # This is to allow record types to override the validation on a
        # recordset
        return {}

    STRING_KEYS = ['id', 'recordset_id', 'data']

    def __str__(self):
        record = self.to_dict()
        record['data'] = record['data'][:35]
        return (self._make_obj_str(self.STRING_KEYS) % record)
class ZoneTransferRequest(
        base.DictObjectMixin,
        base.PersistentObjectMixin,
        base.DesignateObject,
):
    fields = {
        'key':
        fields.StringFields(nullable=True, maxLength=160),
        'zone_id':
        fields.UUIDFields(nullable=True),
        'description':
        fields.StringFields(nullable=True, maxLength=160),
        'tenant_id':
        fields.StringFields(nullable=True),
        'target_tenant_id':
        fields.StringFields(nullable=True),
        'status':
        fields.EnumField(
            nullable=True,
            valid_values=["ACTIVE", "PENDING", "DELETED", "ERROR",
                          "COMPLETE"]),
        'zone_name':
        fields.StringFields(nullable=True, maxLength=255),
    }

    STRING_KEYS = ['id', 'zone_id', 'zone_name', 'target_tenant_id']
Example #5
0
class ZoneImport(base.DictObjectMixin, base.PersistentObjectMixin,
                 base.DesignateObject):
    fields = {
        'status':
        fields.EnumField(
            nullable=True,
            valid_values=["ACTIVE", "PENDING", "DELETED", "ERROR",
                          "COMPLETE"]),
        'task_type':
        fields.EnumField(nullable=True, valid_values=["IMPORT"]),
        'tenant_id':
        fields.StringFields(nullable=True),
        'message':
        fields.StringFields(nullable=True, maxLength=160),
        'zone_id':
        fields.UUIDFields(nullable=True)
    }
class PoolManagerStatus(base.DictObjectMixin, base.PersistentObjectMixin,
                        base.DesignateObject):
    fields = {
        'nameserver_id':
        fields.UUIDFields(),
        'zone_id':
        fields.UUIDFields(),
        'status':
        fields.EnumField(['ACTIVE', 'PENDING', 'ERROR', 'SUCCESS', 'COMPLETE'],
                         nullable=True),
        'serial_number':
        fields.IntegerFields(minimum=0, maximum=4294967295),
        'action':
        fields.EnumField(['CREATE', 'DELETE', 'UPDATE', 'NONE'],
                         nullable=True),
    }

    STRING_KEYS = ['id', 'action', 'status', 'server_id', 'zone_id']
class ZoneTransferAccept(base.DictObjectMixin, base.PersistentObjectMixin,
                         base.DesignateObject):
    fields = {
        'zone_transfer_request_id':
        fields.UUIDFields(nullable=True),
        'tenant_id':
        fields.StringFields(nullable=True),
        'status':
        fields.EnumField(
            nullable=True,
            valid_values=["ACTIVE", "PENDING", "DELETED", "ERROR",
                          "COMPLETE"]),
        'key':
        fields.StringFields(maxLength=160),
        'zone_id':
        fields.UUIDFields(nullable=True),
    }

    STRING_KEYS = ['id', 'zone_id', 'tenant_id', 'zone_transfer_request_id']
class ServiceStatus(base.DesignateObject, base.DictObjectMixin,
                    base.PersistentObjectMixin):

    def __init__(self, *args, **kwargs):
        super(ServiceStatus, self).__init__(*args, **kwargs)

    fields = {
        "service_name": fields.StringFields(),
        "hostname": fields.StringFields(nullable=True),
        "heartbeated_at": fields.DateTimeField(nullable=True),
        "status": fields.EnumField(nullable=True, valid_values=[
            "UP", "DOWN", "WARNING"
        ]),
        "stats": fields.BaseObjectField(nullable=True),
        "capabilities": fields.BaseObjectField(nullable=True),
    }

    STRING_KEYS = [
        'service_name', 'hostname', 'status'
    ]
Example #9
0
class Zone(base.DesignateObject, base.DictObjectMixin,
           base.PersistentObjectMixin, base.SoftDeleteObjectMixin):
    def __init__(self, *args, **kwargs):
        super(Zone, self).__init__(*args, **kwargs)

    fields = {
        'shard': fields.IntegerFields(nullable=True, minimum=0, maximum=4095),
        'tenant_id': fields.StringFields(nullable=True, read_only=False),
        'name': fields.DomainField(maxLength=255),
        'email': fields.EmailField(maxLength=255, nullable=True),
        'ttl': fields.IntegerFields(nullable=True, minimum=1,
                                    maximum=2147483647),
        'refresh': fields.IntegerFields(nullable=True, minimum=0,
                                        maximum=2147483647, read_only=False),
        'retry': fields.IntegerFields(nullable=True, minimum=0,
                                      maximum=2147483647, read_only=False),
        'expire': fields.IntegerFields(nullable=True, minimum=0,
                                       maximum=2147483647, read_only=False),
        'minimum': fields.IntegerFields(nullable=True, minimum=0,
                                        maximum=2147483647, read_only=False),
        'parent_zone_id': fields.UUIDFields(nullable=True, read_only=False),
        'serial': fields.IntegerFields(nullable=True, minimum=0,
                                       maximum=4294967295, read_only=False),
        'description': fields.StringFields(nullable=True, maxLength=160),
        'status': fields.EnumField(nullable=True, read_only=False,
                                   valid_values=[
                                       'ACTIVE', 'PENDING', 'ERROR',
                                       'DELETED', 'SUCCESS', 'NO_ZONE']

                                   ),
        'action': fields.EnumField(nullable=True,
                                   valid_values=[
                                       'CREATE', 'DELETE', 'UPDATE', 'NONE']
                                   ),
        'pool_id': fields.UUIDFields(nullable=True, read_only=False),
        'recordsets': fields.ObjectField('RecordSetList', nullable=True),
        'attributes': fields.ObjectField('ZoneAttributeList', nullable=True),
        'masters': fields.ObjectField('ZoneMasterList', nullable=True),
        'type': fields.EnumField(nullable=True,
                                 valid_values=['SECONDARY', 'PRIMARY'],
                                 read_only=False
                                 ),
        'transferred_at': fields.DateTimeField(nullable=True, read_only=False),
        'delayed_notify': fields.BooleanField(nullable=True),
    }

    STRING_KEYS = [
        'id', 'type', 'name', 'pool_id', 'serial', 'action', 'status'
    ]

    def get_master_by_ip(self, host):
        """
        Utility to get the master by it's ip for this zone.
        """
        for srv in self.masters:
            srv_host, _ = utils.split_host_port(srv.to_data())
            if host == srv_host:
                return srv
        return False

    def _raise(self, errors):
        if len(errors) != 0:
            raise exceptions.InvalidObject(
                "Provided object does not match "
                "schema", errors=errors, object=self)

    def __hash__(self):
        return hash(self.id)

    def validate(self):
        errors = ValidationErrorList()

        if self.type == 'PRIMARY':
            if self.obj_attr_is_set('masters') and len(self.masters) != 0:
                e = ValidationError()
                e.path = ['type']
                e.validator = 'maxItems'
                e.validator_value = ['masters']
                e.message = "'masters' has more items than allowed"
                errors.append(e)
            if self.email is None:
                e = ValidationError()
                e.path = ['type']
                e.validator = 'required'
                e.validator_value = 'email'
                e.message = "'email' is a required property"
                errors.append(e)
            self._raise(errors)

        try:
            if self.type == 'SECONDARY':
                if self.masters is None or len(self.masters) == 0:
                    e = ValidationError()
                    e.path = ['type']
                    e.validator = 'required'
                    e.validator_value = ['masters']
                    e.message = "'masters' is a required property"
                    errors.append(e)

                for i in ['email', 'ttl']:
                    if i in self.obj_what_changed():
                        e = ValidationError()
                        e.path = ['type']
                        e.validator = 'not_allowed'
                        e.validator_value = i
                        e.message = "'%s' can't be specified when type is " \
                                    "SECONDARY" % i
                        errors.append(e)
                self._raise(errors)

            super(Zone, self).validate()
        except exceptions.RelationNotLoaded as ex:
            errors = ValidationErrorList()
            e = ValidationError()
            e.path = ['type']
            e.validator = 'required'
            e.validator_value = [ex.relation]
            e.message = "'%s' is a required property" % ex.relation
            errors.append(e)
            self._raise(errors)