github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/command/v3/share_service_command.go (about)

     1  package v3
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/actor/v2v3action"
    10  	"code.cloudfoundry.org/cli/actor/v3action"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccversion"
    13  	"code.cloudfoundry.org/cli/command"
    14  	"code.cloudfoundry.org/cli/command/flag"
    15  	"code.cloudfoundry.org/cli/command/translatableerror"
    16  	sharedV2 "code.cloudfoundry.org/cli/command/v2/shared"
    17  	sharedV3 "code.cloudfoundry.org/cli/command/v3/shared"
    18  )
    19  
    20  //go:generate counterfeiter . ShareServiceActor
    21  
    22  type ShareServiceActor interface {
    23  	ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganizationName(sharedToSpaceName string, serviceInstanceName string, sourceSpaceGUID string, sharedToOrgName string) (v2v3action.Warnings, error)
    24  	ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization(sharedToSpaceName string, serviceInstanceName string, sourceSpaceGUID string, sharedToOrgGUID string) (v2v3action.Warnings, error)
    25  	CloudControllerV3APIVersion() string
    26  }
    27  
    28  type ShareServiceCommand struct {
    29  	RequiredArgs    flag.ServiceInstance `positional-args:"yes"`
    30  	OrgName         string               `short:"o" required:"false" description:"Org of the other space (Default: targeted org)"`
    31  	SpaceName       string               `short:"s" required:"true" description:"Space to share the service instance into"`
    32  	usage           interface{}          `usage:"cf share-service SERVICE_INSTANCE -s OTHER_SPACE [-o OTHER_ORG]"`
    33  	relatedCommands interface{}          `related_commands:"bind-service, service, services, unshare-service"`
    34  
    35  	UI          command.UI
    36  	Config      command.Config
    37  	SharedActor command.SharedActor
    38  	Actor       ShareServiceActor
    39  }
    40  
    41  func (cmd *ShareServiceCommand) Setup(config command.Config, ui command.UI) error {
    42  	cmd.UI = ui
    43  	cmd.Config = config
    44  
    45  	sharedActor := sharedaction.NewActor(config)
    46  	cmd.SharedActor = sharedActor
    47  
    48  	ccClientV3, uaaClientV3, err := sharedV3.NewClients(config, ui, true)
    49  	if err != nil {
    50  		if v3Err, ok := err.(ccerror.V3UnexpectedResponseError); ok && v3Err.ResponseCode == http.StatusNotFound {
    51  			return translatableerror.MinimumAPIVersionNotMetError{MinimumVersion: ccversion.MinVersionShareServiceV3}
    52  		}
    53  		return err
    54  	}
    55  
    56  	ccClientV2, uaaClientV2, err := sharedV2.NewClients(config, ui, true)
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	cmd.Actor = v2v3action.NewActor(
    62  		v2action.NewActor(ccClientV2, uaaClientV2, config),
    63  		v3action.NewActor(ccClientV3, config, sharedActor, uaaClientV3),
    64  	)
    65  
    66  	return nil
    67  }
    68  
    69  func (cmd ShareServiceCommand) Execute(args []string) error {
    70  	cmd.UI.DisplayWarning(command.ExperimentalWarning)
    71  
    72  	err := command.MinimumAPIVersionCheck(cmd.Actor.CloudControllerV3APIVersion(), ccversion.MinVersionShareServiceV3)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	err = cmd.SharedActor.CheckTarget(true, true)
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	user, err := cmd.Config.CurrentUser()
    83  	if err != nil {
    84  		return err
    85  	}
    86  
    87  	orgName := cmd.Config.TargetedOrganization().Name
    88  	if cmd.OrgName != "" {
    89  		orgName = cmd.OrgName
    90  	}
    91  
    92  	cmd.UI.DisplayTextWithFlavor("Sharing service instance {{.ServiceInstanceName}} into org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    93  		"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
    94  		"OrgName":             orgName,
    95  		"SpaceName":           cmd.SpaceName,
    96  		"Username":            user.Name,
    97  	})
    98  
    99  	var warnings v2v3action.Warnings
   100  
   101  	if cmd.OrgName != "" {
   102  		warnings, err = cmd.Actor.ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganizationName(cmd.SpaceName, cmd.RequiredArgs.ServiceInstance, cmd.Config.TargetedSpace().GUID, cmd.OrgName)
   103  	} else {
   104  		warnings, err = cmd.Actor.ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization(cmd.SpaceName, cmd.RequiredArgs.ServiceInstance, cmd.Config.TargetedSpace().GUID, cmd.Config.TargetedOrganization().GUID)
   105  	}
   106  
   107  	cmd.UI.DisplayWarnings(warnings)
   108  	if err != nil {
   109  		switch err.(type) {
   110  		case actionerror.ServiceInstanceAlreadySharedError:
   111  			cmd.UI.DisplayText("Service instance {{.ServiceInstanceName}} is already shared with that space.", map[string]interface{}{
   112  				"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
   113  			})
   114  		default:
   115  			return err
   116  		}
   117  	}
   118  
   119  	cmd.UI.DisplayOK()
   120  	return nil
   121  }