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  }