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  }