github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev1/controller/resource_service_key_test.go (about) 1 package controller 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 8 "github.com/IBM-Cloud/bluemix-go/client" 9 "github.com/IBM-Cloud/bluemix-go/crn" 10 11 "github.com/IBM-Cloud/bluemix-go" 12 13 "github.com/IBM-Cloud/bluemix-go/session" 14 "github.com/onsi/gomega/ghttp" 15 16 . "github.com/onsi/ginkgo" 17 . "github.com/onsi/gomega" 18 ) 19 20 var _ = Describe("ServiceKeys", func() { 21 var server *ghttp.Server 22 AfterEach(func() { 23 server.Close() 24 }) 25 26 Describe("GetKeys()", func() { 27 Context("When there is no service key", func() { 28 BeforeEach(func() { 29 server = ghttp.NewServer() 30 server.AppendHandlers( 31 ghttp.CombineHandlers( 32 ghttp.VerifyRequest(http.MethodGet, "/v1/resource_keys"), 33 ghttp.RespondWith(http.StatusOK, `{"resources":[]}`), 34 ), 35 ) 36 }) 37 It("should return zero service key", func() { 38 repo := newTestServiceKeyRepo(server.URL()) 39 keys, err := repo.GetKeys("") 40 Expect(err).ShouldNot(HaveOccurred()) 41 Expect(keys).Should(BeEmpty()) 42 }) 43 }) 44 Context("When there is one service key", func() { 45 BeforeEach(func() { 46 server = ghttp.NewServer() 47 server.AppendHandlers( 48 ghttp.CombineHandlers( 49 ghttp.VerifyRequest(http.MethodGet, "/v1/resource_keys"), 50 ghttp.RespondWith(http.StatusOK, `{"rows_count":1, 51 "resources":[ 52 {"id":"fdb5785b-c2c1-4f5e-b4ea-686083af250d", 53 "url":"/v1/resource_keys/fdb5785b-c2c1-4f5e-b4ea-686083af250d", 54 "created_at":"2017-08-04T05:53:55.69509063Z", 55 "updated_at":null, 56 "deleted_at":null, 57 "source_crn":"crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812::", 58 "parameters":{"role_crn":"crn:v1:bluemix:public:iam::::role:Operator"}, 59 "crn":"crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812:resource-key:fdb5785b-c2c1-4f5e-b4ea-686083af250d", 60 "state":"active", 61 "account_id":"560df2058b1e7c402303cc598b3e5540", 62 "credentials": 63 {"ApiKey-2bdfd49d-889e-4270-8d96-ed4206415b09": 64 {"boundTo":"crn:v1:::iam::a/560df2058b1e7c402303cc598b3e5540::serviceid:ServiceId-7ee2fcde-da3e-4880-93d9-7e2fa26238fc", 65 "name":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key2", 66 "description":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key2", 67 "format":"APIKEY", 68 "apiKey":"[PRIVATE DATA HIDDEN]"}, 69 "ApiKey-e865a2b1-08e5-4c85-8756-0299286f6a79": 70 {"boundTo":"crn:v1:::iam::a/560df2058b1e7c402303cc598b3e5540::serviceid:ServiceId-7ee2fcde-da3e-4880-93d9-7e2fa26238fc", 71 "name":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key1","description":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key1", 72 "format":"APIKEY", 73 "apiKey":"[PRIVATE DATA HIDDEN]" 74 }}}]}`), 75 ), 76 ) 77 }) 78 It("should return one service key", func() { 79 repo := newTestServiceKeyRepo(server.URL()) 80 keys, err := repo.GetKeys("") 81 82 Expect(err).ShouldNot(HaveOccurred()) 83 84 Expect(keys).Should(HaveLen(1)) 85 key := keys[0] 86 Expect(key.ID).Should(Equal("fdb5785b-c2c1-4f5e-b4ea-686083af250d")) 87 Expect(key.SourceCrn.String()).Should(Equal("crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812::")) 88 }) 89 }) 90 }) 91 92 Describe("CreateKey()", func() { 93 94 var ( 95 roleCRN crn.CRN 96 sourceCRN crn.CRN 97 98 serverStatus int 99 serverResponse string 100 ) 101 102 BeforeEach(func() { 103 var err error 104 roleCRN, err = crn.Parse("crn:v1:bluemix:public:iam::::role:Operator") 105 Expect(err).NotTo(HaveOccurred()) 106 107 sourceCRN, err = crn.Parse("crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812::") 108 Expect(err).NotTo(HaveOccurred()) 109 110 serverStatus = http.StatusOK 111 }) 112 113 JustBeforeEach(func() { 114 server = ghttp.NewServer() 115 server.AppendHandlers( 116 ghttp.CombineHandlers( 117 ghttp.VerifyRequest(http.MethodPost, "/v1/resource_keys"), 118 ghttp.VerifyJSON(fmt.Sprintf(`{ 119 "name": "KeyName", 120 "source_crn": "%s", 121 "parameters": { 122 "role_crn": "%s" 123 } 124 }`, sourceCRN.String(), roleCRN.String())), 125 ghttp.RespondWith(serverStatus, serverResponse), 126 ), 127 ) 128 }) 129 130 Context("when creation is successful", func() { 131 BeforeEach(func() { 132 serverStatus = http.StatusOK 133 serverResponse = `{"id":"fdb5785b-c2c1-4f5e-b4ea-686083af250d", 134 "url":"/v1/resource_keys/fdb5785b-c2c1-4f5e-b4ea-686083af250d", 135 "created_at":"2017-08-04T05:53:55.69509063Z", 136 "updated_at":null, 137 "deleted_at":null, 138 "source_crn":"crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812::", 139 "parameters":{ 140 "role_crn":"crn:v1:bluemix:public:iam::::role:Operator"}, 141 "crn":"crn:v1:staging:public:rc-demo-services-cfmysqlv3:us-south:a/560df2058b1e7c402303cc598b3e5540:6d5bd9c5-0412-4f5b-a39a-f322be3d7812:resource-key:fdb5785b-c2c1-4f5e-b4ea-686083af250d", 142 "state":"active", 143 "account_id":"560df2058b1e7c402303cc598b3e5540", 144 "credentials": 145 {"ApiKey-2bdfd49d-889e-4270-8d96-ed4206415b09": 146 {"boundTo":"crn:v1:::iam::a/560df2058b1e7c402303cc598b3e5540::serviceid:ServiceId-7ee2fcde-da3e-4880-93d9-7e2fa26238fc", 147 "name":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key2","description":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key2", 148 "format":"APIKEY", 149 "apiKey":"[PRIVATE DATA HIDDEN]"}, 150 "ApiKey-e865a2b1-08e5-4c85-8756-0299286f6a79": 151 {"boundTo":"crn:v1:::iam::a/560df2058b1e7c402303cc598b3e5540::serviceid:ServiceId-7ee2fcde-da3e-4880-93d9-7e2fa26238fc", 152 "name":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key1", 153 "description":"fdb5785b-c2c1-4f5e-b4ea-686083af250d-key1", 154 "format":"APIKEY", 155 "apiKey":"[PRIVATE DATA HIDDEN]" 156 }}}` 157 }) 158 159 It("should return the new service keys", func() { 160 parameters := make(map[string]interface{}) 161 parameters["role_crn"] = roleCRN 162 key, err := newTestServiceKeyRepo(server.URL()).CreateKey(CreateServiceKeyRequest{ 163 Name: "KeyName", 164 SourceCRN: sourceCRN, 165 Parameters: parameters, 166 }) 167 168 Expect(err).ShouldNot(HaveOccurred()) 169 Expect(key).ShouldNot(BeNil()) 170 Expect(key.ID).Should(Equal("fdb5785b-c2c1-4f5e-b4ea-686083af250d")) 171 }) 172 }) 173 174 Context("when creation failed", func() { 175 BeforeEach(func() { 176 serverStatus = http.StatusBadRequest 177 serverResponse = "invalid role" 178 }) 179 180 It("should return error", func() { 181 parameters := make(map[string]interface{}) 182 parameters["role_crn"] = roleCRN 183 _, err := newTestServiceKeyRepo(server.URL()).CreateKey(CreateServiceKeyRequest{ 184 Name: "KeyName", 185 SourceCRN: sourceCRN, 186 Parameters: parameters, 187 }) 188 Expect(err).To(HaveOccurred()) 189 }) 190 }) 191 }) 192 193 Describe("DeleteKey()", func() { 194 Context("When deletion is successful", func() { 195 BeforeEach(func() { 196 server = ghttp.NewServer() 197 server.AppendHandlers( 198 ghttp.CombineHandlers( 199 ghttp.VerifyRequest(http.MethodDelete, "/v1/resource_keys/db430fea-d29a-4e11-b952-b1e3e18a4ac4"), 200 ghttp.RespondWith(http.StatusNoContent, ``), 201 ), 202 ) 203 }) 204 It("should return success", func() { 205 err := newTestServiceKeyRepo(server.URL()).DeleteKey("db430fea-d29a-4e11-b952-b1e3e18a4ac4") 206 Expect(err).ShouldNot(HaveOccurred()) 207 }) 208 }) 209 210 Context("When deletion failed", func() { 211 BeforeEach(func() { 212 server = ghttp.NewServer() 213 server.AppendHandlers( 214 ghttp.CombineHandlers( 215 ghttp.VerifyRequest(http.MethodDelete, "/v1/resource_keys/abc"), 216 ghttp.RespondWith(http.StatusNotFound, `{"message":"Not found"}`), 217 ), 218 ) 219 }) 220 It("should return error", func() { 221 err := newTestServiceKeyRepo(server.URL()).DeleteKey("abc") 222 Expect(err).Should(HaveOccurred()) 223 }) 224 }) 225 }) 226 }) 227 228 func newTestServiceKeyRepo(url string) ResourceServiceKeyRepository { 229 sess, err := session.New() 230 if err != nil { 231 log.Fatal(err) 232 } 233 conf := sess.Config.Copy() 234 conf.Endpoint = &url 235 236 client := client.Client{ 237 Config: conf, 238 ServiceName: bluemix.ResourceManagementService, 239 } 240 241 return newResourceServiceKeyAPI(&client) 242 }