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 }