Skip to content

Commit 6cc2f22

Browse files
committed
fix: k8s escape resource filename on windows os
Signed-off-by: chenk <[email protected]>
1 parent 96db52c commit 6cc2f22

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

pkg/k8s/scanner/io.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package scanner
33
import (
44
"fmt"
55
"os"
6+
"regexp"
7+
"runtime"
68

79
"golang.org/x/xerrors"
810
"gopkg.in/yaml.v3"
@@ -15,6 +17,10 @@ import (
1517
func createTempFile(artifact *artifacts.Artifact) (string, error) {
1618
filename := fmt.Sprintf("%s-%s-%s-*.yaml", artifact.Namespace, artifact.Kind, artifact.Name)
1719

20+
if runtime.GOOS == "windows" {
21+
//removes characters not permitted in file/directory names on Windows
22+
filename = filenameWindowsFriendly(filename)
23+
}
1824
file, err := os.CreateTemp("", filename)
1925
if err != nil {
2026
return "", xerrors.Errorf("creating tmp file error: %w", err)
@@ -38,3 +44,9 @@ func removeFile(filename string) {
3844
log.Logger.Errorf("failed to remove temp file %s: %s:", filename, err)
3945
}
4046
}
47+
48+
var r, _ = regexp.Compile("\\\\|/|:|\\*|\\?|<|>")
49+
50+
func filenameWindowsFriendly(name string) string {
51+
return r.ReplaceAllString(name, "_")
52+
}

pkg/k8s/scanner/io_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package scanner
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func Test_FilenameWindowsFriendly(t *testing.T) {
10+
11+
tests := []struct {
12+
name string
13+
fileName string
14+
want string
15+
}{
16+
{
17+
name: "name with invalid char - colon",
18+
fileName: `kube-system-Role-system:controller:bootstrap-signer-2934213283.yaml`,
19+
want: `kube-system-Role-system_controller_bootstrap-signer-2934213283.yaml`,
20+
},
21+
{
22+
name: "name with no invalid chars",
23+
fileName: `kube-system-Role-system-controller-bootstrap-signer-2934213283.yaml`,
24+
want: `kube-system-Role-system-controller-bootstrap-signer-2934213283.yaml`,
25+
},
26+
}
27+
28+
for _, test := range tests {
29+
t.Run(test.name, func(t *testing.T) {
30+
got := filenameWindowsFriendly(test.fileName)
31+
assert.Equal(t, test.want, got)
32+
})
33+
}
34+
}

0 commit comments

Comments
 (0)