Net attr: Sort segments without name attribute first

Useing get_attr, pulling index 0 in the segments list
of a network to associate the a subnet with the "first"
segment is useful since the "first" segment is created
by neutron behind the scenes on network create. A resource
reference cannot be used since the "first" segment is'nt
a heat resource.

The issue is the order of the segments list is'nt reliable.

On stack update index 0 may be a different segment, and
we end up trying to update the segment_id for a subnet.
Changeing the segment association is not allowed, so
the stack update fails.

While not perfect, sorting the list so that segments where
name is None comes first will ensure that index 0 can be used.

The template author should ensure segments defined in the heat
template all have a names set, so that only the segment creted
implicitly by neutron have 'None' name.

Closes-Bug: #1894920
Change-Id: I097aba2a97144327bec188e6c71629d0f6c95901
(cherry picked from commit 539b2a4c49)
This commit is contained in:
Harald Jensås 2020-09-09 04:55:43 +02:00
parent 49ef181bb2
commit fb879d1ee9
2 changed files with 22 additions and 1 deletions

View File

@ -284,8 +284,13 @@ class Net(neutron.NeutronResource):
if self.resource_id is None:
return
if name == self.SEGMENTS:
return [segment.to_dict() for segment in list(self.client(
segments = [segment.to_dict() for segment in list(self.client(
'openstack').network.segments(network_id=self.resource_id))]
# Sort segments without name attribute first.
# See bug: https://bugs.launchpad.net/tripleo/+bug/1894920
segments.sort(key=lambda s: s['name'] is not None)
return segments
attributes = self._show_resource()
return attributes[name]

View File

@ -0,0 +1,16 @@
---
fixes:
- |
The ordering in the list of segments returned by ``OS::Neutron::Net``
resources is not predictable. Stack updates changeing attributes
of the network can cause the list of segments to shift.
The ordering is now slightly more predictable, segments with name=``None``
are now placed first in the list. This doesn't guarantee the order, but
typically only the segment implicitly created by neutron has no name
attribute set. The template author should ensure other segments on the
network does have a name set, so that the implicit segment will always be
index 0. Resolving attributes of the implcitly created segment on the
network resource can then predictibly happen using index 0. See `bug:
1894920 <https://bugs.launchpad.net/tripleo/+bug/1894920>`_.