blob: 46c816596fea7554dd386111c1073e99610f7061 [file] [log] [blame]
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +01001# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
sonu.kumarde24d962016-05-05 00:28:00 +090014import random
15
16import netaddr
Paul Glass89edc112016-04-21 17:06:33 +000017from oslo_log import log as logging
Paul Glassa3ab50c2016-05-11 16:37:18 -050018from tempest import config
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010019from tempest.lib.common.utils import data_utils
20
Paul Glass89edc112016-04-21 17:06:33 +000021LOG = logging.getLogger(__name__)
Paul Glassa3ab50c2016-05-11 16:37:18 -050022CONF = config.CONF
Paul Glass89edc112016-04-21 17:06:33 +000023
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010024
sonu.kumarde24d962016-05-05 00:28:00 +090025def rand_ip():
26 return ".".join(str(random.randrange(0, 256)) for _ in range(4))
27
28
29def rand_ipv6():
30 def hexes(n):
31 return "".join(random.choice("1234567890abcdef") for _ in range(n))
32 result = ":".join(hexes(4) for _ in range(8))
33 an = netaddr.IPAddress(result, version=6)
34 return an.format(netaddr.ipv6_compact)
35
36
sonu.kumaraec952a2016-04-20 10:08:46 +090037def rand_zone_name(name='', prefix=None, suffix='.com.'):
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010038 """Generate a random zone name
sonu.kumaraec952a2016-04-20 10:08:46 +090039 :param str name: The name that you want to include
40 :param prefix: the exact text to start the string. Defaults to "rand"
41 :param suffix: the exact text to end the string
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010042 :return: a random zone name e.g. example.org.
43 :rtype: string
44 """
sonu.kumaraec952a2016-04-20 10:08:46 +090045 name = data_utils.rand_name(name=name, prefix=prefix)
46 return name + suffix
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010047
48
49def rand_email(domain=None):
50 """Generate a random zone name
51 :return: a random zone name e.g. example.org.
52 :rtype: string
53 """
54 domain = domain or rand_zone_name()
55 return 'example@%s' % domain.rstrip('.')
56
57
58def rand_ttl(start=1, end=86400):
59 """Generate a random TTL value
60 :return: a random ttl e.g. 165
61 :rtype: string
62 """
Paul Glassa3ab50c2016-05-11 16:37:18 -050063 start = max(start, CONF.dns.min_ttl)
Kiall Mac Innes25fb29e2016-04-07 08:07:04 +010064 return data_utils.rand_int_id(start, end)
sonu.kumaraec952a2016-04-20 10:08:46 +090065
66
67def rand_zonefile_data(name=None, ttl=None):
68 """Generate random zone data, with optional overrides
69
70 :return: A ZoneModel
71 """
72 zone_base = ('$ORIGIN &\n& # IN SOA ns.& nsadmin.& # # # # #\n'
73 '& # IN NS ns.&\n& # IN MX 10 mail.&\nns.& 360 IN A 1.0.0.1')
74 if name is None:
75 name = rand_zone_name()
76 if ttl is None:
Paul Glassa3ab50c2016-05-11 16:37:18 -050077 ttl = rand_ttl()
sonu.kumaraec952a2016-04-20 10:08:46 +090078
Paul Glassa3ab50c2016-05-11 16:37:18 -050079 return zone_base.replace('&', name).replace('#', str(ttl))
Paul Glass89edc112016-04-21 17:06:33 +000080
81
82def rand_quotas(zones=None, zone_records=None, zone_recordsets=None,
83 recordset_records=None, api_export_size=None):
Graham Hayesc8114982016-07-04 17:46:08 +010084 quotas_dict = {
85 'zones':
86 zones or data_utils.rand_int_id(100, 999999),
87 'zone_records':
88 zone_records or data_utils.rand_int_id(100, 999999),
89 'zone_recordsets':
90 zone_recordsets or data_utils.rand_int_id(100, 999999),
91 'recordset_records':
92 recordset_records or data_utils.rand_int_id(100, 999999),
Paul Glass89edc112016-04-21 17:06:33 +000093 }
sonu.kumarde24d962016-05-05 00:28:00 +090094
Graham Hayesc8114982016-07-04 17:46:08 +010095 if CONF.dns_feature_enabled.bug_1573141_fixed:
96 quotas_dict['api_export_size'] = \
97 api_export_size or data_utils.rand_int_id(100, 999999)
98 else:
99 LOG.warn("Leaving `api_export_size` out of quota data due to: "
100 "https://bugs.launchpad.net/designate/+bug/1573141")
101
102 return quotas_dict
103
sonu.kumarde24d962016-05-05 00:28:00 +0900104
105def rand_zone_data(name=None, email=None, ttl=None, description=None):
106 """Generate random zone data, with optional overrides
107
108 :return: A ZoneModel
109 """
110 if name is None:
111 name = rand_zone_name(prefix='testdomain', suffix='.com.')
112 if email is None:
113 email = ("admin@" + name).strip('.')
114 if description is None:
115 description = rand_zone_name(prefix='Description ', suffix='')
116 if ttl is None:
Paul Glassa3ab50c2016-05-11 16:37:18 -0500117 ttl = rand_ttl()
sonu.kumarde24d962016-05-05 00:28:00 +0900118 return {
119 'name': name,
120 'email': email,
Paul Glassa3ab50c2016-05-11 16:37:18 -0500121 'ttl': ttl,
sonu.kumarde24d962016-05-05 00:28:00 +0900122 'description': description}
123
124
125def rand_recordset_data(record_type, zone_name, name=None, records=None,
126 ttl=None):
127 """Generate random recordset data, with optional overrides
128
129 :return: A RecordsetModel
130 """
131 if name is None:
132 name = rand_zone_name(prefix=record_type, suffix='.' + zone_name)
133 if records is None:
134 records = [rand_ip()]
135 if ttl is None:
Paul Glassa3ab50c2016-05-11 16:37:18 -0500136 ttl = rand_ttl()
sonu.kumarde24d962016-05-05 00:28:00 +0900137 return {
138 'type': record_type,
139 'name': name,
140 'records': records,
141 'ttl': ttl}
142
143
144def rand_a_recordset(zone_name, ip=None, **kwargs):
145 if ip is None:
146 ip = rand_ip()
147 return rand_recordset_data('A', zone_name, records=[ip], **kwargs)
148
149
150def rand_aaaa_recordset(zone_name, ip=None, **kwargs):
151 if ip is None:
152 ip = rand_ipv6()
153 return rand_recordset_data('AAAA', zone_name, records=[ip], **kwargs)
154
155
156def rand_cname_recordset(zone_name, cname=None, **kwargs):
157 if cname is None:
158 cname = zone_name
159 return rand_recordset_data('CNAME', zone_name, records=[cname], **kwargs)
160
161
162def rand_mx_recordset(zone_name, pref=None, host=None, **kwargs):
163 if pref is None:
164 pref = str(random.randint(0, 65535))
165 if host is None:
166 host = rand_zone_name(prefix='mail', suffix='.' + zone_name)
167 data = "{0} {1}".format(pref, host)
168 return rand_recordset_data('MX', zone_name, records=[data], **kwargs)
169
170
171def rand_spf_recordset(zone_name, data=None, **kwargs):
172 data = data or "v=spf1 +all"
173 return rand_recordset_data('SPF', zone_name, records=[data], **kwargs)
174
175
176def rand_srv_recordset(zone_name, data=None):
177 data = data or "10 0 8080 %s.%s" % (rand_zone_name(suffix=''), zone_name)
178 return rand_recordset_data('SRV', zone_name,
179 name="_sip._tcp.%s" % zone_name,
180 records=[data])
181
182
183def rand_sshfp_recordset(zone_name, algorithm_number=None,
184 fingerprint_type=None, fingerprint=None,
185 **kwargs):
186 algorithm_number = algorithm_number or 2
187 fingerprint_type = fingerprint_type or 1
188 fingerprint = fingerprint or \
189 "123456789abcdef67890123456789abcdef67890"
190
191 data = "%s %s %s" % (algorithm_number, fingerprint_type, fingerprint)
192 return rand_recordset_data('SSHFP', zone_name, records=[data], **kwargs)
193
194
195def rand_txt_recordset(zone_name, data=None, **kwargs):
196 data = data or "v=spf1 +all"
197 return rand_recordset_data('TXT', zone_name, records=[data], **kwargs)
198
199
200def wildcard_ns_recordset(zone_name):
201 name = "*.{0}".format(zone_name)
202 records = ["ns.example.com."]
203 return rand_recordset_data('NS', zone_name, name, records)
sonu.kumar4beb93c2016-05-05 01:12:43 +0900204
205
206def rand_ns_records():
207 ns_zone = rand_zone_name()
208 records = []
209 for i in range(0, 2):
210 records.append("ns%s.%s" % (i, ns_zone))
211 ns_records = [{"hostname": x, "priority": random.randint(1, 999)}
212 for x in records]
213 return ns_records
sonu.kumar2de01be2016-05-05 10:07:28 +0900214
215
216def rand_tld():
217 data = {
218 "name": rand_zone_name(prefix='tld', suffix='')
219 }
220 return data
sonu.kumare9785c92016-05-17 10:56:47 +0900221
222
223def rand_transfer_request_data(description=None, target_project_id=None):
224 """Generate random transfer request data, with optional overrides
225
226 :return: A TransferRequest data
227 """
228
229 data = {}
230
231 if description is None:
232 data['description'] = data_utils.rand_name(prefix='Description ')
233
234 if target_project_id:
235 data['target_project_id'] = target_project_id
236
237 return data
sonu.kumarc3110862016-05-27 14:48:04 +0900238
239
240def rand_tsig_algorithm():
241 algorithm = ['hmac-md5', 'hmac-sha1', 'hmac-sha224', 'hmac-sha256',
242 'hmac-sha384', 'hmac-sha512']
243 return random.choice(algorithm)
244
245
246def rand_tsig_scope():
247 scope = ["ZONE", "POOL"]
248 return random.choice(scope)
Eric Larsondc715e12016-08-25 13:21:35 +0100249
250
251def make_rand_recordset(zone_name, record_type):
252 """Create a rand recordset by type
253 This essentially just dispatches to the relevant random recordset
254 creation functions.
255
256 :param str zone_name: The zone name the recordset applies to
257 :param str record_type: The type of recordset (ie A, MX, NS, etc...)
258 """
259
260 func = globals()["rand_{}_recordset".format(record_type.lower())]
261 return func(zone_name)