@@ -26,6 +26,7 @@ import (
2626 "github.com/codefresh-io/venona/venonactl/pkg/logger"
2727 "github.com/codefresh-io/venona/venonactl/pkg/obj/kubeobj"
2828 templates "github.com/codefresh-io/venona/venonactl/pkg/templates/kubernetes"
29+ kerrors "k8s.io/apimachinery/pkg/api/errors"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031)
3132
@@ -225,3 +226,63 @@ func (u *venonaPlugin) Upgrade(opt *UpgradeOptions, v Values) (Values, error) {
225226
226227 return v , nil
227228}
229+
230+ func (u * venonaPlugin ) Migrate (opt * MigrateOptions , v Values ) error {
231+ var deletePriorUpgrade = map [string ]interface {}{
232+ "deployment.venona.yaml" : nil ,
233+ "secret.venona.yaml" : nil ,
234+ }
235+
236+ kubeClientset , err := opt .KubeBuilder .BuildClient ()
237+ if err != nil {
238+ u .logger .Error (fmt .Sprintf ("Cannot create kubernetes clientset: %v " , err ))
239+ return err
240+ }
241+
242+ kubeObjects , err := getKubeObjectsFromTempalte (v , venonaFilesPattern , u .logger )
243+ if err != nil {
244+ return err
245+ }
246+ list , err := kubeClientset .CoreV1 ().Pods (opt .ClusterNamespace ).List (metav1.ListOptions {LabelSelector : fmt .Sprintf ("app=%v" , v ["AppName" ])})
247+ if err != nil {
248+ u .logger .Error (fmt .Sprintf ("Cannot find agent pod: %v " , err ))
249+ return err
250+ }
251+ podName := list .Items [0 ].ObjectMeta .Name
252+ for fileName := range kubeObjects {
253+ if _ , ok := deletePriorUpgrade [fileName ]; ok {
254+ u .logger .Debug (fmt .Sprintf ("Deleting previous deplopyment of %s" , fileName ))
255+ delOpt := & deleteOptions {
256+ logger : u .logger ,
257+ templates : templates .TemplatesMap (),
258+ templateValues : v ,
259+ kubeClientSet : kubeClientset ,
260+ namespace : opt .ClusterNamespace ,
261+ matchPattern : fileName ,
262+ operatorType : VenonaPluginType ,
263+ }
264+ err := uninstall (delOpt )
265+ if err != nil {
266+ return err
267+ }
268+ }
269+ }
270+ ticker := time .NewTicker (5 * time .Second )
271+ for {
272+ select {
273+ case <- ticker .C :
274+ u .logger .Debug ("Validating old runner pod termination" )
275+ _ , err = kubeClientset .CoreV1 ().Pods (opt .ClusterNamespace ).Get (podName , metav1.GetOptions {})
276+ if err != nil {
277+ if statusError , errIsStatusError := err .(* kerrors.StatusError ); errIsStatusError {
278+ if statusError .ErrStatus .Reason == metav1 .StatusReasonNotFound {
279+ return nil
280+ }
281+ }
282+ }
283+ case <- time .After (60 * time .Second ):
284+ u .logger .Error ("Failed to validate old venona pod termination" )
285+ return fmt .Errorf ("Failed to validate old venona pod termination" )
286+ }
287+ }
288+ }
0 commit comments