Merge "Don't support floating ip if only specify 'network'"

This commit is contained in:
Jenkins 2016-05-26 12:25:44 +00:00 committed by Gerrit Code Review
commit c8b2f2bcaa
2 changed files with 38 additions and 0 deletions

View File

@ -36,6 +36,7 @@ class ServerNetworkMixin(object):
port = network.get(self.NETWORK_PORT) port = network.get(self.NETWORK_PORT)
subnet = network.get(self.NETWORK_SUBNET) subnet = network.get(self.NETWORK_SUBNET)
fixed_ip = network.get(self.NETWORK_FIXED_IP) fixed_ip = network.get(self.NETWORK_FIXED_IP)
floating_ip = network.get(self.NETWORK_FLOATING_IP)
if net_id is None and port is None and subnet is None: if net_id is None and port is None and subnet is None:
msg = _('One of the properties "%(id)s", "%(port_id)s" ' msg = _('One of the properties "%(id)s", "%(port_id)s" '
@ -58,6 +59,18 @@ class ServerNetworkMixin(object):
"/".join([self.NETWORKS, self.NETWORK_FIXED_IP]), "/".join([self.NETWORKS, self.NETWORK_FIXED_IP]),
"/".join([self.NETWORKS, self.NETWORK_PORT])) "/".join([self.NETWORKS, self.NETWORK_PORT]))
# if user only specifies network and floating ip, floating ip
# can't be associated as the the neutron port isn't created/managed
# by heat
if floating_ip is not None and self.is_using_neutron():
if net_id is not None and port is None and subnet is None:
msg = _('Property "%(fip)s" is not supported if only '
'"%(net)s" is specified, because the corresponding '
'port can not be retrieved.'
) % dict(fip=self.NETWORK_FLOATING_IP,
net=self.NETWORK_ID)
raise exception.StackValidationFailed(message=msg)
def _validate_belonging_subnet_to_net(self, network): def _validate_belonging_subnet_to_net(self, network):
if network.get(self.NETWORK_PORT) is None and self.is_using_neutron(): if network.get(self.NETWORK_PORT) is None and self.is_using_neutron():
net = self._get_network_id(network) net = self._get_network_id(network)

View File

@ -1195,6 +1195,31 @@ class ServersTest(common.HeatTestCase):
'server "%s".') % server.name, 'server "%s".') % server.name,
six.text_type(ex)) six.text_type(ex))
def test_server_validate_with_network_floating_ip(self):
stack_name = 'srv_net_floating_ip'
(tmpl, stack) = self._setup_test_stack(stack_name)
# create a server with 'uuid' and 'network' properties
tmpl['Resources']['WebServer']['Properties']['networks'] = (
[{'floating_ip': '172.24.4.14',
'network': '6b1688bb-18a0-4754-ab05-19daaedc5871'}])
self.patchobject(nova.NovaClientPlugin, '_create',
return_value=self.fc)
resource_defns = tmpl.resource_definitions(stack)
server = servers.Server('server_validate_net_floating_ip',
resource_defns['WebServer'], stack)
self.patchobject(glance.GlanceClientPlugin, 'get_image',
return_value=self.mock_image)
self.patchobject(nova.NovaClientPlugin, 'get_flavor',
return_value=self.mock_flavor)
self.patchobject(neutron.NeutronClientPlugin,
'find_resourceid_by_name_or_id')
ex = self.assertRaises(exception.StackValidationFailed,
server.validate)
self.assertIn(_('Property "floating_ip" is not supported if '
'only "network" is specified, because the '
'corresponding port can not be retrieved.'),
six.text_type(ex))
def test_server_validate_with_port_fixed_ip(self): def test_server_validate_with_port_fixed_ip(self):
stack_name = 'srv_net' stack_name = 'srv_net'
(tmpl, stack) = self._setup_test_stack(stack_name) (tmpl, stack) = self._setup_test_stack(stack_name)