diff --git a/charts/k3k/crds/cluster.yaml b/charts/k3k/crds/cluster.yaml index 91ae2a34..d9cc5b41 100644 --- a/charts/k3k/crds/cluster.yaml +++ b/charts/k3k/crds/cluster.yaml @@ -21,16 +21,34 @@ spec: type: string servers: type: integer + x-kubernetes-validations: + - message: cluster must have at least one server + rule: self >= 1 agents: type: integer + x-kubernetes-validations: + - message: invalid value for agents + rule: self >= 0 token: type: string + x-kubernetes-validations: + - message: token is immutable + rule: self == oldSelf clusterCIDR: type: string + x-kubernetes-validations: + - message: clusterCIDR is immutable + rule: self == oldSelf serviceCIDR: type: string + x-kubernetes-validations: + - message: serviceCIDR is immutable + rule: self == oldSelf clusterDNS: type: string + x-kubernetes-validations: + - message: clusterDNS is immutable + rule: self == oldSelf serverArgs: type: array items: diff --git a/cli/cmds/cluster/create.go b/cli/cmds/cluster/create.go index b4f06065..508c0ea5 100644 --- a/cli/cmds/cluster/create.go +++ b/cli/cmds/cluster/create.go @@ -236,7 +236,6 @@ func newCluster(name, token string, servers, agents int32, clusterCIDR, serviceC APIVersion: "k3k.io/v1alpha1", }, Spec: v1alpha1.ClusterSpec{ - Name: name, Token: token, Servers: &servers, Agents: &agents, diff --git a/pkg/apis/k3k.io/v1alpha1/types.go b/pkg/apis/k3k.io/v1alpha1/types.go index 5b88f11d..73394256 100644 --- a/pkg/apis/k3k.io/v1alpha1/types.go +++ b/pkg/apis/k3k.io/v1alpha1/types.go @@ -16,7 +16,6 @@ type Cluster struct { } type ClusterSpec struct { - Name string `json:"name"` Version string `json:"version"` Servers *int32 `json:"servers"` Agents *int32 `json:"agents"` diff --git a/pkg/controller/cluster/cluster.go b/pkg/controller/cluster/cluster.go index 597a344d..070539a1 100644 --- a/pkg/controller/cluster/cluster.go +++ b/pkg/controller/cluster/cluster.go @@ -181,8 +181,8 @@ func (c *ClusterReconciler) Reconcile(ctx context.Context, req reconcile.Request } func (c *ClusterReconciler) createCluster(ctx context.Context, cluster *v1alpha1.Cluster) error { - if cluster.Name == ClusterInvalidName { - klog.Errorf("Invalid cluster name %s, no action will be taken", cluster.Name) + if err := c.validate(cluster); err != nil { + klog.Errorf("invalid change: %v", err) return nil } s := server.New(cluster, c.Client) @@ -574,3 +574,19 @@ func (c *ClusterReconciler) getETCDTLS(cluster *v1alpha1.Cluster) (*tls.Config, Certificates: []tls.Certificate{clientCert}, }, nil } + +func (c *ClusterReconciler) validate(cluster *v1alpha1.Cluster) error { + if cluster.Name == ClusterInvalidName { + return errors.New("invalid cluster name " + cluster.Name + " no action will be taken") + } + if cluster.Spec.ClusterCIDR != cluster.Status.ClusterCIDR { + return errors.New("immutable field: ClusterCIDR cant be changed once set") + } + if cluster.Spec.ServiceCIDR != cluster.Status.ServiceCIDR { + return errors.New("immutable field: ServiceCIDR cant be changed once set") + } + if cluster.Spec.ClusterDNS != cluster.Status.ClusterDNS { + return errors.New("immutable field: ClusterDNS cant be changed once set") + } + return nil +}