Skip to content

Commit 61135fa

Browse files
authored
Merge pull request #515 from jksolbakken/scaleway
Scaleway plugin
2 parents f2ce41e + 7b08bdd commit 61135fa

File tree

6 files changed

+280
-0
lines changed

6 files changed

+280
-0
lines changed

plugins/scaleway/access_key.go

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
6+
"github.com/1Password/shell-plugins/sdk"
7+
"github.com/1Password/shell-plugins/sdk/importer"
8+
"github.com/1Password/shell-plugins/sdk/provision"
9+
"github.com/1Password/shell-plugins/sdk/schema"
10+
"github.com/1Password/shell-plugins/sdk/schema/credname"
11+
"github.com/1Password/shell-plugins/sdk/schema/fieldname"
12+
)
13+
14+
func AccessKey() schema.CredentialType {
15+
return schema.CredentialType{
16+
Name: credname.AccessKey,
17+
DocsURL: sdk.URL("https://www.scaleway.com/en/docs/iam/how-to/create-api-keys/"),
18+
ManagementURL: sdk.URL("https://console.scaleway.com/iam/api-keys"),
19+
Fields: []schema.CredentialField{
20+
{
21+
Name: fieldname.AccessKeyID,
22+
MarkdownDescription: "Access key ID",
23+
Secret: false,
24+
Optional: false,
25+
Composition: &schema.ValueComposition{
26+
Length: 20,
27+
Charset: schema.Charset{
28+
Uppercase: true,
29+
Digits: true,
30+
},
31+
},
32+
},
33+
{
34+
Name: fieldname.SecretAccessKey,
35+
MarkdownDescription: "Secret key.",
36+
Secret: true,
37+
Optional: false,
38+
Composition: &schema.ValueComposition{
39+
Length: 36,
40+
Charset: schema.Charset{
41+
Lowercase: true,
42+
Digits: true,
43+
},
44+
},
45+
},
46+
{
47+
Name: fieldname.DefaultRegion,
48+
MarkdownDescription: "Default region.",
49+
Secret: false,
50+
Optional: true,
51+
Composition: &schema.ValueComposition{
52+
Charset: schema.Charset{
53+
Lowercase: true,
54+
Uppercase: true,
55+
Digits: true,
56+
},
57+
},
58+
},
59+
{
60+
Name: fieldname.DefaultZone,
61+
MarkdownDescription: "Default zone.",
62+
Secret: false,
63+
Optional: true,
64+
Composition: &schema.ValueComposition{
65+
Charset: schema.Charset{
66+
Lowercase: true,
67+
Uppercase: true,
68+
Digits: true,
69+
},
70+
},
71+
},
72+
{
73+
Name: fieldname.ProjectID,
74+
MarkdownDescription: "Project ID.",
75+
Secret: false,
76+
Optional: true,
77+
Composition: &schema.ValueComposition{
78+
Charset: schema.Charset{
79+
Lowercase: true,
80+
Uppercase: true,
81+
Digits: true,
82+
},
83+
},
84+
},
85+
{
86+
Name: fieldname.OrgID,
87+
MarkdownDescription: "Organization ID.",
88+
Secret: false,
89+
Optional: true,
90+
Composition: &schema.ValueComposition{
91+
Charset: schema.Charset{
92+
Lowercase: true,
93+
Uppercase: true,
94+
Digits: true,
95+
},
96+
},
97+
},
98+
},
99+
DefaultProvisioner: provision.EnvVars(defaultEnvVarMapping),
100+
Importer: importer.TryAll(
101+
importer.TryEnvVarPair(defaultEnvVarMapping),
102+
TryScalewayConfigFile(),
103+
)}
104+
}
105+
106+
var defaultEnvVarMapping = map[string]sdk.FieldName{
107+
"SCW_ACCESS_KEY": fieldname.AccessKeyID,
108+
"SCW_SECRET_KEY": fieldname.SecretAccessKey,
109+
"SCW_DEFAULT_REGION": fieldname.DefaultRegion,
110+
"SCW_DEFAULT_ZONE": fieldname.DefaultZone,
111+
"SCW_DEFAULT_PROJECT_ID": fieldname.ProjectID,
112+
"SCW_DEFAULT_ORGANIZATION_ID": fieldname.OrgID,
113+
}
114+
115+
func TryScalewayConfigFile() sdk.Importer {
116+
return importer.TryFile("~/.config/scw/config.yaml", func(ctx context.Context, contents importer.FileContents, in sdk.ImportInput, out *sdk.ImportAttempt) {
117+
var config Config
118+
if err := contents.ToYAML(&config); err != nil {
119+
out.AddError(err)
120+
return
121+
}
122+
123+
if config.AccessKey == "" || config.SecretKey == "" {
124+
return
125+
}
126+
127+
out.AddCandidate(sdk.ImportCandidate{
128+
Fields: map[sdk.FieldName]string{
129+
fieldname.AccessKeyID: config.AccessKey,
130+
fieldname.SecretAccessKey: config.SecretKey,
131+
fieldname.DefaultRegion: config.DefaultRegion,
132+
fieldname.DefaultZone: config.DefaultZone,
133+
fieldname.ProjectID: config.ProjectID,
134+
fieldname.OrgID: config.OrganizationID,
135+
},
136+
})
137+
})
138+
}
139+
140+
type Config struct {
141+
AccessKey string `yaml:"access_key"`
142+
SecretKey string `yaml:"secret_key"`
143+
DefaultRegion string `yaml:"default_region,omitempty"`
144+
DefaultZone string `yaml:"default_zone,omitempty"`
145+
ProjectID string `yaml:"default_project_id,omitempty"`
146+
OrganizationID string `yaml:"default_organization_id,omitempty"`
147+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/1Password/shell-plugins/sdk"
7+
"github.com/1Password/shell-plugins/sdk/plugintest"
8+
"github.com/1Password/shell-plugins/sdk/schema/fieldname"
9+
)
10+
11+
func TestAccessKeyProvisioner(t *testing.T) {
12+
plugintest.TestProvisioner(t, AccessKey().DefaultProvisioner, map[string]plugintest.ProvisionCase{
13+
"default": {
14+
ItemFields: map[sdk.FieldName]string{
15+
fieldname.AccessKeyID: "AABBCCDDEEFFGGHHIIJJ",
16+
fieldname.SecretAccessKey: "c3a22663-2770-4428-8166-c214643cd70b",
17+
fieldname.DefaultRegion: "fr-par",
18+
fieldname.DefaultZone: "fr-par-1",
19+
fieldname.ProjectID: "d3a22663-2770-4428-8166-c214643cd70c",
20+
fieldname.OrgID: "e3a22663-2770-4428-8166-c214643cd70d",
21+
},
22+
ExpectedOutput: sdk.ProvisionOutput{
23+
Environment: map[string]string{
24+
"SCW_ACCESS_KEY": "AABBCCDDEEFFGGHHIIJJ",
25+
"SCW_SECRET_KEY": "c3a22663-2770-4428-8166-c214643cd70b",
26+
"SCW_DEFAULT_REGION": "fr-par",
27+
"SCW_DEFAULT_ZONE": "fr-par-1",
28+
"SCW_DEFAULT_PROJECT_ID": "d3a22663-2770-4428-8166-c214643cd70c",
29+
"SCW_DEFAULT_ORGANIZATION_ID": "e3a22663-2770-4428-8166-c214643cd70d",
30+
},
31+
},
32+
},
33+
})
34+
}
35+
36+
func TestAccessKeyImporter(t *testing.T) {
37+
plugintest.TestImporter(t, AccessKey().Importer, map[string]plugintest.ImportCase{
38+
"environment": {
39+
Environment: map[string]string{
40+
"SCW_ACCESS_KEY": "yolo",
41+
"SCW_SECRET_KEY": "c3a22663-2770-4428-8166-c214643cd70b",
42+
"SCW_DEFAULT_REGION": "fr-par",
43+
"SCW_DEFAULT_ZONE": "fr-par-1",
44+
"SCW_DEFAULT_PROJECT_ID": "01696acf-7a78-4d94-a129-5e135d0377cc",
45+
"SCW_DEFAULT_ORGANIZATION_ID": "14800390-5df1-4a90-b38e-9b461bdcd108",
46+
},
47+
ExpectedCandidates: []sdk.ImportCandidate{
48+
{
49+
Fields: map[sdk.FieldName]string{
50+
fieldname.AccessKeyID: "yolo",
51+
fieldname.SecretAccessKey: "c3a22663-2770-4428-8166-c214643cd70b",
52+
fieldname.DefaultRegion: "fr-par",
53+
fieldname.DefaultZone: "fr-par-1",
54+
fieldname.ProjectID: "01696acf-7a78-4d94-a129-5e135d0377cc",
55+
fieldname.OrgID: "14800390-5df1-4a90-b38e-9b461bdcd108",
56+
},
57+
},
58+
},
59+
},
60+
"config file": {
61+
Files: map[string]string{
62+
"~/.config/scw/config.yaml": plugintest.LoadFixture(t, "config"),
63+
},
64+
ExpectedCandidates: []sdk.ImportCandidate{
65+
{
66+
Fields: map[sdk.FieldName]string{
67+
fieldname.AccessKeyID: "yolo",
68+
fieldname.SecretAccessKey: "c3a22663-2770-4428-8166-c214643cd70b",
69+
fieldname.DefaultRegion: "fr-par",
70+
fieldname.DefaultZone: "fr-par-1",
71+
fieldname.ProjectID: "01696acf-7a78-4d94-a129-5e135d0377cc",
72+
fieldname.OrgID: "14800390-5df1-4a90-b38e-9b461bdcd108",
73+
},
74+
},
75+
},
76+
},
77+
})
78+
}

plugins/scaleway/plugin.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package scaleway
2+
3+
import (
4+
"github.com/1Password/shell-plugins/sdk"
5+
"github.com/1Password/shell-plugins/sdk/schema"
6+
)
7+
8+
func New() schema.Plugin {
9+
return schema.Plugin{
10+
Name: "scaleway",
11+
Platform: schema.PlatformInfo{
12+
Name: "Scaleway",
13+
Homepage: sdk.URL("https://scaleway.com"),
14+
},
15+
Credentials: []schema.CredentialType{
16+
AccessKey(),
17+
},
18+
Executables: []schema.Executable{
19+
ScalewayCLI(),
20+
},
21+
}
22+
}

plugins/scaleway/scw.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package scaleway
2+
3+
import (
4+
"github.com/1Password/shell-plugins/sdk"
5+
"github.com/1Password/shell-plugins/sdk/needsauth"
6+
"github.com/1Password/shell-plugins/sdk/schema"
7+
"github.com/1Password/shell-plugins/sdk/schema/credname"
8+
)
9+
10+
func ScalewayCLI() schema.Executable {
11+
return schema.Executable{
12+
Name: "Scaleway CLI",
13+
Runs: []string{"scw"},
14+
DocsURL: sdk.URL("https://www.scaleway.com/en/cli/"),
15+
NeedsAuth: needsauth.IfAll(
16+
needsauth.NotForHelpOrVersion(),
17+
needsauth.NotWithoutArgs(),
18+
),
19+
Uses: []schema.CredentialUsage{
20+
{
21+
Name: credname.AccessKey,
22+
},
23+
},
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# comment
2+
access_key: yolo
3+
secret_key: c3a22663-2770-4428-8166-c214643cd70b
4+
default_organization_id: 14800390-5df1-4a90-b38e-9b461bdcd108
5+
default_project_id: 01696acf-7a78-4d94-a129-5e135d0377cc
6+
default_region: fr-par
7+
default_zone: fr-par-1

sdk/schema/fieldname/names.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
Credentials = sdk.FieldName("Credentials")
2929
Database = sdk.FieldName("Database")
3030
DefaultRegion = sdk.FieldName("Default Region")
31+
DefaultZone = sdk.FieldName("Default Zone")
3132
Deployment = sdk.FieldName("Deployment")
3233
Email = sdk.FieldName("Email")
3334
Endpoint = sdk.FieldName("Endpoint")

0 commit comments

Comments
 (0)