Skip to content

Commit ad9f423

Browse files
feat:moving doProgressReport in progress.go
Signed-off-by: mohamedasifs123 <asifabu272@gmail.com>
1 parent 96dd7d8 commit ad9f423

File tree

4 files changed

+206
-142
lines changed

4 files changed

+206
-142
lines changed

sztp-agent/pkg/secureagent/daemon.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -96,38 +96,6 @@ func (a *Agent) getBootstrapURL() error {
9696
return nil
9797
}
9898

99-
func (a *Agent) doReportProgress(s ProgressType, message string) error {
100-
log.Println("[INFO] Starting the Report Progress request.")
101-
url := strings.ReplaceAll(a.GetBootstrapURL(), "get-bootstrapping-data", "report-progress")
102-
var p ProgressJSON
103-
p.IetfSztpBootstrapServerInput.ProgressType = s.String()
104-
p.IetfSztpBootstrapServerInput.Message = message
105-
if s == ProgressTypeBootstrapComplete {
106-
// TODO: use/generate real TA cert here
107-
encodedKey := base64.StdEncoding.EncodeToString([]byte("mysshpass"))
108-
p.IetfSztpBootstrapServerInput.TrustAnchorCerts.TrustAnchorCert = []string{encodedKey}
109-
for _, key := range readSSHHostKeyPublicFiles("/etc/ssh/ssh_host_*key.pub") {
110-
p.IetfSztpBootstrapServerInput.SSHHostKeys.SSHHostKey = append(p.IetfSztpBootstrapServerInput.SSHHostKeys.SSHHostKey, struct {
111-
Algorithm string `json:"algorithm"`
112-
KeyData string `json:"key-data"`
113-
}{
114-
Algorithm: key.Type(),
115-
KeyData: getSSHHostKeyString(key, false),
116-
})
117-
}
118-
}
119-
a.SetProgressJSON(p)
120-
inputJSON, _ := json.Marshal(a.GetProgressJSON())
121-
res, err := a.doTLSRequest(string(inputJSON), url, true)
122-
if err != nil {
123-
log.Println("[ERROR] ", err.Error())
124-
return err
125-
}
126-
log.Println(res)
127-
log.Println("[INFO] Response retrieved successfully")
128-
return nil
129-
}
130-
13199
func (a *Agent) doHandleBootstrapRedirect() error {
132100
if reflect.ValueOf(a.BootstrapServerRedirectInfo).IsZero() {
133101
return nil

sztp-agent/pkg/secureagent/daemon_test.go

Lines changed: 0 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -319,116 +319,6 @@ func TestAgent_doReqBootstrap(t *testing.T) {
319319
}
320320
}
321321

322-
//nolint:funlen
323-
func TestAgent_doReportProgress(t *testing.T) {
324-
var output []byte
325-
expected := BootstrapServerPostOutput{
326-
IetfSztpBootstrapServerOutput: struct {
327-
ConveyedInformation string `json:"conveyed-information"`
328-
}{
329-
ConveyedInformation: "MIIDfwYLKoZIhvcNAQkQASugggNuBIIDansKICAiaWV0Zi1zenRwLWNvbnZleWVkLWluZm86b25ib2FyZGluZy1pbmZvcm1hdGlvbiI6IHsKICAgICJib290LWltYWdlIjogewogICAgICAiZG93bmxvYWQtdXJpIjogWwogICAgICAgICJodHRwOi8vd2ViOjgwODIvdmFyL2xpYi9taXNjL215LWJvb3QtaW1hZ2UuaW1nIiwKICAgICAgICAiZnRwOi8vd2ViOjMwODIvdmFyL2xpYi9taXNjL215LWJvb3QtaW1hZ2UuaW1nIgogICAgICBdLAogICAgICAiaW1hZ2UtdmVyaWZpY2F0aW9uIjogWwogICAgICAgIHsKICAgICAgICAgICJoYXNoLWFsZ29yaXRobSI6ICJpZXRmLXN6dHAtY29udmV5ZWQtaW5mbzpzaGEtMjU2IiwKICAgICAgICAgICJoYXNoLXZhbHVlIjogIjdiOmNhOmU2OmFjOjIzOjA2OmQ4Ojc5OjA2OjhjOmFjOjAzOjgwOmUyOjE2OjQ0OjdlOjQwOjZhOjY1OmZhOmQ0OjY5OjYxOjZlOjA1OmNlOmY1Ojg3OmRjOjJiOjk3IgogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgICJwcmUtY29uZmlndXJhdGlvbi1zY3JpcHQiOiAiSXlFdlltbHVMMkpoYzJnS1pXTm9ieUFpYVc1emFXUmxJSFJvWlNCd2NtVXRZMjl1Wm1sbmRYSmhkR2x2YmkxelkzSnBjSFF1TGk0aUNnPT0iLAogICAgImNvbmZpZ3VyYXRpb24taGFuZGxpbmciOiAibWVyZ2UiLAogICAgImNvbmZpZ3VyYXRpb24iOiAiUEhSdmNDQjRiV3h1Y3owaWFIUjBjSE02TDJWNFlXMXdiR1V1WTI5dEwyTnZibVpwWnlJK0NpQWdQR0Z1ZVMxNGJXd3RZMjl1ZEdWdWRDMXZhMkY1THo0S1BDOTBiM0ErQ2c9PSIsCiAgICAicG9zdC1jb25maWd1cmF0aW9uLXNjcmlwdCI6ICJJeUV2WW1sdUwySmhjMmdLWldOb2J5QWlhVzV6YVdSbElIUm9aU0J3YjNOMExXTnZibVpwWjNWeVlYUnBiMjR0YzJOeWFYQjBMaTR1SWdvPSIKICB9Cn0=",
330-
},
331-
}
332-
expectedFailedBase64 := BootstrapServerPostOutput{
333-
IetfSztpBootstrapServerOutput: struct {
334-
ConveyedInformation string `json:"conveyed-information"`
335-
}{
336-
ConveyedInformation: "{wrongBASE64}",
337-
},
338-
}
339-
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
340-
user, pass, _ := r.BasicAuth()
341-
log.Println(user, pass)
342-
343-
switch {
344-
case (user + ":" + pass) == "USER:PASS":
345-
w.WriteHeader(200)
346-
output, _ = json.Marshal(expected)
347-
case (user + ":" + pass) == "KOBASE64:KO":
348-
w.WriteHeader(200)
349-
output, _ = json.Marshal(expectedFailedBase64)
350-
default:
351-
w.WriteHeader(400)
352-
output, _ = json.Marshal(expected)
353-
}
354-
355-
_, err := fmt.Fprint(w, string(output))
356-
if err != nil {
357-
return
358-
}
359-
}))
360-
defer svr.Close()
361-
type fields struct {
362-
BootstrapURL string
363-
SerialNumber string
364-
DevicePassword string
365-
DevicePrivateKey string
366-
DeviceEndEntityCert string
367-
BootstrapTrustAnchorCert string
368-
ContentTypeReq string
369-
InputJSONContent string
370-
DhcpLeaseFile string
371-
ProgressJSON ProgressJSON
372-
}
373-
tests := []struct {
374-
name string
375-
fields fields
376-
wantErr bool
377-
}{
378-
{
379-
name: "OK",
380-
fields: fields{
381-
BootstrapURL: svr.URL,
382-
SerialNumber: "USER",
383-
DevicePassword: "PASS",
384-
DevicePrivateKey: "PRIVATEKEY",
385-
DeviceEndEntityCert: "ENDENTITYCERT",
386-
BootstrapTrustAnchorCert: "TRUSTANCHORCERT",
387-
ContentTypeReq: "application/vnd.ietf.sztp.bootstrap-server+json",
388-
InputJSONContent: "INPUTJSON",
389-
DhcpLeaseFile: "DHCPLEASEFILE",
390-
ProgressJSON: ProgressJSON{},
391-
},
392-
wantErr: false,
393-
},
394-
{
395-
name: "KO",
396-
fields: fields{
397-
BootstrapURL: svr.URL,
398-
SerialNumber: "USER",
399-
DevicePassword: "PASSWORDWRONG",
400-
DevicePrivateKey: "PRIVATEKEY",
401-
DeviceEndEntityCert: "ENDENTITYCERT",
402-
BootstrapTrustAnchorCert: "TRUSTANCHORCERT",
403-
ContentTypeReq: "application/vnd.ietf.sztp.bootstrap-server+json",
404-
InputJSONContent: "INPUTJSON",
405-
DhcpLeaseFile: "DHCPLEASEFILE",
406-
ProgressJSON: ProgressJSON{},
407-
},
408-
wantErr: true,
409-
},
410-
}
411-
for _, tt := range tests {
412-
t.Run(tt.name, func(t *testing.T) {
413-
a := &Agent{
414-
BootstrapURL: tt.fields.BootstrapURL,
415-
SerialNumber: tt.fields.SerialNumber,
416-
DevicePassword: tt.fields.DevicePassword,
417-
DevicePrivateKey: tt.fields.DevicePrivateKey,
418-
DeviceEndEntityCert: tt.fields.DeviceEndEntityCert,
419-
BootstrapTrustAnchorCert: tt.fields.BootstrapTrustAnchorCert,
420-
ContentTypeReq: tt.fields.ContentTypeReq,
421-
InputJSONContent: tt.fields.InputJSONContent,
422-
DhcpLeaseFile: tt.fields.DhcpLeaseFile,
423-
ProgressJSON: tt.fields.ProgressJSON,
424-
}
425-
if err := a.doReportProgress(ProgressTypeBootstrapInitiated, "Bootstrap Initiated"); (err != nil) != tt.wantErr {
426-
t.Errorf("doReportProgress() error = %v, wantErr %v", err, tt.wantErr)
427-
}
428-
})
429-
}
430-
}
431-
432322
//nolint:funlen
433323
func TestAgent_downloadAndValidateImage(t *testing.T) {
434324
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

sztp-agent/pkg/secureagent/progress.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ Copyright (C) 2022 Red Hat.
99
// Package secureagent implements the secure agent
1010
package secureagent
1111

12+
import (
13+
"encoding/base64"
14+
"encoding/json"
15+
"log"
16+
"strings"
17+
)
18+
1219
type ProgressType int64
1320

1421
const (
@@ -102,6 +109,38 @@ func (s ProgressType) String() string {
102109
return "unknown"
103110
}
104111

112+
func (a *Agent) doReportProgress(s ProgressType, message string) error {
113+
log.Println("[INFO] Starting the Report Progress request.")
114+
url := strings.ReplaceAll(a.GetBootstrapURL(), "get-bootstrapping-data", "report-progress")
115+
var p ProgressJSON
116+
p.IetfSztpBootstrapServerInput.ProgressType = s.String()
117+
p.IetfSztpBootstrapServerInput.Message = message
118+
if s == ProgressTypeBootstrapComplete {
119+
// TODO: use/generate real TA cert here
120+
encodedKey := base64.StdEncoding.EncodeToString([]byte("mysshpass"))
121+
p.IetfSztpBootstrapServerInput.TrustAnchorCerts.TrustAnchorCert = []string{encodedKey}
122+
for _, key := range readSSHHostKeyPublicFiles("/etc/ssh/ssh_host_*key.pub") {
123+
p.IetfSztpBootstrapServerInput.SSHHostKeys.SSHHostKey = append(p.IetfSztpBootstrapServerInput.SSHHostKeys.SSHHostKey, struct {
124+
Algorithm string `json:"algorithm"`
125+
KeyData string `json:"key-data"`
126+
}{
127+
Algorithm: key.Type(),
128+
KeyData: getSSHHostKeyString(key, false),
129+
})
130+
}
131+
}
132+
a.SetProgressJSON(p)
133+
inputJSON, _ := json.Marshal(a.GetProgressJSON())
134+
res, err := a.doTLSRequest(string(inputJSON), url, true)
135+
if err != nil {
136+
log.Println("[ERROR] ", err.Error())
137+
return err
138+
}
139+
log.Println(res)
140+
log.Println("[INFO] Response retrieved successfully")
141+
return nil
142+
}
143+
105144
type ProgressJSON struct {
106145
IetfSztpBootstrapServerInput struct {
107146
ProgressType string `json:"progress-type"`
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright (C) 2022-2023 Red Hat.
3+
4+
// Package secureagent implements the secure agent
5+
package secureagent
6+
7+
import (
8+
"encoding/json"
9+
"fmt"
10+
"log"
11+
"net/http"
12+
"net/http/httptest"
13+
"testing"
14+
)
15+
16+
func TestProgressTypeString(t *testing.T) {
17+
tests := []struct {
18+
input ProgressType
19+
expected string
20+
}{
21+
{ProgressTypeBootstrapInitiated, "bootstrap-initiated"},
22+
{ProgressTypeParsingInitiated, "parsing-initiated"},
23+
{ProgressTypeParsingWarning, "parsing-warning"},
24+
{ProgressTypeParsingError, "parsing-error"},
25+
{ProgressTypeParsingComplete, "parsing-complete"},
26+
{ProgressTypeBootImageInitiated, "boot-image-initiated"},
27+
{ProgressTypeBootImageWarning, "boot-image-warning"},
28+
{ProgressTypeBootImageError, "boot-image-error"},
29+
{ProgressTypeBootImageMismatch, "boot-image-mismatch"},
30+
{ProgressTypeBootImageInstalledRebooting, "boot-image-installed-rebooting"},
31+
{ProgressTypeBootImageComplete, "boot-image-complete"},
32+
{ProgressTypePreScriptInitiated, "pre-script-initiated"},
33+
{ProgressTypePreScriptWarning, "pre-script-warning"},
34+
{ProgressTypePreScriptError, "pre-script-error"},
35+
{ProgressTypePreScriptComplete, "pre-script-complete"},
36+
{ProgressTypeConfigInitiated, "config-initiated"},
37+
{ProgressTypeConfigWarning, "config-warning"},
38+
{ProgressTypeConfigError, "config-error"},
39+
{ProgressTypeConfigComplete, "config-complete"},
40+
{ProgressTypePostScriptInitiated, "post-script-initiated"},
41+
{ProgressTypePostScriptWarning, "post-script-warning"},
42+
{ProgressTypePostScriptError, "post-script-error"},
43+
{ProgressTypePostScriptComplete, "post-script-complete"},
44+
{ProgressTypeBootstrapWarning, "bootstrap-warning"},
45+
{ProgressTypeBootstrapError, "bootstrap-error"},
46+
{ProgressTypeBootstrapComplete, "bootstrap-complete"},
47+
{ProgressTypeInformational, "informational"},
48+
{ProgressType(999), "unknown"}, // Test for an unknown value
49+
}
50+
51+
for _, test := range tests {
52+
result := test.input.String()
53+
if result != test.expected {
54+
t.Errorf("For %v expected %v, but got %v", test.input, test.expected, result)
55+
}
56+
}
57+
}
58+
59+
//nolint:funlen
60+
func TestAgent_doReportProgress(t *testing.T) {
61+
var output []byte
62+
expected := BootstrapServerPostOutput{
63+
IetfSztpBootstrapServerOutput: struct {
64+
ConveyedInformation string `json:"conveyed-information"`
65+
}{
66+
ConveyedInformation: "MIIDfwYLKoZIhvcNAQkQASugggNuBIIDansKICAiaWV0Zi1zenRwLWNvbnZleWVkLWluZm86b25ib2FyZGluZy1pbmZvcm1hdGlvbiI6IHsKICAgICJib290LWltYWdlIjogewogICAgICAiZG93bmxvYWQtdXJpIjogWwogICAgICAgICJodHRwOi8vd2ViOjgwODIvdmFyL2xpYi9taXNjL215LWJvb3QtaW1hZ2UuaW1nIiwKICAgICAgICAiZnRwOi8vd2ViOjMwODIvdmFyL2xpYi9taXNjL215LWJvb3QtaW1hZ2UuaW1nIgogICAgICBdLAogICAgICAiaW1hZ2UtdmVyaWZpY2F0aW9uIjogWwogICAgICAgIHsKICAgICAgICAgICJoYXNoLWFsZ29yaXRobSI6ICJpZXRmLXN6dHAtY29udmV5ZWQtaW5mbzpzaGEtMjU2IiwKICAgICAgICAgICJoYXNoLXZhbHVlIjogIjdiOmNhOmU2OmFjOjIzOjA2OmQ4Ojc5OjA2OjhjOmFjOjAzOjgwOmUyOjE2OjQ0OjdlOjQwOjZhOjY1OmZhOmQ0OjY5OjYxOjZlOjA1OmNlOmY1Ojg3OmRjOjJiOjk3IgogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgICJwcmUtY29uZmlndXJhdGlvbi1zY3JpcHQiOiAiSXlFdlltbHVMMkpoYzJnS1pXTm9ieUFpYVc1emFXUmxJSFJvWlNCd2NtVXRZMjl1Wm1sbmRYSmhkR2x2YmkxelkzSnBjSFF1TGk0aUNnPT0iLAogICAgImNvbmZpZ3VyYXRpb24taGFuZGxpbmciOiAibWVyZ2UiLAogICAgImNvbmZpZ3VyYXRpb24iOiAiUEhSdmNDQjRiV3h1Y3owaWFIUjBjSE02TDJWNFlXMXdiR1V1WTI5dEwyTnZibVpwWnlJK0NpQWdQR0Z1ZVMxNGJXd3RZMjl1ZEdWdWRDMXZhMkY1THo0S1BDOTBiM0ErQ2c9PSIsCiAgICAicG9zdC1jb25maWd1cmF0aW9uLXNjcmlwdCI6ICJJeUV2WW1sdUwySmhjMmdLWldOb2J5QWlhVzV6YVdSbElIUm9aU0J3YjNOMExXTnZibVpwWjNWeVlYUnBiMjR0YzJOeWFYQjBMaTR1SWdvPSIKICB9Cn0=",
67+
},
68+
}
69+
expectedFailedBase64 := BootstrapServerPostOutput{
70+
IetfSztpBootstrapServerOutput: struct {
71+
ConveyedInformation string `json:"conveyed-information"`
72+
}{
73+
ConveyedInformation: "{wrongBASE64}",
74+
},
75+
}
76+
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
77+
user, pass, _ := r.BasicAuth()
78+
log.Println(user, pass)
79+
80+
switch {
81+
case (user + ":" + pass) == "USER:PASS":
82+
w.WriteHeader(200)
83+
output, _ = json.Marshal(expected)
84+
case (user + ":" + pass) == "KOBASE64:KO":
85+
w.WriteHeader(200)
86+
output, _ = json.Marshal(expectedFailedBase64)
87+
default:
88+
w.WriteHeader(400)
89+
output, _ = json.Marshal(expected)
90+
}
91+
92+
_, err := fmt.Fprint(w, string(output))
93+
if err != nil {
94+
return
95+
}
96+
}))
97+
defer svr.Close()
98+
type fields struct {
99+
BootstrapURL string
100+
SerialNumber string
101+
DevicePassword string
102+
DevicePrivateKey string
103+
DeviceEndEntityCert string
104+
BootstrapTrustAnchorCert string
105+
ContentTypeReq string
106+
InputJSONContent string
107+
DhcpLeaseFile string
108+
ProgressJSON ProgressJSON
109+
}
110+
tests := []struct {
111+
name string
112+
fields fields
113+
wantErr bool
114+
}{
115+
{
116+
name: "OK",
117+
fields: fields{
118+
BootstrapURL: svr.URL,
119+
SerialNumber: "USER",
120+
DevicePassword: "PASS",
121+
DevicePrivateKey: "PRIVATEKEY",
122+
DeviceEndEntityCert: "ENDENTITYCERT",
123+
BootstrapTrustAnchorCert: "TRUSTANCHORCERT",
124+
ContentTypeReq: "application/vnd.ietf.sztp.bootstrap-server+json",
125+
InputJSONContent: "INPUTJSON",
126+
DhcpLeaseFile: "DHCPLEASEFILE",
127+
ProgressJSON: ProgressJSON{},
128+
},
129+
wantErr: false,
130+
},
131+
{
132+
name: "KO",
133+
fields: fields{
134+
BootstrapURL: svr.URL,
135+
SerialNumber: "USER",
136+
DevicePassword: "PASSWORDWRONG",
137+
DevicePrivateKey: "PRIVATEKEY",
138+
DeviceEndEntityCert: "ENDENTITYCERT",
139+
BootstrapTrustAnchorCert: "TRUSTANCHORCERT",
140+
ContentTypeReq: "application/vnd.ietf.sztp.bootstrap-server+json",
141+
InputJSONContent: "INPUTJSON",
142+
DhcpLeaseFile: "DHCPLEASEFILE",
143+
ProgressJSON: ProgressJSON{},
144+
},
145+
wantErr: true,
146+
},
147+
}
148+
for _, tt := range tests {
149+
t.Run(tt.name, func(t *testing.T) {
150+
a := &Agent{
151+
BootstrapURL: tt.fields.BootstrapURL,
152+
SerialNumber: tt.fields.SerialNumber,
153+
DevicePassword: tt.fields.DevicePassword,
154+
DevicePrivateKey: tt.fields.DevicePrivateKey,
155+
DeviceEndEntityCert: tt.fields.DeviceEndEntityCert,
156+
BootstrapTrustAnchorCert: tt.fields.BootstrapTrustAnchorCert,
157+
ContentTypeReq: tt.fields.ContentTypeReq,
158+
InputJSONContent: tt.fields.InputJSONContent,
159+
DhcpLeaseFile: tt.fields.DhcpLeaseFile,
160+
ProgressJSON: tt.fields.ProgressJSON,
161+
}
162+
if err := a.doReportProgress(ProgressTypeBootstrapInitiated, "Bootstrap Initiated"); (err != nil) != tt.wantErr {
163+
t.Errorf("doReportProgress() error = %v, wantErr %v", err, tt.wantErr)
164+
}
165+
})
166+
}
167+
}

0 commit comments

Comments
 (0)