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 }