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  }