fix: clear default inventory and configuration logic. (#2632)

Signed-off-by: joyceliu <joyceliu@yunify.com>
This commit is contained in:
liujian 2025-06-23 15:13:02 +08:00 committed by GitHub
parent e530832452
commit 9ade693b0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 156 additions and 97 deletions

View File

@ -29,6 +29,7 @@ import (
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/yaml"
cliflag "k8s.io/component-base/cli/flag"
"github.com/kubesphere/kubekey/v4/cmd/kk/app/options"
@ -39,10 +40,22 @@ import (
// NewAddNodeOptions creates a new AddNodeOptions with default values
func NewAddNodeOptions() *AddNodeOptions {
// set default value
return &AddNodeOptions{
o := &AddNodeOptions{
CommonOptions: options.NewCommonOptions(),
Kubernetes: defaultKubeVersion,
}
o.CommonOptions.GetConfigFunc = func() (*kkcorev1.Config, error) {
data, err := getConfig(o.Kubernetes)
if err != nil {
return nil, err
}
config := &kkcorev1.Config{}
return config, errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", o.Kubernetes)
}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// AddNodeOptions contains options for adding nodes to a cluster
@ -91,12 +104,6 @@ func (o *AddNodeOptions) Complete(cmd *cobra.Command, args []string) (*kkcorev1.
Debug: o.Debug,
}
// override kube_version in config
if err := completeConfig(o.Kubernetes, o.CommonOptions.ConfigFile, o.CommonOptions.Config); err != nil {
return nil, err
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err
}

View File

@ -41,7 +41,10 @@ type ArtifactExportOptions struct {
// NewArtifactExportOptions for newArtifactExportCommand
func NewArtifactExportOptions() *ArtifactExportOptions {
// set default value
return &ArtifactExportOptions{CommonOptions: options.NewCommonOptions()}
o := &ArtifactExportOptions{CommonOptions: options.NewCommonOptions()}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// Flags add to newArtifactExportCommand
@ -72,9 +75,6 @@ func (o *ArtifactExportOptions) Complete(cmd *cobra.Command, args []string) (*kk
Debug: o.Debug,
SkipTags: []string{"certs"},
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err
}
@ -93,8 +93,10 @@ type ArtifactImagesOptions struct {
// NewArtifactImagesOptions for newArtifactImagesCommand
func NewArtifactImagesOptions() *ArtifactImagesOptions {
// set default value
return &ArtifactImagesOptions{CommonOptions: options.NewCommonOptions()}
o := &ArtifactImagesOptions{CommonOptions: options.NewCommonOptions()}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// Flags add to newArtifactImagesCommand
@ -125,9 +127,6 @@ func (o *ArtifactImagesOptions) Complete(cmd *cobra.Command, args []string) (*kk
Debug: o.Debug,
Tags: []string{"only_image"},
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, errors.WithStack(err)

View File

@ -22,7 +22,6 @@ package builtin
import (
"bytes"
"fmt"
"os"
"text/template"
"github.com/cockroachdb/errors"
@ -30,6 +29,7 @@ import (
"k8s.io/apimachinery/pkg/util/yaml"
"github.com/kubesphere/kubekey/v4/builtin/core"
"github.com/kubesphere/kubekey/v4/cmd/kk/app/options"
)
const (
@ -41,40 +41,17 @@ const (
defaultGroupWorker = "kube_worker"
)
func completeInventory(inventoryFile string, inventory *kkcorev1.Inventory) error {
if inventoryFile != "" {
data, err := os.ReadFile(inventoryFile)
if err != nil {
return errors.Wrapf(err, "failed to get inventory for inventoryFile: %q", inventoryFile)
}
return errors.Wrapf(yaml.Unmarshal(data, inventory), "failed to unmarshal inventoryFile %s", inventoryFile)
}
var getInventory options.InventoryFunc = func() (*kkcorev1.Inventory, error) {
data, err := core.Defaults.ReadFile("defaults/inventory/localhost.yaml")
if err != nil {
return errors.Wrap(err, "failed to get local inventory. Please set it by \"--inventory\"")
return nil, errors.Wrap(err, "failed to get local inventory. Please set it by \"--inventory\"")
}
return errors.Wrapf(yaml.Unmarshal(data, inventory), "failed to unmarshal local inventoryFile %q", inventoryFile)
inventory := &kkcorev1.Inventory{}
return inventory, errors.Wrap(yaml.Unmarshal(data, inventory), "failed to unmarshal local inventory file: %q.")
}
func completeConfig(kubeVersion string, configFile string, config *kkcorev1.Config) error {
data, err := getConfig(kubeVersion, configFile)
if err != nil {
return err
}
return errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", kubeVersion)
}
func getConfig(kubeVersion string, configFile string) ([]byte, error) {
if configFile != "" {
data, err := os.ReadFile(configFile)
if err != nil {
return nil, errors.Wrapf(err, "failed to get configFile %q", configFile)
}
return data, nil
}
func getConfig(kubeVersion string) ([]byte, error) {
t, err := template.ParseFS(core.Defaults, fmt.Sprintf("defaults/config/%s.yaml", kubeVersion[:5]))
if err != nil {
return nil, errors.Wrapf(err, "failed to get local configFile template for kube_version: %q. Please set it by \"--config\"", kubeVersion)

View File

@ -32,7 +32,10 @@ import (
// NewCertsRenewOptions for newCertsRenewCommand
func NewCertsRenewOptions() *CertsRenewOptions {
// set default value
return &CertsRenewOptions{CommonOptions: options.NewCommonOptions()}
o := &CertsRenewOptions{CommonOptions: options.NewCommonOptions()}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// CertsRenewOptions for NewCertsRenewOptions
@ -66,9 +69,6 @@ func (o *CertsRenewOptions) Complete(cmd *cobra.Command, args []string) (*kkcore
Debug: o.Debug,
Tags: []string{"certs"},
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
return playbook, o.CommonOptions.Complete(playbook)
}

View File

@ -29,6 +29,7 @@ import (
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/yaml"
cliflag "k8s.io/component-base/cli/flag"
"github.com/kubesphere/kubekey/v4/cmd/kk/app/options"
@ -41,10 +42,21 @@ import (
// NewCreateClusterOptions for newCreateClusterCommand
func NewCreateClusterOptions() *CreateClusterOptions {
// set default value
return &CreateClusterOptions{
o := &CreateClusterOptions{
CommonOptions: options.NewCommonOptions(),
Kubernetes: defaultKubeVersion,
}
o.CommonOptions.GetConfigFunc = func() (*kkcorev1.Config, error) {
data, err := getConfig(o.Kubernetes)
if err != nil {
return nil, err
}
config := &kkcorev1.Config{}
return config, errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", o.Kubernetes)
}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// CreateClusterOptions for NewCreateClusterOptions
@ -85,13 +97,6 @@ func (o *CreateClusterOptions) Complete(cmd *cobra.Command, args []string) (*kkc
Playbook: o.Playbook,
Debug: o.Debug,
}
// override kube_version in config
if err := completeConfig(o.Kubernetes, o.CommonOptions.ConfigFile, o.CommonOptions.Config); err != nil {
return nil, err
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err
}
@ -144,7 +149,7 @@ func (o *CreateConfigOptions) Flags() cliflag.NamedFlagSets {
// If an output directory is specified, it creates a config file named "config-<kubernetes-version>.yaml".
func (o *CreateConfigOptions) Run() error {
// Read the default config file for the specified Kubernetes version
data, err := getConfig(o.Kubernetes, "")
data, err := getConfig(o.Kubernetes)
if err != nil {
return err
}

View File

@ -27,6 +27,7 @@ import (
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/yaml"
cliflag "k8s.io/component-base/cli/flag"
"github.com/kubesphere/kubekey/v4/cmd/kk/app/options"
@ -39,10 +40,21 @@ import (
// NewDeleteClusterOptions creates a new DeleteClusterOptions with default values
func NewDeleteClusterOptions() *DeleteClusterOptions {
// set default value
return &DeleteClusterOptions{
o := &DeleteClusterOptions{
CommonOptions: options.NewCommonOptions(),
Kubernetes: defaultKubeVersion,
}
o.CommonOptions.GetConfigFunc = func() (*kkcorev1.Config, error) {
data, err := getConfig(o.Kubernetes)
if err != nil {
return nil, err
}
config := &kkcorev1.Config{}
return config, errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", o.Kubernetes)
}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// DeleteClusterOptions contains options for deleting a Kubernetes cluster
@ -86,14 +98,6 @@ func (o *DeleteClusterOptions) Complete(cmd *cobra.Command, args []string) (*kkc
Debug: o.Debug,
}
// Complete configuration with kubernetes version and inventory
if err := completeConfig(o.Kubernetes, o.CommonOptions.ConfigFile, o.CommonOptions.Config); err != nil {
return nil, err
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
// Complete common options
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err
@ -120,10 +124,21 @@ func (o *DeleteClusterOptions) completeConfig() error {
// NewDeleteNodesOptions creates a new DeleteNodesOptions with default values
func NewDeleteNodesOptions() *DeleteNodesOptions {
// set default value
return &DeleteNodesOptions{
o := &DeleteNodesOptions{
CommonOptions: options.NewCommonOptions(),
Kubernetes: defaultKubeVersion,
}
o.CommonOptions.GetConfigFunc = func() (*kkcorev1.Config, error) {
data, err := getConfig(o.Kubernetes)
if err != nil {
return nil, err
}
config := &kkcorev1.Config{}
return config, errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", o.Kubernetes)
}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// DeleteNodesOptions contains options for deleting a Kubernetes cluster nodes
@ -168,14 +183,6 @@ func (o *DeleteNodesOptions) Complete(cmd *cobra.Command, args []string) (*kkcor
Debug: o.Debug,
}
// Complete configuration with kubernetes version and inventory
if err := completeConfig(o.Kubernetes, o.CommonOptions.ConfigFile, o.CommonOptions.Config); err != nil {
return nil, err
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
// Complete common options
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err

View File

@ -45,7 +45,10 @@ type InitOSOptions struct {
// NewInitOSOptions for newInitOSCommand
func NewInitOSOptions() *InitOSOptions {
// set default value
return &InitOSOptions{CommonOptions: options.NewCommonOptions()}
o := &InitOSOptions{CommonOptions: options.NewCommonOptions()}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// Flags add to newInitOSCommand
@ -75,9 +78,6 @@ func (o *InitOSOptions) Complete(cmd *cobra.Command, args []string) (*kkcorev1.P
Playbook: o.Playbook,
Debug: o.Debug,
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
if err := o.CommonOptions.Complete(playbook); err != nil {
return nil, err
@ -115,7 +115,10 @@ type InitRegistryOptions struct {
// NewInitRegistryOptions for newInitRegistryCommand
func NewInitRegistryOptions() *InitRegistryOptions {
// set default value
return &InitRegistryOptions{CommonOptions: options.NewCommonOptions()}
o := &InitRegistryOptions{CommonOptions: options.NewCommonOptions()}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// Flags add to newInitRegistryCommand
@ -145,9 +148,6 @@ func (o *InitRegistryOptions) Complete(cmd *cobra.Command, args []string) (*kkco
Playbook: o.Playbook,
Debug: o.Debug,
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
return playbook, o.CommonOptions.Complete(playbook)
}

View File

@ -20,10 +20,13 @@ limitations under the License.
package builtin
import (
"fmt"
"github.com/cockroachdb/errors"
kkcorev1 "github.com/kubesphere/kubekey/api/core/v1"
"github.com/spf13/cobra"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/yaml"
cliflag "k8s.io/component-base/cli/flag"
"github.com/kubesphere/kubekey/v4/cmd/kk/app/options"
@ -32,17 +35,37 @@ import (
// NewPreCheckOptions for newPreCheckCommand
func NewPreCheckOptions() *PreCheckOptions {
// set default value
return &PreCheckOptions{CommonOptions: options.NewCommonOptions()}
o := &PreCheckOptions{
CommonOptions: options.NewCommonOptions(),
Kubernetes: defaultKubeVersion,
}
o.CommonOptions.GetConfigFunc = func() (*kkcorev1.Config, error) {
data, err := getConfig(o.Kubernetes)
if err != nil {
return nil, err
}
config := &kkcorev1.Config{}
return config, errors.Wrapf(yaml.Unmarshal(data, config), "failed to unmarshal local configFile for kube_version: %q.", o.Kubernetes)
}
o.CommonOptions.GetInventoryFunc = getInventory
return o
}
// PreCheckOptions for NewPreCheckOptions
type PreCheckOptions struct {
options.CommonOptions
// kubernetes version which the cluster will install.
Kubernetes string
}
// Flags add to newPreCheckCommand
func (o *PreCheckOptions) Flags() cliflag.NamedFlagSets {
return o.CommonOptions.Flags()
fss := o.CommonOptions.Flags()
kfs := fss.FlagSet("config")
kfs.StringVar(&o.Kubernetes, "with-kubernetes", o.Kubernetes, fmt.Sprintf("Specify a supported version of kubernetes. default is %s", o.Kubernetes))
return fss
}
// Complete options. create Playbook, Config and Inventory
@ -73,9 +96,6 @@ func (o *PreCheckOptions) Complete(cmd *cobra.Command, args []string) (*kkcorev1
Debug: o.Debug,
Tags: tags,
}
if err := completeInventory(o.CommonOptions.InventoryFile, o.CommonOptions.Inventory); err != nil {
return nil, err
}
return playbook, o.CommonOptions.Complete(playbook)
}

View File

@ -25,6 +25,7 @@ import (
"github.com/cockroachdb/errors"
kkcorev1 "github.com/kubesphere/kubekey/api/core/v1"
"gopkg.in/yaml.v3"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@ -39,8 +40,13 @@ import (
"github.com/kubesphere/kubekey/v4/pkg/proxy"
)
// // CTX cancel by shutdown signal
// var CTX = signals.SetupSignalHandler()
// InventoryFunc defines a function type that returns a pointer to a kkcorev1.Inventory and an error.
// It is used to provide a custom way to retrieve or generate an Inventory object.
type InventoryFunc func() (*kkcorev1.Inventory, error)
// ConfigFunc defines a function type that returns a pointer to a kkcorev1.Config and an error.
// It is used to provide a custom way to retrieve or generate a Config object.
type ConfigFunc func() (*kkcorev1.Config, error)
// CommonOptions holds the configuration options for executing a playbook.
// It includes paths to various configuration files, runtime settings, and
@ -65,9 +71,11 @@ type CommonOptions struct {
Namespace string
// Config is the kubekey core configuration.
Config *kkcorev1.Config
Config *kkcorev1.Config
GetConfigFunc ConfigFunc
// Inventory is the kubekey core inventory.
Inventory *kkcorev1.Inventory
Inventory *kkcorev1.Inventory
GetInventoryFunc InventoryFunc
}
// NewCommonOptions creates a new CommonOptions object with default values.
@ -100,7 +108,7 @@ func NewCommonOptions() CommonOptions {
APIVersion: kkcorev1.SchemeGroupVersion.String(),
Kind: "Inventory",
},
ObjectMeta: metav1.ObjectMeta{Name: "default"},
ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault, Name: "default"},
}
return o
@ -175,13 +183,47 @@ func (o *CommonOptions) Complete(playbook *kkcorev1.Playbook) error {
}
o.Workdir = filepath.Join(wd, o.Workdir)
}
// Generate and complete the configuration.
if o.ConfigFile != "" {
data, err := os.ReadFile(o.ConfigFile)
if err != nil {
return errors.Wrapf(err, "failed to get config from file %q", o.ConfigFile)
}
if err := yaml.Unmarshal(data, o.Config); err != nil {
return errors.Wrapf(err, "failed to unmarshal config from file %q", o.ConfigFile)
}
} else if o.GetConfigFunc != nil {
config, err := o.GetConfigFunc()
if err != nil {
return err
}
o.Config = config
}
if o.InventoryFile != "" {
data, err := os.ReadFile(o.InventoryFile)
if err != nil {
return errors.Wrapf(err, "failed to get inventory from file %q", o.InventoryFile)
}
if err := yaml.Unmarshal(data, o.Inventory); err != nil {
return errors.Wrapf(err, "failed to unmarshal inventory from file %q", o.InventoryFile)
}
} else if o.GetInventoryFunc != nil {
inventory, err := o.GetInventoryFunc()
if err != nil {
return err
}
o.Inventory = inventory
}
// Complete the configuration.
if err := o.completeConfig(); err != nil {
return err
}
playbook.Spec.Config = ptr.Deref(o.Config, kkcorev1.Config{})
// Complete the inventory reference.
o.completeInventory(o.Inventory)
if err := o.completeInventory(o.Inventory); err != nil {
return err
}
playbook.Spec.InventoryRef = &corev1.ObjectReference{
Kind: o.Inventory.Kind,
Namespace: o.Inventory.Namespace,
@ -224,11 +266,13 @@ func (o *CommonOptions) completeConfig() error {
}
// genConfig generate config by ConfigFile and set value by command args.
func (o *CommonOptions) completeInventory(inventory *kkcorev1.Inventory) {
func (o *CommonOptions) completeInventory(inventory *kkcorev1.Inventory) error {
// set value by command args
if o.Namespace != "" {
inventory.Namespace = o.Namespace
}
return nil
}
// setValue sets a value in the config based on a key-value pair.