blob: 1a59e297b92285310c4fa40794b20c5e83527ce5 [file] [log] [blame]
Mohammed Naser3dfc2a82024-02-20 23:51:39 -05001package charts
2
3import (
4 "io"
5 "os"
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11 "github.com/yannh/kubeconform/pkg/validator"
12 "helm.sh/helm/v3/pkg/action"
13 "helm.sh/helm/v3/pkg/chart/loader"
14 "helm.sh/helm/v3/pkg/chartutil"
15)
16
17var (
18 KUBERNETES_VERSIONS = []string{
19 "1.22.0",
20 "1.23.0",
21 "1.24.0",
22 "1.25.0",
23 "1.26.0",
24 "1.27.0",
25 "1.28.0",
26 }
27)
28
29func TestKubeconform(t *testing.T) {
30 t.Parallel()
31
32 files, err := os.ReadDir("./")
33 require.NoError(t, err)
34 require.NotEmpty(t, files)
35
36 schemas := []string{
37 "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/{{ .NormalizedKubernetesVersion }}-standalone{{ .StrictSuffix }}/{{ .ResourceKind }}{{ .KindSuffix }}.json",
38 "https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json",
39 }
40
41 var clients map[string]*action.Install = make(map[string]*action.Install)
42 for _, version := range KUBERNETES_VERSIONS {
43 kubeVersion, err := chartutil.ParseKubeVersion(version)
44 require.NoError(t, err)
45
46 client := action.NewInstall(&action.Configuration{})
47 client.ClientOnly = true
48 client.DryRun = true
49 client.ReleaseName = "kubeconform"
50 client.Namespace = "default"
51 client.IncludeCRDs = true
52 client.KubeVersion = kubeVersion
53
54 clients[version] = client
55 }
56
57 var validators map[string]validator.Validator = make(map[string]validator.Validator)
58 for _, version := range KUBERNETES_VERSIONS {
59 opts := validator.Opts{
60 KubernetesVersion: version,
61 SkipKinds: map[string]struct{}{
62 "CephBlockPool": {},
63 "CephCluster": {},
64 "CephFilesystem": {},
65 "CephObjectStore": {},
66 "apiextensions.k8s.io/v1/CustomResourceDefinition": {},
67 },
68 Strict: true,
69 }
70
71 v, err := validator.New(schemas, opts)
72 require.NoError(t, err)
73
74 validators[version] = v
75 }
76
77 for _, file := range files {
78 if !file.IsDir() {
79 continue
80 }
81
82 t.Run(file.Name(), func(t *testing.T) {
83 chart, err := loader.LoadDir(file.Name())
84 require.NoError(t, err)
85
86 t.Parallel()
87
88 for _, version := range KUBERNETES_VERSIONS {
89 t.Run(version, func(t *testing.T) {
90 client := clients[version]
91 v := validators[version]
92
93 t.Parallel()
94
95 rel, err := client.Run(chart, map[string]interface{}{})
96 require.NoError(t, err)
97
98 manifests := io.NopCloser(strings.NewReader(rel.Manifest))
99 for _, res := range v.Validate(chart.Name(), manifests) {
100 require.NoError(t, res.Err)
101 assert.Empty(t, res.ValidationErrors)
102 }
103 })
104 }
105 })
106 }
107}