github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/caas/kubernetes/provider/resources/serviceaccount_test.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package resources_test 5 6 import ( 7 "context" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 corev1 "k8s.io/api/core/v1" 13 k8serrors "k8s.io/apimachinery/pkg/api/errors" 14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 16 "github.com/juju/juju/caas/kubernetes/provider/resources" 17 ) 18 19 type serviceAccountSuite struct { 20 resourceSuite 21 } 22 23 var _ = gc.Suite(&serviceAccountSuite{}) 24 25 func (s *serviceAccountSuite) TestApply(c *gc.C) { 26 sa := &corev1.ServiceAccount{ 27 ObjectMeta: metav1.ObjectMeta{ 28 Name: "sa1", 29 Namespace: "test", 30 }, 31 } 32 // Create. 33 saResource := resources.NewServiceAccount("sa1", "test", sa) 34 c.Assert(saResource.Apply(context.TODO(), s.client), jc.ErrorIsNil) 35 result, err := s.client.CoreV1().ServiceAccounts("test").Get(context.TODO(), "sa1", metav1.GetOptions{}) 36 c.Assert(err, jc.ErrorIsNil) 37 c.Assert(len(result.GetAnnotations()), gc.Equals, 0) 38 39 // Update. 40 sa.SetAnnotations(map[string]string{"a": "b"}) 41 saResource = resources.NewServiceAccount("sa1", "test", sa) 42 c.Assert(saResource.Apply(context.TODO(), s.client), jc.ErrorIsNil) 43 44 result, err = s.client.CoreV1().ServiceAccounts("test").Get(context.TODO(), "sa1", metav1.GetOptions{}) 45 c.Assert(err, jc.ErrorIsNil) 46 c.Assert(result.GetName(), gc.Equals, `sa1`) 47 c.Assert(result.GetNamespace(), gc.Equals, `test`) 48 c.Assert(result.GetAnnotations(), gc.DeepEquals, map[string]string{"a": "b"}) 49 } 50 51 func (s *serviceAccountSuite) TestGet(c *gc.C) { 52 template := corev1.ServiceAccount{ 53 ObjectMeta: metav1.ObjectMeta{ 54 Name: "sa1", 55 Namespace: "test", 56 }, 57 } 58 sa1 := template 59 sa1.SetAnnotations(map[string]string{"a": "b"}) 60 _, err := s.client.CoreV1().ServiceAccounts("test").Create(context.TODO(), &sa1, metav1.CreateOptions{}) 61 c.Assert(err, jc.ErrorIsNil) 62 63 saResource := resources.NewServiceAccount("sa1", "test", &template) 64 c.Assert(len(saResource.GetAnnotations()), gc.Equals, 0) 65 err = saResource.Get(context.TODO(), s.client) 66 c.Assert(err, jc.ErrorIsNil) 67 c.Assert(saResource.GetName(), gc.Equals, `sa1`) 68 c.Assert(saResource.GetNamespace(), gc.Equals, `test`) 69 c.Assert(saResource.GetAnnotations(), gc.DeepEquals, map[string]string{"a": "b"}) 70 } 71 72 func (s *serviceAccountSuite) TestDelete(c *gc.C) { 73 sa := corev1.ServiceAccount{ 74 ObjectMeta: metav1.ObjectMeta{ 75 Name: "sa1", 76 Namespace: "test", 77 }, 78 } 79 _, err := s.client.CoreV1().ServiceAccounts("test").Create(context.TODO(), &sa, metav1.CreateOptions{}) 80 c.Assert(err, jc.ErrorIsNil) 81 82 result, err := s.client.CoreV1().ServiceAccounts("test").Get(context.TODO(), "sa1", metav1.GetOptions{}) 83 c.Assert(err, jc.ErrorIsNil) 84 c.Assert(result.GetName(), gc.Equals, `sa1`) 85 86 saResource := resources.NewServiceAccount("sa1", "test", &sa) 87 err = saResource.Delete(context.TODO(), s.client) 88 c.Assert(err, jc.ErrorIsNil) 89 90 err = saResource.Get(context.TODO(), s.client) 91 c.Assert(err, jc.Satisfies, errors.IsNotFound) 92 93 _, err = s.client.CoreV1().ServiceAccounts("test").Get(context.TODO(), "sa1", metav1.GetOptions{}) 94 c.Assert(err, jc.Satisfies, k8serrors.IsNotFound) 95 } 96 97 func (s *serviceAccountSuite) TestUpdate(c *gc.C) { 98 sa := corev1.ServiceAccount{ 99 ObjectMeta: metav1.ObjectMeta{ 100 Name: "sa1", 101 Namespace: "test", 102 }, 103 } 104 _, err := s.client.CoreV1().ServiceAccounts("test").Create( 105 context.TODO(), 106 &sa, 107 metav1.CreateOptions{}, 108 ) 109 c.Assert(err, jc.ErrorIsNil) 110 111 sa.ObjectMeta.Labels = map[string]string{ 112 "test": "label", 113 } 114 115 saResource := resources.NewServiceAccount("sa1", "test", &sa) 116 err = saResource.Update(context.TODO(), s.client) 117 c.Assert(err, jc.ErrorIsNil) 118 119 rsa, err := s.client.CoreV1().ServiceAccounts("test").Get( 120 context.TODO(), 121 "sa1", 122 metav1.GetOptions{}, 123 ) 124 c.Assert(err, jc.ErrorIsNil) 125 c.Assert(rsa, jc.DeepEquals, &saResource.ServiceAccount) 126 } 127 128 func (s *serviceAccountSuite) TestEnsureCreatesNew(c *gc.C) { 129 sa := resources.NewServiceAccount("sa1", "test", &corev1.ServiceAccount{}) 130 cleanups, err := sa.Ensure(context.TODO(), s.client) 131 c.Assert(err, jc.ErrorIsNil) 132 133 obj, err := s.client.CoreV1().ServiceAccounts("test").Get( 134 context.TODO(), "sa1", metav1.GetOptions{}) 135 c.Assert(err, jc.ErrorIsNil) 136 c.Assert(&sa.ServiceAccount, jc.DeepEquals, obj) 137 138 for _, v := range cleanups { 139 v() 140 } 141 142 // Test cleanup removes service account 143 _, err = s.client.CoreV1().ServiceAccounts("test").Get( 144 context.TODO(), "sa1", metav1.GetOptions{}) 145 c.Assert(k8serrors.IsNotFound(err), jc.IsTrue) 146 } 147 148 func (s *serviceAccountSuite) TestEnsureUpdates(c *gc.C) { 149 sa := &corev1.ServiceAccount{ 150 ObjectMeta: metav1.ObjectMeta{ 151 Name: "sa2", 152 Namespace: "testing", 153 }, 154 } 155 156 _, err := s.client.CoreV1().ServiceAccounts("testing").Create( 157 context.TODO(), sa, metav1.CreateOptions{}) 158 c.Assert(err, jc.ErrorIsNil) 159 160 sa.ObjectMeta.Labels = map[string]string{ 161 "test": "case", 162 } 163 164 resource := resources.NewServiceAccount("sa2", "testing", sa) 165 _, err = resource.Ensure(context.TODO(), s.client) 166 c.Assert(err, jc.ErrorIsNil) 167 168 obj, err := s.client.CoreV1().ServiceAccounts("testing").Get( 169 context.TODO(), sa.Name, metav1.GetOptions{}) 170 c.Assert(err, jc.ErrorIsNil) 171 172 c.Assert(obj, jc.DeepEquals, &resource.ServiceAccount) 173 }