github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/examples/resource/controller/service-instance/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  	"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/catalog"
    10  	"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/controller"
    11  	"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/management"
    12  	"github.com/IBM-Cloud/bluemix-go/models"
    13  	"github.com/IBM-Cloud/bluemix-go/session"
    14  	"github.com/IBM-Cloud/bluemix-go/trace"
    15  )
    16  
    17  func main() {
    18  
    19  	var name string
    20  	flag.StringVar(&name, "name", "", "Name of the service-instance")
    21  
    22  	var servicename string
    23  	flag.StringVar(&servicename, "service", "", "Name of the service offering")
    24  
    25  	var serviceplan string
    26  	flag.StringVar(&serviceplan, "plan", "", "Name of the service plan")
    27  
    28  	var resourcegrp string
    29  	flag.StringVar(&resourcegrp, "resource-group", "", "Name of the resource group")
    30  
    31  	var location string
    32  	flag.StringVar(&location, "location", "", "location or region to deploy")
    33  
    34  	flag.Parse()
    35  
    36  	if name == "" || servicename == "" || serviceplan == "" || location == "" {
    37  		flag.Usage()
    38  		os.Exit(1)
    39  	}
    40  
    41  	trace.Logger = trace.NewLogger("true")
    42  	sess, err := session.New(&bluemix.Config{Debug: true})
    43  	if err != nil {
    44  		log.Fatal(err)
    45  	}
    46  
    47  	catalogClient, err := catalog.New(sess)
    48  
    49  	if err != nil {
    50  		log.Fatal(err)
    51  	}
    52  	resCatalogAPI := catalogClient.ResourceCatalog()
    53  
    54  	service, err := resCatalogAPI.FindByName(servicename, true)
    55  	if err != nil {
    56  		log.Fatal(err)
    57  	}
    58  
    59  	servicePlanID, err := resCatalogAPI.GetServicePlanID(service[0], serviceplan)
    60  	if err != nil {
    61  		log.Fatal(err)
    62  	}
    63  	if servicePlanID == "" {
    64  		_, err := resCatalogAPI.GetServicePlan(serviceplan)
    65  		if err != nil {
    66  			log.Fatal(err)
    67  		}
    68  		servicePlanID = serviceplan
    69  	}
    70  	deployments, err := resCatalogAPI.ListDeployments(servicePlanID)
    71  	if err != nil {
    72  		log.Fatal(err)
    73  	}
    74  
    75  	if len(deployments) == 0 {
    76  
    77  		log.Printf("No deployment found for service plan : %s", serviceplan)
    78  		os.Exit(1)
    79  	}
    80  
    81  	supportedDeployments := []models.ServiceDeployment{}
    82  	supportedLocations := make(map[string]bool)
    83  	for _, d := range deployments {
    84  		if d.Metadata.RCCompatible {
    85  			deploymentLocation := d.Metadata.Deployment.Location
    86  			supportedLocations[deploymentLocation] = true
    87  			if deploymentLocation == location {
    88  				supportedDeployments = append(supportedDeployments, d)
    89  			}
    90  		}
    91  	}
    92  
    93  	if len(supportedDeployments) == 0 {
    94  		locationList := make([]string, 0, len(supportedLocations))
    95  		for l := range supportedLocations {
    96  			locationList = append(locationList, l)
    97  		}
    98  		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)
    99  		os.Exit(1)
   100  	}
   101  
   102  	managementClient, err := management.New(sess)
   103  	if err != nil {
   104  		log.Fatal(err)
   105  	}
   106  
   107  	var resourceGroupID string
   108  	resGrpAPI := managementClient.ResourceGroup()
   109  
   110  	if resourcegrp == "" {
   111  
   112  		resourceGroupQuery := management.ResourceGroupQuery{
   113  			Default: true,
   114  		}
   115  
   116  		grpList, err := resGrpAPI.List(&resourceGroupQuery)
   117  
   118  		if err != nil {
   119  			log.Fatal(err)
   120  		}
   121  		resourceGroupID = grpList[0].ID
   122  
   123  	} else {
   124  		grp, err := resGrpAPI.FindByName(nil, resourcegrp)
   125  		if err != nil {
   126  			log.Fatal(err)
   127  		}
   128  		resourceGroupID = grp[0].ID
   129  	}
   130  
   131  	controllerClient, err := controller.New(sess)
   132  
   133  	if err != nil {
   134  		log.Fatal(err)
   135  	}
   136  
   137  	resServiceInstanceAPI := controllerClient.ResourceServiceInstance()
   138  
   139  	var serviceInstancePayload = controller.CreateServiceInstanceRequest{
   140  		Name:            name,
   141  		ServicePlanID:   servicePlanID,
   142  		ResourceGroupID: resourceGroupID,
   143  		TargetCrn:       supportedDeployments[0].CatalogCRN,
   144  	}
   145  
   146  	serviceInstance, err := resServiceInstanceAPI.CreateInstance(serviceInstancePayload)
   147  
   148  	if err != nil {
   149  		log.Fatal(err)
   150  	}
   151  
   152  	log.Println("Resoure service Instance Details :", serviceInstance)
   153  
   154  	serviceInstance, err = resServiceInstanceAPI.GetInstance(serviceInstance.ID)
   155  	if err != nil {
   156  		log.Fatal(err)
   157  	}
   158  
   159  	log.Println("Resoure service Instance Details :", serviceInstance)
   160  
   161  	serviceInstanceUpdatePayload := controller.UpdateServiceInstanceRequest{
   162  		Name:          "update-service",
   163  		ServicePlanID: servicePlanID,
   164  	}
   165  
   166  	serviceInstance, err = resServiceInstanceAPI.UpdateInstance(serviceInstance.ID, serviceInstanceUpdatePayload)
   167  
   168  	if err != nil {
   169  		log.Fatal(err)
   170  	}
   171  
   172  	log.Println("Resoure service Instance Details after update :", serviceInstance)
   173  
   174  	err = resServiceInstanceAPI.DeleteInstance(serviceInstance.ID, true)
   175  
   176  	if err != nil {
   177  		log.Fatal(err)
   178  	}
   179  
   180  }