github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/actor/v2v3action/service_instance.go (about)

     1  package v2v3action
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
    10  )
    11  
    12  func (actor Actor) ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganizationName(shareToSpaceName string, serviceInstanceName string, sourceSpaceGUID string, shareToOrgName string) (Warnings, error) {
    13  	var allWarnings Warnings
    14  
    15  	organization, warningsV3, err := actor.V3Actor.GetOrganizationByName(shareToOrgName)
    16  	allWarnings = Warnings(warningsV3)
    17  	if err != nil {
    18  		return allWarnings, err
    19  	}
    20  
    21  	warnings, err := actor.ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization(shareToSpaceName, serviceInstanceName, sourceSpaceGUID, organization.GUID)
    22  	allWarnings = append(allWarnings, warnings...)
    23  	return allWarnings, err
    24  }
    25  
    26  func (actor Actor) ShareServiceInstanceToSpaceNameByNameAndSpaceAndOrganization(shareToSpaceName string, serviceInstanceName string, sourceSpaceGUID string, shareToOrgGUID string) (Warnings, error) {
    27  	var allWarnings Warnings
    28  
    29  	serviceInstance, warningsV2, err := actor.V2Actor.GetServiceInstanceByNameAndSpace(serviceInstanceName, sourceSpaceGUID)
    30  	allWarnings = append(allWarnings, warningsV2...)
    31  	if err != nil {
    32  		if _, ok := err.(actionerror.ServiceInstanceNotFoundError); ok {
    33  			return allWarnings, actionerror.SharedServiceInstanceNotFoundError{}
    34  		}
    35  		return allWarnings, err
    36  	}
    37  
    38  	shareToSpace, warningsV2, err := actor.V2Actor.GetSpaceByOrganizationAndName(shareToOrgGUID, shareToSpaceName)
    39  	allWarnings = append(allWarnings, warningsV2...)
    40  	if err != nil {
    41  		return allWarnings, err
    42  	}
    43  
    44  	if serviceInstance.IsManaged() {
    45  		var warnings Warnings
    46  		_, warnings, err = actor.isServiceInstanceShareableByService(serviceInstance.ServiceGUID)
    47  		allWarnings = append(allWarnings, warnings...)
    48  		if err != nil {
    49  			return allWarnings, err
    50  		}
    51  
    52  		var serviceInstanceSharedTos []v2action.ServiceInstanceSharedTo
    53  		serviceInstanceSharedTos, warningsV2, err = actor.V2Actor.GetServiceInstanceSharedTosByServiceInstance(serviceInstance.GUID)
    54  		allWarnings = append(allWarnings, warningsV2...)
    55  		if err != nil {
    56  			return allWarnings, err
    57  		}
    58  
    59  		for _, sharedTo := range serviceInstanceSharedTos {
    60  			if sharedTo.SpaceGUID == shareToSpace.GUID {
    61  				allWarnings = append(allWarnings, fmt.Sprintf("Service instance %s is already shared with that space.", serviceInstanceName))
    62  				return allWarnings, actionerror.ServiceInstanceAlreadySharedError{}
    63  			}
    64  		}
    65  	}
    66  
    67  	_, warningsV3, err := actor.V3Actor.ShareServiceInstanceToSpaces(serviceInstance.GUID, []string{shareToSpace.GUID})
    68  	allWarnings = append(allWarnings, warningsV3...)
    69  	return allWarnings, err
    70  }
    71  
    72  func (actor Actor) isServiceInstanceShareableByService(serviceGUID string) (bool, Warnings, error) {
    73  	var allWarnings Warnings
    74  
    75  	service, warningsV2, err := actor.V2Actor.GetService(serviceGUID)
    76  	allWarnings = append(allWarnings, warningsV2...)
    77  	if err != nil {
    78  		return false, allWarnings, err
    79  	}
    80  
    81  	featureFlags, warningsV2, err := actor.V2Actor.GetFeatureFlags()
    82  	allWarnings = append(allWarnings, warningsV2...)
    83  	if err != nil {
    84  		return false, allWarnings, err
    85  	}
    86  
    87  	var featureFlagEnabled bool
    88  	for _, flag := range featureFlags {
    89  		if flag.Name == string(ccv2.FeatureFlagServiceInstanceSharing) {
    90  			featureFlagEnabled = flag.Enabled
    91  		}
    92  	}
    93  
    94  	if !featureFlagEnabled || !service.Extra.Shareable {
    95  		return false, allWarnings, actionerror.ServiceInstanceNotShareableError{
    96  			FeatureFlagEnabled:          featureFlagEnabled,
    97  			ServiceBrokerSharingEnabled: service.Extra.Shareable,
    98  		}
    99  	}
   100  
   101  	return true, allWarnings, nil
   102  }
   103  
   104  func (actor Actor) UnshareServiceInstanceFromOrganizationNameAndSpaceNameByNameAndSpace(sharedToOrgName string, sharedToSpaceName string, serviceInstanceName string, currentlyTargetedSpaceGUID string) (Warnings, error) {
   105  	var allWarnings Warnings
   106  	serviceInstance, warningsV2, err := actor.V2Actor.GetServiceInstanceByNameAndSpace(serviceInstanceName, currentlyTargetedSpaceGUID)
   107  	allWarnings = append(allWarnings, warningsV2...)
   108  	if err != nil {
   109  		if _, ok := err.(actionerror.ServiceInstanceNotFoundError); ok {
   110  			return allWarnings, actionerror.SharedServiceInstanceNotFoundError{}
   111  		}
   112  		return allWarnings, err
   113  	}
   114  
   115  	sharedTos, warningsV2, err := actor.V2Actor.GetServiceInstanceSharedTosByServiceInstance(serviceInstance.GUID)
   116  	allWarnings = append(allWarnings, warningsV2...)
   117  	if err != nil {
   118  		return allWarnings, err
   119  	}
   120  
   121  	sharedToSpaceGUID := ""
   122  	for _, sharedTo := range sharedTos {
   123  		if strings.EqualFold(sharedTo.SpaceName, sharedToSpaceName) && strings.EqualFold(sharedTo.OrganizationName, sharedToOrgName) {
   124  			sharedToSpaceGUID = sharedTo.SpaceGUID
   125  		}
   126  	}
   127  	if sharedToSpaceGUID == "" {
   128  		return allWarnings, actionerror.ServiceInstanceNotSharedToSpaceError{ServiceInstanceName: serviceInstanceName}
   129  	}
   130  
   131  	warningsV3, err := actor.V3Actor.UnshareServiceInstanceByServiceInstanceAndSpace(serviceInstance.GUID, sharedToSpaceGUID)
   132  	allWarnings = append(allWarnings, warningsV3...)
   133  	return allWarnings, err
   134  }