github.com/Thanhphan1147/cloudfoundry-cli@v7.1.0+incompatible/actor/v2v3action/service_instance.go (about)

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