Add zones_export_client's methods and tests to Designate tempest plugin

Partially-Implements: blueprint designate-tempest-plugin

Change-Id: Iff03a53842ac4e44ed720163695a35a74b970768
diff --git a/designate_tempest_plugin/common/models.py b/designate_tempest_plugin/common/models.py
new file mode 100644
index 0000000..e69bd09
--- /dev/null
+++ b/designate_tempest_plugin/common/models.py
@@ -0,0 +1,81 @@
+"""
+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.
+"""
+
+
+class ZoneFile(object):
+
+    def __init__(self, origin, ttl, records):
+        self.origin = origin
+        self.ttl = ttl
+        self.records = records
+
+    def __str__(self):
+        return str(self.__dict__)
+
+    def __repr__(self):
+        return str(self)
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+    @classmethod
+    def from_text(cls, text):
+        """Return a ZoneFile from a string containing the zone file contents"""
+        # filter out empty lines and strip all leading/trailing whitespace.
+        # this assumes no multiline records
+        lines = [x.strip() for x in text.split('\n') if x.strip()]
+
+        assert lines[0].startswith('$ORIGIN')
+        assert lines[1].startswith('$TTL')
+
+        return ZoneFile(
+            origin=lines[0].split(' ')[1],
+            ttl=int(lines[1].split(' ')[1]),
+            records=[ZoneFileRecord.from_text(x) for x in lines[2:]],
+        )
+
+
+class ZoneFileRecord(object):
+
+    def __init__(self, name, type, data):
+        self.name = str(name)
+        self.type = str(type)
+        self.data = str(data)
+
+    def __str__(self):
+        return str(self.__dict__)
+
+    def __repr__(self):
+        return str(self)
+
+    def __eq__(self, other):
+        return self.__dict__ == other.__dict__
+
+    def __hash__(self):
+        return hash(tuple(sorted(self.__dict__.items())))
+
+    @classmethod
+    def from_text(cls, text):
+        """Create a ZoneFileRecord from a line of text of a zone file, like:
+
+            mydomain.com. IN NS ns1.example.com.
+        """
+        # assumes records don't have a TTL between the name and the class.
+        # assumes no parentheses in the record, all on a single line.
+        parts = [x for x in text.split(' ', 4) if x.strip()]
+        name, rclass, rtype, data = parts
+        assert rclass == 'IN'
+        return cls(name=name, type=rtype, data=data)