github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/examples/mccp/app/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"time"
     9  
    10  	"github.com/IBM-Cloud/bluemix-go/api/mccp/mccpv2"
    11  	"github.com/IBM-Cloud/bluemix-go/helpers"
    12  	"github.com/IBM-Cloud/bluemix-go/session"
    13  	"github.com/IBM-Cloud/bluemix-go/trace"
    14  )
    15  
    16  func main() {
    17  
    18  	var path string
    19  	flag.StringVar(&path, "path", "", "Bluemix path for application")
    20  
    21  	var org string
    22  	flag.StringVar(&org, "org", "", "Bluemix Organization")
    23  
    24  	var name string
    25  	flag.StringVar(&name, "name", "", "Bluemix app name")
    26  
    27  	var space string
    28  	flag.StringVar(&space, "space", "", "Bluemix Space")
    29  
    30  	var diego bool
    31  	flag.BoolVar(&diego, "diego", false, "Bluemix Diego")
    32  
    33  	var dockerImage string
    34  	flag.StringVar(&dockerImage, "docker", "", "Docker image")
    35  
    36  	var sharedDomain string
    37  	flag.StringVar(&sharedDomain, "shared_domain", "mybluemix.net", "Bluemix shared domain")
    38  
    39  	var timeout time.Duration
    40  	flag.DurationVar(&timeout, "timeout", 120*time.Second, "Maximum time to wait for application to start")
    41  
    42  	var routeName string
    43  	flag.StringVar(&routeName, "route", "", "Bluemix app route")
    44  
    45  	var buildpack string
    46  	flag.StringVar(&buildpack, "buildpack", "https://github.com/cloudfoundry/nodejs-buildpack.git", "Bluemix buildpack")
    47  
    48  	var newBuildPack string
    49  	flag.StringVar(&newBuildPack, "new_buildpack", "", "Bluemix buildpack")
    50  
    51  	var serviceOffering string
    52  	flag.StringVar(&serviceOffering, "so", "cleardb", "Bluemix Service Offering")
    53  
    54  	var servicePlan string
    55  	flag.StringVar(&servicePlan, "plan", "cb5", "Bluemix Service Plan")
    56  
    57  	var instance int
    58  	flag.IntVar(&instance, "instance", 2, "Bluemix App Instance")
    59  
    60  	var serviceInstanceName string
    61  	flag.StringVar(&serviceInstanceName, "svcname", "myservice", "Bluemix service instance name for the cloudantnosqldb offering")
    62  
    63  	var memory int
    64  	flag.IntVar(&memory, "memory", 128, "Bluemix app memory")
    65  
    66  	var diskQuota int
    67  	flag.IntVar(&diskQuota, "diskQuota", 512, "Bluemix app diskquota")
    68  
    69  	var clean bool
    70  	flag.BoolVar(&clean, "clean", false, "If set to true it will delete the application")
    71  
    72  	flag.Parse()
    73  
    74  	if name == "" || space == "" || org == "" || path == "" || routeName == "" {
    75  		flag.Usage()
    76  		os.Exit(1)
    77  	}
    78  
    79  	trace.Logger = trace.NewLogger("true")
    80  
    81  	sess, err := session.New()
    82  	if err != nil {
    83  		log.Fatal(err)
    84  	}
    85  
    86  	client, err := mccpv2.New(sess)
    87  
    88  	if err != nil {
    89  		log.Fatal(err)
    90  	}
    91  	region := sess.Config.Region
    92  	orgAPI := client.Organizations()
    93  	myorg, err := orgAPI.FindByName(org, region)
    94  
    95  	if err != nil {
    96  		log.Fatal(err)
    97  	}
    98  
    99  	spaceAPI := client.Spaces()
   100  	myspace, err := spaceAPI.FindByNameInOrg(myorg.GUID, space, region)
   101  
   102  	if err != nil {
   103  		log.Fatal(err)
   104  	}
   105  	log.Println(myorg.GUID, myspace.GUID)
   106  
   107  	serviceOfferingAPI := client.ServiceOfferings()
   108  	myserviceOff, err := serviceOfferingAPI.FindByLabel(serviceOffering)
   109  	if err != nil {
   110  		log.Fatal(err)
   111  	}
   112  	servicePlanAPI := client.ServicePlans()
   113  	plan, err := servicePlanAPI.FindPlanInServiceOffering(myserviceOff.GUID, servicePlan)
   114  	if err != nil {
   115  		log.Fatal(err)
   116  	}
   117  
   118  	serviceInstanceAPI := client.ServiceInstances()
   119  	myService, err := serviceInstanceAPI.Create(mccpv2.ServiceInstanceCreateRequest{
   120  		Name:      serviceInstanceName,
   121  		PlanGUID:  plan.GUID,
   122  		SpaceGUID: myspace.GUID,
   123  	})
   124  	if err != nil {
   125  		log.Fatal(err)
   126  	}
   127  
   128  	appAPI := client.Apps()
   129  	_, err = appAPI.FindByName(myspace.GUID, name)
   130  
   131  	if err == nil {
   132  		log.Fatal(err)
   133  	}
   134  
   135  	var appPayload = mccpv2.AppRequest{
   136  		Name:               helpers.String(name),
   137  		SpaceGUID:          helpers.String(myspace.GUID),
   138  		BuildPack:          helpers.String(buildpack),
   139  		Instances:          instance,
   140  		Memory:             memory,
   141  		DiskQuota:          diskQuota,
   142  		Diego:              diego,
   143  		HealthCheckTimeout: 10,
   144  		//DockerImage: helpers.String(dockerImage),
   145  	}
   146  
   147  	newapp, err := appAPI.Create(appPayload)
   148  	if err != nil {
   149  		log.Fatal(err)
   150  	}
   151  
   152  	sharedDomainAPI := client.SharedDomains()
   153  	domain, err := sharedDomainAPI.FindByName(sharedDomain)
   154  	fmt.Println(domain)
   155  	if err != nil {
   156  		log.Fatal(err)
   157  	}
   158  
   159  	routeAPI := client.Routes()
   160  	route, err := routeAPI.Find(routeName, domain.GUID)
   161  	fmt.Println(route)
   162  	if err != nil {
   163  		log.Fatal(err)
   164  	}
   165  
   166  	if len(route) == 0 {
   167  		req := mccpv2.RouteRequest{
   168  			Host:       routeName,
   169  			DomainGUID: domain.GUID,
   170  			SpaceGUID:  myspace.GUID,
   171  		}
   172  		newroute, err := routeAPI.Create(req)
   173  		fmt.Println(newroute)
   174  		if err != nil {
   175  			log.Fatal(err)
   176  		}
   177  		bindRoute, err := appAPI.BindRoute(newapp.Metadata.GUID, newroute.Metadata.GUID)
   178  		fmt.Println(bindRoute)
   179  		if err != nil {
   180  			log.Fatal(err)
   181  		}
   182  
   183  	} else {
   184  		bindRoute, err := appAPI.BindRoute(newapp.Metadata.GUID, route[0].GUID)
   185  		fmt.Println(bindRoute)
   186  		if err != nil {
   187  			log.Fatal(err)
   188  		}
   189  
   190  	}
   191  	if dockerImage == "" {
   192  		uploadResponse, err := appAPI.Upload(newapp.Metadata.GUID, path)
   193  		if err != nil {
   194  			log.Fatal(err)
   195  		}
   196  		log.Println(uploadResponse)
   197  	}
   198  
   199  	appState, err := appAPI.Start(newapp.Metadata.GUID, timeout)
   200  	if err != nil {
   201  		log.Fatal(err)
   202  	}
   203  	if appState.PackageState != mccpv2.AppStagedState {
   204  		log.Fatalf("Application couldn't be staged, current status is  %s", appState.PackageState)
   205  	}
   206  	if appState.InstanceState != mccpv2.AppRunningState {
   207  		log.Fatalf("Application is not yet running, current status is  %s", appState.InstanceState)
   208  	}
   209  
   210  	sbAPI := client.ServiceBindings()
   211  
   212  	sb, err := sbAPI.Create(mccpv2.ServiceBindingRequest{
   213  		ServiceInstanceGUID: myService.Metadata.GUID,
   214  		AppGUID:             newapp.Metadata.GUID,
   215  	})
   216  
   217  	if err != nil {
   218  		log.Fatal(err)
   219  	}
   220  	sbFields, err := sbAPI.Get(sb.Metadata.GUID)
   221  	if err != nil {
   222  		log.Fatal(err)
   223  	}
   224  	log.Println(*sbFields)
   225  
   226  	apps, err := appAPI.Get(newapp.Metadata.GUID)
   227  	fmt.Println(apps)
   228  	if err != nil {
   229  		log.Fatal(err)
   230  	}
   231  
   232  	//Update name, buildpack
   233  	appPayload.Name = helpers.String("testappupdate")
   234  	appPayload.SpaceGUID = helpers.String(myspace.GUID)
   235  	appPayload.BuildPack = helpers.String(newBuildPack)
   236  
   237  	updateapp, err := appAPI.Update(newapp.Metadata.GUID, appPayload)
   238  	fmt.Println(updateapp)
   239  	if err != nil {
   240  		log.Fatal(err)
   241  	}
   242  
   243  	appInstances, err := appAPI.Instances(updateapp.Metadata.GUID)
   244  	fmt.Println(appInstances)
   245  	if err != nil {
   246  		log.Fatal(err)
   247  	}
   248  
   249  	if clean {
   250  		err := appAPI.DeleteServiceBindings(updateapp.Metadata.GUID, sb.Metadata.GUID)
   251  		if err != nil {
   252  			log.Fatal(err)
   253  		}
   254  		err = appAPI.Delete(updateapp.Metadata.GUID, true, true)
   255  		if err != nil {
   256  			log.Fatal(err)
   257  		}
   258  	}
   259  
   260  }