github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/bind_service_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/liamawhite/cli-with-i18n/actor/sharedaction"
     8  	"github.com/liamawhite/cli-with-i18n/actor/v2action"
     9  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccerror"
    10  	oldCmd "github.com/liamawhite/cli-with-i18n/cf/cmd"
    11  	"github.com/liamawhite/cli-with-i18n/command"
    12  	"github.com/liamawhite/cli-with-i18n/command/flag"
    13  	"github.com/liamawhite/cli-with-i18n/command/v2/shared"
    14  )
    15  
    16  //go:generate counterfeiter . BindServiceActor
    17  
    18  type BindServiceActor interface {
    19  	BindServiceBySpace(appName string, ServiceInstanceName string, spaceGUID string, parameters map[string]interface{}) (v2action.Warnings, error)
    20  }
    21  
    22  type BindServiceCommand struct {
    23  	RequiredArgs     flag.BindServiceArgs          `positional-args:"yes"`
    24  	ParametersAsJSON flag.JSONOrFileWithValidation `short:"c" description:"Valid JSON object containing service-specific configuration parameters, provided either in-line or in a file. For a list of supported configuration parameters, see documentation for the particular service offering."`
    25  	usage            interface{}                   `usage:"CF_NAME bind-service APP_NAME SERVICE_INSTANCE [-c PARAMETERS_AS_JSON]\n\n   Optionally provide service-specific configuration parameters in a valid JSON object in-line:\n\n   CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c '{\"name\":\"value\",\"name\":\"value\"}'\n\n   Optionally provide a file containing service-specific configuration parameters in a valid JSON object. \n   The path to the parameters file can be an absolute or relative path to a file.\n   CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c PATH_TO_FILE\n\n   Example of valid JSON object:\n   {\n      \"permissions\": \"read-only\"\n   }\n\nEXAMPLES:\n   Linux/Mac:\n      CF_NAME bind-service myapp mydb -c '{\"permissions\":\"read-only\"}'\n\n   Windows Command Line:\n      CF_NAME bind-service myapp mydb -c \"{\\\"permissions\\\":\\\"read-only\\\"}\"\n\n   Windows PowerShell:\n      CF_NAME bind-service myapp mydb -c '{\\\"permissions\\\":\\\"read-only\\\"}'\n\n   CF_NAME bind-service myapp mydb -c ~/workspace/tmp/instance_config.json"`
    26  	relatedCommands  interface{}                   `related_commands:"services"`
    27  
    28  	UI          command.UI
    29  	Config      command.Config
    30  	SharedActor command.SharedActor
    31  	Actor       BindServiceActor
    32  }
    33  
    34  func (cmd *BindServiceCommand) Setup(config command.Config, ui command.UI) error {
    35  	cmd.UI = ui
    36  	cmd.Config = config
    37  	cmd.SharedActor = sharedaction.NewActor(config)
    38  
    39  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    44  
    45  	return nil
    46  }
    47  
    48  func (cmd BindServiceCommand) Execute(args []string) error {
    49  	if !cmd.Config.Experimental() {
    50  		oldCmd.Main(os.Getenv("CF_TRACE"), os.Args)
    51  		return nil
    52  	}
    53  
    54  	err := cmd.SharedActor.CheckTarget(cmd.Config, true, true)
    55  	if err != nil {
    56  		return shared.HandleError(err)
    57  	}
    58  
    59  	user, err := cmd.Config.CurrentUser()
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	cmd.UI.DisplayTextWithFlavor("Binding service {{.ServiceName}} to app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{
    65  		"ServiceName": cmd.RequiredArgs.ServiceInstanceName,
    66  		"AppName":     cmd.RequiredArgs.AppName,
    67  		"OrgName":     cmd.Config.TargetedOrganization().Name,
    68  		"SpaceName":   cmd.Config.TargetedSpace().Name,
    69  		"CurrentUser": user.Name,
    70  	})
    71  
    72  	warnings, err := cmd.Actor.BindServiceBySpace(cmd.RequiredArgs.AppName, cmd.RequiredArgs.ServiceInstanceName, cmd.Config.TargetedSpace().GUID, cmd.ParametersAsJSON)
    73  	cmd.UI.DisplayWarnings(warnings)
    74  	if err != nil {
    75  		if _, isTakenError := err.(ccerror.ServiceBindingTakenError); isTakenError {
    76  			cmd.UI.DisplayText("App {{.AppName}} is already bound to {{.ServiceName}}.", map[string]interface{}{
    77  				"AppName":     cmd.RequiredArgs.AppName,
    78  				"ServiceName": cmd.RequiredArgs.ServiceInstanceName,
    79  			})
    80  			cmd.UI.DisplayOK()
    81  			return nil
    82  		}
    83  		return shared.HandleError(err)
    84  	}
    85  
    86  	cmd.UI.DisplayOK()
    87  	cmd.UI.DisplayText("TIP: Use '{{.CFCommand}} {{.AppName}}' to ensure your env variable changes take effect", map[string]interface{}{
    88  		"CFCommand": fmt.Sprintf("%s restage", cmd.Config.BinaryName()),
    89  		"AppName":   cmd.RequiredArgs.AppName,
    90  	})
    91  
    92  	return nil
    93  }