github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/tags.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/drycc/controller-sdk-go/api"
     8  	"github.com/drycc/controller-sdk-go/config"
     9  )
    10  
    11  // TagsList lists an app's tags.
    12  func (d *DryccCmd) TagsList(appID string) error {
    13  	s, appID, err := load(d.ConfigFile, appID)
    14  
    15  	if err != nil {
    16  		return err
    17  	}
    18  
    19  	config, err := config.List(s.Client, appID)
    20  	if d.checkAPICompatibility(s.Client, err) != nil {
    21  		return err
    22  	}
    23  	if len(config.Tags) == 0 {
    24  		d.Println(fmt.Sprintf("No tags found in %s app.", appID))
    25  	} else {
    26  		table := d.getDefaultFormatTable([]string{"UUID", "OWNER", "PTYPE", "TAG"})
    27  		for _, key := range *sortKeys(config.Tags) {
    28  			table.Append([]string{
    29  				config.UUID,
    30  				config.Owner,
    31  				key,
    32  				fmt.Sprintf("%v", config.Tags[key]),
    33  			})
    34  		}
    35  		table.Render()
    36  	}
    37  	return nil
    38  }
    39  
    40  // TagsSet sets an app's tags.
    41  func (d *DryccCmd) TagsSet(appID string, tags []string) error {
    42  	s, appID, err := load(d.ConfigFile, appID)
    43  
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	tagsMap, err := parseTags(tags)
    49  	if err != nil {
    50  		return err
    51  	}
    52  
    53  	d.Print("Applying tags... ")
    54  
    55  	quit := progress(d.WOut)
    56  	configObj := api.Config{}
    57  	configObj.Tags = tagsMap
    58  
    59  	_, err = config.Set(s.Client, appID, configObj)
    60  	quit <- true
    61  	<-quit
    62  	if d.checkAPICompatibility(s.Client, err) != nil {
    63  		return err
    64  	}
    65  
    66  	d.Print("done\n\n")
    67  
    68  	return d.TagsList(appID)
    69  }
    70  
    71  // TagsUnset removes an app's tags.
    72  func (d *DryccCmd) TagsUnset(appID string, tags []string) error {
    73  	s, appID, err := load(d.ConfigFile, appID)
    74  
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	d.Print("Applying tags... ")
    80  
    81  	quit := progress(d.WOut)
    82  
    83  	configObj := api.Config{}
    84  
    85  	tagsMap := make(map[string]interface{})
    86  
    87  	for _, tag := range tags {
    88  		tagsMap[tag] = nil
    89  	}
    90  
    91  	configObj.Tags = tagsMap
    92  
    93  	_, err = config.Set(s.Client, appID, configObj)
    94  	quit <- true
    95  	<-quit
    96  	if d.checkAPICompatibility(s.Client, err) != nil {
    97  		return err
    98  	}
    99  
   100  	d.Print("done\n\n")
   101  
   102  	return d.TagsList(appID)
   103  }
   104  
   105  func parseTags(tags []string) (map[string]interface{}, error) {
   106  	tagMap := make(map[string]interface{})
   107  
   108  	for _, tag := range tags {
   109  		key, value, err := parseTag(tag)
   110  
   111  		if err != nil {
   112  			return nil, err
   113  		}
   114  
   115  		tagMap[key] = value
   116  	}
   117  
   118  	return tagMap, nil
   119  }
   120  
   121  func parseTag(tag string) (string, string, error) {
   122  	parts := strings.Split(tag, "=")
   123  
   124  	if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
   125  		return "", "", fmt.Errorf(`%s is invalid, Must be in format key=value
   126  Examples: rack=1 evironment=production`, tag)
   127  	}
   128  
   129  	return parts[0], parts[1], nil
   130  }