diff --git a/cli/cmds/cluster_create.go b/cli/cmds/cluster_create.go index f5a113c..d4b9ab4 100644 --- a/cli/cmds/cluster_create.go +++ b/cli/cmds/cluster_create.go @@ -13,14 +13,14 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/retry" "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" - v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" @@ -118,7 +118,10 @@ func createAction(appCtx *AppContext, config *CreateConfig) func(cmd *cobra.Comm logrus.Infof("Creating cluster '%s' in namespace '%s'", name, namespace) - cluster := newCluster(name, namespace, config) + cluster, err := newCluster(name, namespace, config) + if err != nil { + return err + } cluster.Spec.Expose = &v1beta1.ExposeConfig{ NodePort: &v1beta1.NodePortConfig{}, @@ -186,7 +189,17 @@ func createAction(appCtx *AppContext, config *CreateConfig) func(cmd *cobra.Comm } } -func newCluster(name, namespace string, config *CreateConfig) *v1beta1.Cluster { +func newCluster(name, namespace string, config *CreateConfig) (*v1beta1.Cluster, error) { + var storageRequestSize resource.Quantity + if config.storageRequestSize != "" { + parsed, err := resource.ParseQuantity(config.storageRequestSize) + if err != nil { + return nil, err + } + + storageRequestSize = parsed + } + cluster := &v1beta1.Cluster{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -212,7 +225,7 @@ func newCluster(name, namespace string, config *CreateConfig) *v1beta1.Cluster { Persistence: v1beta1.PersistenceConfig{ Type: v1beta1.PersistenceMode(config.persistenceType), StorageClassName: ptr.To(config.storageClassName), - StorageRequestSize: ptr.To(resource.MustParse(config.storageRequestSize)), + StorageRequestSize: ptr.To(storageRequestSize), }, MirrorHostNodes: config.mirrorHostNodes, }, @@ -222,7 +235,7 @@ func newCluster(name, namespace string, config *CreateConfig) *v1beta1.Cluster { } if config.token != "" { - cluster.Spec.TokenSecretRef = &v1.SecretReference{ + cluster.Spec.TokenSecretRef = &corev1.SecretReference{ Name: k3kcluster.TokenSecretName(name), Namespace: namespace, } @@ -254,11 +267,11 @@ func newCluster(name, namespace string, config *CreateConfig) *v1beta1.Cluster { } } - return cluster + return cluster, nil } -func env(envSlice []string) []v1.EnvVar { - var envVars []v1.EnvVar +func env(envSlice []string) []corev1.EnvVar { + var envVars []corev1.EnvVar for _, env := range envSlice { keyValue := strings.Split(env, "=") @@ -266,7 +279,7 @@ func env(envSlice []string) []v1.EnvVar { logrus.Fatalf("incorrect value for environment variable %s", env) } - envVars = append(envVars, v1.EnvVar{ + envVars = append(envVars, corev1.EnvVar{ Name: keyValue[0], Value: keyValue[1], }) @@ -353,8 +366,8 @@ func CreateCustomCertsSecrets(ctx context.Context, name, namespace, customCertsP return nil } -func caCertSecret(certName, clusterName, clusterNamespace string, cert, key []byte) *v1.Secret { - return &v1.Secret{ +func caCertSecret(certName, clusterName, clusterNamespace string, cert, key []byte) *corev1.Secret { + return &corev1.Secret{ TypeMeta: metav1.TypeMeta{ Kind: "Secret", APIVersion: "v1", @@ -363,10 +376,10 @@ func caCertSecret(certName, clusterName, clusterNamespace string, cert, key []by Name: controller.SafeConcatNameWithPrefix(clusterName, certName), Namespace: clusterNamespace, }, - Type: v1.SecretTypeTLS, + Type: corev1.SecretTypeTLS, Data: map[string][]byte{ - v1.TLSCertKey: cert, - v1.TLSPrivateKeyKey: key, + corev1.TLSCertKey: cert, + corev1.TLSPrivateKeyKey: key, }, } } diff --git a/pkg/apis/k3k.io/v1beta1/types.go b/pkg/apis/k3k.io/v1beta1/types.go index 560fe87..069619f 100644 --- a/pkg/apis/k3k.io/v1beta1/types.go +++ b/pkg/apis/k3k.io/v1beta1/types.go @@ -1,8 +1,9 @@ package v1beta1 import ( - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" + + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -124,7 +125,7 @@ type ClusterSpec struct { // The Secret must have a "token" field in its data. // // +optional - TokenSecretRef *v1.SecretReference `json:"tokenSecretRef,omitempty"` + TokenSecretRef *corev1.SecretReference `json:"tokenSecretRef,omitempty"` // TLSSANs specifies subject alternative names for the K3s server certificate. // @@ -146,12 +147,12 @@ type ClusterSpec struct { // ServerEnvs specifies list of environment variables to set in the server pod. // // +optional - ServerEnvs []v1.EnvVar `json:"serverEnvs,omitempty"` + ServerEnvs []corev1.EnvVar `json:"serverEnvs,omitempty"` // AgentEnvs specifies list of environment variables to set in the agent pod. // // +optional - AgentEnvs []v1.EnvVar `json:"agentEnvs,omitempty"` + AgentEnvs []corev1.EnvVar `json:"agentEnvs,omitempty"` // Addons specifies secrets containing raw YAML to deploy on cluster startup. // @@ -161,12 +162,12 @@ type ClusterSpec struct { // ServerLimit specifies resource limits for server nodes. // // +optional - ServerLimit v1.ResourceList `json:"serverLimit,omitempty"` + ServerLimit corev1.ResourceList `json:"serverLimit,omitempty"` // WorkerLimit specifies resource limits for agent nodes. // // +optional - WorkerLimit v1.ResourceList `json:"workerLimit,omitempty"` + WorkerLimit corev1.ResourceList `json:"workerLimit,omitempty"` // MirrorHostNodes controls whether node objects from the host cluster // are mirrored into the virtual cluster. @@ -583,13 +584,13 @@ type VirtualClusterPolicySpec struct { // Quota specifies the resource limits for clusters within a clusterpolicy. // // +optional - Quota *v1.ResourceQuotaSpec `json:"quota,omitempty"` + Quota *corev1.ResourceQuotaSpec `json:"quota,omitempty"` // Limit specifies the LimitRange that will be applied to all pods within the VirtualClusterPolicy // to set defaults and constraints (min/max) // // +optional - Limit *v1.LimitRangeSpec `json:"limit,omitempty"` + Limit *corev1.LimitRangeSpec `json:"limit,omitempty"` // DefaultNodeSelector specifies the node selector that applies to all clusters (server + agent) in the target Namespace. // diff --git a/pkg/controller/cluster/cluster_test.go b/pkg/controller/cluster/cluster_test.go index 232627f..6099217 100644 --- a/pkg/controller/cluster/cluster_test.go +++ b/pkg/controller/cluster/cluster_test.go @@ -4,6 +4,7 @@ import ( "context" "time" + "k8s.io/apimachinery/pkg/api/resource" "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" @@ -66,7 +67,7 @@ var _ = Describe("Cluster Controller", Label("controller"), Label("Cluster"), fu Expect(cluster.Spec.Sync.PriorityClasses.Enabled).To(BeFalse()) Expect(cluster.Spec.Persistence.Type).To(Equal(v1beta1.DynamicPersistenceMode)) - Expect(cluster.Spec.Persistence.StorageRequestSize).To(Equal("2G")) + Expect(cluster.Spec.Persistence.StorageRequestSize.Equal(resource.MustParse("2G"))).To(BeTrue()) Expect(cluster.Status.Phase).To(Equal(v1beta1.ClusterUnknown))