HAProxy Native Golang Client
HAProxy Native Client is a client that exposes methods for reading and changing HAProxy configuration files, and executing commands and parsing the output of the HAProxy Runtime API (via unix socket, AKA stats socket in HAProxy).
HAProxy Models
This project contains structs and validation methods that are autogenerated using go-swagger from the swagger specification found here.These structs are also used in the DataPlaneAPI
Requirements
go-swagger v0.23.0. Note that at the moment you need to use version 0.23.0
models can be generated with make models. It automatically combines specification parts into a single file, and then use that to generate models.
Usage Example
//import cfg_opt "github.com/haproxytech/client-native/v3/configuration/options"
confClient, err := configuration.New(context.Background(),
cfg_opt.ConfigurationFile(haproxyOptions.ConfigFile),
cfg_opt.HAProxyBin(haproxyOptions.HAProxy),
cfg_opt.Backups(haproxyOptions.BackupsNumber),
cfg_opt.UsePersistentTransactions,
cfg_opt.TransactionsDir(haproxyOptions.TransactionDir),
cfg_opt.ValidateCmd(haproxyOptions.ValidateCmd),
cfg_opt.MasterWorker,
cfg_opt.UseMd5Hash,
)
if err != nil {
return nil, fmt.Errorf("error setting up configuration client: %s", err.Error())
}
// runtime
// import runtime_options "github.com/haproxytech/client-native/v3/runtime/options"
nbproc := 8
ms := runtime_options.MasterSocket(masterSocket, nbproc)
runtimeClient, err = runtime_api.New(ctx, ms)
if err != nil {
return nil, fmt.Errorf("error setting up runtime client: %s", err.Error())
}
// or if not using master-worker
socketList := map[int]string{
1: "/var/vur/haproxy.sock"
}
sockets := runtime_options.Sockets(socketList)
runtimeClient, err = runtime_api.New(ctx, mapsDir, sockets)
if err != nil {
return nil, fmt.Errorf("error setting up runtime client: %s", err.Error())
}
// end runtime
// import "github.com/haproxytech/client-native/v3/options"
opt := []options.Option{
options.Configuration(confClient),
options.Runtime(runtimeClient),
}
if haproxyOptions.MapsDir != "" {
mapStorage, err := storage.New(haproxyOptions.MapsDir, storage.MapsType)
if err != nil {
log.Fatalf("error initializing map storage: %v", err)
}
opt = append(opt, options.MapStorage(mapStorage))
} else {
log.Fatalf("error trying to use empty string for managed map directory")
}
if haproxyOptions.SSLCertsDir != "" {
sslCertStorage, err := storage.New(haproxyOptions.SSLCertsDir, storage.SSLType)
if err != nil {
log.Fatalf("error initializing SSL certs storage: %v", err)
}
opt = append(opt, options.SSLCertStorage(sslCertStorage))
} else {
log.Fatalf("error trying to use empty string for managed map directory")
}
if haproxyOptions.GeneralStorage != "" {
generalStorage, err := storage.New(haproxyOptions.GeneralStorage, storage.GeneralType)
if err != nil {
log.Fatalf("error initializing General storage: %v", err)
}
opt = append(opt, options.GeneralStorage(generalStorage))
} else {
log.Fatalf("error trying to use empty string for managed general files directory")
}
if haproxyOptions.SpoeDir != "" {
prms := spoe.Params{
SpoeDir: haproxyOptions.SpoeDir,
TransactionDir: haproxyOptions.SpoeTransactionDir,
}
spoe, err := spoe.NewSpoe(prms)
if err != nil {
log.Fatalf("error setting up spoe: %v", err)
}
opt = append(opt, options.Spoe(spoe))
} else {
log.Fatalf("error trying to use empty string for SPOE configuration directory")
}
client, err := client_native.New(cyx, opt...)
if err != nil {
log.Fatalf("Error initializing configuration client: %v", err)
}
configuration, err := h.Client.Configuration()
if err != nil {
fmt.Println(err.Error())
}
bcks, err := configuration.GetBackends(t)
if err != nil {
fmt.Println(err.Error())
}
//...
backendsJSON, err := bcks.MarshallBinary()
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(string(backendsJSON))
//...
Contributing
For commit messages and general style please follow the haproxy project's CONTRIBUTING guide and use that where applicable.