diff --git a/pkg/commands/BUILD.bazel b/pkg/commands/BUILD.bazel index 053b5e4117..3a92504d87 100644 --- a/pkg/commands/BUILD.bazel +++ b/pkg/commands/BUILD.bazel @@ -19,6 +19,7 @@ go_library( "//pkg/client/simple:go_default_library", "//pkg/featureflag:go_default_library", "//pkg/resources/digitalocean:go_default_library", + "//upup/pkg/fi:go_default_library", "//upup/pkg/fi/cloudup:go_default_library", "//upup/pkg/fi/cloudup/aliup:go_default_library", "//upup/pkg/fi/cloudup/awstasks:go_default_library", diff --git a/pkg/commands/set_cluster.go b/pkg/commands/set_cluster.go index 3effd67540..4d01863373 100644 --- a/pkg/commands/set_cluster.go +++ b/pkg/commands/set_cluster.go @@ -29,6 +29,7 @@ import ( "k8s.io/kops/cmd/kops/util" api "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/featureflag" + "k8s.io/kops/upup/pkg/fi" ) type SetClusterOptions struct { @@ -145,6 +146,32 @@ func SetClusterFields(fields []string, cluster *api.Cluster, instanceGroups []*a } etcd.Manager.Image = kv[1] } + case "cluster.spec.networking.cilium.ipam": + createCiliumNetworking(cluster) + cluster.Spec.Networking.Cilium.Ipam = kv[1] + case "cluster.spec.networking.cilium.enableNodePort": + createCiliumNetworking(cluster) + v, err := strconv.ParseBool(kv[1]) + if err != nil { + return fmt.Errorf("unknown boolean value: %q", kv[1]) + } + cluster.Spec.Networking.Cilium.EnableNodePort = v + case "cluster.spec.networking.cilium.disableMasquerade": + createCiliumNetworking(cluster) + v, err := strconv.ParseBool(kv[1]) + if err != nil { + return fmt.Errorf("unknown boolean value: %q", kv[1]) + } + cluster.Spec.Networking.Cilium.DisableMasquerade = v + case "cluster.spec.kubeProxy.enabled": + if cluster.Spec.KubeProxy == nil { + cluster.Spec.KubeProxy = &api.KubeProxyConfig{} + } + v, err := strconv.ParseBool(kv[1]) + if err != nil { + return fmt.Errorf("unknown boolean value: %q", kv[1]) + } + cluster.Spec.KubeProxy.Enabled = fi.Bool(v) default: return fmt.Errorf("unhandled field: %q", field) } @@ -152,6 +179,15 @@ func SetClusterFields(fields []string, cluster *api.Cluster, instanceGroups []*a return nil } +func createCiliumNetworking(cluster *api.Cluster) { + if cluster.Spec.Networking == nil { + cluster.Spec.Networking = &api.NetworkingSpec{} + } + if cluster.Spec.Networking.Cilium == nil { + cluster.Spec.Networking.Cilium = &api.CiliumNetworkingSpec{} + } +} + func toEtcdProviderType(in string) (api.EtcdProviderType, error) { s := strings.ToLower(in) switch s { diff --git a/pkg/commands/set_cluster_test.go b/pkg/commands/set_cluster_test.go index 3a75aa8562..1a5369a045 100644 --- a/pkg/commands/set_cluster_test.go +++ b/pkg/commands/set_cluster_test.go @@ -70,3 +70,55 @@ func TestSetClusterFields(t *testing.T) { } } + +func TestSetCiliumFields(t *testing.T) { + + grid := []struct { + Fields []string + Input kops.Cluster + Output kops.Cluster + }{ + { + Fields: []string{ + "cluster.spec.networking.cilium.ipam=eni", + "cluster.spec.networking.cilium.enableNodePort=true", + "cluster.spec.networking.cilium.disableMasquerade=true", + "cluster.spec.kubeProxy.enabled=false", + }, + Input: kops.Cluster{ + Spec: kops.ClusterSpec{}, + }, + Output: kops.Cluster{ + Spec: kops.ClusterSpec{ + KubeProxy: &kops.KubeProxyConfig{ + Enabled: fi.Bool(false), + }, + Networking: &kops.NetworkingSpec{ + Cilium: &kops.CiliumNetworkingSpec{ + Ipam: "eni", + EnableNodePort: true, + DisableMasquerade: true, + }, + }, + }, + }, + }, + } + + for _, g := range grid { + var igs []*kops.InstanceGroup + c := g.Input + + err := SetClusterFields(g.Fields, &c, igs) + if err != nil { + t.Errorf("unexpected error from setClusterFields %v: %v", g.Fields, err) + continue + } + + if !reflect.DeepEqual(c, g.Output) { + t.Errorf("unexpected output from setClusterFields %v. expected=%v, actual=%v", g.Fields, g.Output, c) + continue + } + + } +}