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