@@ -5,8 +5,12 @@ package handlers
5
5
6
6
import (
7
7
"github.com/go-logr/logr"
8
+ ipkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/installpackage/v1alpha1"
9
+ pkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/package/v1alpha1"
8
10
kcclient "github.com/vmware-tanzu/carvel-kapp-controller/pkg/client/clientset/versioned"
11
+ versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1"
9
12
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
+ "k8s.io/apimachinery/pkg/runtime"
10
14
"k8s.io/apimachinery/pkg/types"
11
15
"k8s.io/client-go/util/workqueue"
12
16
"sigs.k8s.io/controller-runtime/pkg/event"
@@ -31,48 +35,69 @@ func NewInstalledPkgVersionHandler(c kcclient.Interface, log logr.Logger) *Insta
31
35
32
36
func (ipvh * InstalledPkgVersionHandler ) Create (evt event.CreateEvent , q workqueue.RateLimitingInterface ) {
33
37
ipvh .log .Info ("enqueueing installedPkgList" )
34
- err := ipvh .enqueueAllPackages ( q )
38
+ err := ipvh .enqueueEligibleInstalledPackages ( q , evt . Object )
35
39
if err != nil {
36
40
ipvh .log .Error (err , "enqueueing all installed pakcages" )
37
41
}
38
42
}
39
43
40
44
func (ipvh * InstalledPkgVersionHandler ) Update (evt event.UpdateEvent , q workqueue.RateLimitingInterface ) {
41
45
ipvh .log .Info ("enqueueing installedPkgList" )
42
- err := ipvh .enqueueAllPackages ( q )
46
+ err := ipvh .enqueueEligibleInstalledPackages ( q , evt . ObjectNew )
43
47
if err != nil {
44
48
ipvh .log .Error (err , "enqueueing all installed pakcages" )
45
49
}
46
50
}
47
51
48
52
func (ipvh * InstalledPkgVersionHandler ) Delete (evt event.DeleteEvent , q workqueue.RateLimitingInterface ) {
49
53
ipvh .log .Info ("enqueueing installedPkgList" )
50
- err := ipvh .enqueueAllPackages ( q )
54
+ err := ipvh .enqueueEligibleInstalledPackages ( q , evt . Object )
51
55
if err != nil {
52
56
ipvh .log .Error (err , "enqueueing all installed pakcages" )
53
57
}
54
58
}
55
59
56
60
func (ipvh * InstalledPkgVersionHandler ) Generic (evt event.GenericEvent , q workqueue.RateLimitingInterface ) {
57
61
ipvh .log .Info ("enqueueing installedPkgList" )
58
- err := ipvh .enqueueAllPackages ( q )
62
+ err := ipvh .enqueueEligibleInstalledPackages ( q , evt . Object )
59
63
if err != nil {
60
64
ipvh .log .Error (err , "enqueueing all installed pakcages" )
61
65
}
62
66
}
63
67
64
- func (ipvh * InstalledPkgVersionHandler ) enqueueAllPackages (q workqueue.RateLimitingInterface ) error {
68
+ func (ipvh * InstalledPkgVersionHandler ) enqueueEligibleInstalledPackages (q workqueue.RateLimitingInterface , obj runtime.Object ) error {
69
+ pkg := obj .(* pkgv1alpha1.Package )
65
70
installedPkgList , err := ipvh .client .InstallV1alpha1 ().InstalledPackages ("" ).List (metav1.ListOptions {})
66
71
if err != nil {
67
72
return err
68
73
}
69
74
70
75
for _ , ip := range installedPkgList .Items {
71
- q .Add (reconcile.Request {NamespacedName : types.NamespacedName {
72
- Name : ip .Name ,
73
- Namespace : ip .Namespace ,
74
- }})
76
+ if ip .Spec .PkgRef .PublicName == pkg .Spec .PublicName && ipvh .isEligibleForVersionUpgrade (pkg .Spec .Version , ip ) {
77
+ q .Add (reconcile.Request {NamespacedName : types.NamespacedName {
78
+ Name : ip .Name ,
79
+ Namespace : ip .Namespace ,
80
+ }})
81
+ }
75
82
}
76
83
77
84
return nil
78
85
}
86
+
87
+ func (ipvh * InstalledPkgVersionHandler ) isEligibleForVersionUpgrade (version string , installedPkg ipkgv1alpha1.InstalledPackage ) bool {
88
+ semverConfig := installedPkg .Spec .PkgRef .VersionSelection
89
+ if installedPkg .Spec .PkgRef .Version != "" {
90
+ semverConfig = & versions.VersionSelectionSemver {
91
+ Constraints : installedPkg .Spec .PkgRef .Version ,
92
+ // Prereleases must be non nil to be included
93
+ Prereleases : & versions.VersionSelectionSemverPrereleases {},
94
+ }
95
+ }
96
+
97
+ selectedVersion , err := versions .HighestConstrainedVersion ([]string {version }, versions.VersionSelection {Semver : semverConfig })
98
+ if selectedVersion == "" || err != nil {
99
+ return false
100
+ }
101
+
102
+ return true
103
+ }
0 commit comments