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 }