github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+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 }