Skip to content

Commit b856b2e

Browse files
committed
Support of scw --gateway=servername option (#70)
1 parent 793c4f6 commit b856b2e

File tree

8 files changed

+98
-16
lines changed

8 files changed

+98
-16
lines changed

api/helpers.go

+31
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package api
66

77
import (
8+
"errors"
89
"fmt"
910
"os"
1011
"strings"
@@ -37,6 +38,36 @@ type ScalewayImageInterface struct {
3738
Type string
3839
}
3940

41+
func ResolveGateway(api *ScalewayAPI, gateway string) (string, error) {
42+
if gateway == "" {
43+
return "", nil
44+
}
45+
46+
// Parses optional type prefix, i.e: "server:name" -> "name"
47+
_, gateway = parseNeedle(gateway)
48+
49+
servers, err := api.ResolveServer(gateway)
50+
if err != nil {
51+
return "", err
52+
}
53+
54+
if len(servers) == 0 {
55+
return gateway, nil
56+
}
57+
58+
if len(servers) > 1 {
59+
showResolverResults(gateway, servers)
60+
return "", errors.New(fmt.Sprintf("Gateway '%s' is ambiguous", gateway))
61+
}
62+
63+
// if len(servers) == 1 {
64+
server, err := api.GetServer(servers[0].Identifier)
65+
if err != nil {
66+
return "", err
67+
}
68+
return server.PublicAddress.IP, nil
69+
}
70+
4071
// CreateVolumeFromHumanSize creates a volume on the API with a human readable size
4172
func CreateVolumeFromHumanSize(api *ScalewayAPI, size string) (*string, error) {
4273
bytes, err := humanize.ParseBytes(size)

commands/cp.go

+20-8
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ var cpHelp bool // -h, --help flag
5252
var cpGateway string // -g, --gateway flag
5353

5454
// TarFromSource creates a stream buffer with the tarballed content of the user source
55-
func TarFromSource(api *api.ScalewayAPI, source string) (*io.ReadCloser, error) {
55+
func TarFromSource(apiClient *api.ScalewayAPI, source string) (*io.ReadCloser, error) {
5656
var tarOutputStream io.ReadCloser
5757

5858
// source is a server address + path (scp-like uri)
@@ -63,9 +63,9 @@ func TarFromSource(api *api.ScalewayAPI, source string) (*io.ReadCloser, error)
6363
return nil, fmt.Errorf("invalid source uri, see 'scw cp -h' for usage")
6464
}
6565

66-
serverID := api.GetServerID(serverParts[0])
66+
serverID := apiClient.GetServerID(serverParts[0])
6767

68-
server, err := api.GetServer(serverID)
68+
server, err := apiClient.GetServer(serverID)
6969
if err != nil {
7070
return nil, err
7171
}
@@ -83,8 +83,14 @@ func TarFromSource(api *api.ScalewayAPI, source string) (*io.ReadCloser, error)
8383
remoteCommand = append(remoteCommand, "-cf", "-")
8484
remoteCommand = append(remoteCommand, base)
8585

86+
// Resolve gateway
87+
gateway, err := api.ResolveGateway(apiClient, cpGateway)
88+
if err != nil {
89+
log.Fatalf("Cannot resolve Gateway '%s': %v", cpGateway, err)
90+
}
91+
8692
// execCmd contains the ssh connection + the remoteCommand
87-
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, false, nil, remoteCommand, cpGateway))
93+
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, false, nil, remoteCommand, gateway))
8894
log.Debugf("Executing: ssh %s", strings.Join(execCmd, " "))
8995
spawnSrc := exec.Command("ssh", execCmd...)
9096

@@ -141,7 +147,7 @@ func TarFromSource(api *api.ScalewayAPI, source string) (*io.ReadCloser, error)
141147
}
142148

143149
// UntarToDest writes to user destination the streamed tarball in input
144-
func UntarToDest(api *api.ScalewayAPI, sourceStream *io.ReadCloser, destination string) error {
150+
func UntarToDest(apiClient *api.ScalewayAPI, sourceStream *io.ReadCloser, destination string) error {
145151
// destination is a server address + path (scp-like uri)
146152
if strings.Index(destination, ":") > -1 {
147153
log.Debugf("Streaming using ssh and untaring remotely")
@@ -150,9 +156,9 @@ func UntarToDest(api *api.ScalewayAPI, sourceStream *io.ReadCloser, destination
150156
return fmt.Errorf("invalid destination uri, see 'scw cp -h' for usage")
151157
}
152158

153-
serverID := api.GetServerID(serverParts[0])
159+
serverID := apiClient.GetServerID(serverParts[0])
154160

155-
server, err := api.GetServer(serverID)
161+
server, err := apiClient.GetServer(serverID)
156162
if err != nil {
157163
return err
158164
}
@@ -166,8 +172,14 @@ func UntarToDest(api *api.ScalewayAPI, sourceStream *io.ReadCloser, destination
166172
}
167173
remoteCommand = append(remoteCommand, "-xf", "-")
168174

175+
// Resolve gateway
176+
gateway, err := api.ResolveGateway(apiClient, cpGateway)
177+
if err != nil {
178+
log.Fatalf("Cannot resolve Gateway '%s': %v", cpGateway, err)
179+
}
180+
169181
// execCmd contains the ssh connection + the remoteCommand
170-
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, false, nil, remoteCommand, cpGateway))
182+
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, false, nil, remoteCommand, gateway))
171183
log.Debugf("Executing: ssh %s", strings.Join(execCmd, " "))
172184
spawnDst := exec.Command("ssh", execCmd...)
173185

commands/exec.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,13 @@ func runExec(cmd *types.Command, args []string) {
5757

5858
serverID := cmd.API.GetServerID(args[0])
5959

60+
// Resolve gateway
61+
gateway, err := api.ResolveGateway(cmd.API, execGateway)
62+
if err != nil {
63+
log.Fatalf("Cannot resolve Gateway '%s': %v", execGateway, err)
64+
}
65+
6066
var server *api.ScalewayServer
61-
var err error
6267
if execW {
6368
// --wait
6469
server, err = api.WaitForServerReady(cmd.API, serverID)
@@ -80,7 +85,7 @@ func runExec(cmd *types.Command, args []string) {
8085
}()
8186
}
8287

83-
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, args[1:], !execW, execGateway)
88+
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, args[1:], !execW, gateway)
8489
if err != nil {
8590
log.Fatalf("%v", err)
8691
os.Exit(1)

commands/kill.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
log "github.com/Sirupsen/logrus"
1313

14+
"github.com/scaleway/scaleway-cli/api"
1415
types "github.com/scaleway/scaleway-cli/commands/types"
1516
"github.com/scaleway/scaleway-cli/utils"
1617
)
@@ -47,7 +48,13 @@ func runKill(cmd *types.Command, args []string) {
4748
log.Fatalf("Failed to get server information for %s: %v", serverID, err)
4849
}
4950

50-
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, true, nil, []string{command}, killGateway))
51+
// Resolve gateway
52+
gateway, err := api.ResolveGateway(cmd.API, killGateway)
53+
if err != nil {
54+
log.Fatalf("Cannot resolve Gateway '%s': %v", killGateway, err)
55+
}
56+
57+
execCmd := append(utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, true, nil, []string{command}, gateway))
5158

5259
log.Debugf("Executing: ssh %s", strings.Join(execCmd, " "))
5360

commands/logs.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package commands
77
import (
88
log "github.com/Sirupsen/logrus"
99

10+
"github.com/scaleway/scaleway-cli/api"
1011
types "github.com/scaleway/scaleway-cli/commands/types"
1112
"github.com/scaleway/scaleway-cli/utils"
1213
)
@@ -43,8 +44,14 @@ func runLogs(cmd *types.Command, args []string) {
4344

4445
// FIXME: switch to serial history when API is ready
4546

47+
// Resolve gateway
48+
gateway, err := api.ResolveGateway(cmd.API, logsGateway)
49+
if err != nil {
50+
log.Fatalf("Cannot resolve Gateway '%s': %v", logsGateway, err)
51+
}
52+
4653
command := []string{"dmesg"}
47-
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, command, true, logsGateway)
54+
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, command, true, gateway)
4855
if err != nil {
4956
log.Fatalf("Command execution failed: %v", err)
5057
}

commands/port.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package commands
77
import (
88
log "github.com/Sirupsen/logrus"
99

10+
"github.com/scaleway/scaleway-cli/api"
1011
types "github.com/scaleway/scaleway-cli/commands/types"
1112
"github.com/scaleway/scaleway-cli/utils"
1213
)
@@ -41,8 +42,14 @@ func runPort(cmd *types.Command, args []string) {
4142
log.Fatalf("Failed to get server information for %s: %v", serverID, err)
4243
}
4344

45+
// Resolve gateway
46+
gateway, err := api.ResolveGateway(cmd.API, portGateway)
47+
if err != nil {
48+
log.Fatalf("Cannot resolve Gateway '%s': %v", portGateway, err)
49+
}
50+
4451
command := []string{"netstat -lutn 2>/dev/null | grep LISTEN"}
45-
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, command, true, portGateway)
52+
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, command, true, gateway)
4653
if err != nil {
4754
log.Fatalf("Command execution failed: %v", err)
4855
}

commands/run.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,18 @@ func runRun(cmd *types.Command, args []string) {
110110
}
111111
log.Debugf("Server is ready: %s", server.PublicAddress.IP)
112112

113+
// Resolve gateway
114+
gateway, err := api.ResolveGateway(cmd.API, runGateway)
115+
if err != nil {
116+
log.Fatalf("Cannot resolve Gateway '%s': %v", runGateway, err)
117+
}
118+
113119
// exec -w SERVER COMMAND ARGS...
114120
log.Debugf("Executing command")
115121
if len(args) < 2 {
116-
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, []string{}, false, runGateway)
122+
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, []string{}, false, gateway)
117123
} else {
118-
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, args[1:], false, runGateway)
124+
err = utils.SSHExec(server.PublicAddress.IP, server.PrivateIP, args[1:], false, gateway)
119125
}
120126
if err != nil {
121127
log.Debugf("Command execution failed: %v", err)

commands/top.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
log "github.com/Sirupsen/logrus"
1313

14+
"github.com/scaleway/scaleway-cli/api"
1415
types "github.com/scaleway/scaleway-cli/commands/types"
1516
"github.com/scaleway/scaleway-cli/utils"
1617
)
@@ -46,7 +47,13 @@ func runTop(cmd *types.Command, args []string) {
4647
log.Fatalf("Failed to get server information for %s: %v", serverID, err)
4748
}
4849

49-
execCmd := utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, true, nil, []string{command}, topGateway)
50+
// Resolve gateway
51+
gateway, err := api.ResolveGateway(cmd.API, topGateway)
52+
if err != nil {
53+
log.Fatalf("Cannot resolve Gateway '%s': %v", topGateway, err)
54+
}
55+
56+
execCmd := utils.NewSSHExecCmd(server.PublicAddress.IP, server.PrivateIP, true, nil, []string{command}, gateway)
5057
log.Debugf("Executing: ssh %s", strings.Join(execCmd, " "))
5158
out, err := exec.Command("ssh", execCmd...).CombinedOutput()
5259
fmt.Printf("%s", out)

0 commit comments

Comments
 (0)