[openstack-dev] [TripleO][Heat] Conditionally passing properties in Heat
Dan Sneddon
dsneddon at redhat.com
Wed Apr 19 21:51:28 UTC 2017
On 04/13/2017 12:01 AM, Rabi Mishra wrote:
> On Thu, Apr 13, 2017 at 2:14 AM, Dan Sneddon <dsneddon at redhat.com
> <mailto:dsneddon at redhat.com>> wrote:
>
> On 04/12/2017 01:22 PM, Thomas Herve wrote:
> > On Wed, Apr 12, 2017 at 9:00 PM, Dan Sneddon <dsneddon at redhat.com
> <mailto:dsneddon at redhat.com>> wrote:
> >> I'm implementing predictable control plane IPs for spine/leaf,
> and I'm
> >> running into a problem implementing this in the TripleO Heat
> templates.
> >>
> >> I have a review in progress [1] that works, but fails on upgrade,
> so I'm
> >> looking for an alternative approach. I'm trying to influence the IP
> >> address that is selected for overcloud nodes' Control Plane IP.
> Here is
> >> the current construct:
> >>
> >> Controller:
> >> type: OS::TripleO::Server
> >> metadata:
> >> os-collect-config:
> >> command: {get_param: ConfigCommand}
> >> properties:
> >> image: {get_param: controllerImage}
> >> image_update_policy: {get_param: ImageUpdatePolicy}
> >> flavor: {get_param: OvercloudControlFlavor}
> >> key_name: {get_param: KeyName}
> >> networks:
> >> - network: ctlplane # <- Here's where the port is created
> >>
> >> If I add fixed_ip: to the networks element at the end of the above, I
> >> can select an IP address from the 'ctlplane' network, like this:
> >>
> >> networks:
> >> - network: ctlplane
> >> fixed_ip: {get_attr: [ControlPlanePort, ip_address]}
> >>
> >> But the problem is that if I pass a blank string to fixed_ip, I
> get an
> >> error on deployment. This means that the old behavior of
> automatically
> >> selecting an IP doesn't work.
> >>
> >> I thought I has solved this by passing an external Neutron port,
> like this:
> >>
> >> networks:
> >> - network: ctlplane
> >> port: {get_attr: [ControlPlanePort, port_id]}
> >>
> >> Which works for deployments, but that fails on upgrades, since the
> >> original port was created as part of the Nova::Server resource,
> instead
> >> of being an external resource.
> >
> > Can you detail how it fails? I was under the impression we never
> > replaced servers no matter what (or we try to do that, at least). Is
> > the issue that your new port is not the correct one?
> >
> >> I'm now looking for a way to use Heat conditionals to apply the
> fixed_ip
> >> only if the value is not unset. Looking at the intrinsic
> functions [2],
> >> I don't see a way to do this. Is what I'm trying to do with Heat
> possible?
> >
> > You should be able to write something like that (not tested):
> >
> > networks:
> > if:
> > - <my condition>
> > - network: ctlplane
> > fixed_ip: {get_attr: [ControlPlanePort, ip_address]}
> > - network: ctlplane
> >
> > The question is how to define your condition. Maybe:
> >
> > conditions:
> > fixed_ip_condition:
> > not:
> > equals:
> > - {get_attr: [ControlPlanePort, ip_address]}
> > - ''
> >
> > To get back to the problem you stated first.
> >
> >
> >> Another option I'm exploring is conditionally applying resources. It
> >> appears that would require duplicating the entire TripleO::Server
> stanza
> >> in *-role.yaml so that there is one that uses fixed_ip and one
> that does
> >> not. Which one is applied would be based on a condition that tested
> >> whether fixed_ip was blank or not. The downside of that is that
> it would
> >> make the role definition confusing because there would be a large
> >> resource that was implemented twice, with only one line difference
> >> between them.
> >
> > You can define properties with conditions, so you shouldn't need to
> > rewrite everything.
> >
>
> Thomas,
>
> Thanks, I will try your suggestions and that should get me closer.
>
> The full error log is available here:
> http://logs.openstack.org/78/413278/11/check-tripleo/gate-tripleo-ci-centos-7-ovb-updates/8d91762/console.html
> <http://logs.openstack.org/78/413278/11/check-tripleo/gate-tripleo-ci-centos-7-ovb-updates/8d91762/console.html>
>
> We do an interface_detach/attach when a port is replaced.
> It seems to be failing[1] as this is not implemented for
> ironic/baremetal driver. I could see a patch[2] to add that
> functionality though.
>
> [1]
> http://logs.openstack.org/78/413278/11/check-tripleo/gate-tripleo-ci-centos-7-ovb-updates/8d91762/logs/undercloud/var/log/nova/nova-compute.txt.gz#_2017-04-12_00_26_15_475
>
> [2] https://review.openstack.org/#/c/419975/
>
> We retry a few times to check whether the detach/attach is complete(it's
> an async operation in nova and takes time), so the cryptic error below
> is coming from tenacity library which fails after the configured number
> of attempts.
>
> Here are the errors I am getting:
>
> 2017-04-12 00:26:34.436655 | 2017-04-12 00:26:29Z
> [overcloud-CephStorage-bkucn6ign34i-0-2yq2jbtwuu7k.CephStorage]:
> UPDATE_FAILED RetryError: resources.CephStorage: RetryError[<Future at
> 0xdd62550 state=finished returned bool>]
> 2017-04-12 00:26:34.436808 | 2017-04-12 00:26:29Z
> [overcloud-CephStorage-bkucn6ign34i-0-2yq2jbtwuu7k]: UPDATE_FAILED
> RetryError: resources.CephStorage: RetryError[<Future at 0xdd62550
> state=finished returned bool>]
> 2017-04-12 00:26:34.436903 | 2017-04-12 00:26:29Z
> [overcloud-CephStorage-bkucn6ign34i.0]: UPDATE_FAILED resources[0]:
> RetryError: resources.CephStorage: RetryError[<Future at 0xdd62550
> state=finished returned bool>]
> 2017-04-12 00:26:34.436989 | 2017-04-12 00:26:29Z
> [overcloud-CephStorage-bkucn6ign34i]: UPDATE_FAILED resources[0]:
> RetryError: resources.CephStorage: RetryError[<Future at 0xdd62550
> state=finished returned bool>]
> 2017-04-12 00:26:34.437078 | 2017-04-12 00:26:30Z
> [overcloud-Controller-3lf3jauv4cbc-0-ydowkb3nwsso.Controller]:
> UPDATE_FAILED RetryError: resources.Controller: RetryError[<Future at
> 0xdc79b50 state=finished returned bool>]
> 2017-04-12 00:26:34.437173 | 2017-04-12 00:26:30Z
> [overcloud-Controller-3lf3jauv4cbc-0-ydowkb3nwsso]: UPDATE_FAILED
> RetryError: resources.Controller: RetryError[<Future at 0xdc79b50
> state=finished returned bool>]
> 2017-04-12 00:26:34.437269 | 2017-04-12 00:26:30Z [CephStorage]:
> UPDATE_FAILED resources.CephStorage: resources[0]: RetryError:
> resources.CephStorage: RetryError[<Future at 0xdd62550 state=finished
> returned bool>]
>
> --
> Dan Sneddon | Senior Principal Software Engineer
> dsneddon at redhat.com <mailto:dsneddon at redhat.com> |
> redhat.com/openstack <http://redhat.com/openstack>
> dsneddon:irc | @dxs:twitter
>
> --
> Regards,
> Rabi Misra
Rabi,
Thanks for the explanation on why the port replacement isn't working.
Unfortunately, I tried the recommendation that Thomas Herve made about
using conditionals, but that failed. It appears that you can't use a
get_attr inside of a conditional statement, I get an error to that
effect. I can use a get_param, but that doesn't help me check a value in
a nested stack.
So in order for me to achieve the goal of being able to conditionally
assign the IP automatically or from a fixed_ip, I need either a Heat
feature (to resolve get_attr inside of conditional statements), or the
Nova patch to implement attach/detach in Ironic.
Thanks to both of you for the assistance.
--
Dan Sneddon | Senior Principal Software Engineer
dsneddon at redhat.com | redhat.com/openstack
dsneddon:irc | @dxs:twitter
More information about the OpenStack-dev
mailing list