in internal/pkg/cli/storage_init.go [1210:1296]
func buildStorageInitCmd() *cobra.Command {
vars := initStorageVars{}
cmd := &cobra.Command{
Use: "init",
Short: "Creates a new AWS CloudFormation template for a storage resource.",
Long: `Creates a new AWS CloudFormation template for a storage resource.
Storage resources are addons, either for a workload or the environments.`,
Example: `
Create an S3 bucket named "my-bucket" attached to the "frontend" service.
/code $ copilot storage init -n my-bucket -t S3 -w frontend -l workload
Create an environment S3 bucket fronted by the "api" service.
/code $ copilot storage init -n my-bucket -t S3 -w api -l environment
Create a DynamoDB table with a sort key.
/code $ copilot storage init -n my-table -t DynamoDB -w frontend --partition-key Email:S --sort-key UserId:N --no-lsi
Create an RDS Aurora Serverless v2 cluster using PostgreSQL.
/code $ copilot storage init -n my-cluster -t Aurora -w frontend --engine PostgreSQL --initial-db testdb`,
RunE: runCmdE(func(cmd *cobra.Command, args []string) error {
opts, err := newStorageInitOpts(vars)
if err != nil {
return err
}
return run(opts)
}),
}
cmd.Flags().StringVarP(&vars.storageName, nameFlag, nameFlagShort, "", storageFlagDescription)
cmd.Flags().StringVarP(&vars.storageType, storageTypeFlag, typeFlagShort, "", storageTypeFlagDescription)
cmd.Flags().StringVarP(&vars.workloadName, workloadFlag, workloadFlagShort, "", storageWorkloadFlagDescription)
cmd.Flags().StringVarP(&vars.lifecycle, storageLifecycleFlag, storageLifecycleShort, "", storageLifecycleFlagDescription)
cmd.Flags().StringVarP(&vars.addIngressFrom, storageAddIngressFromFlag, "", "", storageAddIngressFromFlagDescription)
cmd.Flags().StringVar(&vars.partitionKey, storagePartitionKeyFlag, "", storagePartitionKeyFlagDescription)
cmd.Flags().StringVar(&vars.sortKey, storageSortKeyFlag, "", storageSortKeyFlagDescription)
cmd.Flags().StringArrayVar(&vars.lsiSorts, storageLSIConfigFlag, []string{}, storageLSIConfigFlagDescription)
cmd.Flags().BoolVar(&vars.noLSI, storageNoLSIFlag, false, storageNoLSIFlagDescription)
cmd.Flags().BoolVar(&vars.noSort, storageNoSortFlag, false, storageNoSortFlagDescription)
cmd.Flags().StringVar(&vars.auroraServerlessVersion, storageAuroraServerlessVersionFlag, defaultAuroraServerlessVersion, storageAuroraServerlessVersionFlagDescription)
cmd.Flags().StringVar(&vars.rdsEngine, storageRDSEngineFlag, "", storageRDSEngineFlagDescription)
cmd.Flags().StringVar(&vars.rdsInitialDBName, storageRDSInitialDBFlag, "", storageRDSInitialDBFlagDescription)
cmd.Flags().StringVar(&vars.rdsParameterGroup, storageRDSParameterGroupFlag, "", storageRDSParameterGroupFlagDescription)
ddbFlags := []string{storagePartitionKeyFlag, storageSortKeyFlag, storageNoSortFlag, storageLSIConfigFlag, storageNoLSIFlag}
rdsFlags := []string{storageAuroraServerlessVersionFlag, storageRDSEngineFlag, storageRDSInitialDBFlag, storageRDSParameterGroupFlag}
for _, f := range append(ddbFlags, storageAuroraServerlessVersionFlag, storageRDSInitialDBFlag, storageRDSParameterGroupFlag) {
cmd.MarkFlagsMutuallyExclusive(storageAddIngressFromFlag, f)
}
requiredFlags := pflag.NewFlagSet("Required", pflag.ContinueOnError)
requiredFlags.AddFlag(cmd.Flags().Lookup(nameFlag))
requiredFlags.AddFlag(cmd.Flags().Lookup(storageTypeFlag))
requiredFlags.AddFlag(cmd.Flags().Lookup(workloadFlag))
requiredFlags.AddFlag(cmd.Flags().Lookup(storageLifecycleFlag))
ddbFlagSet := pflag.NewFlagSet("DynamoDB", pflag.ContinueOnError)
for _, f := range ddbFlags {
ddbFlagSet.AddFlag(cmd.Flags().Lookup(f))
}
auroraFlagSet := pflag.NewFlagSet("Aurora Serverless", pflag.ContinueOnError)
for _, f := range rdsFlags {
auroraFlagSet.AddFlag(cmd.Flags().Lookup(f))
}
optionalFlagSet := pflag.NewFlagSet("Optional", pflag.ContinueOnError)
optionalFlagSet.AddFlag(cmd.Flags().Lookup(storageAddIngressFromFlag))
cmd.Annotations = map[string]string{
// The order of the sections we want to display.
"sections": `Required,DynamoDB,Aurora Serverless,Optional`,
"Required": requiredFlags.FlagUsages(),
"DynamoDB": ddbFlagSet.FlagUsages(),
"Aurora Serverless": auroraFlagSet.FlagUsages(),
"Optional": optionalFlagSet.FlagUsages(),
}
cmd.SetUsageTemplate(`{{h1 "Usage"}}{{if .Runnable}}
{{.UseLine}}{{end}}{{$annotations := .Annotations}}{{$sections := split .Annotations.sections ","}}{{if gt (len $sections) 0}}
{{range $i, $sectionName := $sections}}{{h1 (print $sectionName " Flags")}}
{{(index $annotations $sectionName) | trimTrailingWhitespaces}}{{if ne (inc $i) (len $sections)}}
{{end}}{{end}}{{end}}{{if .HasAvailableInheritedFlags}}
{{h1 "Global Flags"}}
{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasExample}}
{{h1 "Examples"}}{{code .Example}}{{end}}
`)
return cmd
}