Skip to content

Commit edc16ed

Browse files
authored
feat(k8s): add version commands (#775)
1 parent cae20cb commit edc16ed

9 files changed

+232
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Get all the details about a specific Kubernetes version.
2+
3+
USAGE:
4+
scw k8s version get <version> [arg=value ...]
5+
6+
ARGS:
7+
version Version from which to get details
8+
[region] Region to target. If none is passed will use default region from the config
9+
10+
FLAGS:
11+
-h, --help help for get
12+
13+
GLOBAL FLAGS:
14+
-D, --debug Enable debug mode
15+
-o, --output string Output format: json or human
16+
-p, --profile string The config profile to use

cmd/scw/testdata/test-all-usage-k8s-version-usage.stderr.golden

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ USAGE:
99

1010
AVAILABLE COMMANDS:
1111
list List all available versions
12+
get Get a Kubernetes version
1213

1314
FLAGS:
1415
-h, --help help for version

internal/namespaces/k8s/v1beta4/custom.go

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import (
1414
// - Apply handwritten overrides (of Command.Run)
1515
func GetCommands() *core.Commands {
1616
cmds := GetGeneratedCommands()
17+
cmds.Merge(core.NewCommands(
18+
k8sVersionGetCommand(),
19+
))
1720

1821
human.RegisterMarshalerFunc(k8s.ClusterStatus(0), human.BindAttributesMarshalFunc(clusterStatusAttributes))
1922
human.RegisterMarshalerFunc(k8s.PoolStatus(0), human.BindAttributesMarshalFunc(poolStatusAttributes))
@@ -32,5 +35,7 @@ func GetCommands() *core.Commands {
3235

3336
cmds.MustFind("k8s", "node", "reboot").Override(nodeRebootBuilder)
3437

38+
cmds.MustFind("k8s", "version", "list").Override(versionListBuilder)
39+
3540
return cmds
3641
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package k8s
2+
3+
import (
4+
"context"
5+
6+
"github.com/scaleway/scaleway-cli/internal/core"
7+
k8s "github.com/scaleway/scaleway-sdk-go/api/k8s/v1beta4"
8+
)
9+
10+
func versionListBuilder(c *core.Command) *core.Command {
11+
originalRun := c.Run
12+
13+
c.Run = func(ctx context.Context, argsI interface{}) (interface{}, error) {
14+
originalRes, err := originalRun(ctx, argsI)
15+
if err != nil {
16+
return nil, err
17+
}
18+
19+
versionsResponse := originalRes.(*k8s.ListVersionsResponse)
20+
return versionsResponse.Versions, nil
21+
}
22+
23+
return c
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package k8s
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
8+
"github.com/scaleway/scaleway-cli/internal/core"
9+
k8s "github.com/scaleway/scaleway-sdk-go/api/k8s/v1beta4"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
type k8sVersionGetRequest struct {
14+
Version string
15+
Region scw.Region
16+
}
17+
18+
func k8sVersionGetCommand() *core.Command {
19+
return &core.Command{
20+
Short: `Get a Kubernetes version`,
21+
Long: `Get all the details about a specific Kubernetes version.`,
22+
Namespace: "k8s",
23+
Verb: "get",
24+
Resource: "version",
25+
ArgsType: reflect.TypeOf(k8sVersionGetRequest{}),
26+
ArgSpecs: core.ArgSpecs{
27+
{
28+
Name: "version",
29+
Short: "Version from which to get details",
30+
Required: true,
31+
Positional: true,
32+
},
33+
core.RegionArgSpec(),
34+
},
35+
Run: k8sVersionGetRun,
36+
}
37+
}
38+
39+
func k8sVersionGetRun(ctx context.Context, argsI interface{}) (i interface{}, e error) {
40+
request := argsI.(*k8sVersionGetRequest)
41+
42+
client := core.ExtractClient(ctx)
43+
apiK8s := k8s.NewAPI(client)
44+
45+
versions, err := apiK8s.ListVersions(&k8s.ListVersionsRequest{
46+
Region: request.Region,
47+
})
48+
49+
if err != nil {
50+
return nil, err
51+
}
52+
53+
for _, version := range versions.Versions {
54+
if version.Name == request.Version {
55+
return version, nil
56+
}
57+
}
58+
return nil, fmt.Errorf("version '%s' not found", request.Version)
59+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package k8s
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/scaleway/scaleway-cli/internal/core"
8+
)
9+
10+
////
11+
// Simple use cases
12+
////
13+
func Test_GetVersion(t *testing.T) {
14+
t.Run("simple", core.Test(&core.TestConfig{
15+
Commands: GetCommands(),
16+
Cmd: "scw k8s version get 1.17.4",
17+
Check: core.TestCheckCombine(
18+
core.TestCheckGolden(),
19+
core.TestCheckExitCode(0),
20+
),
21+
}))
22+
23+
t.Run("error", core.Test(&core.TestConfig{
24+
Commands: GetCommands(),
25+
Cmd: "scw k8s version get test",
26+
Check: core.TestCheckCombine(
27+
core.TestCheckError(fmt.Errorf("version 'test' not found")),
28+
core.TestCheckExitCode(1),
29+
),
30+
}))
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
version: 1
3+
interactions:
4+
- request:
5+
body: ""
6+
form: {}
7+
headers:
8+
User-Agent:
9+
- scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14; linux; amd64) cli-e2e-test
10+
url: https://api.scaleway.com/k8s/v1beta4/regions/fr-par/versions
11+
method: GET
12+
response:
13+
body: '{"versions":[{"region":"fr-par","name":"1.17.4","label":"Kubernetes 1.17.4","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","ServiceTopology","EndpointSlice","HPAScaleToZero","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]},{"region":"fr-par","name":"1.16.8","label":"Kubernetes
14+
1.16.8","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","EndpointSlice","HPAScaleToZero","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]},{"region":"fr-par","name":"1.15.11","label":"Kubernetes
15+
1.15.11","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]}]}'
16+
headers:
17+
Content-Length:
18+
- "1348"
19+
Content-Security-Policy:
20+
- default-src 'none'; frame-ancestors 'none'
21+
Content-Type:
22+
- application/json
23+
Date:
24+
- Tue, 17 Mar 2020 11:38:15 GMT
25+
Server:
26+
- scaleway_api
27+
Strict-Transport-Security:
28+
- max-age=63072000
29+
X-Content-Type-Options:
30+
- nosniff
31+
X-Frame-Options:
32+
- DENY
33+
X-Request-Id:
34+
- d3f5d4f9-44bb-4c0c-8c4a-a82d2251db18
35+
status: 200 OK
36+
code: 200
37+
duration: ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
version: 1
3+
interactions:
4+
- request:
5+
body: ""
6+
form: {}
7+
headers:
8+
User-Agent:
9+
- scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14; linux; amd64) cli-e2e-test
10+
url: https://api.scaleway.com/k8s/v1beta4/regions/fr-par/versions
11+
method: GET
12+
response:
13+
body: '{"versions":[{"region":"fr-par","name":"1.17.4","label":"Kubernetes 1.17.4","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","ServiceTopology","EndpointSlice","HPAScaleToZero","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]},{"region":"fr-par","name":"1.16.8","label":"Kubernetes
14+
1.16.8","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","EndpointSlice","HPAScaleToZero","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]},{"region":"fr-par","name":"1.15.11","label":"Kubernetes
15+
1.15.11","available_cnis":["cilium","calico","weave","flannel"],"available_ingresses":["none","nginx","traefik"],"available_container_runtimes":["docker","containerd","crio"],"available_feature_gates":["TTLAfterFinished","ServiceNodeExclusion"],"available_admission_plugins":["PodSecurityPolicy","MutatingAdmissionWebhook","PodNodeSelector","AlwaysPullImages"]}]}'
16+
headers:
17+
Content-Length:
18+
- "1348"
19+
Content-Security-Policy:
20+
- default-src 'none'; frame-ancestors 'none'
21+
Content-Type:
22+
- application/json
23+
Date:
24+
- Tue, 17 Mar 2020 11:38:15 GMT
25+
Server:
26+
- scaleway_api
27+
Strict-Transport-Security:
28+
- max-age=63072000
29+
X-Content-Type-Options:
30+
- nosniff
31+
X-Frame-Options:
32+
- DENY
33+
X-Request-Id:
34+
- 7d321500-a3fd-4a89-ab8c-12caab3b8f4c
35+
status: 200 OK
36+
code: 200
37+
duration: ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name 1.17.4
2+
label Kubernetes 1.17.4
3+
region fr-par
4+
available-cnis.0 cilium
5+
available-cnis.1 calico
6+
available-cnis.2 weave
7+
available-cnis.3 flannel
8+
available-ingresses.0 none
9+
available-ingresses.1 nginx
10+
available-ingresses.2 traefik
11+
available-container-runtimes.0 docker
12+
available-container-runtimes.1 containerd
13+
available-container-runtimes.2 crio
14+
available-feature-gates.0 TTLAfterFinished
15+
available-feature-gates.1 ServiceTopology
16+
available-feature-gates.2 EndpointSlice
17+
available-feature-gates.3 HPAScaleToZero
18+
available-feature-gates.4 ServiceNodeExclusion
19+
available-admission-plugins.0 PodSecurityPolicy
20+
available-admission-plugins.1 MutatingAdmissionWebhook
21+
available-admission-plugins.2 PodNodeSelector
22+
available-admission-plugins.3 AlwaysPullImages

0 commit comments

Comments
 (0)