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 }