diff --git a/upup/models/cloudup/resources/addons/nodelocaldns.addons.k8s.io/k8s-1.12.yaml.template b/upup/models/cloudup/resources/addons/nodelocaldns.addons.k8s.io/k8s-1.12.yaml.template index d5ec516844270..671ba5ee7e012 100644 --- a/upup/models/cloudup/resources/addons/nodelocaldns.addons.k8s.io/k8s-1.12.yaml.template +++ b/upup/models/cloudup/resources/addons/nodelocaldns.addons.k8s.io/k8s-1.12.yaml.template @@ -56,7 +56,7 @@ data: prometheus :9253 health {{ KubeDNS.NodeLocalDNS.LocalIP }}:{{ NodeLocalDNSHealthCheck }} } - {{- if KubeDNS.NodeLocalDNS.ForwardToKubeDNS }} + {{- if WithDefaultBool KubeDNS.NodeLocalDNS.ForwardToKubeDNS false }} .:53 { errors cache 30 diff --git a/upup/pkg/fi/cloudup/openstacktasks/port.go b/upup/pkg/fi/cloudup/openstacktasks/port.go index 5fa4b05fb8dc3..7b85cd08fe6ae 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/port.go +++ b/upup/pkg/fi/cloudup/openstacktasks/port.go @@ -18,6 +18,7 @@ package openstacktasks import ( "fmt" + "sort" secgroup "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups" "github.com/gophercloud/gophercloud/openstack/networking/v2/ports" @@ -88,6 +89,10 @@ func newPortTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle *fi.Lifecycl Lifecycle: lifecycle, }) } + + // sort for consistent comparison + sort.Sort(SecurityGroupsByID(sgs)) + subnets := make([]*Subnet, len(port.FixedIPs)) for i, subn := range port.FixedIPs { subnets[i] = &Subnet{ @@ -131,6 +136,10 @@ func (s *Port) Find(context *fi.Context) (*Port, error) { } else if len(rs) != 1 { return nil, fmt.Errorf("found multiple ports with name: %s", fi.StringValue(s.Name)) } + + // sort for consistent comparison + sort.Sort(SecurityGroupsByID(s.SecurityGroups)) + return newPortTaskFromCloud(cloud, s.Lifecycle, &rs[0], s) } diff --git a/upup/pkg/fi/cloudup/openstacktasks/securitygroup.go b/upup/pkg/fi/cloudup/openstacktasks/securitygroup.go index 23594aa38cc0a..85c888281780b 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/securitygroup.go +++ b/upup/pkg/fi/cloudup/openstacktasks/securitygroup.go @@ -38,6 +38,15 @@ type SecurityGroup struct { Lifecycle *fi.Lifecycle } +// SecurityGroupsByID implements sort.Interface based on the ID field. +type SecurityGroupsByID []*SecurityGroup + +func (a SecurityGroupsByID) Len() int { return len(a) } +func (a SecurityGroupsByID) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a SecurityGroupsByID) Less(i, j int) bool { + return fi.StringValue(a[i].ID) < fi.StringValue(a[j].ID) +} + var _ fi.CompareWithID = &SecurityGroup{} func (s *SecurityGroup) CompareWithID() *string {