github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/command/v3/unshare_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 . UnshareServiceActor
    21  
    22  type UnshareServiceActor interface {
    23  	UnshareServiceInstanceFromOrganizationNameAndSpaceNameByNameAndSpace(sharedToOrgName string, sharedToSpaceName string, serviceInstanceName string, currentlyTargetedSpaceGUID string) (v2v3action.Warnings, error)
    24  	CloudControllerV3APIVersion() string
    25  }
    26  
    27  type UnshareServiceCommand struct {
    28  	RequiredArgs      flag.ServiceInstance `positional-args:"yes"`
    29  	SharedToOrgName   string               `short:"o" required:"false" description:"Org of the other space (Default: targeted org)"`
    30  	SharedToSpaceName string               `short:"s" required:"true" description:"Space to unshare the service instance from"`
    31  	Force             bool                 `short:"f" description:"Force unshare without confirmation"`
    32  	usage             interface{}          `usage:"cf unshare-service SERVICE_INSTANCE -s OTHER_SPACE [-o OTHER_ORG] [-f]"`
    33  	relatedCommands   interface{}          `related_commands:"delete-service, service, services, share-service, unbind-service"`
    34  
    35  	UI          command.UI
    36  	Config      command.Config
    37  	SharedActor command.SharedActor
    38  	Actor       UnshareServiceActor
    39  }
    40  
    41  func (cmd *UnshareServiceCommand) 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 UnshareServiceCommand) 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.SharedToOrgName != "" {
    89  		orgName = cmd.SharedToOrgName
    90  	}
    91  
    92  	if !cmd.Force {
    93  		cmd.UI.DisplayWarning("WARNING: Unsharing this service instance will remove any service bindings that exist in any spaces that this instance is shared into. This could cause applications to stop working.")
    94  		cmd.UI.DisplayNewline()
    95  
    96  		response, promptErr := cmd.UI.DisplayBoolPrompt(false, "Really unshare the service instance?", map[string]interface{}{
    97  			"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
    98  		})
    99  		if promptErr != nil {
   100  			return promptErr
   101  		}
   102  		if !response {
   103  			cmd.UI.DisplayText("Unshare cancelled")
   104  			return nil
   105  		}
   106  	}
   107  
   108  	cmd.UI.DisplayTextWithFlavor("Unsharing service instance {{.ServiceInstanceName}} from org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
   109  		"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
   110  		"OrgName":             orgName,
   111  		"SpaceName":           cmd.SharedToSpaceName,
   112  		"Username":            user.Name,
   113  	})
   114  
   115  	warnings, err := cmd.Actor.UnshareServiceInstanceFromOrganizationNameAndSpaceNameByNameAndSpace(orgName, cmd.SharedToSpaceName, cmd.RequiredArgs.ServiceInstance, cmd.Config.TargetedSpace().GUID)
   116  	cmd.UI.DisplayWarnings(warnings)
   117  	if err != nil {
   118  		switch err.(type) {
   119  		case actionerror.ServiceInstanceNotSharedToSpaceError:
   120  			cmd.UI.DisplayText("Service instance {{.ServiceInstanceName}} is not shared with space {{.SpaceName}} in organization {{.OrgName}}.", map[string]interface{}{
   121  				"ServiceInstanceName": cmd.RequiredArgs.ServiceInstance,
   122  				"SpaceName":           cmd.SharedToSpaceName,
   123  				"OrgName":             orgName,
   124  			})
   125  		default:
   126  			return err
   127  		}
   128  	}
   129  
   130  	cmd.UI.DisplayOK()
   131  	return nil
   132  }