diff --git a/pkg/ctl/cmdutils/configfile.go b/pkg/ctl/cmdutils/configfile.go index 9b0dd42c71..66eca8c5e4 100644 --- a/pkg/ctl/cmdutils/configfile.go +++ b/pkg/ctl/cmdutils/configfile.go @@ -829,6 +829,64 @@ func NewUpdateNodegroupLoader(cmd *Cmd) ClusterConfigLoader { return l } +// NewGetNodegroupLoader loads config file and validates command for `eksctl get nodegroup`. +func NewGetNodegroupLoader(cmd *Cmd, ng *api.NodeGroup) ClusterConfigLoader { + l := newCommonClusterConfigLoader(cmd) + + l.validateWithoutConfigFile = func() error { + meta := cmd.ClusterConfig.Metadata + + if meta.Name != "" && cmd.NameArg != "" { + return ErrClusterFlagAndArg(cmd, meta.Name, cmd.NameArg) + } + + if meta.Name == "" { + return ErrMustBeSet(ClusterNameFlag(cmd)) + } + + if ng.Name != "" && cmd.NameArg != "" { + return ErrFlagAndArg("--name", ng.Name, cmd.NameArg) + } + + if cmd.NameArg != "" { + ng.Name = cmd.NameArg + } + + // prevent creation of invalid config object with unnamed nodegroup + if ng.Name != "" { + cmd.ClusterConfig.NodeGroups = append(cmd.ClusterConfig.NodeGroups, ng) + } + + return nil + } + + return l +} + +// NewGetLabelsLoader loads config file and validates command for `eksctl get labels`. +func NewGetLabelsLoader(cmd *Cmd, ngName string) ClusterConfigLoader { + l := newCommonClusterConfigLoader(cmd) + l.validateWithoutConfigFile = func() error { + meta := cmd.ClusterConfig.Metadata + + if meta.Name == "" { + return ErrMustBeSet(ClusterNameFlag(cmd)) + } + + if ngName == "" { + return ErrMustBeSet("--nodegroup") + } + + if cmd.NameArg != "" { + return ErrUnsupportedNameArg() + } + + return nil + } + + return l +} + // validateSupportedConfigFields parses a config file's fields, evaluates if non-empty fields are supported, // and returns an error if a field is not supported. func validateSupportedConfigFields(obj interface{}, supportedFields []string, unsupportedFields []string) ([]string, error) { diff --git a/pkg/ctl/get/labels.go b/pkg/ctl/get/labels.go index efdece8d9e..00aa9aa236 100644 --- a/pkg/ctl/get/labels.go +++ b/pkg/ctl/get/labels.go @@ -34,6 +34,7 @@ func getLabelsCmd(cmd *cmdutils.Cmd) { cmdutils.AddRegionFlag(fs, &cmd.ProviderConfig) cmdutils.AddTimeoutFlag(fs, &cmd.ProviderConfig.WaitTimeout) + cmdutils.AddConfigFileFlag(fs, &cmd.ClusterConfigFile) }) cmdutils.AddCommonFlagsForAWS(cmd.FlagSetGroup, &cmd.ProviderConfig, false) @@ -41,17 +42,10 @@ func getLabelsCmd(cmd *cmdutils.Cmd) { } func getLabels(cmd *cmdutils.Cmd, nodeGroupName string) error { - cfg := cmd.ClusterConfig - if cfg.Metadata.Name == "" { - return cmdutils.ErrMustBeSet(cmdutils.ClusterNameFlag(cmd)) - } - if nodeGroupName == "" { - return cmdutils.ErrMustBeSet("--nodegroup") - } - - if cmd.NameArg != "" { - return cmdutils.ErrUnsupportedNameArg() + if err := cmdutils.NewGetLabelsLoader(cmd, nodeGroupName).Load(); err != nil { + return err } + cfg := cmd.ClusterConfig ctl, err := cmd.NewProviderForExistingCluster() if err != nil { diff --git a/pkg/ctl/get/labels_test.go b/pkg/ctl/get/labels_test.go index 3a2ea17b7a..7c42be0b8d 100644 --- a/pkg/ctl/get/labels_test.go +++ b/pkg/ctl/get/labels_test.go @@ -1,6 +1,8 @@ package get import ( + "os" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -34,5 +36,24 @@ var _ = Describe("get", func() { Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("Error: name argument is not supported")) }) + + It("setting --cluster and --config-file at the same time", func() { + f, err := os.CreateTemp("", "configfile") + Expect(err).NotTo(HaveOccurred()) + _, err = f.WriteString(labelsGetConfigFile) + Expect(err).NotTo(HaveOccurred()) + cmd := newMockCmd("labels", "--cluster", "name", "--nodegroup", "name", "--config-file", f.Name()) + _, err = cmd.execute() + Expect(err).To(MatchError(ContainSubstring("Error: cannot use --cluster when --config-file/-f is set"))) + }) }) }) + +var labelsGetConfigFile = `apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig + +metadata: + name: test-nodegroup-cluster-config + region: us-west-2 + version: '1.20' +` diff --git a/pkg/ctl/get/nodegroup.go b/pkg/ctl/get/nodegroup.go index 725feb6c0c..404e1cae03 100644 --- a/pkg/ctl/get/nodegroup.go +++ b/pkg/ctl/get/nodegroup.go @@ -45,29 +45,11 @@ func getNodeGroupCmd(cmd *cmdutils.Cmd) { } func doGetNodeGroup(cmd *cmdutils.Cmd, ng *api.NodeGroup, params *getCmdParams) error { - if err := cmdutils.NewMetadataLoader(cmd).Load(); err != nil { + if err := cmdutils.NewGetNodegroupLoader(cmd, ng).Load(); err != nil { return err } cfg := cmd.ClusterConfig - // TODO: move this into a loader when --config-file gets added to this command - if cfg.Metadata.Name == "" { - return cmdutils.ErrMustBeSet(cmdutils.ClusterNameFlag(cmd)) - } - - if ng.Name != "" && cmd.NameArg != "" { - return cmdutils.ErrFlagAndArg("--name", ng.Name, cmd.NameArg) - } - - if cmd.NameArg != "" { - ng.Name = cmd.NameArg - } - - // prevent creation of invalid config object with unnamed nodegroup - if ng.Name != "" { - cfg.NodeGroups = append(cfg.NodeGroups, ng) - } - ctl, err := cmd.NewProviderForExistingCluster() if err != nil { return err diff --git a/pkg/ctl/get/nodegroup_test.go b/pkg/ctl/get/nodegroup_test.go index 6d43e75247..38cbbb7737 100644 --- a/pkg/ctl/get/nodegroup_test.go +++ b/pkg/ctl/get/nodegroup_test.go @@ -15,14 +15,8 @@ var _ = Describe("get", func() { Expect(err).To(MatchError(ContainSubstring("Error: --cluster must be set"))) }) - It("setting --name and argument at the same time", func() { - cmd := newMockCmd("nodegroup", "ng", "--name", "ng") - _, err := cmd.execute() - Expect(err).To(MatchError(ContainSubstring("Error: --name=ng and argument ng cannot be used at the same time"))) - }) - It("setting --cluster and argument at the same time", func() { - cmd := newMockCmd("nodegroup", "ng", "--cluster", "name") + cmd := newMockCmd("nodegroup", "ng", "--cluster", "name", "--name", "ng") _, err := cmd.execute() Expect(err).To(MatchError(ContainSubstring("Error: --cluster=name and argument ng cannot be used at the same time"))) })