Add Designate integration

This patch adds Designate support

Change-Id: Ic8391196c0d7eefc6f0ff7b6cc6106d499284e22
Related-PROD: PROD-14689
diff --git a/.kitchen.yml b/.kitchen.yml
index 2481b6c..da050d9 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -158,4 +158,9 @@
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_legacy_fwaas_v1.sls
 
+  - name: control_dns
+    provisioner:
+      pillars-from-files:
+        neutron.sls: tests/pillar/control_dns.sls
+
 # vim: ft=yaml sw=2 ts=2 sts=2 tw=125
diff --git a/.travis.yml b/.travis.yml
index cc2ce87..6e01664 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -46,6 +46,8 @@
     - PLATFORM=trevorj/salty-whales:trusty SUITE=control_qos
     - PLATFORM=trevorj/salty-whales:xenial SUITE=control_qos
     - PLATFORM=trevorj/salty-whales:xenial SUITE=control_ovn
+    - PLATFORM=trevorj/salty-whales:trusty SUITE=control_dns
+    - PLATFORM=trevorj/salty-whales:xenial SUITE=control_dns
     - PLATFORM=trevorj/salty-whales:trusty SUITE=gateway_dvr
     - PLATFORM=trevorj/salty-whales:xenial SUITE=gateway_dvr
     - PLATFORM=trevorj/salty-whales:trusty SUITE=gateway_legacy
diff --git a/README.rst b/README.rst
index 57153ed..7da4084 100644
--- a/README.rst
+++ b/README.rst
@@ -992,6 +992,23 @@
               enabled: True
 
 
+
+Neutron with Designate
+-----------------------------------------
+.. code-block:: yaml
+
+    neutron:
+      server:
+        backend:
+          extension:
+            dns:
+              enabled: True
+              host: 127.0.0.1
+              port: 9001
+              protocol: http
+
+
+
 Documentation and Bugs
 ======================
 
diff --git a/_states/neutronng.py b/_states/neutronng.py
index 92afb7a..046fb79 100644
--- a/_states/neutronng.py
+++ b/_states/neutronng.py
@@ -83,7 +83,8 @@
                     shared=None,
                     provider_segmentation_id=None,
                     profile=None,
-                    endpoint_type=None):
+                    endpoint_type=None,
+                    dns_domain=None):
     '''
     Ensure that the neutron network is present with the specified properties.
     name
@@ -103,7 +104,8 @@
         admin_state_up=admin_state_up,
         shared=shared,
         tenant_id=tenant_id,
-        provider_segmentation_id=provider_segmentation_id)
+        provider_segmentation_id=provider_segmentation_id,
+        dns_domain=dns_domain)
 
     if len(existing_networks) == 0:
         network_arguments.update(connection_args)
diff --git a/metadata/service/control/cluster.yml b/metadata/service/control/cluster.yml
index 701b367..b1ac5ad 100644
--- a/metadata/service/control/cluster.yml
+++ b/metadata/service/control/cluster.yml
@@ -44,3 +44,12 @@
         user: nova
         password: ${_param:keystone_nova_password}
         tenant: service
+      backend:
+        extension:
+          dns:
+            enabled: False
+            engine: designate
+            protocol: http
+            host: ${_param:cluster_vip_address}
+            port: 9001
+            url: ${neutron:server:backend:extension:dns:protocol}://${neutron:server:backend:extension:dns:host}:${neutron:server:backend:extension:dns:port}/v2
diff --git a/metadata/service/control/single.yml b/metadata/service/control/single.yml
index 149d37a..0f22b88 100644
--- a/metadata/service/control/single.yml
+++ b/metadata/service/control/single.yml
@@ -48,3 +48,12 @@
         user: nova
         password: ${_param:keystone_nova_password}
         tenant: service
+      backend:
+        extension:
+          dns:
+            enabled: False
+            engine: designate
+            protocol: http
+            host: ${_param:single_address}
+            port: 9001
+            url: ${neutron:server:backend:extension:dns:protocol}://${neutron:server:backend:extension:dns:host}:${neutron:server:backend:extension:dns:port}/v2
diff --git a/neutron/client.sls b/neutron/client.sls
index 44b03f7..2f8e6b9 100644
--- a/neutron/client.sls
+++ b/neutron/client.sls
@@ -58,6 +58,9 @@
     {%- if network.provider_segmentation_id is defined %}
     - provider_segmentation_id: {{ network.provider_segmentation_id }}
     {%- endif %}
+    {%- if network.dns_domain is defined %}
+    - dns_domain: {{ network.dns_domain }}
+    {%- endif %}
 
 {%- if network.subnet is defined %}
 
diff --git a/neutron/files/ocata/neutron-server.conf.Debian b/neutron/files/ocata/neutron-server.conf.Debian
index 74e155c..fd15e1f 100644
--- a/neutron/files/ocata/neutron-server.conf.Debian
+++ b/neutron/files/ocata/neutron-server.conf.Debian
@@ -118,6 +118,9 @@
 
 # Driver for external DNS integration. (string value)
 #external_dns_driver = <None>
+{%- if server.backend.get('extension', {}).get('dns', {}).get('enabled', False) %}
+external_dns_driver={{ server.backend.get('extension', {}).get('dns', {}).get('engine', '') }}
+{%- endif %}
 
 # Allow sending resource operation notification to DHCP agent (boolean value)
 #dhcp_agent_notification = true
@@ -2224,3 +2227,20 @@
 {% include "neutron/files/"+server.version+"/ContrailPlugin.ini" %}
 
 {% endif %}
+
+{%- if server.backend.get('extension', {}).get('dns', {}).get('enabled', False) and server.backend.get('extension', {}).get('dns', {}).get('engine', '') == 'designate' %}
+[designate]
+{%- if server.backend.get('extension', {}).get('dns', {}).get('url', False) %}
+url = {{ server.backend.extension.dns.url }}
+{%- else %}
+#url = <None>
+{%- endif %}
+auth_region={{ server.identity.region }}
+auth_type = password
+user_domain_id = {{ server.identity.get('domain', 'default') }}
+project_domain_id = {{ server.identity.get('domain', 'default') }}
+project_name = {{ server.identity.tenant }}
+username = {{ server.identity.user }}
+password = {{ server.identity.password }}
+auth_url=http://{{ server.identity.host }}:35357
+{%- endif %}
diff --git a/tests/pillar/control_dns.sls b/tests/pillar/control_dns.sls
new file mode 100644
index 0000000..d8167fa
--- /dev/null
+++ b/tests/pillar/control_dns.sls
@@ -0,0 +1,58 @@
+neutron:
+  server:
+    backend:
+      engine: ml2
+      external_mtu: 1500
+      mechanism:
+        ovs:
+          driver: openvswitch
+      tenant_network_types: flat,vxlan
+      extension:
+        dns:
+          enabled: true
+          engine: designate
+          url: http://127.0.0.1:9001/v2
+    bind:
+      address: 172.16.10.101
+      port: 9696
+    compute:
+      host: 127.0.0.1
+      password: workshop
+      region: RegionOne
+      tenant: service
+      user: nova
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      name: neutron
+      password: workshop
+      port: 3306
+      user: neutron
+    dns_domain: novalocal
+    dvr: false
+    enabled: true
+    qos: false
+    global_physnet_mtu: 1500
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      password: workshop
+      port: 35357
+      region: RegionOne
+      tenant: service
+      user: neutron
+      endpoint_type: internal
+    l3_ha: False
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      password: workshop
+      port: 5672
+      user: openstack
+      virtual_host: /openstack
+    plugin: ml2
+    version: ocata
+    policy:
+      create_subnet: 'rule:admin_or_network_owner'
+      'get_network:queue_id': 'rule:admin_only'
+      'create_network:shared':