github.com/scaleway/scaleway-cli@v1.11.1/pkg/cli/cmd_run.go (about)

     1  // Copyright (C) 2015 Scaleway. All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE.md file.
     4  
     5  package cli
     6  
     7  import (
     8  	"fmt"
     9  	"strings"
    10  
    11  	"github.com/scaleway/scaleway-cli/pkg/commands"
    12  )
    13  
    14  var cmdRun = &Command{
    15  	Exec:        runRun,
    16  	UsageLine:   "run [OPTIONS] IMAGE [COMMAND] [ARG...]",
    17  	Description: "Run a command in a new server",
    18  	Help:        "Run a command in a new server.",
    19  	Examples: `
    20      $ scw run ubuntu-trusty
    21      $ scw run --commercial-type=C2S ubuntu-trusty
    22      $ scw run --show-boot --commercial-type=C2S ubuntu-trusty
    23      $ scw run --rm ubuntu-trusty
    24      $ scw run -a --rm ubuntu-trusty
    25      $ scw run --gateway=myotherserver ubuntu-trusty
    26      $ scw run ubuntu-trusty bash
    27      $ scw run --name=mydocker docker docker run moul/nyancat:armhf
    28      $ scw run --bootscript=3.2.34 --env="boot=live rescue_image=http://j.mp/scaleway-ubuntu-trusty-tarball" 50GB bash
    29      $ scw run --attach alpine
    30      $ scw run --detach alpine
    31      $ scw run --tmp-ssh-key alpine
    32      $ scw run --userdata="FOO=BAR FILE=@/tmp/file" alpine
    33  `,
    34  }
    35  
    36  func init() {
    37  	cmdRun.Flag.StringVar(&runCreateName, []string{"-name"}, "", "Assign a name")
    38  	cmdRun.Flag.StringVar(&runCreateBootscript, []string{"-bootscript"}, "", "Assign a bootscript")
    39  	cmdRun.Flag.StringVar(&runCreateEnv, []string{"e", "-env"}, "", "Provide metadata tags passed to initrd (i.e., boot=rescue INITRD_DEBUG=1)")
    40  	cmdRun.Flag.StringVar(&runCreateVolume, []string{"v", "-volume"}, "", "Attach additional volume (i.e., 50G)")
    41  	cmdRun.Flag.BoolVar(&runHelpFlag, []string{"h", "-help"}, false, "Print usage")
    42  	cmdRun.Flag.Int64Var(&runTimeout, []string{"T", "-timeout"}, 0, "Set timeout value to seconds")
    43  	cmdRun.Flag.StringVar(&runIPAddress, []string{"-ip-address"}, "", "Assign a reserved public IP, a 'dynamic' one or 'none' (default to 'none' if gateway specified, 'dynamic' otherwise)")
    44  	cmdRun.Flag.BoolVar(&runAttachFlag, []string{"a", "-attach"}, false, "Attach to serial console")
    45  	cmdRun.Flag.BoolVar(&runDetachFlag, []string{"d", "-detach"}, false, "Run server in background and print server ID")
    46  	cmdRun.Flag.StringVar(&runGateway, []string{"g", "-gateway"}, "", "Use a SSH gateway")
    47  	cmdRun.Flag.StringVar(&runUserdatas, []string{"u", "-userdata"}, "", "Start a server with userdata predefined")
    48  	cmdRun.Flag.StringVar(&runCommercialType, []string{"-commercial-type"}, "VC1S", "Start a server with specific commercial-type C1, VC1[S|M|L], C2[S|M|L]")
    49  	cmdRun.Flag.StringVar(&runSSHUser, []string{"-user"}, "root", "Specify SSH User")
    50  	cmdRun.Flag.BoolVar(&runAutoRemove, []string{"-rm"}, false, "Automatically remove the server when it exits")
    51  	cmdRun.Flag.BoolVar(&runIPV6, []string{"-ipv6"}, false, "Enable IPV6")
    52  	cmdRun.Flag.BoolVar(&runTmpSSHKey, []string{"-tmp-ssh-key"}, false, "Access your server without uploading your SSH key to your account")
    53  	cmdRun.Flag.BoolVar(&runShowBoot, []string{"-show-boot"}, false, "Allows to show the boot")
    54  	cmdRun.Flag.IntVar(&runSSHPort, []string{"-p", "-port"}, 22, "Specify SSH port")
    55  	// FIXME: handle start --timeout
    56  }
    57  
    58  // Flags
    59  var runCreateName string       // --name flag
    60  var runAutoRemove bool         // --rm flag
    61  var runCreateBootscript string // --bootscript flag
    62  var runCreateEnv string        // -e, --env flag
    63  var runCreateVolume string     // -v, --volume flag
    64  var runIPAddress string        // --ip-address flag
    65  var runHelpFlag bool           // -h, --help flag
    66  var runAttachFlag bool         // -a, --attach flag
    67  var runDetachFlag bool         // -d, --detach flag
    68  var runGateway string          // -g, --gateway flag
    69  var runUserdatas string        // -u, --userdata flag
    70  var runCommercialType string   // --commercial-type flag
    71  var runTmpSSHKey bool          // --tmp-ssh-key flag
    72  var runShowBoot bool           // --show-boot flag
    73  var runIPV6 bool               // --ipv6 flag
    74  var runTimeout int64           // --timeout flag
    75  var runSetState string         // --set-state flag
    76  var runSSHUser string          // --user flag
    77  var runSSHPort int             // -p, --port flag
    78  
    79  func runRun(cmd *Command, rawArgs []string) error {
    80  	if runHelpFlag {
    81  		return cmd.PrintUsage()
    82  	}
    83  	if len(rawArgs) < 1 {
    84  		return cmd.PrintShortUsage()
    85  	}
    86  	if runAttachFlag && len(rawArgs) > 1 {
    87  		return fmt.Errorf("conflicting options: -a and COMMAND")
    88  	}
    89  	if runAttachFlag && runDetachFlag {
    90  		return fmt.Errorf("conflicting options: -a and -d")
    91  	}
    92  	if runAttachFlag && runShowBoot {
    93  		return fmt.Errorf("conflicting options: -a and --show-boot")
    94  	}
    95  	if runShowBoot && len(rawArgs) > 1 {
    96  		return fmt.Errorf("conflicting options: --show-boot and COMMAND")
    97  	}
    98  	if runShowBoot && runDetachFlag {
    99  		return fmt.Errorf("conflicting options: --show-boot and -d")
   100  	}
   101  	if runDetachFlag && len(rawArgs) > 1 {
   102  		return fmt.Errorf("conflicting options: -d and COMMAND")
   103  	}
   104  	if runAutoRemove && runDetachFlag {
   105  		return fmt.Errorf("conflicting options: --detach and --rm")
   106  	}
   107  
   108  	args := commands.RunArgs{
   109  		Attach:         runAttachFlag,
   110  		Bootscript:     runCreateBootscript,
   111  		Command:        rawArgs[1:],
   112  		Detach:         runDetachFlag,
   113  		Gateway:        runGateway,
   114  		Image:          rawArgs[0],
   115  		Name:           runCreateName,
   116  		AutoRemove:     runAutoRemove,
   117  		TmpSSHKey:      runTmpSSHKey,
   118  		ShowBoot:       runShowBoot,
   119  		IP:             runIPAddress,
   120  		Timeout:        runTimeout,
   121  		Userdata:       runUserdatas,
   122  		CommercialType: runCommercialType,
   123  		State:          runSetState,
   124  		IPV6:           runIPV6,
   125  		SSHUser:        runSSHUser,
   126  		SSHPort:        runSSHPort,
   127  		// FIXME: Timeout
   128  	}
   129  
   130  	if len(runCreateEnv) > 0 {
   131  		args.Tags = strings.Split(runCreateEnv, " ")
   132  	}
   133  	if len(runCreateVolume) > 0 {
   134  		args.Volumes = strings.Split(runCreateVolume, " ")
   135  	}
   136  	ctx := cmd.GetContext(rawArgs)
   137  	return commands.Run(ctx, args)
   138  }