github.com/kubernetes-incubator/kube-aws@v0.16.4/cmd/init.go (about)

     1  package cmd
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/kubernetes-incubator/kube-aws/builtin"
     8  	"github.com/kubernetes-incubator/kube-aws/core/root/config"
     9  	"github.com/kubernetes-incubator/kube-aws/filegen"
    10  	"github.com/kubernetes-incubator/kube-aws/flatcar/amiregistry"
    11  	"github.com/kubernetes-incubator/kube-aws/logger"
    12  	"github.com/spf13/cobra"
    13  )
    14  
    15  var (
    16  	cmdInit = &cobra.Command{
    17  		Use:          "init",
    18  		Short:        "Initialize default node pool configuration",
    19  		Long:         ``,
    20  		RunE:         runCmdInit,
    21  		SilenceUsage: true,
    22  	}
    23  
    24  	initOpts = config.InitialConfig{}
    25  )
    26  
    27  const (
    28  	defaultReleaseChannel = "stable"
    29  )
    30  
    31  func init() {
    32  	RootCmd.AddCommand(cmdInit)
    33  	cmdInit.Flags().StringVar(&initOpts.S3URI, "s3-uri", "", "The URI of the S3 bucket")
    34  	cmdInit.Flags().StringVar(&initOpts.ClusterName, "cluster-name", "", "The name of this cluster. This will be the name of the cloudformation stack")
    35  	cmdInit.Flags().StringVar(&initOpts.ExternalDNSName, "external-dns-name", "", "The hostname that will route to the api server")
    36  	cmdInit.Flags().StringVar(&initOpts.HostedZoneID, "hosted-zone-id", "", "The hosted zone in which a Route53 record set for a k8s API endpoint is created")
    37  	cmdInit.Flags().StringVar(&initOpts.Region.Name, "region", "", "The AWS region to deploy to")
    38  	cmdInit.Flags().StringVar(&initOpts.AvailabilityZone, "availability-zone", "", "The AWS availability-zone to deploy to")
    39  	cmdInit.Flags().StringVar(&initOpts.KeyName, "key-name", "", "The AWS key-pair for ssh access to nodes")
    40  	cmdInit.Flags().StringVar(&initOpts.KMSKeyARN, "kms-key-arn", "", "The ARN of the AWS KMS key for encrypting TLS assets")
    41  	cmdInit.Flags().StringVar(&initOpts.AmiId, "ami-id", "", "The AMI ID of CoreOS. Last CoreOS Stable Channel selected by default if empty")
    42  	cmdInit.Flags().BoolVar(&initOpts.NoRecordSet, "no-record-set", false, "Instruct kube-aws to not manage Route53 record sets for your K8S API endpoints")
    43  }
    44  
    45  func runCmdInit(_ *cobra.Command, _ []string) error {
    46  	// Validate flags.
    47  	if err := validateRequired(
    48  		flag{"--s3-uri", initOpts.S3URI},
    49  		flag{"--cluster-name", initOpts.ClusterName},
    50  		flag{"--external-dns-name", initOpts.ExternalDNSName},
    51  		flag{"--region", initOpts.Region.Name},
    52  		flag{"--availability-zone", initOpts.AvailabilityZone},
    53  	); err != nil {
    54  		return err
    55  	}
    56  
    57  	if initOpts.AmiId == "" {
    58  		amiID, err := amiregistry.GetAMI(initOpts.Region.Name, defaultReleaseChannel)
    59  		initOpts.AmiId = amiID
    60  		if err != nil {
    61  			return fmt.Errorf("cannot retrieve CoreOS AMI for region %s, channel %s", initOpts.Region.Name, defaultReleaseChannel)
    62  		}
    63  	}
    64  
    65  	if !initOpts.NoRecordSet && initOpts.HostedZoneID == "" {
    66  		return errors.New("missing required flags: either --hosted-zone-id or --no-record-set is required")
    67  	}
    68  
    69  	if err := filegen.CreateFileFromTemplate(configPath, initOpts, builtin.Bytes("cluster.yaml.tmpl")); err != nil {
    70  		return fmt.Errorf("error exec-ing default config template: %v", err)
    71  	}
    72  
    73  	successMsg :=
    74  		`Success! Created %s
    75  
    76  Next steps:
    77  1. (Optional) Edit %s to parameterize the cluster.
    78  2. Use the "kube-aws render" command to render the CloudFormation stack template and coreos-cloudinit userdata.
    79  `
    80  	logger.Infof(successMsg, configPath, configPath)
    81  	return nil
    82  }