diff --git a/docs/commands/object.md b/docs/commands/object.md
index 20d9ae96b7..347262413a 100644
--- a/docs/commands/object.md
+++ b/docs/commands/object.md
@@ -146,6 +146,7 @@ scw object config get [arg=value ...]
|------|---|-------------|
| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for |
| name | Default: `scaleway` | Name of the s3 remote you want to generate |
+| project-id | | Scaleway project ID to use with IAM Access Key syntax |
| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config |
@@ -187,6 +188,7 @@ scw object config install [arg=value ...]
|------|---|-------------|
| type | Required
One of: `rclone`, `s3cmd`, `mc` | Type of S3 tool you want to generate a config for |
| name | Default: `scaleway` | Name of the s3 remote you want to generate |
+| project-id | | Scaleway project ID to use with IAM Access Key syntax |
| region | Default: `fr-par`
One of: `fr-par`, `nl-ams` | Region to target. If none is passed will use default region from the config |
diff --git a/internal/namespaces/object/v1/custom_config_get.go b/internal/namespaces/object/v1/custom_config_get.go
index a78515154e..30e286e5ed 100644
--- a/internal/namespaces/object/v1/custom_config_get.go
+++ b/internal/namespaces/object/v1/custom_config_get.go
@@ -37,6 +37,12 @@ func configGetCommand() *core.Command {
Required: false,
Default: core.DefaultValueSetter("scaleway"),
},
+ {
+ Name: "project-id",
+ Short: "Scaleway project ID to use with IAM Access Key syntax",
+ Required: false,
+ ValidateFunc: core.ValidateProjectID(),
+ },
core.RegionArgSpec(scw.RegionFrPar, scw.RegionNlAms),
},
Examples: []*core.Example{
diff --git a/internal/namespaces/object/v1/custom_config_get_test.go b/internal/namespaces/object/v1/custom_config_get_test.go
index 84fef2277f..c5784f5e64 100644
--- a/internal/namespaces/object/v1/custom_config_get_test.go
+++ b/internal/namespaces/object/v1/custom_config_get_test.go
@@ -16,6 +16,7 @@ func Test_ConfigGet(t *testing.T) {
"11111111-1111-1111-1111-111111111111",
),
scw.WithDefaultOrganizationID("11111111-1111-1111-1111-111111111111"),
+ scw.WithDefaultProjectID("11111111-1111-1111-1111-111111111111"),
scw.WithDefaultZone(scw.ZoneFrPar1),
scw.WithDefaultRegion(scw.RegionFrPar),
)
diff --git a/internal/namespaces/object/v1/custom_config_install.go b/internal/namespaces/object/v1/custom_config_install.go
index a4cccedc7b..f7bdef9da1 100644
--- a/internal/namespaces/object/v1/custom_config_install.go
+++ b/internal/namespaces/object/v1/custom_config_install.go
@@ -41,6 +41,12 @@ func configInstallCommand() *core.Command {
Required: false,
Default: core.DefaultValueSetter("scaleway"),
},
+ {
+ Name: "project-id",
+ Short: "Scaleway project ID to use with IAM Access Key syntax",
+ Required: false,
+ ValidateFunc: core.ValidateProjectID(),
+ },
core.RegionArgSpec(scw.RegionFrPar, scw.RegionNlAms),
},
Examples: []*core.Example{
diff --git a/internal/namespaces/object/v1/custom_config_install_test.go b/internal/namespaces/object/v1/custom_config_install_test.go
index f4a5981665..226aefdb9e 100644
--- a/internal/namespaces/object/v1/custom_config_install_test.go
+++ b/internal/namespaces/object/v1/custom_config_install_test.go
@@ -18,6 +18,7 @@ func Test_ConfigInstall(t *testing.T) {
"11111111-1111-1111-1111-111111111111",
),
scw.WithDefaultOrganizationID("11111111-1111-1111-1111-111111111111"),
+ scw.WithDefaultProjectID("11111111-1111-1111-1111-111111111111"),
scw.WithDefaultZone(scw.ZoneFrPar1),
scw.WithDefaultRegion(scw.RegionFrPar),
)
diff --git a/internal/namespaces/object/v1/s3configfile.go b/internal/namespaces/object/v1/s3configfile.go
index 28f54582e2..dc862ca396 100644
--- a/internal/namespaces/object/v1/s3configfile.go
+++ b/internal/namespaces/object/v1/s3configfile.go
@@ -37,6 +37,7 @@ type s3config struct {
Region scw.Region
Name string
ctx context.Context
+ ProjectID string
}
const (
@@ -71,7 +72,7 @@ type = s3
provider = Scaleway
env_auth = false
endpoint = s3.{{ .Region }}.scw.cloud
-access_key_id = {{ .AccessKey }}
+access_key_id = {{ .AccessKey }}@{{ .ProjectID }}
secret_access_key = {{ .SecretKey }}
region = {{ .Region }}
location_constraint =
@@ -87,10 +88,20 @@ func newS3Config(ctx context.Context, region scw.Region, name string) (s3config,
if !accessExists {
return s3config{}, errors.New("no access key found")
}
+
secretKey, secretExists := client.GetSecretKey()
if !secretExists {
return s3config{}, errors.New("no secret key found")
}
+
+ projectID, exists := client.GetDefaultProjectID()
+ if !exists {
+ return s3config{}, errors.New("no project ID found")
+ }
+
+ if projectID != "" {
+ accessKey+="@"+projectID
+ }
config := s3config{
AccessKey: accessKey,
SecretKey: secretKey,
@@ -144,6 +155,7 @@ func (c s3config) getConfigFile(tool s3tool) (core.RawResult, error) {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
API string `json:"api"`
+ ProjectID string `json:"projectID"`
}
m := struct {
Version string `json:"version"`
@@ -153,7 +165,7 @@ func (c s3config) getConfigFile(tool s3tool) (core.RawResult, error) {
Hosts: map[string]hostconfig{
c.Name: {
URL: "https://s3." + c.Region.String() + ".scw.cloud",
- AccessKey: c.AccessKey,
+ AccessKey: c.AccessKey + "@" + c.ProjectID,
SecretKey: c.SecretKey,
API: "S3v4",
},
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-default-mc.golden b/internal/namespaces/object/v1/testdata/test-config-get-default-mc.golden
index 5734bd2208..f2dbdbaafb 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-default-mc.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-default-mc.golden
@@ -1,5 +1,5 @@
π²π²π² EXIT CODE: 0 π²π²π²
π©π©π© STDOUTοΈ π©π©π©οΈ
-{"version":"9","hosts":{"scaleway":{"url":"https://s3.fr-par.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4"}}}
+{"version":"9","hosts":{"scaleway":{"url":"https://s3.fr-par.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4","projectID":""}}}
π©π©π© JSON STDOUT π©π©π©
-{"version":"9","hosts":{"scaleway":{"url":"https://s3.fr-par.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4"}}}
+{"version":"9","hosts":{"scaleway":{"url":"https://s3.fr-par.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4","projectID":""}}}
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-default-rclone.golden b/internal/namespaces/object/v1/testdata/test-config-get-default-rclone.golden
index fbefdbbf60..012e5df6b3 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-default-rclone.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-default-rclone.golden
@@ -8,7 +8,7 @@ type = s3
provider = Scaleway
env_auth = false
endpoint = s3.fr-par.scw.cloud
-access_key_id = SCWXXXXXXXXXXXXXXXXX
+access_key_id = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
secret_access_key = 11111111-1111-1111-1111-111111111111
region = fr-par
location_constraint =
@@ -25,7 +25,7 @@ type = s3
provider = Scaleway
env_auth = false
endpoint = s3.fr-par.scw.cloud
-access_key_id = SCWXXXXXXXXXXXXXXXXX
+access_key_id = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
secret_access_key = 11111111-1111-1111-1111-111111111111
region = fr-par
location_constraint =
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-default-s3cmd.golden b/internal/namespaces/object/v1/testdata/test-config-get-default-s3cmd.golden
index 2f84f5d7ee..284f491807 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-default-s3cmd.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-default-s3cmd.golden
@@ -4,7 +4,7 @@
# Configuration file for s3cmd https://s3tools.org/s3cmd
# Default location: $HOME/.s3cfg
[default]
-access_key = SCWXXXXXXXXXXXXXXXXX
+access_key = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
bucket_location = fr-par
host_base = s3.fr-par.scw.cloud
host_bucket = %(bucket)s.s3.fr-par.scw.cloud
@@ -15,7 +15,7 @@ use_https = True
# Configuration file for s3cmd https://s3tools.org/s3cmd
# Default location: $HOME/.s3cfg
[default]
-access_key = SCWXXXXXXXXXXXXXXXXX
+access_key = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
bucket_location = fr-par
host_base = s3.fr-par.scw.cloud
host_bucket = %(bucket)s.s3.fr-par.scw.cloud
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-with-region-mc.golden b/internal/namespaces/object/v1/testdata/test-config-get-with-region-mc.golden
index ff758202a2..4c0d4252ee 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-with-region-mc.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-with-region-mc.golden
@@ -1,5 +1,5 @@
π²π²π² EXIT CODE: 0 π²π²π²
π©π©π© STDOUTοΈ π©π©π©οΈ
-{"version":"9","hosts":{"scaleway":{"url":"https://s3.nl-ams.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4"}}}
+{"version":"9","hosts":{"scaleway":{"url":"https://s3.nl-ams.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4","projectID":""}}}
π©π©π© JSON STDOUT π©π©π©
-{"version":"9","hosts":{"scaleway":{"url":"https://s3.nl-ams.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4"}}}
+{"version":"9","hosts":{"scaleway":{"url":"https://s3.nl-ams.scw.cloud","accessKey":"SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111","secretKey":"11111111-1111-1111-1111-111111111111","api":"S3v4","projectID":""}}}
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-with-region-rclone.golden b/internal/namespaces/object/v1/testdata/test-config-get-with-region-rclone.golden
index c8bf893230..ebe4a2dd53 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-with-region-rclone.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-with-region-rclone.golden
@@ -8,7 +8,7 @@ type = s3
provider = Scaleway
env_auth = false
endpoint = s3.nl-ams.scw.cloud
-access_key_id = SCWXXXXXXXXXXXXXXXXX
+access_key_id = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
secret_access_key = 11111111-1111-1111-1111-111111111111
region = nl-ams
location_constraint =
@@ -25,7 +25,7 @@ type = s3
provider = Scaleway
env_auth = false
endpoint = s3.nl-ams.scw.cloud
-access_key_id = SCWXXXXXXXXXXXXXXXXX
+access_key_id = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
secret_access_key = 11111111-1111-1111-1111-111111111111
region = nl-ams
location_constraint =
diff --git a/internal/namespaces/object/v1/testdata/test-config-get-with-region-s3cmd.golden b/internal/namespaces/object/v1/testdata/test-config-get-with-region-s3cmd.golden
index d4051acce6..1fdffc3306 100644
--- a/internal/namespaces/object/v1/testdata/test-config-get-with-region-s3cmd.golden
+++ b/internal/namespaces/object/v1/testdata/test-config-get-with-region-s3cmd.golden
@@ -4,7 +4,7 @@
# Configuration file for s3cmd https://s3tools.org/s3cmd
# Default location: $HOME/.s3cfg
[default]
-access_key = SCWXXXXXXXXXXXXXXXXX
+access_key = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
bucket_location = nl-ams
host_base = s3.nl-ams.scw.cloud
host_bucket = %(bucket)s.s3.nl-ams.scw.cloud
@@ -15,7 +15,7 @@ use_https = True
# Configuration file for s3cmd https://s3tools.org/s3cmd
# Default location: $HOME/.s3cfg
[default]
-access_key = SCWXXXXXXXXXXXXXXXXX
+access_key = SCWXXXXXXXXXXXXXXXXX@11111111-1111-1111-1111-111111111111
bucket_location = nl-ams
host_base = s3.nl-ams.scw.cloud
host_bucket = %(bucket)s.s3.nl-ams.scw.cloud