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  }