github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/healthcheck/list.go (about)

     1  package healthcheck
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/fastly/go-fastly/v9/fastly"
     8  
     9  	"github.com/fastly/cli/pkg/argparser"
    10  	fsterr "github.com/fastly/cli/pkg/errors"
    11  	"github.com/fastly/cli/pkg/global"
    12  	"github.com/fastly/cli/pkg/text"
    13  )
    14  
    15  // ListCommand calls the Fastly API to list healthchecks.
    16  type ListCommand struct {
    17  	argparser.Base
    18  	argparser.JSONOutput
    19  
    20  	Input          fastly.ListHealthChecksInput
    21  	serviceName    argparser.OptionalServiceNameID
    22  	serviceVersion argparser.OptionalServiceVersion
    23  }
    24  
    25  // NewListCommand returns a usable command registered under the parent.
    26  func NewListCommand(parent argparser.Registerer, g *global.Data) *ListCommand {
    27  	c := ListCommand{
    28  		Base: argparser.Base{
    29  			Globals: g,
    30  		},
    31  	}
    32  	c.CmdClause = parent.Command("list", "List healthchecks on a Fastly service version")
    33  
    34  	// Required.
    35  	c.RegisterFlag(argparser.StringFlagOpts{
    36  		Name:        argparser.FlagVersionName,
    37  		Description: argparser.FlagVersionDesc,
    38  		Dst:         &c.serviceVersion.Value,
    39  		Required:    true,
    40  	})
    41  
    42  	// Optional.
    43  	c.RegisterFlagBool(c.JSONFlag()) // --json
    44  	c.RegisterFlag(argparser.StringFlagOpts{
    45  		Name:        argparser.FlagServiceIDName,
    46  		Description: argparser.FlagServiceIDDesc,
    47  		Dst:         &g.Manifest.Flag.ServiceID,
    48  		Short:       's',
    49  	})
    50  	c.RegisterFlag(argparser.StringFlagOpts{
    51  		Action:      c.serviceName.Set,
    52  		Name:        argparser.FlagServiceName,
    53  		Description: argparser.FlagServiceDesc,
    54  		Dst:         &c.serviceName.Value,
    55  	})
    56  	return &c
    57  }
    58  
    59  // Exec invokes the application logic for the command.
    60  func (c *ListCommand) Exec(_ io.Reader, out io.Writer) error {
    61  	if c.Globals.Verbose() && c.JSONOutput.Enabled {
    62  		return fsterr.ErrInvalidVerboseJSONCombo
    63  	}
    64  
    65  	serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
    66  		AllowActiveLocked:  true,
    67  		APIClient:          c.Globals.APIClient,
    68  		Manifest:           *c.Globals.Manifest,
    69  		Out:                out,
    70  		ServiceNameFlag:    c.serviceName,
    71  		ServiceVersionFlag: c.serviceVersion,
    72  		VerboseMode:        c.Globals.Flags.Verbose,
    73  	})
    74  	if err != nil {
    75  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    76  			"Service ID":      serviceID,
    77  			"Service Version": fsterr.ServiceVersion(serviceVersion),
    78  		})
    79  		return err
    80  	}
    81  
    82  	c.Input.ServiceID = serviceID
    83  	c.Input.ServiceVersion = fastly.ToValue(serviceVersion.Number)
    84  
    85  	o, err := c.Globals.APIClient.ListHealthChecks(&c.Input)
    86  	if err != nil {
    87  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    88  			"Service ID":      serviceID,
    89  			"Service Version": fastly.ToValue(serviceVersion.Number),
    90  		})
    91  		return err
    92  	}
    93  
    94  	if ok, err := c.WriteJSON(out, o); ok {
    95  		return err
    96  	}
    97  
    98  	if !c.Globals.Verbose() {
    99  		tw := text.NewTable(out)
   100  		tw.AddHeader("SERVICE", "VERSION", "NAME", "METHOD", "HOST", "PATH")
   101  		for _, hc := range o {
   102  			tw.AddLine(
   103  				fastly.ToValue(hc.ServiceID),
   104  				fastly.ToValue(hc.ServiceVersion),
   105  				fastly.ToValue(hc.Name),
   106  				fastly.ToValue(hc.Method),
   107  				fastly.ToValue(hc.Host),
   108  				fastly.ToValue(hc.Path),
   109  			)
   110  		}
   111  		tw.Print()
   112  		return nil
   113  	}
   114  
   115  	fmt.Fprintf(out, "Version: %d\n", c.Input.ServiceVersion)
   116  	for i, hc := range o {
   117  		fmt.Fprintf(out, "\tHealthcheck %d/%d\n", i+1, len(o))
   118  		text.PrintHealthCheck(out, "\t\t", hc)
   119  	}
   120  	fmt.Fprintln(out)
   121  
   122  	return nil
   123  }