@@ -31,8 +31,11 @@ import (
3131 "github.com/tektoncd/operator/pkg/client/clientset/versioned"
3232 operatorclient "github.com/tektoncd/operator/pkg/client/injection/client"
3333 "github.com/tektoncd/operator/pkg/reconciler/common"
34+ "github.com/tektoncd/operator/pkg/reconciler/kubernetes/tektoninstallerset"
35+ "github.com/tektoncd/operator/pkg/reconciler/shared/hash"
3436 "go.uber.org/zap"
3537 corev1 "k8s.io/api/core/v1"
38+ apierrors "k8s.io/apimachinery/pkg/api/errors"
3639 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3740 "knative.dev/pkg/apis"
3841 "knative.dev/pkg/injection"
@@ -84,33 +87,76 @@ func (oe openshiftExtension) PostReconcile(ctx context.Context, comp v1alpha1.Te
8487 logger := logging .FromContext (ctx )
8588 addon := comp .(* v1alpha1.TektonAddon )
8689
87- miscellaneousManifest := oe .manifest
8890 exist , err := checkIfInstallerSetExist (ctx , oe .operatorClientSet , oe .version , addon , miscellaneousResourcesInstallerSet )
8991 if err != nil {
9092 return err
9193 }
9294 if ! exist {
9395
94- if err := applyAddons (& miscellaneousManifest , "05-tkncliserve" ); err != nil {
96+ manifest , err := getMiscellaneousManifest (ctx , addon , oe .manifest , comp )
97+ if err != nil {
9598 return err
9699 }
97100
98- if err := getOptionalAddons (& miscellaneousManifest , comp ); err != nil {
101+ if err := createInstallerSet (ctx , oe .operatorClientSet , addon , manifest , oe .version ,
102+ miscellaneousResourcesInstallerSet , "addon-openshift" ); err != nil {
99103 return err
100104 }
105+ }
106+
107+ // Check if installer set is already created
108+ compInstallerSet , ok := addon .Status .AddonsInstallerSet [miscellaneousResourcesInstallerSet ]
109+ if ! ok {
110+ return v1alpha1 .RECONCILE_AGAIN_ERR
111+ }
112+
113+ installedTIS , err := oe .operatorClientSet .OperatorV1alpha1 ().TektonInstallerSets ().
114+ Get (ctx , compInstallerSet , metav1.GetOptions {})
115+ if err != nil {
116+ if apierrors .IsNotFound (err ) {
117+ manifest , err := getMiscellaneousManifest (ctx , addon , oe .manifest , comp )
118+ if err != nil {
119+ return err
120+ }
101121
102- images := common .ToLowerCaseKeys (common .ImagesFromEnv (common .AddonsImagePrefix ))
103- extraTranformers := []mf.Transformer {
104- common .DeploymentImages (images ),
122+ if err := createInstallerSet (ctx , oe .operatorClientSet , addon , manifest , oe .version ,
123+ miscellaneousResourcesInstallerSet , "addon-openshift" ); err != nil {
124+ return err
125+ }
105126 }
106- if err := addonTransform (ctx , & miscellaneousManifest , addon , extraTranformers ... ); err != nil {
127+ logger .Error ("failed to get InstallerSet: %s" , err )
128+ return err
129+ }
130+
131+ expectedSpecHash , err := hash .Compute (addon .Spec )
132+ if err != nil {
133+ return err
134+ }
135+
136+ // spec hash stored on installerSet
137+ lastAppliedHash := installedTIS .GetAnnotations ()[tektoninstallerset .LastAppliedHashKey ]
138+
139+ if lastAppliedHash != expectedSpecHash {
140+
141+ manifest , err := getMiscellaneousManifest (ctx , addon , oe .manifest , comp )
142+ if err != nil {
107143 return err
108144 }
109145
110- if err := createInstallerSet (ctx , oe .operatorClientSet , addon , miscellaneousManifest , oe .version ,
111- miscellaneousResourcesInstallerSet , "addon-openshift" ); err != nil {
146+ // Update the spec hash
147+ current := installedTIS .GetAnnotations ()
148+ current [tektoninstallerset .LastAppliedHashKey ] = expectedSpecHash
149+ installedTIS .SetAnnotations (current )
150+
151+ // Update the manifests
152+ installedTIS .Spec .Manifests = manifest .Resources ()
153+
154+ if _ , err = oe .operatorClientSet .OperatorV1alpha1 ().TektonInstallerSets ().
155+ Update (ctx , installedTIS , metav1.UpdateOptions {}); err != nil {
112156 return err
113157 }
158+
159+ return v1alpha1 .RECONCILE_AGAIN_ERR
114160 }
115161
116162 existingInstallerSet , ok := addon .Status .AddonsInstallerSet [miscellaneousResourcesInstallerSet ]
@@ -221,3 +267,23 @@ func getRouteHost(manifest *mf.Manifest) (string, error) {
221267 }
222268 return hostUrl , nil
223269}
270+
271+ func getMiscellaneousManifest (ctx context.Context , addon * v1alpha1.TektonAddon , miscellaneousManifest mf.Manifest , comp v1alpha1.TektonComponent ) (mf.Manifest , error ) {
272+ if err := applyAddons (& miscellaneousManifest , "05-tkncliserve" ); err != nil {
273+ return mf.Manifest {}, err
274+ }
275+
276+ if err := getOptionalAddons (& miscellaneousManifest , comp ); err != nil {
277+ return mf.Manifest {}, err
278+ }
279+
280+ images := common .ToLowerCaseKeys (common .ImagesFromEnv (common .AddonsImagePrefix ))
281+ extraTranformers := []mf.Transformer {
282+ common .DeploymentImages (images ),
283+ common .AddConfiguration (addon .Spec .Config ),
284+ }
285+ if err := addonTransform (ctx , & miscellaneousManifest , addon , extraTranformers ... ); err != nil {
286+ return mf.Manifest {}, err
287+ }
288+ return miscellaneousManifest , nil
289+ }
0 commit comments