github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/logging/syslog/create.go (about)

     1  package syslog
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/fastly/go-fastly/v9/fastly"
     7  
     8  	"github.com/fastly/cli/pkg/argparser"
     9  	"github.com/fastly/cli/pkg/commands/logging/common"
    10  	"github.com/fastly/cli/pkg/errors"
    11  	"github.com/fastly/cli/pkg/global"
    12  	"github.com/fastly/cli/pkg/manifest"
    13  	"github.com/fastly/cli/pkg/text"
    14  )
    15  
    16  // CreateCommand calls the Fastly API to create a Syslog logging endpoint.
    17  type CreateCommand struct {
    18  	argparser.Base
    19  	Manifest manifest.Data
    20  
    21  	// Required.
    22  	ServiceName    argparser.OptionalServiceNameID
    23  	ServiceVersion argparser.OptionalServiceVersion
    24  
    25  	// Optional.
    26  	Address           argparser.OptionalString
    27  	AutoClone         argparser.OptionalAutoClone
    28  	EndpointName      argparser.OptionalString // Can't shadow argparser.Base method Name().
    29  	Format            argparser.OptionalString
    30  	FormatVersion     argparser.OptionalInt
    31  	MessageType       argparser.OptionalString
    32  	Placement         argparser.OptionalString
    33  	Port              argparser.OptionalInt
    34  	ResponseCondition argparser.OptionalString
    35  	TLSCACert         argparser.OptionalString
    36  	TLSClientCert     argparser.OptionalString
    37  	TLSClientKey      argparser.OptionalString
    38  	TLSHostname       argparser.OptionalString
    39  	Token             argparser.OptionalString
    40  	UseTLS            argparser.OptionalBool
    41  }
    42  
    43  // NewCreateCommand returns a usable command registered under the parent.
    44  func NewCreateCommand(parent argparser.Registerer, g *global.Data) *CreateCommand {
    45  	c := CreateCommand{
    46  		Base: argparser.Base{
    47  			Globals: g,
    48  		},
    49  	}
    50  	c.CmdClause = parent.Command("create", "Create a Syslog logging endpoint on a Fastly service version").Alias("add")
    51  
    52  	// Required.
    53  	c.CmdClause.Flag("name", "The name of the Syslog logging object. Used as a primary key for API access").Short('n').Action(c.EndpointName.Set).StringVar(&c.EndpointName.Value)
    54  	c.RegisterFlag(argparser.StringFlagOpts{
    55  		Name:        argparser.FlagVersionName,
    56  		Description: argparser.FlagVersionDesc,
    57  		Dst:         &c.ServiceVersion.Value,
    58  		Required:    true,
    59  	})
    60  
    61  	// Optional.
    62  	c.CmdClause.Flag("address", "A hostname or IPv4 address").Action(c.Address.Set).StringVar(&c.Address.Value)
    63  	c.CmdClause.Flag("auth-token", "Whether to prepend each message with a specific token").Action(c.Token.Set).StringVar(&c.Token.Value)
    64  	c.RegisterAutoCloneFlag(argparser.AutoCloneFlagOpts{
    65  		Action: c.AutoClone.Set,
    66  		Dst:    &c.AutoClone.Value,
    67  	})
    68  	c.RegisterFlag(argparser.StringFlagOpts{
    69  		Name:        argparser.FlagServiceIDName,
    70  		Description: argparser.FlagServiceIDDesc,
    71  		Dst:         &g.Manifest.Flag.ServiceID,
    72  		Short:       's',
    73  	})
    74  	common.Format(c.CmdClause, &c.Format)
    75  	common.FormatVersion(c.CmdClause, &c.FormatVersion)
    76  	common.MessageType(c.CmdClause, &c.MessageType)
    77  	common.Placement(c.CmdClause, &c.Placement)
    78  	c.CmdClause.Flag("port", "The port number").Action(c.Port.Set).IntVar(&c.Port.Value)
    79  	common.ResponseCondition(c.CmdClause, &c.ResponseCondition)
    80  	c.RegisterFlag(argparser.StringFlagOpts{
    81  		Action:      c.ServiceName.Set,
    82  		Name:        argparser.FlagServiceName,
    83  		Description: argparser.FlagServiceDesc,
    84  		Dst:         &c.ServiceName.Value,
    85  	})
    86  	common.TLSCACert(c.CmdClause, &c.TLSCACert)
    87  	common.TLSClientCert(c.CmdClause, &c.TLSClientCert)
    88  	common.TLSClientKey(c.CmdClause, &c.TLSClientKey)
    89  	common.TLSHostname(c.CmdClause, &c.TLSHostname)
    90  	c.CmdClause.Flag("use-tls", "Whether to use TLS for secure logging. Can be either true or false").Action(c.UseTLS.Set).BoolVar(&c.UseTLS.Value)
    91  	return &c
    92  }
    93  
    94  // ConstructInput transforms values parsed from CLI flags into an object to be used by the API client library.
    95  func (c *CreateCommand) ConstructInput(serviceID string, serviceVersion int) (*fastly.CreateSyslogInput, error) {
    96  	var input fastly.CreateSyslogInput
    97  
    98  	input.ServiceID = serviceID
    99  	if c.EndpointName.WasSet {
   100  		input.Name = &c.EndpointName.Value
   101  	}
   102  	input.ServiceVersion = serviceVersion
   103  	if c.Address.WasSet {
   104  		input.Address = &c.Address.Value
   105  	}
   106  
   107  	if c.Port.WasSet {
   108  		input.Port = &c.Port.Value
   109  	}
   110  
   111  	if c.UseTLS.WasSet {
   112  		input.UseTLS = fastly.ToPointer(fastly.Compatibool(c.UseTLS.Value))
   113  	}
   114  
   115  	if c.TLSCACert.WasSet {
   116  		input.TLSCACert = &c.TLSCACert.Value
   117  	}
   118  
   119  	if c.TLSHostname.WasSet {
   120  		input.TLSHostname = &c.TLSHostname.Value
   121  	}
   122  
   123  	if c.TLSClientCert.WasSet {
   124  		input.TLSClientCert = &c.TLSClientCert.Value
   125  	}
   126  
   127  	if c.TLSClientKey.WasSet {
   128  		input.TLSClientKey = &c.TLSClientKey.Value
   129  	}
   130  
   131  	if c.Token.WasSet {
   132  		input.Token = &c.Token.Value
   133  	}
   134  
   135  	if c.Format.WasSet {
   136  		input.Format = &c.Format.Value
   137  	}
   138  
   139  	if c.FormatVersion.WasSet {
   140  		input.FormatVersion = &c.FormatVersion.Value
   141  	}
   142  
   143  	if c.MessageType.WasSet {
   144  		input.MessageType = &c.MessageType.Value
   145  	}
   146  
   147  	if c.ResponseCondition.WasSet {
   148  		input.ResponseCondition = &c.ResponseCondition.Value
   149  	}
   150  
   151  	if c.Placement.WasSet {
   152  		input.Placement = &c.Placement.Value
   153  	}
   154  	return &input, nil
   155  }
   156  
   157  // Exec invokes the application logic for the command.
   158  func (c *CreateCommand) Exec(_ io.Reader, out io.Writer) error {
   159  	serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
   160  		AutoCloneFlag:      c.AutoClone,
   161  		APIClient:          c.Globals.APIClient,
   162  		Manifest:           *c.Globals.Manifest,
   163  		Out:                out,
   164  		ServiceNameFlag:    c.ServiceName,
   165  		ServiceVersionFlag: c.ServiceVersion,
   166  		VerboseMode:        c.Globals.Flags.Verbose,
   167  	})
   168  	if err != nil {
   169  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
   170  			"Service ID":      serviceID,
   171  			"Service Version": errors.ServiceVersion(serviceVersion),
   172  		})
   173  		return err
   174  	}
   175  
   176  	input, err := c.ConstructInput(serviceID, fastly.ToValue(serviceVersion.Number))
   177  	if err != nil {
   178  		c.Globals.ErrLog.Add(err)
   179  		return err
   180  	}
   181  
   182  	d, err := c.Globals.APIClient.CreateSyslog(input)
   183  	if err != nil {
   184  		c.Globals.ErrLog.Add(err)
   185  		return err
   186  	}
   187  
   188  	text.Success(out,
   189  		"Created Syslog logging endpoint %s (service %s version %d)",
   190  		fastly.ToValue(d.Name),
   191  		fastly.ToValue(d.ServiceID),
   192  		fastly.ToValue(d.ServiceVersion),
   193  	)
   194  	return nil
   195  }