From a98de81298ab5d5c63d32cc038ccebac7ee778aa Mon Sep 17 00:00:00 2001
From: Paul Glass <paul.glass@rackspace.com>
Date: Mon, 28 Sep 2015 15:44:46 +0000
Subject: [PATCH] Add functional tests for tlds

The tld tests will create/remove tlds which would cause problems
when running zone tests in parallel. To solve this, a separate tld
is created for each zone.

Change-Id: I8957f6f294bc5624ce049e36bef4a948cef3e380
---
 designateclient/functionaltests/base.py       |  7 ++
 designateclient/functionaltests/client.py     | 33 +++++++-
 designateclient/functionaltests/datagen.py    |  8 +-
 .../functionaltests/v2/fixtures.py            | 19 +++++
 .../functionaltests/v2/test_recordsets.py     |  1 +
 .../functionaltests/v2/test_tlds.py           | 82 +++++++++++++++++++
 .../functionaltests/v2/test_zone.py           |  5 ++
 .../functionaltests/v2/test_zone_transfer.py  |  2 +
 8 files changed, 154 insertions(+), 3 deletions(-)
 create mode 100644 designateclient/functionaltests/v2/test_tlds.py

diff --git a/designateclient/functionaltests/base.py b/designateclient/functionaltests/base.py
index 52e293d..5d6835c 100644
--- a/designateclient/functionaltests/base.py
+++ b/designateclient/functionaltests/base.py
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 """
 from tempest_lib.cli import base
+from tempest_lib.exceptions import CommandFailed
 
 from designateclient.functionaltests import client
 from designateclient.functionaltests import config
@@ -24,3 +25,9 @@ class BaseDesignateTest(base.ClientTestBase):
     def _get_clients(self):
         config.read_config()
         return client.DesignateCLI.as_user('default')
+
+    def ensure_tld_exists(self, tld):
+        try:
+            self.clients.as_user('admin').tld_create(tld)
+        except CommandFailed:
+            pass
diff --git a/designateclient/functionaltests/client.py b/designateclient/functionaltests/client.py
index 70c8e17..86682d4 100644
--- a/designateclient/functionaltests/client.py
+++ b/designateclient/functionaltests/client.py
@@ -191,8 +191,39 @@ class RecordsetCommands(object):
         return self.parsed_cmd(cmd, *args, **kwargs)
 
 
+class TLDCommands(object):
+
+    def tld_list(self, *args, **kwargs):
+        return self.parsed_cmd('tld list', ListModel, *args, **kwargs)
+
+    def tld_show(self, id, *args, **kwargs):
+        return self.parsed_cmd('tld show {0}'.format(id), FieldValueModel,
+                               *args, **kwargs)
+
+    def tld_delete(self, id, *args, **kwargs):
+        return self.parsed_cmd('tld delete {0}'.format(id), *args, **kwargs)
+
+    def tld_create(self, name, description=None, *args, **kwargs):
+        options_str = build_option_string({
+            '--name': name,
+            '--description': description,
+        })
+        cmd = 'tld create {0}'.format(options_str)
+        return self.parsed_cmd(cmd, FieldValueModel, *args, **kwargs)
+
+    def tld_set(self, id, name=None, description=None, no_description=False,
+                *args, **kwargs):
+        options_str = build_option_string({
+            '--name': name,
+            '--description': description,
+        })
+        flags_str = build_flags_string({'--no-description': no_description})
+        cmd = 'tld set {0} {1} {2}'.format(id, options_str, flags_str)
+        return self.parsed_cmd(cmd, FieldValueModel, *args, **kwargs)
+
+
 class DesignateCLI(base.CLIClient, ZoneCommands, ZoneTransferCommands,
-                   RecordsetCommands):
+                   RecordsetCommands, TLDCommands):
 
     # instantiate this once to minimize requests to keystone
     _CLIENTS = None
diff --git a/designateclient/functionaltests/datagen.py b/designateclient/functionaltests/datagen.py
index 7ae7178..3940c84 100644
--- a/designateclient/functionaltests/datagen.py
+++ b/designateclient/functionaltests/datagen.py
@@ -21,8 +21,12 @@ def random_digits(n=8):
     return "".join([random.choice(string.digits) for _ in range(n)])
 
 
-def random_zone_name(name='testdomain'):
-    return "{0}{1}.com.".format(name, random_digits())
+def random_tld(name='testtld'):
+    return "{0}{1}".format(name, random_digits())
+
+
+def random_zone_name(name='testdomain', tld='com'):
+    return "{0}{1}.{2}.".format(name, random_digits(), tld)
 
 
 def random_a_recordset_name(zone_name, recordset_name='testrecord'):
diff --git a/designateclient/functionaltests/v2/fixtures.py b/designateclient/functionaltests/v2/fixtures.py
index 1b6894c..e841b14 100644
--- a/designateclient/functionaltests/v2/fixtures.py
+++ b/designateclient/functionaltests/v2/fixtures.py
@@ -96,3 +96,22 @@ class RecordsetFixture(BaseFixture):
             client.recordset_delete(zone_id, recordset_id)
         except CommandFailed:
             pass
+
+
+class TLDFixture(BaseFixture):
+    """See DesignateCLI.tld_create for __init__ args"""
+
+    def __init__(self, user='admin', *args, **kwargs):
+        super(TLDFixture, self).__init__(user=user, *args, **kwargs)
+
+    def _setUp(self):
+        super(TLDFixture, self)._setUp()
+        self.tld = self.client.tld_create(*self.args, **self.kwargs)
+        self.addCleanup(self.cleanup_tld, self.client, self.tld.id)
+
+    @classmethod
+    def cleanup_tld(cls, client, tld_id):
+        try:
+            client.tld_delete(tld_id)
+        except CommandFailed:
+            pass
diff --git a/designateclient/functionaltests/v2/test_recordsets.py b/designateclient/functionaltests/v2/test_recordsets.py
index 8712c23..6be2a2d 100644
--- a/designateclient/functionaltests/v2/test_recordsets.py
+++ b/designateclient/functionaltests/v2/test_recordsets.py
@@ -26,6 +26,7 @@ class TestRecordset(BaseDesignateTest):
 
     def setUp(self):
         super(TestRecordset, self).setUp()
+        self.ensure_tld_exists('com')
         self.zone = self.useFixture(ZoneFixture(
             name=random_zone_name(),
             email='test@example.com',
diff --git a/designateclient/functionaltests/v2/test_tlds.py b/designateclient/functionaltests/v2/test_tlds.py
new file mode 100644
index 0000000..6a79be7
--- /dev/null
+++ b/designateclient/functionaltests/v2/test_tlds.py
@@ -0,0 +1,82 @@
+"""
+Copyright 2015 Rackspace
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+from tempest_lib.exceptions import CommandFailed
+
+from designateclient.functionaltests.base import BaseDesignateTest
+from designateclient.functionaltests.datagen import random_tld
+from designateclient.functionaltests.v2.fixtures import TLDFixture
+
+
+class TestTld(BaseDesignateTest):
+
+    def setUp(self):
+        super(TestTld, self).setUp()
+        tld_name = random_tld()
+        self.tld = self.useFixture(TLDFixture(
+            name=tld_name,
+            description='A random tld',
+        )).tld
+
+        self.assertEqual(self.tld.name, tld_name)
+        self.assertEqual(self.tld.description, 'A random tld')
+
+    def test_tld_list(self):
+        tlds = self.clients.as_user('admin').tld_list()
+        self.assertGreater(len(tlds), 0)
+
+    def test_tld_create_and_show(self):
+        tld = self.clients.as_user('admin').tld_show(self.tld.id)
+        self.assertEqual(tld.name, self.tld.name)
+        self.assertEqual(tld.created_at, self.tld.created_at)
+        self.assertEqual(tld.id, self.tld.id)
+        self.assertEqual(tld.name, self.tld.name)
+        self.assertEqual(tld.updated_at, self.tld.updated_at)
+
+    def test_tld_delete(self):
+        client = self.clients.as_user('admin')
+        client.tld_delete(self.tld.id)
+        self.assertRaises(CommandFailed, client.tld_show, self.tld.id)
+
+    def test_tld_set(self):
+        client = self.clients.as_user('admin')
+        updated_name = random_tld('updated')
+        tld = client.tld_set(self.tld.id, name=updated_name,
+                             description='An updated tld')
+        self.assertEqual(tld.description, 'An updated tld')
+        self.assertEqual(tld.name, updated_name)
+
+    def test_tld_set_no_description(self):
+        client = self.clients.as_user('admin')
+        tld = client.tld_set(self.tld.id, no_description=True)
+        self.assertEqual(tld.description, 'None')
+
+    def test_no_set_tld_with_description_and_no_description(self):
+        client = self.clients.as_user('admin')
+        self.assertRaises(CommandFailed, client.tld_set, self.tld.id,
+                          description='An updated tld',
+                          no_description=True)
+
+
+class TestTldNegative(BaseDesignateTest):
+
+    def test_tld_invalid_commmand(self):
+        client = self.clients.as_user('admin')
+        self.assertRaises(CommandFailed, client.openstack, 'tld notacommand')
+
+    def test_tld_create_invalid_flag(self):
+        client = self.clients.as_user('admin')
+        self.assertRaises(CommandFailed, client.openstack,
+                          'tld create --notanoption "junk"')
diff --git a/designateclient/functionaltests/v2/test_zone.py b/designateclient/functionaltests/v2/test_zone.py
index 6ce8fd8..bcdb87b 100644
--- a/designateclient/functionaltests/v2/test_zone.py
+++ b/designateclient/functionaltests/v2/test_zone.py
@@ -24,6 +24,7 @@ class TestZone(BaseDesignateTest):
 
     def setUp(self):
         super(TestZone, self).setUp()
+        self.ensure_tld_exists('com')
         self.fixture = self.useFixture(ZoneFixture(
             name=random_zone_name(),
             email='test@example.com',
@@ -80,6 +81,10 @@ class TestZone(BaseDesignateTest):
 
 class TestsPassingZoneFlags(BaseDesignateTest):
 
+    def setUp(self):
+        super(TestsPassingZoneFlags, self).setUp()
+        self.ensure_tld_exists('com')
+
     def test_zone_create_primary_with_all_args(self):
         zone_name = random_zone_name()
         fixture = self.useFixture(ZoneFixture(
diff --git a/designateclient/functionaltests/v2/test_zone_transfer.py b/designateclient/functionaltests/v2/test_zone_transfer.py
index 4b97498..eeead24 100644
--- a/designateclient/functionaltests/v2/test_zone_transfer.py
+++ b/designateclient/functionaltests/v2/test_zone_transfer.py
@@ -28,6 +28,7 @@ class TestZoneTransferRequest(BaseDesignateTest):
 
     def setUp(self):
         super(TestZoneTransferRequest, self).setUp()
+        self.ensure_tld_exists('com')
         fixture = self.useFixture(ZoneFixture(
             name=random_zone_name(),
             email='test@example.com',
@@ -92,6 +93,7 @@ class TestZoneTransferAccept(BaseDesignateTest):
 
     def setUp(self):
         super(TestZoneTransferAccept, self).setUp()
+        self.ensure_tld_exists('com')
         fixture = self.useFixture(ZoneFixture(
             name=random_zone_name(),
             email='test@example.com',