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)
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' ]
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']
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' ]
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)