Add DNS integration support to the client

DNS integration has been added to Neutron. This commit complements that
by adding --dns-name and --dns-domain arguments to create and update
commands of networks, ports and floating IPs.

Change-Id: I7a6ec05b6d7483fceb35f586ac476e8713904b59
Closes-Bug: #1547736
This commit is contained in:
Miguel Lavalle 2016-02-20 01:04:36 +00:00
parent e02a0ea3cf
commit 8d4c0e4ac2
7 changed files with 156 additions and 0 deletions

View File

@ -0,0 +1,67 @@
# Copyright (c) 2016 IBM
# All Rights Reserved.
#
# 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 neutronclient._i18n import _
def add_dns_argument_create(parser, resource, attribute):
# Add dns_name and dns_domain support to network, port and floatingip
# create
argument = '--dns-%s' % attribute
parser.add_argument(
argument,
help=_('Assign DNS %(attribute)s to the %(resource)s '
'(requires DNS integration '
'extension)') % {'attribute': attribute, 'resource': resource})
def args2body_dns_create(parsed_args, resource, attribute):
# Add dns_name and dns_domain support to network, port and floatingip
# create
destination = 'dns_%s' % attribute
argument = getattr(parsed_args, destination)
if argument:
resource[destination] = argument
def add_dns_argument_update(parser, resource, attribute):
# Add dns_name and dns_domain support to network, port and floatingip
# update
argument = '--dns-%s' % attribute
no_argument = '--no-dns-%s' % attribute
dns_args = parser.add_mutually_exclusive_group()
dns_args.add_argument(
argument,
help=_('Assign DNS %(attribute)s to the %(resource)s '
'(requires DNS integration '
'extension.)') % {'attribute': attribute, 'resource': resource})
dns_args.add_argument(
no_argument, action='store_true',
help=_('Unassign DNS %(attribute)s from the %(resource)s '
'(requires DNS integration '
'extension.)') % {'attribute': attribute, 'resource': resource})
def args2body_dns_update(parsed_args, resource, attribute):
# Add dns_name and dns_domain support to network, port and floatingip
# update
destination = 'dns_%s' % attribute
no_destination = 'no_dns_%s' % attribute
argument = getattr(parsed_args, destination)
no_argument = getattr(parsed_args, no_destination)
if argument:
resource[destination] = argument
if no_argument:
resource[destination] = ""

View File

@ -20,6 +20,7 @@ import argparse
from neutronclient._i18n import _
from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.neutron.v2_0 import dns
class ListFloatingIP(neutronV20.ListCommand):
@ -68,6 +69,8 @@ class CreateFloatingIP(neutronV20.CreateCommand):
'--subnet',
dest='subnet_id',
help=_('Subnet ID on which you want to create the floating IP.'))
dns.add_dns_argument_create(parser, self.resource, 'domain')
dns.add_dns_argument_create(parser, self.resource, 'name')
def args2body(self, parsed_args):
_network_id = neutronV20.find_resourceid_by_name_or_id(
@ -77,6 +80,8 @@ class CreateFloatingIP(neutronV20.CreateCommand):
['port_id', 'tenant_id',
'fixed_ip_address',
'floating_ip_address', 'subnet_id'])
dns.args2body_dns_create(parsed_args, body, 'domain')
dns.args2body_dns_create(parsed_args, body, 'name')
return {self.resource: body}

View File

@ -21,6 +21,7 @@ from neutronclient.common import exceptions
from neutronclient.common import utils
from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.neutron.v2_0 import availability_zone
from neutronclient.neutron.v2_0 import dns
from neutronclient.neutron.v2_0.qos import policy as qos_policy
@ -165,6 +166,7 @@ class CreateNetwork(neutronV20.CreateCommand, qos_policy.CreateQosPolicyMixin):
self.add_arguments_qos_policy(parser)
availability_zone.add_az_hint_argument(parser, self.resource)
dns.add_dns_argument_create(parser, self.resource, 'domain')
def args2body(self, parsed_args):
body = {'name': parsed_args.name,
@ -178,6 +180,7 @@ class CreateNetwork(neutronV20.CreateCommand, qos_policy.CreateQosPolicyMixin):
self.args2body_qos_policy(parsed_args, body)
availability_zone.args2body_az_hint(parsed_args, body)
dns.args2body_dns_create(parsed_args, body, 'domain')
return {'network': body}
@ -195,8 +198,10 @@ class UpdateNetwork(neutronV20.UpdateCommand, qos_policy.UpdateQosPolicyMixin):
def add_known_arguments(self, parser):
self.add_arguments_qos_policy(parser)
dns.add_dns_argument_update(parser, self.resource, 'domain')
def args2body(self, parsed_args):
body = {}
self.args2body_qos_policy(parsed_args, body)
dns.args2body_dns_update(parsed_args, body, 'domain')
return {'network': body}

View File

@ -22,6 +22,7 @@ from neutronclient._i18n import _
from neutronclient.common import exceptions
from neutronclient.common import utils
from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.neutron.v2_0 import dns
from neutronclient.neutron.v2_0.qos import policy as qos_policy
@ -263,6 +264,7 @@ class CreatePort(neutronV20.CreateCommand, UpdatePortSecGroupMixin,
parser.add_argument(
'network_id', metavar='NETWORK',
help=_('Network ID or name this port belongs to.'))
dns.add_dns_argument_create(parser, self.resource, 'name')
def args2body(self, parsed_args):
client = self.get_client()
@ -283,6 +285,7 @@ class CreatePort(neutronV20.CreateCommand, UpdatePortSecGroupMixin,
self.args2body_extradhcpopt(parsed_args, body)
self.args2body_qos_policy(parsed_args, body)
self.args2body_allowedaddresspairs(parsed_args, body)
dns.args2body_dns_create(parsed_args, body, 'name')
return {'port': body}
@ -314,6 +317,7 @@ class UpdatePort(neutronV20.UpdateCommand, UpdatePortSecGroupMixin,
self.add_arguments_extradhcpopt(parser)
self.add_arguments_qos_policy(parser)
self.add_arguments_allowedaddresspairs(parser)
dns.add_dns_argument_update(parser, self.resource, 'name')
def args2body(self, parsed_args):
body = {}
@ -326,5 +330,6 @@ class UpdatePort(neutronV20.UpdateCommand, UpdatePortSecGroupMixin,
self.args2body_extradhcpopt(parsed_args, body)
self.args2body_qos_policy(parsed_args, body)
self.args2body_allowedaddresspairs(parsed_args, body)
dns.args2body_dns_update(parsed_args, body, 'name')
return {'port': body}

View File

@ -117,6 +117,21 @@ class CLITestV20FloatingIpsJSON(test_cli20.CLITestV20Base):
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_create_floatingip_with_dns_name_and_dns_domain(self):
# Create floatingip: fip1 with dns name and dns domain.
resource = 'floatingip'
cmd = fip.CreateFloatingIP(test_cli20.MyApp(sys.stdout), None)
name = 'fip1'
myid = 'myid'
dns_name_name = 'my-floatingip'
dns_domain_name = 'my-domain.org.'
args = [name, '--dns-name', dns_name_name, '--dns-domain',
dns_domain_name]
position_names = ['floating_network_id', 'dns_name', 'dns_domain']
position_values = [name, dns_name_name, dns_domain_name]
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_list_floatingips(self):
# list floatingips: -D.
resources = 'floatingips'

View File

@ -163,6 +163,19 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_create_network_with_dns_domain(self):
# Create net: --dns-domain my-domain.org.
resource = 'network'
cmd = network.CreateNetwork(test_cli20.MyApp(sys.stdout), None)
name = 'myname'
myid = 'myid'
dns_domain_name = 'my-domain.org.'
args = [name, '--dns-domain', dns_domain_name]
position_names = ['name', 'dns_domain']
position_values = [name, dns_domain_name]
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_list_nets_empty_with_column(self):
resources = "networks"
cmd = network.ListNetwork(test_cli20.MyApp(sys.stdout), None)
@ -528,6 +541,22 @@ class CLITestV20NetworkJSON(test_cli20.CLITestV20Base):
['myid', '--no-qos-policy'],
{'qos_policy_id': None, })
def test_update_network_with_dns_domain(self):
# Update net: myid --dns-domain my-domain.org.
resource = 'network'
cmd = network.UpdateNetwork(test_cli20.MyApp(sys.stdout), None)
self._test_update_resource(resource, cmd, 'myid',
['myid', '--dns-domain', 'my-domain.org.'],
{'dns_domain': 'my-domain.org.', })
def test_update_network_with_no_dns_domain(self):
# Update net: myid --no-dns-domain
resource = 'network'
cmd = network.UpdateNetwork(test_cli20.MyApp(sys.stdout), None)
self._test_update_resource(resource, cmd, 'myid',
['myid', '--no-dns-domain'],
{'dns_domain': "", })
def test_show_network(self):
# Show net: --fields id --fields name myid.
resource = 'network'

View File

@ -338,6 +338,20 @@ class CLITestV20PortJSON(test_cli20.CLITestV20Base):
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_create_port_with_dns_name(self):
# Create port: --dns-name my-port.
resource = 'port'
cmd = port.CreatePort(test_cli20.MyApp(sys.stdout), None)
name = 'myname'
myid = 'myid'
netid = 'netid'
dns_name_name = 'my-port'
args = [netid, '--dns-name', dns_name_name]
position_names = ['network_id', 'dns_name']
position_values = [netid, dns_name_name]
self._test_create_resource(resource, cmd, name, myid, args,
position_names, position_values)
def test_create_port_with_allowed_address_pair_ipaddr(self):
# Create port:
# --allowed-address-pair ip_address=addr0
@ -648,6 +662,22 @@ class CLITestV20PortJSON(test_cli20.CLITestV20Base):
['myid', '--no-qos-policy'],
{'qos_policy_id': None, })
def test_update_port_with_dns_name(self):
# Update port: myid --dns-name my-port.
resource = 'port'
cmd = port.UpdatePort(test_cli20.MyApp(sys.stdout), None)
self._test_update_resource(resource, cmd, 'myid',
['myid', '--dns-name', 'my-port'],
{'dns_name': 'my-port', })
def test_update_port_with_no_dns_name(self):
# Update port: myid --no-dns-name
resource = 'port'
cmd = port.UpdatePort(test_cli20.MyApp(sys.stdout), None)
self._test_update_resource(resource, cmd, 'myid',
['myid', '--no-dns-name'],
{'dns_name': "", })
def test_delete_extra_dhcp_opts_from_port(self):
resource = 'port'
myid = 'myid'