github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/caas/kubernetes/provider/controller_upgrade_test.go (about)

     1  // Copyright 2020 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  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/version/v2"
    13  	gc "gopkg.in/check.v1"
    14  	apps "k8s.io/api/apps/v1"
    15  	core "k8s.io/api/core/v1"
    16  	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
    17  	"k8s.io/client-go/kubernetes"
    18  	"k8s.io/client-go/kubernetes/fake"
    19  
    20  	k8sconstants "github.com/juju/juju/caas/kubernetes/provider/constants"
    21  	"github.com/juju/juju/caas/kubernetes/provider/utils"
    22  	"github.com/juju/juju/cloudconfig/podcfg"
    23  )
    24  
    25  // DummyUpgradeCAASController implements UpgradeCAASControllerBroker for the
    26  // purpose of testing.
    27  type dummyUpgradeCAASController struct {
    28  	client *fake.Clientset
    29  }
    30  
    31  type ControllerUpgraderSuite struct {
    32  	broker *dummyUpgradeCAASController
    33  }
    34  
    35  var _ = gc.Suite(&ControllerUpgraderSuite{})
    36  
    37  func (d *dummyUpgradeCAASController) Client() kubernetes.Interface {
    38  	return d.client
    39  }
    40  
    41  func (d *dummyUpgradeCAASController) IsLegacyLabels() bool {
    42  	return false
    43  }
    44  
    45  func (d *dummyUpgradeCAASController) Namespace() string {
    46  	return "test"
    47  }
    48  
    49  func (s *ControllerUpgraderSuite) SetUpTest(c *gc.C) {
    50  	s.broker = &dummyUpgradeCAASController{
    51  		client: fake.NewSimpleClientset(),
    52  	}
    53  }
    54  
    55  func (s *ControllerUpgraderSuite) TestControllerUpgrade(c *gc.C) {
    56  	var (
    57  		appName      = k8sconstants.JujuControllerStackName
    58  		oldImagePath = fmt.Sprintf("%s/%s:9.9.8", podcfg.JujudOCINamespace, podcfg.JujudOCIName)
    59  		newImagePath = fmt.Sprintf("%s/%s:9.9.9", podcfg.JujudOCINamespace, podcfg.JujudOCIName)
    60  	)
    61  	_, err := s.broker.Client().AppsV1().StatefulSets(s.broker.Namespace()).Create(context.TODO(),
    62  		&apps.StatefulSet{
    63  			ObjectMeta: meta.ObjectMeta{
    64  				Name: appName,
    65  			},
    66  			Spec: apps.StatefulSetSpec{
    67  				Selector: &meta.LabelSelector{
    68  					MatchLabels: map[string]string{
    69  						"match-label": "true",
    70  					},
    71  				},
    72  				Template: core.PodTemplateSpec{
    73  					Spec: core.PodSpec{
    74  						Containers: []core.Container{
    75  							{
    76  								Name:  "jujud",
    77  								Image: oldImagePath,
    78  							},
    79  						},
    80  					},
    81  				},
    82  			},
    83  		}, meta.CreateOptions{})
    84  	c.Assert(err, jc.ErrorIsNil)
    85  
    86  	c.Assert(controllerUpgrade(appName, version.MustParse("9.9.9"), s.broker), jc.ErrorIsNil)
    87  
    88  	ss, err := s.broker.Client().AppsV1().StatefulSets(s.broker.Namespace()).
    89  		Get(context.TODO(), appName, meta.GetOptions{})
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Assert(ss.Spec.Template.Spec.Containers[0].Image, gc.Equals, newImagePath)
    92  
    93  	c.Assert(ss.Annotations[utils.AnnotationVersionKey(false)], gc.Equals, version.MustParse("9.9.9").String())
    94  	c.Assert(ss.Spec.Template.Annotations[utils.AnnotationVersionKey(false)], gc.Equals, version.MustParse("9.9.9").String())
    95  }
    96  
    97  func (s *ControllerUpgraderSuite) TestControllerDoesNotExist(c *gc.C) {
    98  	var (
    99  		appName = k8sconstants.JujuControllerStackName
   100  	)
   101  	err := controllerUpgrade(appName, version.MustParse("9.9.9"), s.broker)
   102  	c.Assert(err, gc.NotNil)
   103  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
   104  }