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  }