Skip to content

Commit 121b725

Browse files
yfodilremyleone
andauthored
feat(iot): change device create output (#2593)
Co-authored-by: Rémy Léone <[email protected]>
1 parent 1953a69 commit 121b725

File tree

5 files changed

+395
-0
lines changed

5 files changed

+395
-0
lines changed

internal/namespaces/iot/v1/custom.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ func GetCommands() *core.Commands {
1313
human.RegisterMarshalerFunc(iot.DeviceMessageFiltersRulePolicy(""), human.EnumMarshalFunc(deviceMessageFiltersRulePolicyMarshalSpecs))
1414
human.RegisterMarshalerFunc(iot.DeviceStatus(""), human.EnumMarshalFunc(deviceStatusMarshalSpecs))
1515
human.RegisterMarshalerFunc(iot.CreateNetworkResponse{}, iotNetworkCreateResponsedMarshalerFunc)
16+
human.RegisterMarshalerFunc(iot.CreateDeviceResponse{}, iotDeviceCreateResponsedMarshalerFunc)
1617

1718
cmds.MustFind("iot", "hub", "create").Override(hubCreateBuilder)
1819

internal/namespaces/iot/v1/custom_device.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package iot
22

33
import (
4+
"strings"
5+
46
"github.com/fatih/color"
57
"github.com/scaleway/scaleway-cli/v2/internal/human"
8+
"github.com/scaleway/scaleway-cli/v2/internal/terminal"
69
"github.com/scaleway/scaleway-sdk-go/api/iot/v1"
710
)
811

@@ -18,3 +21,35 @@ var (
1821
iot.DeviceStatusError: &human.EnumMarshalSpec{Attribute: color.FgRed, Value: "error"},
1922
}
2023
)
24+
25+
func iotDeviceCreateResponsedMarshalerFunc(i interface{}, opt *human.MarshalOpt) (string, error) {
26+
type tmp iot.CreateDeviceResponse
27+
deviceCreateResponse := tmp(i.(iot.CreateDeviceResponse))
28+
29+
deviceContent, err := human.Marshal(deviceCreateResponse.Device, opt)
30+
if err != nil {
31+
return "", err
32+
}
33+
deviceView := terminal.Style("Device:\n", color.Bold) + deviceContent
34+
35+
certificateContent, err := human.Marshal(deviceCreateResponse.Certificate.Crt, opt)
36+
if err != nil {
37+
return "", err
38+
}
39+
certificateView := terminal.Style("Certificate:\n", color.Bold) + certificateContent
40+
41+
privateKeyContent, err := human.Marshal(deviceCreateResponse.Certificate.Key, opt)
42+
if err != nil {
43+
return "", err
44+
}
45+
privateKeyView := terminal.Style("Private Key:\n", color.Bold) + privateKeyContent
46+
47+
warningKeys := "WARNING: The keys below are displayed only once. Make sure to store them securely"
48+
49+
return strings.Join([]string{
50+
deviceView,
51+
warningKeys,
52+
certificateView,
53+
privateKeyView,
54+
}, "\n\n"), nil
55+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package iot
2+
3+
import (
4+
"testing"
5+
6+
"github.com/scaleway/scaleway-cli/v2/internal/core"
7+
)
8+
9+
func Test_CreateDevice(t *testing.T) {
10+
t.Run("Simple", core.Test(&core.TestConfig{
11+
Commands: GetCommands(),
12+
BeforeFunc: createHub(),
13+
Cmd: "scw iot device create hub-id={{ .Hub.ID }} name=foo",
14+
Check: core.TestCheckGolden(),
15+
AfterFunc: core.AfterFuncCombine(
16+
core.ExecAfterCmd("scw iot device delete {{ .CmdResult.Device.ID }}"),
17+
deleteHub(),
18+
),
19+
}))
20+
}
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
---
2+
version: 1
3+
interactions:
4+
- request:
5+
body: '{"name":"cli-hub-goofy-faraday","project_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","product_plan":"plan_shared","disable_events":null,"events_topic_prefix":null}'
6+
form: {}
7+
headers:
8+
Content-Type:
9+
- application/json
10+
User-Agent:
11+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
12+
url: https://api.scaleway.com/iot/v1/regions/fr-par/hubs
13+
method: POST
14+
response:
15+
body: '{"region":"fr-par","id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","organization_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","project_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","name":"cli-hub-goofy-faraday","status":"enabling","product_plan":"plan_shared","endpoint":"iot.fr-par.scw.cloud","created_at":"2022-11-16T14:45:01.496Z","updated_at":"2022-11-16T14:45:01.496Z","enabled":true,"device_count":0,"connected_device_count":0,"disable_events":false,"events_topic_prefix":"$SCW/events","enable_device_auto_provisioning":false,"has_custom_ca":false}'
16+
headers:
17+
Content-Length:
18+
- "546"
19+
Content-Security-Policy:
20+
- default-src 'none'; frame-ancestors 'none'
21+
Content-Type:
22+
- application/json
23+
Date:
24+
- Wed, 16 Nov 2022 14:45:02 GMT
25+
Server:
26+
- Scaleway API-Gateway
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+
- 736705b2-5184-4d05-83af-4053b19bc954
35+
status: 200 OK
36+
code: 200
37+
duration: ""
38+
- request:
39+
body: ""
40+
form: {}
41+
headers:
42+
User-Agent:
43+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
44+
url: https://api.scaleway.com/iot/v1/regions/fr-par/hubs/2658f811-fbb5-4c50-b52a-3947fbbdfa34
45+
method: GET
46+
response:
47+
body: '{"region":"fr-par","id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","organization_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","project_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","name":"cli-hub-goofy-faraday","status":"enabling","product_plan":"plan_shared","endpoint":"iot.fr-par.scw.cloud","created_at":"2022-11-16T14:45:01.496Z","updated_at":"2022-11-16T14:45:01.496Z","enabled":true,"device_count":0,"connected_device_count":0,"disable_events":false,"events_topic_prefix":"$SCW/events","enable_device_auto_provisioning":false,"has_custom_ca":false}'
48+
headers:
49+
Content-Length:
50+
- "546"
51+
Content-Security-Policy:
52+
- default-src 'none'; frame-ancestors 'none'
53+
Content-Type:
54+
- application/json
55+
Date:
56+
- Wed, 16 Nov 2022 14:45:02 GMT
57+
Server:
58+
- Scaleway API-Gateway
59+
Strict-Transport-Security:
60+
- max-age=63072000
61+
X-Content-Type-Options:
62+
- nosniff
63+
X-Frame-Options:
64+
- DENY
65+
X-Request-Id:
66+
- 7fc9705c-5aea-4fe8-84f2-37403be7692c
67+
status: 200 OK
68+
code: 200
69+
duration: ""
70+
- request:
71+
body: ""
72+
form: {}
73+
headers:
74+
User-Agent:
75+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
76+
url: https://api.scaleway.com/iot/v1/regions/fr-par/hubs/2658f811-fbb5-4c50-b52a-3947fbbdfa34
77+
method: GET
78+
response:
79+
body: '{"region":"fr-par","id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","organization_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","project_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","name":"cli-hub-goofy-faraday","status":"enabling","product_plan":"plan_shared","endpoint":"iot.fr-par.scw.cloud","created_at":"2022-11-16T14:45:01.496Z","updated_at":"2022-11-16T14:45:01.496Z","enabled":true,"device_count":0,"connected_device_count":0,"disable_events":false,"events_topic_prefix":"$SCW/events","enable_device_auto_provisioning":false,"has_custom_ca":false}'
80+
headers:
81+
Content-Length:
82+
- "546"
83+
Content-Security-Policy:
84+
- default-src 'none'; frame-ancestors 'none'
85+
Content-Type:
86+
- application/json
87+
Date:
88+
- Wed, 16 Nov 2022 14:45:07 GMT
89+
Server:
90+
- Scaleway API-Gateway
91+
Strict-Transport-Security:
92+
- max-age=63072000
93+
X-Content-Type-Options:
94+
- nosniff
95+
X-Frame-Options:
96+
- DENY
97+
X-Request-Id:
98+
- 75aa2532-db88-4024-8af2-ce553be1d1f6
99+
status: 200 OK
100+
code: 200
101+
duration: ""
102+
- request:
103+
body: ""
104+
form: {}
105+
headers:
106+
User-Agent:
107+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
108+
url: https://api.scaleway.com/iot/v1/regions/fr-par/hubs/2658f811-fbb5-4c50-b52a-3947fbbdfa34
109+
method: GET
110+
response:
111+
body: '{"region":"fr-par","id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","organization_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","project_id":"564aa517-68b0-4fd7-8c8c-d21c4bcdcbd5","name":"cli-hub-goofy-faraday","status":"ready","product_plan":"plan_shared","endpoint":"iot.fr-par.scw.cloud","created_at":"2022-11-16T14:45:01.496Z","updated_at":"2022-11-16T14:45:01.496Z","enabled":true,"device_count":0,"connected_device_count":0,"disable_events":false,"events_topic_prefix":"$SCW/events","enable_device_auto_provisioning":false,"has_custom_ca":false}'
112+
headers:
113+
Content-Length:
114+
- "543"
115+
Content-Security-Policy:
116+
- default-src 'none'; frame-ancestors 'none'
117+
Content-Type:
118+
- application/json
119+
Date:
120+
- Wed, 16 Nov 2022 14:45:12 GMT
121+
Server:
122+
- Scaleway API-Gateway
123+
Strict-Transport-Security:
124+
- max-age=63072000
125+
X-Content-Type-Options:
126+
- nosniff
127+
X-Frame-Options:
128+
- DENY
129+
X-Request-Id:
130+
- 1901021e-ff77-40c8-a25f-8096bdbdb640
131+
status: 200 OK
132+
code: 200
133+
duration: ""
134+
- request:
135+
body: '{"name":"foo","hub_id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","allow_insecure":false,"allow_multiple_connections":false,"message_filters":null,"description":null}'
136+
form: {}
137+
headers:
138+
Content-Type:
139+
- application/json
140+
User-Agent:
141+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
142+
url: https://api.scaleway.com/iot/v1/regions/fr-par/devices
143+
method: POST
144+
response:
145+
body: '{"device":{"id":"87dc3ddb-dc41-414c-8527-d987dfeadb9b","name":"foo","status":"enabled","hub_id":"2658f811-fbb5-4c50-b52a-3947fbbdfa34","created_at":"2022-11-16T14:45:12.488Z","updated_at":"2022-11-16T14:45:12.488Z","allow_insecure":false,"last_activity_at":"1970-01-01T00:00:00Z","is_connected":false,"message_filters":{"publish":{"policy":"reject","topics":[]},"subscribe":{"policy":"reject","topics":[]}},"allow_multiple_connections":false,"description":"","has_custom_certificate":false},"certificate":{"crt":"-----BEGIN
146+
CERTIFICATE-----\nMIIETjCCAzagAwIBAgIQfXLKLFLHcMNdN7okvo/VtDANBgkqhkiG9w0BAQsFADCB\nzjELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkZyYW5jZTEOMAwGA1UEBxMFUGFyaXMx\nEjAQBgNVBAkTCUxhIE1haXNvbjEJMAcGA1UEERMAMRgwFgYDVQQKEw9TY2FsZXdh\neS9PbmxpbmUxEDAOBgNVBAsTB0xhYi9Jb1QxITAfBgNVBAMTGFNjYWxld2F5IElv\nVCBDZXJ0aWZpY2F0ZTEwMC4GA1UEBRMnMjE1MzE0NTA3MTE4NDY5Njc2OTQ1Njk5\nOTYwNjA4NzA5MjYxNTcwMB4XDTIyMTExNTE0NDUxMloXDTMyMTExNTE0NDUxMlow\ngZ4xCzAJBgNVBAYTAkZSMQwwCgYDVQQIEwNJREYxDjAMBgNVBAcTBVBhcmlzMTEw\nLwYDVQQKEygwNjBDRjlGRDQyRTUwQUM0NTM4RDQ5NzgyQjk3MTZBNjEyQjZDMUFE\nMQwwCgYDVQQDEwNmb28xMDAuBgNVBAUTJzE2Njc0OTUyMTg3MzM4NTQyMjI4MDAx\nNjY3NTIyODMxNzg5ODE2NDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAPkjLMYAOaWd5sL850g1/26socgsN0hJPgTiHSFntpHKncl7Euayi3+g51BSu9OS\nuzQK/BOzYcscIUCopGmgwnsgqZthRRghtNFYgO+Vb1vjrGJEmQqjLfyddrb528M8\nl0EKSiJBjmBkvZ6O9voRZD88SL4kFzbD6Vq98G4WFG03/LBFoW0mYfZgeuNc6q8Q\n1WijrLQay6bzf4ZrD9gVf2s7oFW+tVKKohu2qM+rbWsu8buGx13hKEPepnEUtNmQ\n4ayYlmWMYbSZSVvyOkD1ox7SrbjtPYqni9rNt/NHkCTL1mQqjcTx7WRfb2Es3zM2\nNophJbItwJwIHLuixpK3HlUCAwEAAaNWMFQwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud\nJQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUquEHuIi7\nWs9yNTBergzZ9QSM3iMwDQYJKoZIhvcNAQELBQADggEBAH9v/RsVxEgdgmaGQ8lN\nu/74TBQ4bGgaX7lyspHsG3z/lBjzQzGTv/Yd60UmGgP1D83pLFmnKdxoG7yEzg5u\n35exNjgO8hV6HywRt686XSL7Tj1i6uZfYDN2qvd4zEYfjY5CyZqn2Kws0Gf4r71L\nXQkY/qdwcuYGkHWMW6OpSfltE8qbEqPlvCDCbKXE9+XL+3Ofq2ijQLq45CIIhqC+\n6xagHdabjVezUcDnWkyotImPVDOGVYABZlJi2gFI2P6XrYwuHEB3UthyAW/RsCqD\nru2JzrxFkqc3ToRiHkY3+RCIKw23JAPcCV4qXrJzJchC7p+c5bZfswmLXMI8dF/p\n0JE=\n-----END
147+
CERTIFICATE-----\n","key":"-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA+SMsxgA5pZ3mwvznSDX/bqyhyCw3SEk+BOIdIWe2kcqdyXsS\n5rKLf6DnUFK705K7NAr8E7NhyxwhQKikaaDCeyCpm2FFGCG00ViA75VvW+OsYkSZ\nCqMt/J12tvnbwzyXQQpKIkGOYGS9no72+hFkPzxIviQXNsPpWr3wbhYUbTf8sEWh\nbSZh9mB641zqrxDVaKOstBrLpvN/hmsP2BV/azugVb61UoqiG7aoz6ttay7xu4bH\nXeEoQ96mcRS02ZDhrJiWZYxhtJlJW/I6QPWjHtKtuO09iqeL2s2380eQJMvWZCqN\nxPHtZF9vYSzfMzY2imElsi3AnAgcu6LGkrceVQIDAQABAoIBAQDocADd2mfuNJuP\nYBUIMhjWUQm/kEEjl/Hc7HjxKaoT6027JLBFvF6Z/KzTK91BT6yIqZb1am7a6Ku9\nf5mlUu8foSGcbevgz9G7Xy8sV+dFe+zg4c9HNWc6QE7597MpO+aCL+9qdm83T8X5\noLicJo240a2seE+QMMgOeRdQHhmAqtw1pkcqH5+3Vc6LUIvtYYHm50lWkgnWWodE\nzL/KBYmg2B/WdmMESi8Q9/1YL9Dm9OSUCBVEk3/mEOz/V0dhnmLnF2PMzdmWmQqO\nWvd9hS7LqwQg5k+AK0TQGxXQIcFyokos7zaVbQho7MGmva5j90RpSVlUg5/gJ3Ln\ni9bfsYIhAoGBAPkwZhKhSHiVL0u8sCtzkwxRa6b2eAZ1f7yvsQ1JeZg3yUMy+sJU\nWJKl5UPZ5nML2p6tTPbGLt+a/mzkSqjGzJb3DeWcc/KKuPhdwbXJIa+vQjP+t6Oo\nna+XaLPArnWbpoJzN2xe1SPNI0UTcMs24LcTwMjMWGWR8byHuRa6qKXnAoGBAP/y\naiwV9lJSqnGiI9t6Ix5Mq+EsbBJdArFkDrLpbKB3iLxERH7jnMtAdv/OKDffsLi1\nRyPoaloalkF0HoaxkxG2M7npeliRzJ3dpJ59zc2mdF/R0BxIwVLSA/Ucj3NYZTc0\nvLhoNR0aApxOEoo3D1vBdoRdDcabysyHYwt4fppjAoGAaYFYdmLbMFLZ55NIc91H\nUVvX3KVWREXTg6xPpnSJiy1zhYQ8L7NOnSioXYYQ0H0gXza483MNvZb+SlSOV890\nKCcKN0F6xiJ+Fop7zeAO5zepLCKY1i46NXJB3nmiZCE26tylhrjQPYxJdqG4jBH8\nKweuBFagxsB4PX6pmzoE1dkCgYEA/PyVW4w91LNnTDjTLp70VX+9qS3qiOAsyEC5\nkrjNqXNd0ZG9DptXIURQG5uf/1J48KombmTNstBy0rG/dq3RTAGH8WzJhQBge25Y\nyFxbb7nnb8sI5Nw5Uu7KAJ7BYGbwbPgQzkoarfBGwk8dXkb8RFrfFgiQlE7rzuzH\nxs/MfDcCgYEAu7p+1KZ+zmJCUPt3x81CVSAH/ntJL6j++MqB7qeb9eCjzQuNKK46\nq2FkMIva1cQqIkQTyoofsDxDblNDdlwS3htF0bbs79tI+AJfn+WIV2kuepi9vmyy\na9pRpSCncvC3TaNfRzNBMGbjnghnqGXz89/GUYXoXK9fnbMhFNHUU6w=\n-----END
148+
RSA PRIVATE KEY-----\n"}}'
149+
headers:
150+
Content-Length:
151+
- "3811"
152+
Content-Security-Policy:
153+
- default-src 'none'; frame-ancestors 'none'
154+
Content-Type:
155+
- application/json
156+
Date:
157+
- Wed, 16 Nov 2022 14:45:13 GMT
158+
Server:
159+
- Scaleway API-Gateway
160+
Strict-Transport-Security:
161+
- max-age=63072000
162+
X-Content-Type-Options:
163+
- nosniff
164+
X-Frame-Options:
165+
- DENY
166+
X-Request-Id:
167+
- f5854fea-a79a-4365-882b-750a1ba4427a
168+
status: 200 OK
169+
code: 200
170+
duration: ""
171+
- request:
172+
body: ""
173+
form: {}
174+
headers:
175+
User-Agent:
176+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
177+
url: https://api.scaleway.com/iot/v1/regions/fr-par/devices/87dc3ddb-dc41-414c-8527-d987dfeadb9b
178+
method: DELETE
179+
response:
180+
body: ""
181+
headers:
182+
Content-Security-Policy:
183+
- default-src 'none'; frame-ancestors 'none'
184+
Content-Type:
185+
- application/json
186+
Date:
187+
- Wed, 16 Nov 2022 14:45:13 GMT
188+
Server:
189+
- Scaleway API-Gateway
190+
Strict-Transport-Security:
191+
- max-age=63072000
192+
X-Content-Type-Options:
193+
- nosniff
194+
X-Frame-Options:
195+
- DENY
196+
X-Request-Id:
197+
- 9b6f8134-d4e8-4cfc-bd82-a1040fe2defe
198+
status: 204 No Content
199+
code: 204
200+
duration: ""
201+
- request:
202+
body: ""
203+
form: {}
204+
headers:
205+
User-Agent:
206+
- scaleway-sdk-go/v1.0.0-beta.7+dev (go1.19.1; darwin; amd64) cli-e2e-test
207+
url: https://api.scaleway.com/iot/v1/regions/fr-par/hubs/2658f811-fbb5-4c50-b52a-3947fbbdfa34
208+
method: DELETE
209+
response:
210+
body: ""
211+
headers:
212+
Content-Security-Policy:
213+
- default-src 'none'; frame-ancestors 'none'
214+
Content-Type:
215+
- application/json
216+
Date:
217+
- Wed, 16 Nov 2022 14:45:13 GMT
218+
Server:
219+
- Scaleway API-Gateway
220+
Strict-Transport-Security:
221+
- max-age=63072000
222+
X-Content-Type-Options:
223+
- nosniff
224+
X-Frame-Options:
225+
- DENY
226+
X-Request-Id:
227+
- 31154b0f-6f73-490b-adc1-a4baa367b8dc
228+
status: 204 No Content
229+
code: 204
230+
duration: ""

0 commit comments

Comments
 (0)