github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/labels.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/appsettings"
     9  )
    10  
    11  // LabelsList list app's labels
    12  func (d *DryccCmd) LabelsList(appID string) error {
    13  	s, appID, err := load(d.ConfigFile, appID)
    14  
    15  	if err != nil {
    16  		return err
    17  	}
    18  
    19  	appSettings, err := appsettings.List(s.Client, appID)
    20  	if d.checkAPICompatibility(s.Client, err) != nil {
    21  		return err
    22  	}
    23  
    24  	if len(appSettings.Label) == 0 {
    25  		d.Println(fmt.Sprintf("No labels found in %s app.", appID))
    26  	} else {
    27  		table := d.getDefaultFormatTable([]string{"UUID", "OWNER", "KEY", "VALUE"})
    28  		for _, key := range *sortKeys(appSettings.Label) {
    29  			table.Append([]string{
    30  				appSettings.UUID,
    31  				appSettings.Owner,
    32  				key,
    33  				fmt.Sprintf("%v", appSettings.Label[key]),
    34  			})
    35  		}
    36  		table.Render()
    37  	}
    38  
    39  	return nil
    40  }
    41  
    42  // LabelsSet sets labels for app
    43  func (d *DryccCmd) LabelsSet(appID string, labels []string) error {
    44  	s, appID, err := load(d.ConfigFile, appID)
    45  
    46  	if err != nil {
    47  		return err
    48  	}
    49  
    50  	labelsMap, err := parseLabels(labels)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	d.Printf("Applying labels on %s... ", appID)
    56  
    57  	quit := progress(d.WOut)
    58  
    59  	_, err = appsettings.Set(s.Client, appID, api.AppSettings{Label: labelsMap})
    60  
    61  	quit <- true
    62  	<-quit
    63  
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	d.Println("done")
    69  	return nil
    70  }
    71  
    72  // LabelsUnset removes labels for the app.
    73  func (d *DryccCmd) LabelsUnset(appID string, labels []string) error {
    74  	s, appID, err := load(d.ConfigFile, appID)
    75  
    76  	if err != nil {
    77  		return err
    78  	}
    79  
    80  	labelsMap := make(map[string]interface{})
    81  
    82  	for _, label := range labels {
    83  		labelsMap[label] = nil
    84  	}
    85  
    86  	d.Printf("Removing labels on %s... ", appID)
    87  
    88  	quit := progress(d.WOut)
    89  
    90  	_, err = appsettings.Set(s.Client, appID, api.AppSettings{Label: labelsMap})
    91  
    92  	quit <- true
    93  	<-quit
    94  
    95  	if err != nil {
    96  		return err
    97  	}
    98  
    99  	d.Println("done")
   100  	return nil
   101  }
   102  
   103  func parseLabels(labels []string) (map[string]interface{}, error) {
   104  	labelsMap := make(map[string]interface{})
   105  
   106  	for _, label := range labels {
   107  		key, value, err := parseLabel(label)
   108  
   109  		if err != nil {
   110  			return nil, err
   111  		}
   112  
   113  		labelsMap[key] = value
   114  	}
   115  
   116  	return labelsMap, nil
   117  }
   118  
   119  func parseLabel(label string) (string, string, error) {
   120  	parts := strings.Split(label, "=")
   121  
   122  	if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
   123  		return "", "", fmt.Errorf(`%s is invalid, Must be in format key=value
   124  Examples: git_repo=https://github.com/drycc/workflow team=frontend`, label)
   125  	}
   126  
   127  	return parts[0], parts[1], nil
   128  }