github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/caas/kubernetes/provider/resources.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provider 5 6 import ( 7 "context" 8 "fmt" 9 10 "github.com/juju/errors" 11 "github.com/juju/version/v2" 12 v1 "k8s.io/apimachinery/pkg/apis/meta/v1" 13 14 jujucontext "github.com/juju/juju/environs/context" 15 "github.com/juju/juju/environs/tags" 16 ) 17 18 // AdoptResources is called when the model is moved from one 19 // controller to another using model migration. 20 func (k *kubernetesClient) AdoptResources(ctx jujucontext.ProviderCallContext, controllerUUID string, fromVersion version.Number) error { 21 if k.namespace == "" { 22 return errNoNamespace 23 } 24 modelLabel := fmt.Sprintf("%v==%v", tags.JujuModel, k.modelUUID) 25 26 pods := k.client().CoreV1().Pods(k.namespace) 27 podsList, err := pods.List(context.TODO(), v1.ListOptions{ 28 LabelSelector: modelLabel, 29 }) 30 if err != nil { 31 return errors.Trace(err) 32 } 33 for _, p := range podsList.Items { 34 p.Labels[tags.JujuController] = controllerUUID 35 if _, err := pods.Update(context.TODO(), &p, v1.UpdateOptions{}); err != nil { 36 return errors.Annotatef(err, "updating labels for pod %q", p.Name) 37 } 38 } 39 40 pvcs := k.client().CoreV1().PersistentVolumeClaims(k.namespace) 41 pvcList, err := pvcs.List(context.TODO(), v1.ListOptions{ 42 LabelSelector: modelLabel, 43 }) 44 if err != nil { 45 return errors.Trace(err) 46 } 47 for _, pvc := range pvcList.Items { 48 pvc.Labels[tags.JujuController] = controllerUUID 49 if _, err := pvcs.Update(context.TODO(), &pvc, v1.UpdateOptions{}); err != nil { 50 return errors.Annotatef(err, "updating labels for pvc %q", pvc.Name) 51 } 52 } 53 54 pvs := k.client().CoreV1().PersistentVolumes() 55 pvList, err := pvs.List(context.TODO(), v1.ListOptions{ 56 LabelSelector: modelLabel, 57 }) 58 if err != nil { 59 return errors.Trace(err) 60 } 61 for _, pv := range pvList.Items { 62 pv.Labels[tags.JujuController] = controllerUUID 63 if _, err := pvs.Update(context.TODO(), &pv, v1.UpdateOptions{}); err != nil { 64 return errors.Annotatef(err, "updating labels for pvc %q", pv.Name) 65 } 66 } 67 68 sSets := k.client().AppsV1().StatefulSets(k.namespace) 69 ssList, err := sSets.List(context.TODO(), v1.ListOptions{ 70 LabelSelector: modelLabel, 71 }) 72 if err != nil { 73 return errors.Trace(err) 74 } 75 for _, ss := range ssList.Items { 76 ss.Labels[tags.JujuController] = controllerUUID 77 if _, err := sSets.Update(context.TODO(), &ss, v1.UpdateOptions{}); err != nil { 78 return errors.Annotatef(err, "updating labels for stateful set %q", ss.Name) 79 } 80 } 81 82 deployments := k.client().AppsV1().Deployments(k.namespace) 83 dList, err := deployments.List(context.TODO(), v1.ListOptions{ 84 LabelSelector: modelLabel, 85 }) 86 if err != nil { 87 return errors.Trace(err) 88 } 89 for _, d := range dList.Items { 90 d.Labels[tags.JujuController] = controllerUUID 91 if _, err := deployments.Update(context.TODO(), &d, v1.UpdateOptions{}); err != nil { 92 return errors.Annotatef(err, "updating labels for deployment %q", d.Name) 93 } 94 } 95 96 return nil 97 }