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 }