Add recordset_client's methods and tests to Designate tempest plugin

Partially-Implements: blueprint designate-tempest-plugin

Change-Id: I55ebc5210f7b1e50b59411658a1ae4d1f39a3ff4
diff --git a/designate_tempest_plugin/data_utils.py b/designate_tempest_plugin/data_utils.py
index c77c4b1..322e506 100644
--- a/designate_tempest_plugin/data_utils.py
+++ b/designate_tempest_plugin/data_utils.py
@@ -11,12 +11,27 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
+import random
+
+import netaddr
 from oslo_log import log as logging
 from tempest.lib.common.utils import data_utils
 
 LOG = logging.getLogger(__name__)
 
 
+def rand_ip():
+    return ".".join(str(random.randrange(0, 256)) for _ in range(4))
+
+
+def rand_ipv6():
+    def hexes(n):
+        return "".join(random.choice("1234567890abcdef") for _ in range(n))
+    result = ":".join(hexes(4) for _ in range(8))
+    an = netaddr.IPAddress(result, version=6)
+    return an.format(netaddr.ipv6_compact)
+
+
 def rand_zone_name(name='', prefix=None, suffix='.com.'):
     """Generate a random zone name
     :param str name: The name that you want to include
@@ -80,3 +95,104 @@
             #     api_export_size or data_utils.rand_int_id(100, 999999),
         }
     }
+
+
+def rand_zone_data(name=None, email=None, ttl=None, description=None):
+    """Generate random zone data, with optional overrides
+
+    :return: A ZoneModel
+    """
+    if name is None:
+        name = rand_zone_name(prefix='testdomain', suffix='.com.')
+    if email is None:
+        email = ("admin@" + name).strip('.')
+    if description is None:
+        description = rand_zone_name(prefix='Description ', suffix='')
+    if ttl is None:
+        ttl = random.randint(1200, 8400),
+    return {
+        'name': name,
+        'email': email,
+        'ttl': random.randint(1200, 8400),
+        'description': description}
+
+
+def rand_recordset_data(record_type, zone_name, name=None, records=None,
+                        ttl=None):
+    """Generate random recordset data, with optional overrides
+
+    :return: A RecordsetModel
+    """
+    if name is None:
+        name = rand_zone_name(prefix=record_type, suffix='.' + zone_name)
+    if records is None:
+        records = [rand_ip()]
+    if ttl is None:
+        ttl = random.randint(1200, 8400)
+    return {
+        'type': record_type,
+        'name': name,
+        'records': records,
+        'ttl': ttl}
+
+
+def rand_a_recordset(zone_name, ip=None, **kwargs):
+    if ip is None:
+        ip = rand_ip()
+    return rand_recordset_data('A', zone_name, records=[ip], **kwargs)
+
+
+def rand_aaaa_recordset(zone_name, ip=None, **kwargs):
+    if ip is None:
+        ip = rand_ipv6()
+    return rand_recordset_data('AAAA', zone_name, records=[ip], **kwargs)
+
+
+def rand_cname_recordset(zone_name, cname=None, **kwargs):
+    if cname is None:
+        cname = zone_name
+    return rand_recordset_data('CNAME', zone_name, records=[cname], **kwargs)
+
+
+def rand_mx_recordset(zone_name, pref=None, host=None, **kwargs):
+    if pref is None:
+        pref = str(random.randint(0, 65535))
+    if host is None:
+        host = rand_zone_name(prefix='mail', suffix='.' + zone_name)
+    data = "{0} {1}".format(pref, host)
+    return rand_recordset_data('MX', zone_name, records=[data], **kwargs)
+
+
+def rand_spf_recordset(zone_name, data=None, **kwargs):
+    data = data or "v=spf1 +all"
+    return rand_recordset_data('SPF', zone_name, records=[data], **kwargs)
+
+
+def rand_srv_recordset(zone_name, data=None):
+    data = data or "10 0 8080 %s.%s" % (rand_zone_name(suffix=''), zone_name)
+    return rand_recordset_data('SRV', zone_name,
+                               name="_sip._tcp.%s" % zone_name,
+                               records=[data])
+
+
+def rand_sshfp_recordset(zone_name, algorithm_number=None,
+                         fingerprint_type=None, fingerprint=None,
+                         **kwargs):
+    algorithm_number = algorithm_number or 2
+    fingerprint_type = fingerprint_type or 1
+    fingerprint = fingerprint or \
+        "123456789abcdef67890123456789abcdef67890"
+
+    data = "%s %s %s" % (algorithm_number, fingerprint_type, fingerprint)
+    return rand_recordset_data('SSHFP', zone_name, records=[data], **kwargs)
+
+
+def rand_txt_recordset(zone_name, data=None, **kwargs):
+    data = data or "v=spf1 +all"
+    return rand_recordset_data('TXT', zone_name, records=[data], **kwargs)
+
+
+def wildcard_ns_recordset(zone_name):
+    name = "*.{0}".format(zone_name)
+    records = ["ns.example.com."]
+    return rand_recordset_data('NS', zone_name, name, records)