github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/examples/resource/controller/service-key/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "log" 6 "os" 7 8 bluemix "github.com/IBM-Cloud/bluemix-go" 9 iam "github.com/IBM-Cloud/bluemix-go/api/iam/iamv1" 10 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog" 11 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/controller" 12 "github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/management" 13 "github.com/IBM-Cloud/bluemix-go/models" 14 "github.com/IBM-Cloud/bluemix-go/session" 15 "github.com/IBM-Cloud/bluemix-go/trace" 16 "github.com/IBM-Cloud/bluemix-go/utils" 17 ) 18 19 func main() { 20 21 var name string 22 flag.StringVar(&name, "name", "", "Name of the service-instance") 23 24 var servicename string 25 flag.StringVar(&servicename, "service", "", "Name of the service offering") 26 27 var serviceplan string 28 flag.StringVar(&serviceplan, "plan", "", "Name of the service plan") 29 30 var resourcegrp string 31 flag.StringVar(&resourcegrp, "resource-group", "", "Name of the resource group") 32 33 var location string 34 flag.StringVar(&location, "location", "", "location or region to deploy") 35 36 var key string 37 flag.StringVar(&key, "key", "", "Name of the service key") 38 39 var role string 40 flag.StringVar(&role, "role", "", "Name of the role") 41 42 flag.Parse() 43 44 if name == "" || servicename == "" || serviceplan == "" || location == "" { 45 flag.Usage() 46 os.Exit(1) 47 } 48 49 trace.Logger = trace.NewLogger("true") 50 sess, err := session.New(&bluemix.Config{Debug: true}) 51 if err != nil { 52 log.Fatal(err) 53 } 54 55 catalogClient, err := catalog.New(sess) 56 57 if err != nil { 58 log.Fatal(err) 59 } 60 resCatalogAPI := catalogClient.ResourceCatalog() 61 62 service, err := resCatalogAPI.FindByName(servicename, true) 63 if err != nil { 64 log.Fatal(err) 65 } 66 67 servicePlanID, err := resCatalogAPI.GetServicePlanID(service[0], serviceplan) 68 if err != nil { 69 log.Fatal(err) 70 } 71 72 if servicePlanID == "" { 73 _, err := resCatalogAPI.GetServicePlan(serviceplan) 74 if err != nil { 75 log.Fatal(err) 76 } 77 servicePlanID = serviceplan 78 } 79 80 deployments, err := resCatalogAPI.ListDeployments(servicePlanID) 81 if err != nil { 82 log.Fatal(err) 83 } 84 85 if len(deployments) == 0 { 86 87 log.Printf("No deployment found for service plan : %s", serviceplan) 88 os.Exit(1) 89 } 90 91 supportedDeployments := []models.ServiceDeployment{} 92 supportedLocations := make(map[string]bool) 93 for _, d := range deployments { 94 if d.Metadata.RCCompatible { 95 deploymentLocation := d.Metadata.Deployment.Location 96 supportedLocations[deploymentLocation] = true 97 if deploymentLocation == location { 98 supportedDeployments = append(supportedDeployments, d) 99 } 100 } 101 } 102 103 if len(supportedDeployments) == 0 { 104 locationList := make([]string, 0, len(supportedLocations)) 105 for l := range supportedLocations { 106 locationList = append(locationList, l) 107 } 108 log.Printf("No deployment found for service plan %s at location %s.\nValid location(s) are: %q.\nUse service instance example if the service is a Cloud Foundry service.", serviceplan, location, locationList) 109 os.Exit(1) 110 } 111 112 managementClient, err := management.New(sess) 113 if err != nil { 114 log.Fatal(err) 115 } 116 117 var resourceGroupID string 118 resGrpAPI := managementClient.ResourceGroup() 119 120 if resourcegrp == "" { 121 122 resourceGroupQuery := management.ResourceGroupQuery{ 123 Default: true, 124 } 125 126 grpList, err := resGrpAPI.List(&resourceGroupQuery) 127 128 if err != nil { 129 log.Fatal(err) 130 } 131 resourceGroupID = grpList[0].ID 132 133 } else { 134 grp, err := resGrpAPI.FindByName(nil, resourcegrp) 135 if err != nil { 136 log.Fatal(err) 137 } 138 resourceGroupID = grp[0].ID 139 } 140 141 controllerClient, err := controller.New(sess) 142 143 if err != nil { 144 log.Fatal(err) 145 } 146 147 resServiceInstanceAPI := controllerClient.ResourceServiceInstance() 148 149 var serviceInstancePayload = controller.CreateServiceInstanceRequest{ 150 Name: name, 151 ServicePlanID: servicePlanID, 152 ResourceGroupID: resourceGroupID, 153 TargetCrn: supportedDeployments[0].CatalogCRN, 154 } 155 156 serviceInstance, err := resServiceInstanceAPI.CreateInstance(serviceInstancePayload) 157 158 if err != nil { 159 log.Fatal(err) 160 } 161 162 log.Println("Resoure service Instance Details :", serviceInstance) 163 164 serviceInstance, err = resServiceInstanceAPI.GetInstance(serviceInstance.ID) 165 if err != nil { 166 log.Fatal(err) 167 } 168 169 log.Println("Resoure service Instance Details :", serviceInstance) 170 171 instance, err := resServiceInstanceAPI.GetInstance(serviceInstance.ID) 172 if err != nil { 173 log.Fatal(err) 174 } 175 176 serviceresp, err := resCatalogAPI.Get(instance.ServiceID, true) 177 if err != nil { 178 log.Fatal(err) 179 } 180 181 iamClient, err := iam.New(sess) 182 183 if err != nil { 184 log.Fatal(err) 185 } 186 187 serviceRolesAPI := iamClient.ServiceRoles() 188 189 var roles []models.PolicyRole 190 191 if serviceresp.Name == "" { 192 roles, err = serviceRolesAPI.ListSystemDefinedRoles() 193 194 } else { 195 roles, err = serviceRolesAPI.ListServiceRoles(serviceresp.Name) 196 } 197 198 if err != nil { 199 log.Fatal(err) 200 } 201 202 roleMatch, err := utils.FindRoleByName(roles, role) 203 if err != nil { 204 log.Fatal(err) 205 } 206 207 parameters := make(map[string]interface{}) 208 209 parameters["role_crn"] = roleMatch.ID 210 211 resServiceKeyAPI := controllerClient.ResourceServiceKey() 212 213 params := controller.CreateServiceKeyRequest{ 214 Name: key, 215 SourceCRN: instance.Crn, 216 Parameters: parameters, 217 } 218 219 keyresp, err := resServiceKeyAPI.CreateKey(params) 220 if err != nil { 221 log.Fatal(err) 222 } 223 224 log.Println("Resoure service key Details :", keyresp) 225 226 keyresp, err = resServiceKeyAPI.GetKey(keyresp.ID) 227 if err != nil { 228 log.Fatal(err) 229 } 230 231 log.Println("Resoure service key Details :", keyresp) 232 233 err = resServiceKeyAPI.DeleteKey(keyresp.ID) 234 235 if err != nil { 236 log.Fatal(err) 237 } 238 239 err = resServiceInstanceAPI.DeleteInstance(serviceInstance.ID, true) 240 241 if err != nil { 242 log.Fatal(err) 243 } 244 245 }