Skip to content

Commit 96b6c33

Browse files
committed
chore: Add integration tests and use config values
Signed-off-by: imusmanmalik <[email protected]>
1 parent 62b5196 commit 96b6c33

File tree

5 files changed

+229
-9
lines changed

5 files changed

+229
-9
lines changed

pkg/packageinstall/app.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ import (
77
"fmt"
88
"sort"
99
"strings"
10-
"time"
1110

1211
"github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1"
1312
kcv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1"
1413
pkgingv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1"
1514
datapkgingv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1"
1615
"github.com/vmware-tanzu/carvel-kapp-controller/pkg/client/clientset/versioned/scheme"
16+
"github.com/vmware-tanzu/carvel-kapp-controller/pkg/config"
1717
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1818
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1919
)
@@ -34,8 +34,7 @@ const (
3434
)
3535

3636
var (
37-
// DefaultSyncPeriod value for App
38-
DefaultSyncPeriod = &metav1.Duration{Duration: time.Minute * 10}
37+
kcConfig config.Config
3938
)
4039

4140
// NewApp creates a new instance of v1alpha1.App based on the provided parameters.
@@ -63,7 +62,7 @@ func NewApp(existingApp *v1alpha1.App, pkgInstall *pkgingv1alpha1.PackageInstall
6362
if opts.DefaultSyncPeriod != 0 {
6463
desiredApp.Spec.SyncPeriod = &metav1.Duration{Duration: opts.DefaultSyncPeriod}
6564
} else {
66-
desiredApp.Spec.SyncPeriod = DefaultSyncPeriod
65+
desiredApp.Spec.SyncPeriod = &metav1.Duration{Duration: kcConfig.PackageInstallDefaultSyncPeriod()}
6766
}
6867
} else {
6968
desiredApp.Spec.SyncPeriod = pkgInstall.Spec.SyncPeriod

pkg/packageinstall/app_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
)
1919

2020
// several tests below have no SyncPeriod set so they'll all use the same default.
21-
var defaultSyncPeriod = *packageinstall.DefaultSyncPeriod
21+
var defaultSyncPeriod metav1.Duration = metav1.Duration{Duration: 10 * time.Minute}
2222

2323
func TestAppExtPathsFromSecretNameAnn(t *testing.T) {
2424
ipkg := &pkgingv1alpha1.PackageInstall{
@@ -588,7 +588,7 @@ func TestAppPackageIntallDefaultSyncPeriod(t *testing.T) {
588588
// Define the expected app object, with the sync period attribute set to the default value
589589
expectedApp := &kcv1alpha1.App{
590590
Spec: kcv1alpha1.AppSpec{
591-
SyncPeriod: packageinstall.DefaultSyncPeriod,
591+
SyncPeriod: &defaultSyncPeriod,
592592
},
593593
}
594594

pkg/packageinstall/reconciler.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Reconciler struct {
3131
pkgToPkgInstallHandler *PackageInstallVersionHandler
3232
compInfo ComponentInfo
3333
log logr.Logger
34-
opts Opts
34+
kcConfig *kcconfig.Config
3535
}
3636

3737
// NewReconciler is the constructor for the Reconciler struct
@@ -45,7 +45,8 @@ func NewReconciler(kcClient kcclient.Interface, pkgClient pkgclient.Interface,
4545
pkgToPkgInstallHandler: pkgToPkgInstallHandler,
4646
compInfo: compInfo,
4747
log: log,
48-
opts: Opts{DefaultSyncPeriod: kcConfig.PackageInstallDefaultSyncPeriod()}}
48+
kcConfig: kcConfig,
49+
}
4950
}
5051

5152
var _ reconcile.Reconciler = &Reconciler{}
@@ -88,5 +89,5 @@ func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (
8889
return reconcile.Result{}, err
8990
}
9091

91-
return NewPackageInstallCR(existingPkgInstall, log, r.kcClient, r.pkgClient, r.coreClient, r.compInfo, r.opts).Reconcile()
92+
return NewPackageInstallCR(existingPkgInstall, log, r.kcClient, r.pkgClient, r.coreClient, r.compInfo, Opts{DefaultSyncPeriod: r.kcConfig.PackageInstallDefaultSyncPeriod()}).Reconcile()
9293
}

test/e2e/kappcontroller/config_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,88 @@ stringData:
337337
assert.Contains(t, cr.Status.Fetch.Stderr, "MANIFEST_UNKNOWN: manifest unknown;")
338338
})
339339
}
340+
341+
func TestConfig_PackageInstallDefaultSyncPeriod(t *testing.T) {
342+
env := e2e.BuildEnv(t)
343+
logger := e2e.Logger{}
344+
kapp := e2e.Kapp{T: t, Namespace: env.Namespace, L: logger}
345+
sas := e2e.ServiceAccounts{Namespace: env.Namespace}
346+
kubectl := e2e.Kubectl{T: t, Namespace: env.Namespace, L: logger}
347+
348+
configName := "test-config-package-install-default-sync-period-config"
349+
name := "install-pkg-test"
350+
351+
packageInstallYaml := fmt.Sprintf(`
352+
---
353+
apiVersion: packaging.carvel.dev/v1alpha1
354+
kind: PackageRepository
355+
metadata:
356+
name: basic.test.carvel.dev
357+
annotations:
358+
kapp.k14s.io/change-group: "packagerepo"
359+
spec:
360+
fetch:
361+
imgpkgBundle:
362+
image: index.docker.io/k8slt/kc-e2e-test-repo@sha256:ddd93b67b97c1460580ca1afd04326d16900dc716c4357cade85b83deab76f1c
363+
---
364+
apiVersion: packaging.carvel.dev/v1alpha1
365+
kind: PackageInstall
366+
metadata:
367+
name: %s
368+
namespace: %s
369+
annotations:
370+
kapp.k14s.io/change-group: kappctrl-e2e.k14s.io/packageinstalls
371+
kapp.k14s.io/change-rule: "upsert after upserting packagerepo"
372+
spec:
373+
serviceAccountName: kappctrl-e2e-ns-sa
374+
packageRef:
375+
refName: pkg.test.carvel.dev
376+
versionSelection:
377+
constraints: 1.0.0`, name, env.Namespace) + sas.ForNamespaceYAML()
378+
379+
cleanUpApp := func() {
380+
kapp.Run([]string{"delete", "-a", name})
381+
kapp.Run([]string{"delete", "-a", configName})
382+
}
383+
cleanUpApp()
384+
defer cleanUpApp()
385+
386+
logger.Section("deploy controller config to set global label", func() {
387+
config := `
388+
apiVersion: v1
389+
kind: Secret
390+
metadata:
391+
name: kapp-controller-config
392+
namespace: kapp-controller
393+
stringData:
394+
packageInstallDefaultSyncPeriod: 60s
395+
`
396+
kapp.RunWithOpts([]string{"deploy", "-f", "-", "-a", configName}, e2e.RunOpts{StdinReader: strings.NewReader(config)})
397+
398+
// Since config propagation is async, just wait a little bit
399+
time.Sleep(2 * time.Second)
400+
})
401+
402+
logger.Section("deploy PackageInstall and App created has global packageInstallDefaultSyncPeriod set", func() {
403+
404+
// Create Repo and PackageInstall from YAML
405+
kapp.RunWithOpts([]string{"deploy", "-f", "-", "-a", name}, e2e.RunOpts{StdinReader: strings.NewReader(packageInstallYaml)})
406+
407+
// syncPeriod of the App created via PackageInstall should match to configured value on a global controller level config
408+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "pkgi/" + name, "--timeout", "1m"})
409+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "apps/" + name, "--timeout", "1m"})
410+
out := kubectl.Run([]string{"get", fmt.Sprintf("apps/%s", name), "-o", "yaml"})
411+
412+
var cr v1alpha1.App
413+
err := yaml.Unmarshal([]byte(out), &cr)
414+
415+
if err != nil {
416+
t.Fatalf("Failed to unmarshal: %s", err)
417+
}
418+
419+
expectedSyncPeriod := time.Duration(60) * time.Second
420+
actualSyncPeriod := cr.Spec.SyncPeriod.Duration
421+
422+
assert.Equal(t, actualSyncPeriod, expectedSyncPeriod)
423+
})
424+
}

test/e2e/kappcontroller/packageinstall_test.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,3 +815,138 @@ spec:
815815
constraints: %[2]s
816816
`, name, version) + sas.ForNamespaceYAML()
817817
}
818+
819+
func Test_PackageInstall_DefaultSyncPeriod(t *testing.T) {
820+
env := e2e.BuildEnv(t)
821+
logger := e2e.Logger{}
822+
kapp := e2e.Kapp{T: t, Namespace: env.Namespace, L: logger}
823+
sas := e2e.ServiceAccounts{Namespace: env.Namespace}
824+
kubectl := e2e.Kubectl{T: t, Namespace: env.Namespace, L: logger}
825+
826+
name := "install-pkg-default-sync-period-test"
827+
828+
packageInstallYaml := fmt.Sprintf(`
829+
---
830+
apiVersion: packaging.carvel.dev/v1alpha1
831+
kind: PackageRepository
832+
metadata:
833+
name: basic.test.carvel.dev
834+
annotations:
835+
kapp.k14s.io/change-group: "packagerepo"
836+
spec:
837+
fetch:
838+
imgpkgBundle:
839+
image: index.docker.io/k8slt/kc-e2e-test-repo@sha256:ddd93b67b97c1460580ca1afd04326d16900dc716c4357cade85b83deab76f1c
840+
---
841+
apiVersion: packaging.carvel.dev/v1alpha1
842+
kind: PackageInstall
843+
metadata:
844+
name: %s
845+
namespace: %s
846+
annotations:
847+
kapp.k14s.io/change-group: kappctrl-e2e.k14s.io/packageinstalls
848+
kapp.k14s.io/change-rule: "upsert after upserting packagerepo"
849+
spec:
850+
serviceAccountName: kappctrl-e2e-ns-sa
851+
packageRef:
852+
refName: pkg.test.carvel.dev
853+
versionSelection:
854+
constraints: 1.0.0`, name, env.Namespace) + sas.ForNamespaceYAML()
855+
856+
cleanUpApp := func() {
857+
kapp.Run([]string{"delete", "-a", name})
858+
}
859+
cleanUpApp()
860+
defer cleanUpApp()
861+
862+
logger.Section("deploy PackageInstall and App created has default syncPeriod set", func() {
863+
864+
// Create Repo and PackageInstall from YAML
865+
kapp.RunWithOpts([]string{"deploy", "-f", "-", "-a", name}, e2e.RunOpts{StdinReader: strings.NewReader(packageInstallYaml)})
866+
867+
// syncPeriod of the App created via PackageInstall should match to configured value on a global controller level config
868+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "pkgi/" + name, "--timeout", "1m"})
869+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "apps/" + name, "--timeout", "1m"})
870+
out := kubectl.Run([]string{"get", fmt.Sprintf("apps/%s", name), "-o", "yaml"})
871+
872+
var cr v1alpha1.App
873+
err := yaml.Unmarshal([]byte(out), &cr)
874+
875+
if err != nil {
876+
t.Fatalf("Failed to unmarshal: %s", err)
877+
}
878+
879+
expectedSyncPeriod := time.Duration(10) * time.Minute
880+
actualSyncPeriod := cr.Spec.SyncPeriod.Duration
881+
882+
assert.Equal(t, actualSyncPeriod, expectedSyncPeriod)
883+
})
884+
}
885+
886+
func Test_PackageInstall_CustomSyncPeriod(t *testing.T) {
887+
env := e2e.BuildEnv(t)
888+
logger := e2e.Logger{}
889+
kapp := e2e.Kapp{T: t, Namespace: env.Namespace, L: logger}
890+
sas := e2e.ServiceAccounts{Namespace: env.Namespace}
891+
kubectl := e2e.Kubectl{T: t, Namespace: env.Namespace, L: logger}
892+
893+
name := "install-pkg-custom-sync-period-test"
894+
895+
packageInstallYaml := fmt.Sprintf(`
896+
---
897+
apiVersion: packaging.carvel.dev/v1alpha1
898+
kind: PackageRepository
899+
metadata:
900+
name: basic.test.carvel.dev
901+
annotations:
902+
kapp.k14s.io/change-group: "packagerepo"
903+
spec:
904+
fetch:
905+
imgpkgBundle:
906+
image: index.docker.io/k8slt/kc-e2e-test-repo@sha256:ddd93b67b97c1460580ca1afd04326d16900dc716c4357cade85b83deab76f1c
907+
---
908+
apiVersion: packaging.carvel.dev/v1alpha1
909+
kind: PackageInstall
910+
metadata:
911+
name: %s
912+
namespace: %s
913+
annotations:
914+
kapp.k14s.io/change-group: kappctrl-e2e.k14s.io/packageinstalls
915+
kapp.k14s.io/change-rule: "upsert after upserting packagerepo"
916+
spec:
917+
syncPeriod: 30s
918+
serviceAccountName: kappctrl-e2e-ns-sa
919+
packageRef:
920+
refName: pkg.test.carvel.dev
921+
versionSelection:
922+
constraints: 1.0.0`, name, env.Namespace) + sas.ForNamespaceYAML()
923+
924+
cleanUpApp := func() {
925+
kapp.Run([]string{"delete", "-a", name})
926+
}
927+
cleanUpApp()
928+
defer cleanUpApp()
929+
930+
logger.Section("deploy PackageInstall and App created has default syncPeriod set", func() {
931+
932+
// Create Repo and PackageInstall from YAML
933+
kapp.RunWithOpts([]string{"deploy", "-f", "-", "-a", name}, e2e.RunOpts{StdinReader: strings.NewReader(packageInstallYaml)})
934+
935+
// syncPeriod of the App created via PackageInstall should match to configured value on a global controller level config
936+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "pkgi/" + name, "--timeout", "1m"})
937+
kubectl.Run([]string{"wait", "--for=condition=ReconcileSucceeded", "apps/" + name, "--timeout", "1m"})
938+
out := kubectl.Run([]string{"get", fmt.Sprintf("apps/%s", name), "-o", "yaml"})
939+
940+
var cr v1alpha1.App
941+
err := yaml.Unmarshal([]byte(out), &cr)
942+
943+
if err != nil {
944+
t.Fatalf("Failed to unmarshal: %s", err)
945+
}
946+
947+
expectedSyncPeriod := time.Duration(30) * time.Second
948+
actualSyncPeriod := cr.Spec.SyncPeriod.Duration
949+
950+
assert.Equal(t, actualSyncPeriod, expectedSyncPeriod)
951+
})
952+
}

0 commit comments

Comments
 (0)