|
1 | 1 | package kubernetes
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "regexp" |
4 | 5 | "testing"
|
5 | 6 |
|
6 | 7 | "github.com/stretchr/testify/assert"
|
7 | 8 | "github.com/stretchr/testify/require"
|
| 9 | + |
| 10 | + "github.com/grafana/tanka/pkg/kubernetes/manifest" |
| 11 | + "github.com/grafana/tanka/pkg/spec/v1alpha1" |
8 | 12 | )
|
9 | 13 |
|
10 | 14 | func TestExtract(t *testing.T) {
|
@@ -54,3 +58,130 @@ func TestExtract(t *testing.T) {
|
54 | 58 | })
|
55 | 59 | }
|
56 | 60 | }
|
| 61 | + |
| 62 | +func mkobj(kind string, name string, ns string) map[string]interface{} { |
| 63 | + ret := map[string]interface{}{ |
| 64 | + "kind": kind, |
| 65 | + "apiVersion": "apiversion", |
| 66 | + "metadata": map[string]interface{}{ |
| 67 | + "name": name, |
| 68 | + }, |
| 69 | + } |
| 70 | + if ns != "" { |
| 71 | + ret["metadata"].(map[string]interface{})["namespace"] = ns |
| 72 | + } |
| 73 | + |
| 74 | + return ret |
| 75 | +} |
| 76 | + |
| 77 | +func TestReconcileSorting(t *testing.T) { |
| 78 | + tests := []struct { |
| 79 | + raw map[string]interface{} |
| 80 | + targets []*regexp.Regexp |
| 81 | + state manifest.List |
| 82 | + err error |
| 83 | + }{ |
| 84 | + { |
| 85 | + // sorting by kinds in the `kindOrder` list |
| 86 | + raw: map[string]interface{}{ |
| 87 | + "a": mkobj("Service", "service", "default"), |
| 88 | + "b": mkobj("Deployment", "deployment", "default"), |
| 89 | + "c": mkobj("CustomResourceDefinition", "crd", ""), |
| 90 | + }, |
| 91 | + state: manifest.List{ |
| 92 | + mkobj("CustomResourceDefinition", "crd", ""), |
| 93 | + mkobj("Service", "service", "default"), |
| 94 | + mkobj("Deployment", "deployment", "default"), |
| 95 | + }, |
| 96 | + }, |
| 97 | + { |
| 98 | + // alphabtical sorting by kinds outside `kindOrder` list |
| 99 | + raw: map[string]interface{}{ |
| 100 | + "a": mkobj("B", "b", "default"), |
| 101 | + "b": mkobj("C", "c", "default"), |
| 102 | + "c": mkobj("A", "a", "default"), |
| 103 | + }, |
| 104 | + state: manifest.List{ |
| 105 | + mkobj("A", "a", "default"), |
| 106 | + mkobj("B", "b", "default"), |
| 107 | + mkobj("C", "c", "default"), |
| 108 | + }, |
| 109 | + }, |
| 110 | + { |
| 111 | + // sorting by the namespace if kinds match |
| 112 | + raw: map[string]interface{}{ |
| 113 | + "a": mkobj("Service", "service", "default2"), |
| 114 | + "b": mkobj("Service", "service", "default"), |
| 115 | + "c": mkobj("Service", "service", "default1"), |
| 116 | + }, |
| 117 | + state: manifest.List{ |
| 118 | + mkobj("Service", "service", "default"), |
| 119 | + mkobj("Service", "service", "default1"), |
| 120 | + mkobj("Service", "service", "default2"), |
| 121 | + }, |
| 122 | + }, |
| 123 | + { |
| 124 | + // sorting by the names if both kinds and namespaces match |
| 125 | + raw: map[string]interface{}{ |
| 126 | + "a": mkobj("Service", "service2", "default"), |
| 127 | + "b": mkobj("Service", "service", "default"), |
| 128 | + "c": mkobj("Service", "service1", "default"), |
| 129 | + }, |
| 130 | + state: manifest.List{ |
| 131 | + mkobj("Service", "service", "default"), |
| 132 | + mkobj("Service", "service1", "default"), |
| 133 | + mkobj("Service", "service2", "default"), |
| 134 | + }, |
| 135 | + }, |
| 136 | + { |
| 137 | + // sorting by the names if both kinds match and there are no namespaces |
| 138 | + raw: map[string]interface{}{ |
| 139 | + "a": mkobj("CustomResourceDefinition", "crd2", ""), |
| 140 | + "b": mkobj("CustomResourceDefinition", "crd", ""), |
| 141 | + "c": mkobj("CustomResourceDefinition", "crd1", ""), |
| 142 | + }, |
| 143 | + state: manifest.List{ |
| 144 | + mkobj("CustomResourceDefinition", "crd", ""), |
| 145 | + mkobj("CustomResourceDefinition", "crd1", ""), |
| 146 | + mkobj("CustomResourceDefinition", "crd2", ""), |
| 147 | + }, |
| 148 | + }, |
| 149 | + { |
| 150 | + raw: map[string]interface{}{ |
| 151 | + "a": mkobj("Deployment", "b", "a"), |
| 152 | + "b": mkobj("ConfigMap", "a", "a"), |
| 153 | + "c": mkobj("Issuer", "a", "a"), |
| 154 | + "d": mkobj("Service", "b", "a"), |
| 155 | + "e": mkobj("Service", "a", "a"), |
| 156 | + "f": mkobj("Deployment", "a", "a"), |
| 157 | + "g": mkobj("ConfigMap", "a", "b"), |
| 158 | + "h": mkobj("Issuer", "b", "a"), |
| 159 | + "i": mkobj("Service", "b", "b"), |
| 160 | + "j": mkobj("Deployment", "a", "b"), |
| 161 | + "k": mkobj("ConfigMap", "b", "a"), |
| 162 | + "l": mkobj("Issuer", "a", "b"), |
| 163 | + }, |
| 164 | + state: manifest.List{ |
| 165 | + mkobj("ConfigMap", "a", "a"), |
| 166 | + mkobj("ConfigMap", "b", "a"), |
| 167 | + mkobj("ConfigMap", "a", "b"), |
| 168 | + mkobj("Service", "a", "a"), |
| 169 | + mkobj("Service", "b", "a"), |
| 170 | + mkobj("Service", "b", "b"), |
| 171 | + mkobj("Deployment", "a", "a"), |
| 172 | + mkobj("Deployment", "b", "a"), |
| 173 | + mkobj("Deployment", "a", "b"), |
| 174 | + mkobj("Issuer", "a", "a"), |
| 175 | + mkobj("Issuer", "b", "a"), |
| 176 | + mkobj("Issuer", "a", "b"), |
| 177 | + }, |
| 178 | + }, |
| 179 | + } |
| 180 | + |
| 181 | + for _, test := range tests { |
| 182 | + res, err := Reconcile(test.raw, v1alpha1.New().Spec, test.targets) |
| 183 | + |
| 184 | + require.NoError(t, err) |
| 185 | + require.Equal(t, test.state, res) |
| 186 | + } |
| 187 | +} |
0 commit comments