internal/deployers/eksctl/up.go (101 lines of code) (raw):
package eksctl
import (
"context"
"fmt"
"os"
"github.com/aws/aws-k8s-tester/internal/util"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/eks"
ekstypes "github.com/aws/aws-sdk-go-v2/service/eks/types"
"k8s.io/klog"
)
type UpOptions struct {
Region string `flag:"region" desc:"AWS region for EKS cluster"`
KubernetesVersion string `flag:"kubernetes-version" desc:"cluster Kubernetes version"`
Nodes int `flag:"nodes" desc:"number of nodes to launch in cluster"`
AMI string `flag:"ami" desc:"Node AMI"`
InstanceTypes []string `flag:"instance-types" desc:"Node instance types"`
}
func (d *deployer) verifyUpFlags() error {
if d.KubernetesVersion == "" {
klog.Infof("--kubernetes-version is empty, attempting to detect it...")
detectedVersion, err := detectKubernetesVersion()
if err != nil {
return fmt.Errorf("unable to detect --kubernetes-version, flag cannot be empty")
}
klog.Infof("detected --kubernetes-version=%s", detectedVersion)
d.KubernetesVersion = detectedVersion
}
if d.Nodes < 0 {
return fmt.Errorf("number of nodes must be greater than zero")
}
if d.Nodes == 0 {
d.Nodes = 4
klog.V(2).Infof("Using default number of nodes: %d", d.Nodes)
}
return nil
}
func (d *deployer) Up() error {
if err := d.verifyUpFlags(); err != nil {
return fmt.Errorf("up flags are invalid: %v", err)
}
klog.Infof("creating cluster: %s", d.commonOptions.RunID())
kubeconfig, err := d.Kubeconfig()
if err != nil {
return err
}
clusterConfig, err := d.RenderClusterConfig()
if err != nil {
return err
}
klog.Infof("rendered cluster config: %s", string(clusterConfig))
clusterConfigFile, err := os.CreateTemp("", "kubetest2-eksctl-cluster-config")
if err != nil {
return err
}
defer clusterConfigFile.Close()
_, err = clusterConfigFile.Write(clusterConfig)
if err != nil {
return err
}
args := []string{
"create",
"cluster",
"--install-nvidia-plugin=false",
"--install-neuron-plugin=false",
"--config-file", clusterConfigFile.Name(),
"--kubeconfig", kubeconfig,
}
err = util.ExecuteCommand("eksctl", args...)
if err != nil {
return fmt.Errorf("failed to create cluster: %v", err)
}
return nil
}
func (d *deployer) IsUp() (up bool, err error) {
result, err := d.eksClient.DescribeCluster(context.TODO(), &eks.DescribeClusterInput{
Name: aws.String(d.commonOptions.RunID()),
})
if err != nil {
return false, err
}
switch result.Cluster.Status {
case ekstypes.ClusterStatusActive:
return true, nil
case ekstypes.ClusterStatusCreating:
return false, nil
default:
return false, fmt.Errorf("cluster status is: %v", result.Cluster.Status)
}
}
func detectKubernetesVersion() (string, error) {
detectedVersion, err := util.DetectKubernetesVersion()
if err != nil {
return "", err
}
minorVersion, err := util.ParseMinorVersion(detectedVersion)
if err != nil {
return "", err
}
return minorVersion, nil
}