From 71452d0dddf295cdcade413dd95eab6d33c0ee18 Mon Sep 17 00:00:00 2001 From: Jesse Haka Date: Mon, 25 Feb 2019 22:54:07 +0200 Subject: [PATCH] specify dns servers to openstack subnet --- cmd/kops/create_cluster.go | 5 +++ docs/tutorial/openstack.md | 1 + pkg/apis/kops/componentconfig.go | 1 + pkg/apis/kops/v1alpha1/componentconfig.go | 1 + .../kops/v1alpha1/zz_generated.conversion.go | 2 + .../kops/v1alpha1/zz_generated.deepcopy.go | 5 +++ pkg/apis/kops/v1alpha2/componentconfig.go | 1 + .../kops/v1alpha2/zz_generated.conversion.go | 2 + .../kops/v1alpha2/zz_generated.deepcopy.go | 5 +++ pkg/apis/kops/zz_generated.deepcopy.go | 5 +++ pkg/model/openstackmodel/network.go | 8 ++++ upup/pkg/fi/cloudup/openstacktasks/subnet.go | 39 +++++++++++++------ 12 files changed, 64 insertions(+), 11 deletions(-) diff --git a/cmd/kops/create_cluster.go b/cmd/kops/create_cluster.go index dbc9756a68..aafc3bcd10 100644 --- a/cmd/kops/create_cluster.go +++ b/cmd/kops/create_cluster.go @@ -151,6 +151,7 @@ type CreateClusterOptions struct { // OpenstackExternalNet is the name of the external network for the openstack router OpenstackExternalNet string OpenstackStorageIgnoreAZ bool + OpenstackDNSServers string // OpenstackLBOctavia is boolean value should we use octavia or old loadbalancer api OpenstackLBOctavia bool @@ -383,6 +384,7 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command { cmd.Flags().StringVar(&options.OpenstackExternalNet, "os-ext-net", options.OpenstackExternalNet, "The name of the external network to use with the openstack router") cmd.Flags().BoolVar(&options.OpenstackStorageIgnoreAZ, "os-kubelet-ignore-az", options.OpenstackStorageIgnoreAZ, "If true kubernetes may attach volumes across availability zones") cmd.Flags().BoolVar(&options.OpenstackLBOctavia, "os-octavia", options.OpenstackLBOctavia, "If true octavia loadbalancer api will be used") + cmd.Flags().StringVar(&options.OpenstackDNSServers, "os-dns-servers", options.OpenstackDNSServers, "comma separated list of DNS Servers which is used in network") } return cmd @@ -915,6 +917,9 @@ func RunCreateCluster(f *util.Factory, out io.Writer, c *CreateClusterOptions) e MaxRetries: fi.Int(3), }, } + if c.OpenstackDNSServers != "" { + cluster.Spec.CloudConfig.Openstack.Router.DNSServers = fi.String(c.OpenstackDNSServers) + } } } diff --git a/docs/tutorial/openstack.md b/docs/tutorial/openstack.md index eb59b6ee6f..74a1071dfe 100644 --- a/docs/tutorial/openstack.md +++ b/docs/tutorial/openstack.md @@ -63,4 +63,5 @@ kops delete cluster my-cluster.k8s.local --yes #### Optional flags * `--os-kubelet-ignore-az=true` Nova and Cinder have different availability zones, more information [Kubernetes docs](https://kubernetes.io/docs/concepts/cluster-administration/cloud-providers/#block-storage) * `--os-octavia=true` If Octavia Loadbalancer api should be used instead of old lbaas v2 api. +* `--os-dns-servers=8.8.8.8,8.8.4.4` You can define dns servers to be used in your cluster if your openstack setup does not have working dnssetup by default diff --git a/pkg/apis/kops/componentconfig.go b/pkg/apis/kops/componentconfig.go index c0b24f3403..b8e92b00d9 100644 --- a/pkg/apis/kops/componentconfig.go +++ b/pkg/apis/kops/componentconfig.go @@ -528,6 +528,7 @@ type OpenstackMonitor struct { // OpenstackRouter defines the config for a router type OpenstackRouter struct { ExternalNetwork *string `json:"externalNetwork,omitempty"` + DNSServers *string `json:"dnsServers,omitempty"` } // OpenstackConfiguration defines cloud config elements for the openstack cloud provider diff --git a/pkg/apis/kops/v1alpha1/componentconfig.go b/pkg/apis/kops/v1alpha1/componentconfig.go index d6c10674c3..9ce6645c9a 100644 --- a/pkg/apis/kops/v1alpha1/componentconfig.go +++ b/pkg/apis/kops/v1alpha1/componentconfig.go @@ -528,6 +528,7 @@ type OpenstackMonitor struct { // OpenstackRouter defines the config for a router type OpenstackRouter struct { ExternalNetwork *string `json:"externalNetwork,omitempty"` + DNSServers *string `json:"dnsServers,omitempty"` } // OpenstackConfiguration defines cloud config elements for the openstack cloud provider diff --git a/pkg/apis/kops/v1alpha1/zz_generated.conversion.go b/pkg/apis/kops/v1alpha1/zz_generated.conversion.go index 98ad6bfd6a..0dc848b84e 100644 --- a/pkg/apis/kops/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha1/zz_generated.conversion.go @@ -4096,6 +4096,7 @@ func Convert_kops_OpenstackMonitor_To_v1alpha1_OpenstackMonitor(in *kops.Opensta func autoConvert_v1alpha1_OpenstackRouter_To_kops_OpenstackRouter(in *OpenstackRouter, out *kops.OpenstackRouter, s conversion.Scope) error { out.ExternalNetwork = in.ExternalNetwork + out.DNSServers = in.DNSServers return nil } @@ -4106,6 +4107,7 @@ func Convert_v1alpha1_OpenstackRouter_To_kops_OpenstackRouter(in *OpenstackRoute func autoConvert_kops_OpenstackRouter_To_v1alpha1_OpenstackRouter(in *kops.OpenstackRouter, out *OpenstackRouter, s conversion.Scope) error { out.ExternalNetwork = in.ExternalNetwork + out.DNSServers = in.DNSServers return nil } diff --git a/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go index 6e957cfbe1..2aef1bb08f 100644 --- a/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha1/zz_generated.deepcopy.go @@ -2696,6 +2696,11 @@ func (in *OpenstackRouter) DeepCopyInto(out *OpenstackRouter) { *out = new(string) **out = **in } + if in.DNSServers != nil { + in, out := &in.DNSServers, &out.DNSServers + *out = new(string) + **out = **in + } return } diff --git a/pkg/apis/kops/v1alpha2/componentconfig.go b/pkg/apis/kops/v1alpha2/componentconfig.go index 36a5fd0433..39e021e29b 100644 --- a/pkg/apis/kops/v1alpha2/componentconfig.go +++ b/pkg/apis/kops/v1alpha2/componentconfig.go @@ -528,6 +528,7 @@ type OpenstackMonitor struct { // OpenstackRouter defines the config for a router type OpenstackRouter struct { ExternalNetwork *string `json:"externalNetwork,omitempty"` + DNSServers *string `json:"dnsServers,omitempty"` } // OpenstackConfiguration defines cloud config elements for the openstack cloud provider diff --git a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go index 0b49a4aaff..846e8e9f22 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.conversion.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.conversion.go @@ -4366,6 +4366,7 @@ func Convert_kops_OpenstackMonitor_To_v1alpha2_OpenstackMonitor(in *kops.Opensta func autoConvert_v1alpha2_OpenstackRouter_To_kops_OpenstackRouter(in *OpenstackRouter, out *kops.OpenstackRouter, s conversion.Scope) error { out.ExternalNetwork = in.ExternalNetwork + out.DNSServers = in.DNSServers return nil } @@ -4376,6 +4377,7 @@ func Convert_v1alpha2_OpenstackRouter_To_kops_OpenstackRouter(in *OpenstackRoute func autoConvert_kops_OpenstackRouter_To_v1alpha2_OpenstackRouter(in *kops.OpenstackRouter, out *OpenstackRouter, s conversion.Scope) error { out.ExternalNetwork = in.ExternalNetwork + out.DNSServers = in.DNSServers return nil } diff --git a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go index 433df0bca6..ce5010d4fd 100644 --- a/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go +++ b/pkg/apis/kops/v1alpha2/zz_generated.deepcopy.go @@ -2767,6 +2767,11 @@ func (in *OpenstackRouter) DeepCopyInto(out *OpenstackRouter) { *out = new(string) **out = **in } + if in.DNSServers != nil { + in, out := &in.DNSServers, &out.DNSServers + *out = new(string) + **out = **in + } return } diff --git a/pkg/apis/kops/zz_generated.deepcopy.go b/pkg/apis/kops/zz_generated.deepcopy.go index 3c173dc413..47ebd93a9f 100644 --- a/pkg/apis/kops/zz_generated.deepcopy.go +++ b/pkg/apis/kops/zz_generated.deepcopy.go @@ -2981,6 +2981,11 @@ func (in *OpenstackRouter) DeepCopyInto(out *OpenstackRouter) { *out = new(string) **out = **in } + if in.DNSServers != nil { + in, out := &in.DNSServers, &out.DNSServers + *out = new(string) + **out = **in + } return } diff --git a/pkg/model/openstackmodel/network.go b/pkg/model/openstackmodel/network.go index d5a1e5e022..115dee7498 100644 --- a/pkg/model/openstackmodel/network.go +++ b/pkg/model/openstackmodel/network.go @@ -62,6 +62,14 @@ func (b *NetworkModelBuilder) Build(c *fi.ModelBuilderContext) error { CIDR: s(sp.CIDR), Lifecycle: b.Lifecycle, } + if b.Cluster.Spec.CloudConfig.Openstack.Router.DNSServers != nil { + dnsSplitted := strings.Split(fi.StringValue(b.Cluster.Spec.CloudConfig.Openstack.Router.DNSServers), ",") + dnsNameSrv := make([]*string, len(dnsSplitted)) + for i, ns := range dnsSplitted { + dnsNameSrv[i] = fi.String(ns) + } + t.DNSServers = dnsNameSrv + } c.AddTask(t) t1 := &openstacktasks.RouterInterface{ diff --git a/upup/pkg/fi/cloudup/openstacktasks/subnet.go b/upup/pkg/fi/cloudup/openstacktasks/subnet.go index 915d99c785..9afb3b6dd1 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/subnet.go +++ b/upup/pkg/fi/cloudup/openstacktasks/subnet.go @@ -28,11 +28,12 @@ import ( //go:generate fitask -type=Subnet type Subnet struct { - ID *string - Name *string - Network *Network - CIDR *string - Lifecycle *fi.Lifecycle + ID *string + Name *string + Network *Network + CIDR *string + DNSServers []*string + Lifecycle *fi.Lifecycle } // GetDependencies returns the dependencies of the Port task @@ -53,18 +54,24 @@ func (s *Subnet) CompareWithID() *string { } func NewSubnetTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle *fi.Lifecycle, subnet *subnets.Subnet, find *Subnet) (*Subnet, error) { - network, err := cloud.GetNetwork(subnet.NetworkID) if err != nil { return nil, fmt.Errorf("NewSubnetTaskFromCloud: Failed to get network with ID %s: %v", subnet.NetworkID, err) } networkTask, err := NewNetworkTaskFromCloud(cloud, lifecycle, network) + + nameservers := make([]*string, len(subnet.DNSNameservers)) + for i, ns := range subnet.DNSNameservers { + nameservers[i] = fi.String(ns) + } + actual := &Subnet{ - ID: fi.String(subnet.ID), - Name: fi.String(subnet.Name), - Network: networkTask, - CIDR: fi.String(subnet.CIDR), - Lifecycle: lifecycle, + ID: fi.String(subnet.ID), + Name: fi.String(subnet.Name), + Network: networkTask, + CIDR: fi.String(subnet.CIDR), + Lifecycle: lifecycle, + DNSServers: nameservers, } if find != nil { find.ID = actual.ID @@ -113,6 +120,9 @@ func (_ *Subnet) CheckChanges(a, e, changes *Subnet) error { if changes.Name != nil { return fi.CannotChangeField("Name") } + if e.DNSServers != nil { + return fi.CannotChangeField("DNSServers") + } if e.Network != nil { return fi.CannotChangeField("Network") } @@ -135,6 +145,13 @@ func (_ *Subnet) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes EnableDHCP: fi.Bool(true), } + if len(e.DNSServers) > 0 { + dnsNameSrv := make([]string, len(e.DNSServers)) + for i, ns := range e.DNSServers { + dnsNameSrv[i] = fi.StringValue(ns) + } + opt.DNSNameservers = dnsNameSrv + } v, err := t.Cloud.CreateSubnet(opt) if err != nil { return fmt.Errorf("Error creating subnet: %v", err)