in ec2config/validate-defaults.go [108:288]
func (cfg *Config) validateConfig() error {
if len(cfg.Name) == 0 {
return errors.New("empty Name")
}
if cfg.Name != strings.ToLower(cfg.Name) {
return fmt.Errorf("not lower-case Name %q", cfg.Name)
}
var partition endpoints.Partition
switch cfg.Partition {
case endpoints.AwsPartitionID:
partition = endpoints.AwsPartition()
case endpoints.AwsCnPartitionID:
partition = endpoints.AwsCnPartition()
case endpoints.AwsUsGovPartitionID:
partition = endpoints.AwsUsGovPartition()
case endpoints.AwsIsoPartitionID:
partition = endpoints.AwsIsoPartition()
case endpoints.AwsIsoBPartitionID:
partition = endpoints.AwsIsoBPartition()
default:
return fmt.Errorf("unknown partition %q", cfg.Partition)
}
regions := partition.Regions()
if _, ok := regions[cfg.Region]; !ok {
return fmt.Errorf("region %q for partition %q not found in %+v", cfg.Region, cfg.Partition, regions)
}
if cfg.LogColorOverride == "" {
_, cerr := terminal.IsColor()
if cfg.LogColor && cerr != nil {
cfg.LogColor = false
fmt.Fprintf(os.Stderr, "[WARN] LogColor is set to 'false' due to error %+v", cerr)
}
} else {
// non-empty override, don't even run "terminal.IsColor"
ov, perr := strconv.ParseBool(cfg.LogColorOverride)
if perr != nil {
return fmt.Errorf("failed to parse LogColorOverride %q (%v)", cfg.LogColorOverride, perr)
}
cfg.LogColor = ov
fmt.Fprintf(os.Stderr, "[WARN] LogColor is overwritten with %q", cfg.LogColorOverride)
}
if len(cfg.LogOutputs) == 0 {
return errors.New("LogOutputs is not empty")
}
if cfg.ConfigPath == "" {
rootDir, err := os.Getwd()
if err != nil {
rootDir = filepath.Join(os.TempDir(), cfg.Name)
if err := os.MkdirAll(rootDir, 0700); err != nil {
return err
}
}
cfg.ConfigPath = filepath.Join(rootDir, cfg.Name+".yaml")
var p string
p, err = filepath.Abs(cfg.ConfigPath)
if err != nil {
panic(err)
}
cfg.ConfigPath = p
}
if err := os.MkdirAll(filepath.Dir(cfg.ConfigPath), 0700); err != nil {
return err
}
if err := fileutil.IsDirWriteable(filepath.Dir(cfg.ConfigPath)); err != nil {
return err
}
if len(cfg.LogOutputs) == 1 && (cfg.LogOutputs[0] == "stderr" || cfg.LogOutputs[0] == "stdout") {
cfg.LogOutputs = append(cfg.LogOutputs, cfg.ConfigPath+".log")
}
if cfg.ASGsLogsDir == "" {
cfg.ASGsLogsDir = filepath.Join(filepath.Dir(cfg.ConfigPath), cfg.Name+"-logs-remote")
}
if cfg.RemoteAccessCommandsOutputPath == "" {
cfg.RemoteAccessCommandsOutputPath = strings.ReplaceAll(cfg.ConfigPath, ".yaml", "") + ".ssh.sh"
}
if filepath.Ext(cfg.RemoteAccessCommandsOutputPath) != ".sh" {
cfg.RemoteAccessCommandsOutputPath = cfg.RemoteAccessCommandsOutputPath + ".sh"
}
if err := fileutil.IsDirWriteable(filepath.Dir(cfg.RemoteAccessCommandsOutputPath)); err != nil {
return err
}
switch cfg.S3.BucketCreate {
case true: // need create one, or already created
if cfg.S3.BucketName == "" {
cfg.S3.BucketName = cfg.Name + "-s3-bucket"
}
if cfg.S3.BucketLifecycleExpirationDays > 0 && cfg.S3.BucketLifecycleExpirationDays < 3 {
cfg.S3.BucketLifecycleExpirationDays = 3
}
case false: // use existing one
if cfg.S3.BucketName == "" {
return errors.New("empty S3BucketName")
}
}
if cfg.S3.Dir == "" {
cfg.S3.Dir = cfg.Name
}
switch cfg.Role.Create {
case true: // need create one, or already created
if cfg.Role.Name == "" {
cfg.Role.Name = cfg.Name + "-role"
}
if len(cfg.Role.ServicePrincipals) > 0 {
/*
create node group request failed (InvalidParameterException: Following required service principals [ec2.amazonaws.com] were not found in the trust relationships of nodeRole arn:aws:iam::...:role/test-mng-role
{
ClusterName: "test",
Message_: "Following required service principals [ec2.amazonaws.com] were not found in the trust relationships of nodeRole arn:aws:iam::...:role/test-mng-role",
NodegroupName: "test-mng-cpu"
})
*/
found := false
for _, pv := range cfg.Role.ServicePrincipals {
if pv == "ec2.amazonaws.com" { // TODO: support China regions ec2.amazonaws.com.cn or eks.amazonaws.com.cn
found = true
break
}
}
if !found {
return fmt.Errorf("RoleServicePrincipals %q must include 'ec2.amazonaws.com'", cfg.Role.ServicePrincipals)
}
}
case false: // use existing one
if cfg.Role.ARN == "" {
return fmt.Errorf("Parameters.RoleCreate false; expect non-empty RoleARN but got %q", cfg.Role.ARN)
}
if cfg.Role.Name == "" {
cfg.Role.Name = getNameFromARN(cfg.Role.ARN)
}
}
if cfg.Role.PolicyName == "" {
cfg.Role.PolicyName = cfg.Name + "-policy"
}
if cfg.Role.InstanceProfileName == "" {
cfg.Role.InstanceProfileName = cfg.Name + "-instance-profile"
}
switch cfg.VPC.Create {
case true: // need create one, or already created
case false: // use existing one
if cfg.VPC.ID == "" {
return fmt.Errorf("Parameters.RoleCreate false; expect non-empty VPCID but got %q", cfg.VPC.ID)
}
}
switch cfg.RemoteAccessKeyCreate {
case true: // need create one, or already created
if cfg.RemoteAccessKeyName == "" {
cfg.RemoteAccessKeyName = cfg.Name + "-key"
}
if cfg.RemoteAccessPrivateKeyPath == "" {
cfg.RemoteAccessPrivateKeyPath = filepath.Join(os.TempDir(), randutil.String(10)+".insecure.key")
}
case false: // use existing one
if cfg.RemoteAccessKeyName == "" {
return fmt.Errorf("RemoteAccessKeyCreate false; expect non-empty RemoteAccessKeyName but got %q", cfg.RemoteAccessKeyName)
}
if cfg.RemoteAccessPrivateKeyPath == "" {
return fmt.Errorf("RemoteAccessKeyCreate false; expect non-empty RemoteAccessPrivateKeyPath but got %q", cfg.RemoteAccessPrivateKeyPath)
}
if !fileutil.Exist(cfg.RemoteAccessPrivateKeyPath) {
return fmt.Errorf("RemoteAccessPrivateKeyPath %q does not exist", cfg.RemoteAccessPrivateKeyPath)
}
}
if err := fileutil.IsDirWriteable(filepath.Dir(cfg.RemoteAccessPrivateKeyPath)); err != nil {
return err
}
return nil
}