github.com/wmuizelaar/kpt@v0.0.0-20221018115725-bd564717b2ed/internal/util/update/resource-merge_test.go (about) 1 // Copyright 2021 Google LLC 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 //nolint:dupl 16 package update_test 17 18 import ( 19 "path/filepath" 20 "testing" 21 22 "github.com/GoogleContainerTools/kpt/internal/testutil" 23 "github.com/GoogleContainerTools/kpt/internal/testutil/pkgbuilder" 24 . "github.com/GoogleContainerTools/kpt/internal/util/update" 25 "github.com/stretchr/testify/assert" 26 ) 27 28 func TestUpdate_ResourceMerge(t *testing.T) { 29 testCases := map[string]struct { 30 origin *pkgbuilder.RootPkg 31 local *pkgbuilder.RootPkg 32 updated *pkgbuilder.RootPkg 33 relPackagePath string 34 isRoot bool 35 expected *pkgbuilder.RootPkg 36 }{ 37 "updates local subpackages": { 38 origin: pkgbuilder.NewRootPkg(). 39 WithResource(pkgbuilder.DeploymentResource). 40 WithSubPackages( 41 pkgbuilder.NewSubPkg("foo"). 42 WithKptfile(). 43 WithResource(pkgbuilder.DeploymentResource), 44 ), 45 local: pkgbuilder.NewRootPkg(). 46 WithKptfile( 47 pkgbuilder.NewKptfile(). 48 WithUpstream(kptRepo, "/", "master", "resource-merge"). 49 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 50 ). 51 WithResource(pkgbuilder.DeploymentResource). 52 WithSubPackages( 53 pkgbuilder.NewSubPkg("foo"). 54 WithKptfile(). 55 WithResource(pkgbuilder.DeploymentResource), 56 ), 57 updated: pkgbuilder.NewRootPkg(). 58 WithResource(pkgbuilder.ConfigMapResource). 59 WithSubPackages( 60 pkgbuilder.NewSubPkg("foo"). 61 WithKptfile(). 62 WithResource(pkgbuilder.ConfigMapResource), 63 ), 64 relPackagePath: "/", 65 isRoot: true, 66 expected: pkgbuilder.NewRootPkg(). 67 WithKptfile( 68 pkgbuilder.NewKptfile(). 69 WithUpstream(kptRepo, "/", "master", "resource-merge"). 70 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 71 ). 72 WithResource(pkgbuilder.ConfigMapResource). 73 WithSubPackages( 74 pkgbuilder.NewSubPkg("foo"). 75 WithKptfile(). 76 WithResource(pkgbuilder.ConfigMapResource), 77 ), 78 }, 79 "doesn't update remote subpackages": { 80 origin: pkgbuilder.NewRootPkg(). 81 WithResource(pkgbuilder.DeploymentResource). 82 WithSubPackages( 83 pkgbuilder.NewSubPkg("bar"). 84 WithKptfile( 85 pkgbuilder.NewKptfile(). 86 WithUpstream(kptRepo, "/", "main", "resource-merge"), 87 ). 88 WithResource(pkgbuilder.DeploymentResource), 89 ), 90 local: pkgbuilder.NewRootPkg(). 91 WithKptfile( 92 pkgbuilder.NewKptfile(). 93 WithUpstream(kptRepo, "/", "master", "resource-merge"). 94 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 95 ). 96 WithResource(pkgbuilder.DeploymentResource). 97 WithSubPackages( 98 pkgbuilder.NewSubPkg("bar"). 99 WithKptfile( 100 pkgbuilder.NewKptfile(). 101 WithUpstream(kptRepo, "/", "main", "resource-merge"), 102 ). 103 WithResource(pkgbuilder.DeploymentResource), 104 ), 105 updated: pkgbuilder.NewRootPkg(). 106 WithResource(pkgbuilder.ConfigMapResource). 107 WithSubPackages( 108 pkgbuilder.NewSubPkg("bar"). 109 WithKptfile( 110 pkgbuilder.NewKptfile(). 111 WithUpstream(kptRepo, "/", "main", "resource-merge"), 112 ). 113 WithResource(pkgbuilder.ConfigMapResource), 114 ), 115 relPackagePath: "/", 116 isRoot: true, 117 expected: pkgbuilder.NewRootPkg(). 118 WithKptfile( 119 pkgbuilder.NewKptfile(). 120 WithUpstream(kptRepo, "/", "master", "resource-merge"). 121 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 122 ). 123 WithResource(pkgbuilder.ConfigMapResource). 124 WithSubPackages( 125 pkgbuilder.NewSubPkg("bar"). 126 WithKptfile( 127 pkgbuilder.NewKptfile(). 128 WithUpstream(kptRepo, "/", "main", "resource-merge"), 129 ). 130 WithResource(pkgbuilder.DeploymentResource), 131 ), 132 }, 133 "doesn't update the Kptfile if package is the root": { 134 origin: pkgbuilder.NewRootPkg(). 135 WithKptfile( 136 pkgbuilder.NewKptfile(). 137 WithUpstream(kptRepo, "/", "main", "resource-merge"), 138 ). 139 WithResource(pkgbuilder.DeploymentResource), 140 local: pkgbuilder.NewRootPkg(). 141 WithKptfile( 142 pkgbuilder.NewKptfile(). 143 WithUpstream(kptRepo, "/", "master", "resource-merge"). 144 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 145 ). 146 WithResource(pkgbuilder.DeploymentResource), 147 updated: pkgbuilder.NewRootPkg(). 148 WithKptfile( 149 pkgbuilder.NewKptfile(). 150 WithUpstream(kptRepo, "/", "v1.0", "resource-merge"), 151 ). 152 WithResource(pkgbuilder.ConfigMapResource), 153 relPackagePath: "/", 154 isRoot: true, 155 expected: pkgbuilder.NewRootPkg(). 156 WithKptfile( 157 pkgbuilder.NewKptfile(). 158 WithUpstream(kptRepo, "/", "master", "resource-merge"). 159 WithUpstreamLock(kptRepo, "/", "master", "abc123"), 160 ). 161 WithResource(pkgbuilder.ConfigMapResource), 162 }, 163 "updates the Kptfile if package is not the root and local hasn't changed from origin": { 164 origin: pkgbuilder.NewRootPkg(). 165 WithKptfile( 166 pkgbuilder.NewKptfile(). 167 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "master", "resource-merge"). 168 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "master", "abc123"), 169 ). 170 WithResource(pkgbuilder.DeploymentResource), 171 local: pkgbuilder.NewRootPkg(). 172 WithKptfile( 173 pkgbuilder.NewKptfile(). 174 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "master", "resource-merge"). 175 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "master", "abc123"), 176 ). 177 WithResource(pkgbuilder.DeploymentResource), 178 updated: pkgbuilder.NewRootPkg(). 179 WithKptfile( 180 pkgbuilder.NewKptfile(). 181 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "v1.0", "resource-merge"). 182 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "v1.0", "def456"), 183 ). 184 WithResource(pkgbuilder.ConfigMapResource), 185 relPackagePath: "/", 186 isRoot: false, 187 expected: pkgbuilder.NewRootPkg(). 188 WithKptfile( 189 pkgbuilder.NewKptfile(). 190 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "v1.0", "resource-merge"). 191 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "v1.0", "def456"), 192 ). 193 WithResource(pkgbuilder.ConfigMapResource), 194 }, 195 "does not update the local package at all if not root and upstream info is changed on local": { 196 origin: pkgbuilder.NewRootPkg(). 197 WithKptfile( 198 pkgbuilder.NewKptfile(). 199 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "main", "resource-merge"). 200 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "main", "abc123"), 201 ). 202 WithResource(pkgbuilder.DeploymentResource), 203 local: pkgbuilder.NewRootPkg(). 204 WithKptfile( 205 pkgbuilder.NewKptfile(). 206 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 207 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 208 ). 209 WithResource(pkgbuilder.SecretResource), 210 updated: pkgbuilder.NewRootPkg(). 211 WithKptfile( 212 pkgbuilder.NewKptfile(). 213 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "v1.0", "resource-merge"). 214 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "v1.0", "qwerty"), 215 ). 216 WithResource(pkgbuilder.ConfigMapResource), 217 relPackagePath: "/", 218 isRoot: false, 219 expected: pkgbuilder.NewRootPkg(). 220 WithKptfile( 221 pkgbuilder.NewKptfile(). 222 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 223 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 224 ). 225 WithResource(pkgbuilder.SecretResource), 226 }, 227 "does not remove a file from local if it has local changes": { 228 origin: pkgbuilder.NewRootPkg(). 229 WithResource(pkgbuilder.SecretResource). 230 WithResource(pkgbuilder.DeploymentResource), 231 local: pkgbuilder.NewRootPkg(). 232 WithKptfile( 233 pkgbuilder.NewKptfile(). 234 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 235 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 236 ). 237 WithResource(pkgbuilder.SecretResource). 238 WithResource(pkgbuilder.DeploymentResource, pkgbuilder.SetFieldPath("5", "spec", "replicas")), 239 updated: pkgbuilder.NewRootPkg(). 240 WithResource(pkgbuilder.SecretResource), 241 relPackagePath: "/", 242 isRoot: true, 243 expected: pkgbuilder.NewRootPkg(). 244 WithKptfile( 245 pkgbuilder.NewKptfile(). 246 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 247 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 248 ). 249 WithResource(pkgbuilder.SecretResource). 250 WithResource(pkgbuilder.DeploymentResource, pkgbuilder.SetFieldPath("5", "spec", "replicas")), 251 }, 252 "does not re-add files from upstream if deleted from local": { 253 origin: pkgbuilder.NewRootPkg(). 254 WithResource(pkgbuilder.SecretResource). 255 WithResource(pkgbuilder.DeploymentResource), 256 local: pkgbuilder.NewRootPkg(). 257 WithKptfile( 258 pkgbuilder.NewKptfile(). 259 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 260 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 261 ). 262 WithResource(pkgbuilder.SecretResource), 263 updated: pkgbuilder.NewRootPkg(). 264 WithResource(pkgbuilder.SecretResource). 265 WithResource(pkgbuilder.DeploymentResource), 266 relPackagePath: "/", 267 isRoot: true, 268 expected: pkgbuilder.NewRootPkg(). 269 WithKptfile( 270 pkgbuilder.NewKptfile(). 271 WithUpstream("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "resource-merge"). 272 WithUpstreamLock("github.com/GoogleContainerTools/kpt", "/", "feature-branch", "def456"), 273 ). 274 WithResource(pkgbuilder.SecretResource), 275 }, 276 } 277 278 for tn, tc := range testCases { 279 t.Run(tn, func(t *testing.T) { 280 repos := testutil.EmptyReposInfo 281 origin := tc.origin.ExpandPkg(t, repos) 282 local := tc.local.ExpandPkg(t, repos) 283 updated := tc.updated.ExpandPkg(t, repos) 284 expected := tc.expected.ExpandPkg(t, repos) 285 286 updater := &ResourceMergeUpdater{} 287 288 err := updater.Update(Options{ 289 RelPackagePath: tc.relPackagePath, 290 OriginPath: filepath.Join(origin, tc.relPackagePath), 291 LocalPath: filepath.Join(local, tc.relPackagePath), 292 UpdatedPath: filepath.Join(updated, tc.relPackagePath), 293 IsRoot: tc.isRoot, 294 }) 295 if !assert.NoError(t, err) { 296 t.FailNow() 297 } 298 299 testutil.KptfileAwarePkgEqual(t, local, expected, false) 300 }) 301 } 302 }