Skip to content

Commit cdd441c

Browse files
committed
Added 'scw _userdata local' option (fix #166)
1 parent 1b4d37d commit cdd441c

File tree

4 files changed

+81
-14
lines changed

4 files changed

+81
-14
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,7 @@ $ scw inspect myserver | jq '.[0].public_ip.address'
11331133
* `scw info` now prints user/organization info from the API ([#142](https://github.com/scaleway/scaleway-cli/issues/130)
11341134
* Added helpers to manipulate new `user_data` API ([#150](https://github.com/scaleway/scaleway-cli/issues/150))
11351135
* Support of `scw rm -f/--force` option ([#158](https://github.com/scaleway/scaleway-cli/issues/158))
1136+
* Added `scw _userdata local ...` option which interacts with the Metadata API without authentication ([#166](https://github.com/scaleway/scaleway-cli/issues/166))
11361137

11371138
#### Fixes
11381139

pkg/api/api.go

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ import (
2828

2929
// Default values
3030
var (
31-
ComputeAPI string = "https://api.scaleway.com/"
32-
AccountAPI string = "https://account.scaleway.com/"
31+
ComputeAPI string = "https://api.scaleway.com/"
32+
AccountAPI string = "https://account.scaleway.com/"
33+
MetadataAPI string = "http://169.254.42.42/"
3334
)
3435

3536
// ScalewayAPI is the interface used to communicate with the Scaleway API
@@ -55,8 +56,9 @@ type ScalewayAPI struct {
5556
// Cache is used to quickly resolve identifiers from names
5657
Cache *ScalewayCache
5758

58-
client *http.Client
59-
anonuuid anonuuid.AnonUUID
59+
client *http.Client
60+
anonuuid anonuuid.AnonUUID
61+
isMetadata bool
6062
}
6163

6264
// ScalewayAPIError represents a Scaleway API Error
@@ -1355,7 +1357,14 @@ type ScalewayUserdatas struct {
13551357

13561358
// GetUserdatas gets list of userdata for a server
13571359
func (s *ScalewayAPI) GetUserdatas(serverID string) (*ScalewayUserdatas, error) {
1358-
resp, err := s.GetResponse("servers/" + serverID + "/user_data")
1360+
var url string
1361+
if s.isMetadata {
1362+
url = "/user_data"
1363+
} else {
1364+
url = fmt.Sprintf("servers/%s/user_data", serverID)
1365+
}
1366+
1367+
resp, err := s.GetResponse(url)
13591368
if err != nil {
13601369
return nil, err
13611370
}
@@ -1381,7 +1390,14 @@ func (s *ScalewayAPI) GetUserdata(serverID string, key string) (*ScalewayUserdat
13811390
var data ScalewayUserdata
13821391
var err error
13831392

1384-
resp, err := s.GetResponse("servers/" + serverID + "/user_data/" + key)
1393+
var url string
1394+
if s.isMetadata {
1395+
url = fmt.Sprintf("/user_data/%s", key)
1396+
} else {
1397+
url = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
1398+
}
1399+
1400+
resp, err := s.GetResponse(url)
13851401
if err != nil {
13861402
return nil, err
13871403
}
@@ -1397,7 +1413,13 @@ func (s *ScalewayAPI) GetUserdata(serverID string, key string) (*ScalewayUserdat
13971413

13981414
// PatchUserdata sets a user data
13991415
func (s *ScalewayAPI) PatchUserdata(serverID string, key string, value []byte) error {
1400-
resource := fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
1416+
var resource string
1417+
if s.isMetadata {
1418+
resource = fmt.Sprintf("/user_data/%s", key)
1419+
} else {
1420+
resource = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
1421+
}
1422+
14011423
uri := fmt.Sprintf("%s/%s", strings.TrimRight(s.APIUrl, "/"), resource)
14021424
payload := new(bytes.Buffer)
14031425
payload.Write(value)
@@ -1432,7 +1454,14 @@ func (s *ScalewayAPI) PatchUserdata(serverID string, key string, value []byte) e
14321454

14331455
// DeleteUserdata deletes a server user_data
14341456
func (s *ScalewayAPI) DeleteUserdata(serverID string, key string) error {
1435-
resp, err := s.DeleteResponse(fmt.Sprintf("servers/%s/user_data/%s", serverID, key))
1457+
var url string
1458+
if s.isMetadata {
1459+
url = fmt.Sprintf("/user_data/%s", key)
1460+
} else {
1461+
url = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
1462+
}
1463+
1464+
resp, err := s.DeleteResponse(url)
14361465
if err != nil {
14371466
return err
14381467
}
@@ -1687,6 +1716,18 @@ func (s *ScalewayAPI) DisableAccountAPI() {
16871716
s.APIUrl = s.ComputeAPI
16881717
}
16891718

1719+
// EnableMetadataAPI enable metadataAPI
1720+
func (s *ScalewayAPI) EnableMetadataAPI() {
1721+
s.APIUrl = MetadataAPI
1722+
s.isMetadata = true
1723+
}
1724+
1725+
// DisableMetadataAPI disable metadataAPI
1726+
func (s *ScalewayAPI) DisableMetadataAPI() {
1727+
s.APIUrl = s.ComputeAPI
1728+
s.isMetadata = false
1729+
}
1730+
16901731
// SetPassword register the password
16911732
func (s *ScalewayAPI) SetPassword(password string) {
16921733
s.password = password

pkg/cli/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,15 @@ func Start(rawArgs []string, streams *commands.Streams) (int, error) {
9696
if err != nil {
9797
return 1, fmt.Errorf("usage: scw %s", cmd.UsageLine)
9898
}
99-
if cmd.Name() != "login" && cmd.Name() != "help" && cmd.Name() != "version" {
99+
switch cmd.Name() {
100+
case "login", "help", "version":
101+
// commands that don't need API
102+
case "_userdata":
103+
// commands that may need API
104+
api, _ := getScalewayAPI()
105+
cmd.API = api
106+
default:
107+
// commands that do need API
100108
if cfgErr != nil {
101109
if name != "login" && config == nil {
102110
logrus.Debugf("cfgErr: %v", cfgErr)

pkg/cli/x_userdata.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package cli
77
import (
88
"fmt"
99
"strings"
10+
11+
"github.com/scaleway/scaleway-cli/pkg/api"
1012
)
1113

1214
var cmdUserdata = &Command{
@@ -39,12 +41,27 @@ func runUserdata(cmd *Command, args []string) error {
3941
}
4042

4143
ctx := cmd.GetContext(args)
42-
serverID := ctx.API.GetServerID(args[0])
44+
var Api *api.ScalewayAPI
45+
var err error
46+
var serverID string
47+
if args[0] == "local" {
48+
Api, err = api.NewScalewayAPI("", "", "", "")
49+
if err != nil {
50+
return err
51+
}
52+
Api.EnableMetadataAPI()
53+
} else {
54+
if ctx.API == nil {
55+
return fmt.Errorf("You need to login first: 'scw login'")
56+
}
57+
serverID = ctx.API.GetServerID(args[0])
58+
Api = ctx.API
59+
}
4360

4461
switch len(args) {
4562
case 1:
4663
// List userdata
47-
res, err := ctx.API.GetUserdatas(serverID)
64+
res, err := Api.GetUserdatas(serverID)
4865
if err != nil {
4966
return err
5067
}
@@ -57,7 +74,7 @@ func runUserdata(cmd *Command, args []string) error {
5774
switch len(parts) {
5875
case 1:
5976
// Get userdatas
60-
res, err := ctx.API.GetUserdata(serverID, key)
77+
res, err := Api.GetUserdata(serverID, key)
6178
if err != nil {
6279
return err
6380
}
@@ -66,14 +83,14 @@ func runUserdata(cmd *Command, args []string) error {
6683
value := parts[1]
6784
if value != "" {
6885
// Set userdata
69-
err := ctx.API.PatchUserdata(serverID, key, []byte(value))
86+
err := Api.PatchUserdata(serverID, key, []byte(value))
7087
if err != nil {
7188
return err
7289
}
7390
fmt.Fprintln(ctx.Stdout, key)
7491
} else {
7592
// Delete userdata
76-
err := ctx.API.DeleteUserdata(serverID, key)
93+
err := Api.DeleteUserdata(serverID, key)
7794
if err != nil {
7895
return err
7996
}

0 commit comments

Comments
 (0)