From 03122df7719a4d1c7a0dc2cfe2e427a29d07c8cb Mon Sep 17 00:00:00 2001 From: Ole Markus With Date: Sat, 8 Aug 2020 18:28:13 +0200 Subject: [PATCH] Make it possible to change subnet dns servers --- upup/pkg/fi/cloudup/openstacktasks/port.go | 4 +-- .../fi/cloudup/openstacktasks/port_test.go | 2 +- upup/pkg/fi/cloudup/openstacktasks/subnet.go | 31 ++++++++++++++----- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/upup/pkg/fi/cloudup/openstacktasks/port.go b/upup/pkg/fi/cloudup/openstacktasks/port.go index 0b0751d3579ae..cda20675cf4c9 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/port.go +++ b/upup/pkg/fi/cloudup/openstacktasks/port.go @@ -61,7 +61,7 @@ func (s *Port) CompareWithID() *string { return s.ID } -func NewPortTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle *fi.Lifecycle, port *ports.Port, find *Port) (*Port, error) { +func newPortTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle *fi.Lifecycle, port *ports.Port, find *Port) (*Port, error) { additionalSecurityGroupIDs := map[string]struct{}{} if find != nil { for _, sg := range find.AdditionalSecurityGroups { @@ -131,7 +131,7 @@ 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)) } - return NewPortTaskFromCloud(cloud, s.Lifecycle, &rs[0], s) + return newPortTaskFromCloud(cloud, s.Lifecycle, &rs[0], s) } func (s *Port) Run(context *fi.Context) error { diff --git a/upup/pkg/fi/cloudup/openstacktasks/port_test.go b/upup/pkg/fi/cloudup/openstacktasks/port_test.go index 1908736fe001b..74ef04c8d61b5 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/port_test.go +++ b/upup/pkg/fi/cloudup/openstacktasks/port_test.go @@ -207,7 +207,7 @@ func Test_NewPortTaskFromCloud(t *testing.T) { for _, testCase := range tests { t.Run(testCase.desc, func(t *testing.T) { - actual, err := NewPortTaskFromCloud(testCase.cloud, &testCase.lifecycle, testCase.cloudPort, testCase.foundPort) + actual, err := newPortTaskFromCloud(testCase.cloud, &testCase.lifecycle, testCase.cloudPort, testCase.foundPort) if !reflect.DeepEqual(err, testCase.expectedError) { t.Errorf("Error differs:\n%v\n\tinstead of\n%v", err, testCase.expectedError) diff --git a/upup/pkg/fi/cloudup/openstacktasks/subnet.go b/upup/pkg/fi/cloudup/openstacktasks/subnet.go index d140235db0cff..6b3ca1fcfa820 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/subnet.go +++ b/upup/pkg/fi/cloudup/openstacktasks/subnet.go @@ -115,7 +115,7 @@ func (s *Subnet) Run(context *fi.Context) error { return fi.DefaultDeltaRunMethod(s, context) } -func (_ *Subnet) CheckChanges(a, e, changes *Subnet) error { +func (*Subnet) CheckChanges(a, e, changes *Subnet) error { if a == nil { if e.Name == nil { return fi.RequiredField("Name") @@ -130,9 +130,6 @@ func (_ *Subnet) CheckChanges(a, e, changes *Subnet) error { if changes.Name != nil { return fi.CannotChangeField("Name") } - if changes.DNSServers != nil { - return fi.CannotChangeField("DNSServers") - } if changes.Network != nil { return fi.CannotChangeField("Network") } @@ -143,7 +140,7 @@ func (_ *Subnet) CheckChanges(a, e, changes *Subnet) error { return nil } -func (_ *Subnet) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *Subnet) error { +func (*Subnet) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes *Subnet) error { if a == nil { klog.V(2).Infof("Creating Subnet with name:%q", fi.StringValue(e.Name)) @@ -176,9 +173,27 @@ func (_ *Subnet) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes klog.V(2).Infof("Creating a new Openstack subnet, id=%s", v.ID) return nil } else { - err := t.Cloud.AppendTag(openstack.ResourceTypeSubnet, fi.StringValue(a.ID), fi.StringValue(changes.Tag)) - if err != nil { - return fmt.Errorf("Error appending tag to subnet: %v", err) + if changes.Tag != nil { + err := t.Cloud.AppendTag(openstack.ResourceTypeSubnet, fi.StringValue(a.ID), fi.StringValue(changes.Tag)) + if err != nil { + return fmt.Errorf("error appending tag to subnet: %v", err) + } + } + client := t.Cloud.(openstack.OpenstackCloud).NetworkingClient() + + opt := subnets.UpdateOpts{} + + if changes.DNSServers != nil { + dnsNameSrv := make([]string, len(e.DNSServers)) + for i, ns := range e.DNSServers { + dnsNameSrv[i] = fi.StringValue(ns) + } + opt.DNSNameservers = &dnsNameSrv + } + result := subnets.Update(client, fi.StringValue(a.ID), opt) + klog.Infof("Updated %v", opt) + if result.Err != nil { + return fmt.Errorf("error updating subnet %v: %v", a.ID, result.Err) } } e.ID = a.ID