'Update an instance port dns_name attribute with instance.hostname.
The dns_name attribute of a port on a network with a non-blank
dns_domain attribute will be sent to the external DNS service
(Designate) if DNS integration is enabled in Neutron. This requires the
assignment of the dns_name to the port to be done with a Neutron client
using the user\'s context. allocate_for_instance uses a port with admin
context if the port binding extensions is enabled in Neutron. In this
case, we assign in this method the dns_name attribute to the port with
an additional update request. Only a very small fraction of ports will
require this additional update request.'

def _update_port_dns_name(self, context, instance, network, port_id, neutron):

    if ((constants.DNS_INTEGRATION in self.extensions) and self._has_port_binding_extension(context) and network.get('dns_domain')):
        try:
            port_req_body = {'port': {'dns_name': instance.hostname}}
            neutron.update_port(port_id, port_req_body)
        except neutron_client_exc.BadRequest:
            LOG.warning(_LW('Neutron    error:    Instance    hostname    %(hostname)s    is    not    a    valid    DNS    name'), {'hostname': instance.hostname}, instance=instance)
            msg = (_('Instance    hostname    %(hostname)s    is    not    a    valid    DNS    name') % {'hostname': instance.hostname})
            raise exception.InvalidInput(reason=msg)
