1414# License for the specific language governing permissions and limitations
1515# under the License.
1616
17+ import re
18+
1719from oslo_config import cfg
1820from restalchemy .common import contexts
1921from restalchemy .common import exceptions
@@ -112,7 +114,7 @@ def get_name(self, domain) -> str:
112114 )
113115
114116 def get_content (self , domain ) -> str :
115- return str (self .address )
117+ return str (self .content )
116118
117119
118120class ARecord (AbstractRecord ):
@@ -127,6 +129,9 @@ class ARecord(AbstractRecord):
127129 required = True ,
128130 )
129131
132+ def get_content (self , domain ) -> str :
133+ return str (self .address )
134+
130135
131136class SOARecord (AbstractRecord ):
132137 KIND = "SOA"
@@ -149,12 +154,26 @@ def get_content(self, domain) -> str:
149154 return f"{ self .primary_dns } { domain .name } { self .serial } { self .refresh } { self .retry } { self .expire } { self .ttl } "
150155
151156
157+ class TXTRecord (AbstractRecord ):
158+ KIND = "TXT"
159+
160+ name = properties .property (
161+ types_network .RecordName (),
162+ required = True ,
163+ )
164+ content = properties .property (
165+ # Restrict newline and length
166+ types .BaseCompiledRegExpType (re .compile (r'^([^\n]{1,8192})$' )),
167+ required = True ,
168+ )
169+
170+
152171class Record (CommonModel ):
153172 __tablename__ = "dns_records"
154173 domain = relationships .relationship (Domain , required = True )
155174 domain_id = properties .property (types .Integer ())
156175 type = properties .property (
157- types .Enum (("A" , "SOA" )), # "AAAA", "CNAME", "MX", "TXT ",
176+ types .Enum (("A" , "SOA" , "TXT" )), # "AAAA", "CNAME", "MX",
158177 read_only = True ,
159178 required = True ,
160179 )
@@ -165,6 +184,7 @@ class Record(CommonModel):
165184 types_dynamic .KindModelSelectorType (
166185 types_dynamic .KindModelType (ARecord ),
167186 types_dynamic .KindModelType (SOARecord ),
187+ types_dynamic .KindModelType (TXTRecord ),
168188 ),
169189 required = True ,
170190 )
0 commit comments