github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/label_updater.go (about) 1 package v7 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 8 "github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action" 9 "github.com/LukasHeimann/cloudfoundrycli/v8/command" 10 "github.com/LukasHeimann/cloudfoundrycli/v8/command/translatableerror" 11 "github.com/LukasHeimann/cloudfoundrycli/v8/types" 12 "github.com/LukasHeimann/cloudfoundrycli/v8/util/configv3" 13 ) 14 15 //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . SetLabelActor 16 17 type SetLabelActor interface { 18 GetCurrentUser() (configv3.User, error) 19 UpdateApplicationLabelsByApplicationName(string, string, map[string]types.NullString) (v7action.Warnings, error) 20 UpdateBuildpackLabelsByBuildpackNameAndStack(string, string, map[string]types.NullString) (v7action.Warnings, error) 21 UpdateDomainLabelsByDomainName(string, map[string]types.NullString) (v7action.Warnings, error) 22 UpdateOrganizationLabelsByOrganizationName(string, map[string]types.NullString) (v7action.Warnings, error) 23 UpdateRouteLabels(string, string, map[string]types.NullString) (v7action.Warnings, error) 24 UpdateSpaceLabelsBySpaceName(string, string, map[string]types.NullString) (v7action.Warnings, error) 25 UpdateStackLabelsByStackName(string, map[string]types.NullString) (v7action.Warnings, error) 26 UpdateServiceInstanceLabels(string, string, map[string]types.NullString) (v7action.Warnings, error) 27 UpdateServiceBrokerLabelsByServiceBrokerName(string, map[string]types.NullString) (v7action.Warnings, error) 28 UpdateServiceOfferingLabels(serviceOfferingName string, serviceBrokerName string, labels map[string]types.NullString) (v7action.Warnings, error) 29 UpdateServicePlanLabels(servicePlanName string, serviceOfferingName string, serviceBrokerName string, labels map[string]types.NullString) (v7action.Warnings, error) 30 } 31 32 type ActionType string 33 34 const ( 35 Unset ActionType = "Removing" 36 Set ActionType = "Setting" 37 ) 38 39 type TargetResource struct { 40 ResourceType string 41 ResourceName string 42 BuildpackStack string 43 ServiceBroker string 44 ServiceOffering string 45 } 46 47 type LabelUpdater struct { 48 targetResource TargetResource 49 labels map[string]types.NullString 50 51 UI command.UI 52 Config command.Config 53 SharedActor command.SharedActor 54 Actor SetLabelActor 55 56 Username string 57 Action ActionType 58 } 59 60 func (cmd *LabelUpdater) Execute(targetResource TargetResource, labels map[string]types.NullString) error { 61 cmd.targetResource = targetResource 62 cmd.labels = labels 63 cmd.targetResource.ResourceType = strings.ToLower(cmd.targetResource.ResourceType) 64 65 user, err := cmd.Actor.GetCurrentUser() 66 if err != nil { 67 return err 68 } 69 70 cmd.Username = user.Name 71 72 if err := cmd.validateFlags(); err != nil { 73 return err 74 } 75 76 if err := cmd.checkTarget(); err != nil { 77 return err 78 } 79 80 var warnings v7action.Warnings 81 switch ResourceType(cmd.targetResource.ResourceType) { 82 case App: 83 cmd.displayMessageWithOrgAndSpace() 84 warnings, err = cmd.Actor.UpdateApplicationLabelsByApplicationName(cmd.targetResource.ResourceName, cmd.Config.TargetedSpace().GUID, cmd.labels) 85 case Buildpack: 86 cmd.displayMessageWithStack() 87 warnings, err = cmd.Actor.UpdateBuildpackLabelsByBuildpackNameAndStack(cmd.targetResource.ResourceName, cmd.targetResource.BuildpackStack, cmd.labels) 88 case Domain: 89 cmd.displayMessageDefault() 90 warnings, err = cmd.Actor.UpdateDomainLabelsByDomainName(cmd.targetResource.ResourceName, cmd.labels) 91 case Org: 92 cmd.displayMessageDefault() 93 warnings, err = cmd.Actor.UpdateOrganizationLabelsByOrganizationName(cmd.targetResource.ResourceName, cmd.labels) 94 case Route: 95 cmd.displayMessageWithOrgAndSpace() 96 warnings, err = cmd.Actor.UpdateRouteLabels(cmd.targetResource.ResourceName, cmd.Config.TargetedSpace().GUID, cmd.labels) 97 case ServiceBroker: 98 cmd.displayMessageDefault() 99 warnings, err = cmd.Actor.UpdateServiceBrokerLabelsByServiceBrokerName(cmd.targetResource.ResourceName, cmd.labels) 100 case ServiceInstance: 101 cmd.displayMessageWithOrgAndSpace() 102 warnings, err = cmd.Actor.UpdateServiceInstanceLabels(cmd.targetResource.ResourceName, cmd.Config.TargetedSpace().GUID, cmd.labels) 103 case ServiceOffering: 104 cmd.displayMessageForServiceCommands() 105 warnings, err = cmd.Actor.UpdateServiceOfferingLabels(cmd.targetResource.ResourceName, cmd.targetResource.ServiceBroker, cmd.labels) 106 case ServicePlan: 107 cmd.displayMessageForServiceCommands() 108 warnings, err = cmd.Actor.UpdateServicePlanLabels(cmd.targetResource.ResourceName, cmd.targetResource.ServiceOffering, cmd.targetResource.ServiceBroker, cmd.labels) 109 case Space: 110 cmd.displayMessageWithOrg() 111 warnings, err = cmd.Actor.UpdateSpaceLabelsBySpaceName(cmd.targetResource.ResourceName, cmd.Config.TargetedOrganization().GUID, cmd.labels) 112 case Stack: 113 cmd.displayMessageDefault() 114 warnings, err = cmd.Actor.UpdateStackLabelsByStackName(cmd.targetResource.ResourceName, cmd.labels) 115 } 116 117 cmd.UI.DisplayWarnings(warnings) 118 if err != nil { 119 return err 120 } 121 122 cmd.UI.DisplayOK() 123 return nil 124 } 125 126 func (cmd *LabelUpdater) checkTarget() error { 127 switch ResourceType(cmd.targetResource.ResourceType) { 128 case App, ServiceInstance, Route: 129 return cmd.SharedActor.CheckTarget(true, true) 130 case Space: 131 return cmd.SharedActor.CheckTarget(true, false) 132 default: 133 return cmd.SharedActor.CheckTarget(false, false) 134 } 135 } 136 137 func (cmd *LabelUpdater) validateFlags() error { 138 resourceType := ResourceType(cmd.targetResource.ResourceType) 139 switch resourceType { 140 case App, Buildpack, Domain, Org, Route, ServiceBroker, ServiceInstance, ServiceOffering, ServicePlan, Space, Stack: 141 default: 142 return errors.New(cmd.UI.TranslateText("Unsupported resource type of '{{.ResourceType}}'", map[string]interface{}{"ResourceType": cmd.targetResource.ResourceType})) 143 } 144 145 if cmd.targetResource.BuildpackStack != "" && resourceType != Buildpack { 146 return translatableerror.ArgumentCombinationError{ 147 Args: []string{ 148 cmd.targetResource.ResourceType, "--stack, -s", 149 }, 150 } 151 } 152 153 if cmd.targetResource.ServiceBroker != "" && !(resourceType == ServiceOffering || resourceType == ServicePlan) { 154 return translatableerror.ArgumentCombinationError{ 155 Args: []string{ 156 cmd.targetResource.ResourceType, "--broker, -b", 157 }, 158 } 159 } 160 161 if cmd.targetResource.ServiceOffering != "" && resourceType != ServicePlan { 162 return translatableerror.ArgumentCombinationError{ 163 Args: []string{ 164 cmd.targetResource.ResourceType, "--offering, -o", 165 }, 166 } 167 } 168 169 return nil 170 } 171 172 func actionForResourceString(action string, resourceType string) string { 173 return fmt.Sprintf("%s label(s) for %s", action, resourceType) 174 } 175 176 func (cmd *LabelUpdater) displayMessageDefault() { 177 cmd.UI.DisplayTextWithFlavor(actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType)+" {{.ResourceName}} as {{.User}}...", map[string]interface{}{ 178 "ResourceName": cmd.targetResource.ResourceName, 179 "User": cmd.Username, 180 }) 181 } 182 183 func (cmd *LabelUpdater) displayMessageWithOrgAndSpace() { 184 cmd.UI.DisplayTextWithFlavor(actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType)+" {{.ResourceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", map[string]interface{}{ 185 "ResourceName": cmd.targetResource.ResourceName, 186 "OrgName": cmd.Config.TargetedOrganization().Name, 187 "SpaceName": cmd.Config.TargetedSpace().Name, 188 "User": cmd.Username, 189 }) 190 } 191 192 func (cmd *LabelUpdater) displayMessageWithStack() { 193 var template string 194 if cmd.targetResource.BuildpackStack == "" { 195 template = actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType) + " {{.ResourceName}} as {{.User}}..." 196 } else { 197 template = actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType) + " {{.ResourceName}} with stack {{.StackName}} as {{.User}}..." 198 } 199 200 cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{ 201 "ResourceName": cmd.targetResource.ResourceName, 202 "StackName": cmd.targetResource.BuildpackStack, 203 "User": cmd.Username, 204 }) 205 } 206 207 func (cmd *LabelUpdater) displayMessageForServiceCommands() { 208 template := actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType) + " {{.ResourceName}}" 209 210 if cmd.targetResource.ServiceOffering != "" || cmd.targetResource.ServiceBroker != "" { 211 template += " from" 212 213 if cmd.targetResource.ServiceOffering != "" { 214 template += " service offering {{.ServiceOffering}}" 215 if cmd.targetResource.ServiceBroker != "" { 216 template += " /" 217 } 218 } 219 220 if cmd.targetResource.ServiceBroker != "" { 221 template += " service broker {{.ServiceBroker}}" 222 } 223 } 224 225 template += " as {{.User}}..." 226 cmd.UI.DisplayTextWithFlavor(template, map[string]interface{}{ 227 "ResourceName": cmd.targetResource.ResourceName, 228 "ServiceBroker": cmd.targetResource.ServiceBroker, 229 "ServiceOffering": cmd.targetResource.ServiceOffering, 230 "User": cmd.Username, 231 }) 232 } 233 234 func (cmd *LabelUpdater) displayMessageWithOrg() { 235 cmd.UI.DisplayTextWithFlavor(actionForResourceString(string(cmd.Action), cmd.targetResource.ResourceType)+" {{.ResourceName}} in org {{.OrgName}} as {{.User}}...", map[string]interface{}{ 236 "ResourceName": cmd.targetResource.ResourceName, 237 "OrgName": cmd.Config.TargetedOrganization().Name, 238 "User": cmd.Username, 239 }) 240 }