feat: command flags cleanup
Cadoles/bouncer/pipeline/head This commit looks good
Details
Cadoles/bouncer/pipeline/head This commit looks good
Details
This commit is contained in:
parent
8d21e9083c
commit
e32c72e030
|
@ -59,7 +59,7 @@
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Création du proxy nommé 'cadoles' vers https://www.cadoles.com
|
# Création du proxy nommé 'cadoles' vers https://www.cadoles.com
|
||||||
bouncer admin proxy create --to https://www.cadoles.com --proxy-name cadoles
|
bouncer admin proxy create --proxy-to https://www.cadoles.com --proxy-name cadoles
|
||||||
```
|
```
|
||||||
|
|
||||||
Un message équivalent à celui ci devrait s'afficher:
|
Un message équivalent à celui ci devrait s'afficher:
|
||||||
|
@ -77,7 +77,7 @@
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Activation du proxy
|
# Activation du proxy
|
||||||
bouncer admin proxy update --proxy-name cadoles --enabled=true
|
bouncer admin proxy update --proxy-name cadoles --proxy-enabled=true
|
||||||
```
|
```
|
||||||
|
|
||||||
Un message équivalent à celui ci devrait s'afficher:
|
Un message équivalent à celui ci devrait s'afficher:
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
2. À ce stade, le calque est encore inactif. Définir la capacité de la file d'attente à 1 et activer le calque en utilisant le CLI
|
2. À ce stade, le calque est encore inactif. Définir la capacité de la file d'attente à 1 et activer le calque en utilisant le CLI
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bouncer admin layer update --proxy-name cadoles --layer-name my-queue --enabled=true --options '{"capacity": 1}'
|
bouncer admin layer update --proxy-name cadoles --layer-name my-queue --layer-enabled=true --layer-options '{"capacity": 1}'
|
||||||
```
|
```
|
||||||
|
|
||||||
Un message équivalent à celui ci devrait s'afficher:
|
Un message équivalent à celui ci devrait s'afficher:
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/schema"
|
"forge.cadoles.com/cadoles/bouncer/internal/schema"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -155,13 +156,22 @@ func (s *Server) createLayer(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
layerName, err := store.ValidateName(createLayerReq.Name)
|
layerName, err := store.ValidateName(createLayerReq.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error(r.Context(), "could not parse 'name' parameter", logger.E(errors.WithStack(err)))
|
logger.Error(r.Context(), "invalid 'name' parameter", logger.E(errors.WithStack(err)))
|
||||||
api.ErrorResponse(w, http.StatusBadRequest, api.ErrCodeMalformedRequest, nil)
|
api.ErrorResponse(w, http.StatusBadRequest, api.ErrCodeInvalidRequest, nil)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
layer, err := s.layerRepository.CreateLayer(ctx, proxyName, store.LayerName(layerName), store.LayerType(createLayerReq.Type), createLayerReq.Options)
|
layerType := store.LayerType(createLayerReq.Type)
|
||||||
|
|
||||||
|
if !setup.LayerTypeExists(layerType) {
|
||||||
|
logger.Error(r.Context(), "unknown layer type", logger.E(errors.WithStack(err)), logger.F("layerType", layerType))
|
||||||
|
api.ErrorResponse(w, http.StatusBadRequest, api.ErrCodeInvalidRequest, nil)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
layer, err := s.layerRepository.CreateLayer(ctx, proxyName, store.LayerName(layerName), layerType, createLayerReq.Options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, store.ErrAlreadyExist) {
|
if errors.Is(err, store.ErrAlreadyExist) {
|
||||||
api.ErrorResponse(w, http.StatusConflict, ErrCodeAlreadyExist, nil)
|
api.ErrorResponse(w, http.StatusConflict, ErrCodeAlreadyExist, nil)
|
||||||
|
|
|
@ -2,27 +2,22 @@ package flag
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FlagLayerName = "layer-name"
|
FlagKeyLayerType = "layer-type"
|
||||||
FlagLayerType = "layer-type"
|
|
||||||
FlagLayerOptions = "layer-options"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func WithLayerFlags(flags ...cli.Flag) []cli.Flag {
|
func WithLayerFlags(flags ...cli.Flag) []cli.Flag {
|
||||||
baseFlags := proxyFlag.WithProxyFlags(
|
baseFlags := proxyFlag.WithProxyFlags(
|
||||||
&cli.StringFlag{
|
LayerName(),
|
||||||
Name: FlagLayerName,
|
|
||||||
Usage: "use `LAYER_NAME` as targeted layer",
|
|
||||||
Value: "",
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
flags = append(flags, baseFlags...)
|
flags = append(flags, baseFlags...)
|
||||||
|
@ -32,22 +27,63 @@ func WithLayerFlags(flags ...cli.Flag) []cli.Flag {
|
||||||
|
|
||||||
func WithLayerCreateFlags(flags ...cli.Flag) []cli.Flag {
|
func WithLayerCreateFlags(flags ...cli.Flag) []cli.Flag {
|
||||||
return WithLayerFlags(
|
return WithLayerFlags(
|
||||||
&cli.StringFlag{
|
LayerType(),
|
||||||
Name: FlagLayerType,
|
LayerOptions(),
|
||||||
Usage: "Set `LAYER_TYPE` as layer's type",
|
|
||||||
Value: "",
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: FlagLayerOptions,
|
|
||||||
Usage: "Set `LAYER_OPTIONS` as layer's options",
|
|
||||||
Value: "{}",
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const KeyLayerName = "layer-name"
|
||||||
|
|
||||||
|
func LayerName() cli.Flag {
|
||||||
|
return &cli.StringFlag{
|
||||||
|
Name: KeyLayerName,
|
||||||
|
Usage: "use `LAYER_NAME` as targeted layer",
|
||||||
|
Value: "",
|
||||||
|
Required: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyLayerType = "layer-type"
|
||||||
|
|
||||||
|
func LayerType() cli.Flag {
|
||||||
|
return &cli.StringFlag{
|
||||||
|
Name: KeyLayerType,
|
||||||
|
Usage: fmt.Sprintf("Set `LAYER_TYPE` as layer's type (available: %v)", setup.GetLayerTypes()),
|
||||||
|
Value: "",
|
||||||
|
Required: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyLayerOptions = "layer-options"
|
||||||
|
|
||||||
|
func LayerOptions() cli.Flag {
|
||||||
|
return &cli.StringFlag{
|
||||||
|
Name: KeyLayerOptions,
|
||||||
|
Usage: "Set `LAYER_OPTIONS` as layer's options",
|
||||||
|
Value: "{}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyLayerWeight = "layer-weight"
|
||||||
|
|
||||||
|
func LayerWeight() cli.Flag {
|
||||||
|
return &cli.IntFlag{
|
||||||
|
Name: KeyLayerWeight,
|
||||||
|
Usage: "Set `LAYER_WEIGHT` as layer's weight",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyLayerEnabled = "layer-enabled"
|
||||||
|
|
||||||
|
func LayerEnabled() cli.Flag {
|
||||||
|
return &cli.BoolFlag{
|
||||||
|
Name: KeyLayerEnabled,
|
||||||
|
Usage: "Enable or disable layer",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func AssertLayerName(ctx *cli.Context) (store.LayerName, error) {
|
func AssertLayerName(ctx *cli.Context) (store.LayerName, error) {
|
||||||
rawLayerName := ctx.String(FlagLayerName)
|
rawLayerName := ctx.String(KeyLayerName)
|
||||||
|
|
||||||
name, err := store.ValidateName(rawLayerName)
|
name, err := store.ValidateName(rawLayerName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -58,13 +94,18 @@ func AssertLayerName(ctx *cli.Context) (store.LayerName, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertLayerType(ctx *cli.Context) (store.LayerType, error) {
|
func AssertLayerType(ctx *cli.Context) (store.LayerType, error) {
|
||||||
rawLayerType := ctx.String(FlagLayerType)
|
rawLayerType := ctx.String(FlagKeyLayerType)
|
||||||
|
|
||||||
return store.LayerType(rawLayerType), nil
|
layerType := store.LayerType(rawLayerType)
|
||||||
|
if !setup.LayerTypeExists(layerType) {
|
||||||
|
return "", errors.Errorf("unknown layer type '%s'", layerType)
|
||||||
|
}
|
||||||
|
|
||||||
|
return layerType, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertLayerOptions(ctx *cli.Context) (store.LayerOptions, error) {
|
func AssertLayerOptions(ctx *cli.Context) (store.LayerOptions, error) {
|
||||||
rawLayerOptions := ctx.String(FlagLayerOptions)
|
rawLayerOptions := ctx.String(KeyLayerOptions)
|
||||||
|
|
||||||
layerOptions := store.LayerOptions{}
|
layerOptions := store.LayerOptions{}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
||||||
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/layer/flag"
|
||||||
layerFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/layer/flag"
|
layerFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/layer/flag"
|
||||||
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
||||||
|
@ -20,18 +21,9 @@ func UpdateCommand() *cli.Command {
|
||||||
Name: "update",
|
Name: "update",
|
||||||
Usage: "Update layer",
|
Usage: "Update layer",
|
||||||
Flags: layerFlag.WithLayerFlags(
|
Flags: layerFlag.WithLayerFlags(
|
||||||
&cli.BoolFlag{
|
flag.LayerEnabled(),
|
||||||
Name: "enabled",
|
flag.LayerWeight(),
|
||||||
Usage: "Enable or disable proxy",
|
flag.LayerOptions(),
|
||||||
},
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "weight",
|
|
||||||
Usage: "Set `WEIGHT` as proxy's weight",
|
|
||||||
},
|
|
||||||
&cli.StringFlag{
|
|
||||||
Name: "options",
|
|
||||||
Usage: "Set `OPTIONS` as proxy's options",
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
Action: func(ctx *cli.Context) error {
|
Action: func(ctx *cli.Context) error {
|
||||||
baseFlags := clientFlag.GetBaseFlags(ctx)
|
baseFlags := clientFlag.GetBaseFlags(ctx)
|
||||||
|
@ -53,22 +45,22 @@ func UpdateCommand() *cli.Command {
|
||||||
|
|
||||||
opts := &client.UpdateLayerOptions{}
|
opts := &client.UpdateLayerOptions{}
|
||||||
|
|
||||||
if ctx.IsSet("options") {
|
if ctx.IsSet(flag.KeyLayerOptions) {
|
||||||
var options store.LayerOptions
|
var options store.LayerOptions
|
||||||
if err := json.Unmarshal([]byte(ctx.String("options")), &options); err != nil {
|
if err := json.Unmarshal([]byte(ctx.String(flag.KeyLayerOptions)), &options); err != nil {
|
||||||
return errors.Wrap(err, "could not parse options")
|
return errors.Wrap(err, "could not parse layer's options")
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.Options = &options
|
opts.Options = &options
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.IsSet("weight") {
|
if ctx.IsSet(flag.KeyLayerWeight) {
|
||||||
weight := ctx.Int("weight")
|
weight := ctx.Int(flag.KeyLayerWeight)
|
||||||
opts.Weight = &weight
|
opts.Weight = &weight
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.IsSet("enabled") {
|
if ctx.IsSet(flag.KeyLayerEnabled) {
|
||||||
enabled := ctx.Bool("enabled")
|
enabled := ctx.Bool(flag.KeyLayerEnabled)
|
||||||
opts.Enabled = &enabled
|
opts.Enabled = &enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
||||||
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -18,17 +19,8 @@ func CreateCommand() *cli.Command {
|
||||||
Name: "create",
|
Name: "create",
|
||||||
Usage: "Create proxy",
|
Usage: "Create proxy",
|
||||||
Flags: proxyFlag.WithProxyFlags(
|
Flags: proxyFlag.WithProxyFlags(
|
||||||
&cli.StringFlag{
|
flag.ProxyTo(),
|
||||||
Name: "to",
|
flag.ProxyFrom(),
|
||||||
Usage: "Set `TO` as proxy's destination url",
|
|
||||||
Value: "",
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
&cli.StringSliceFlag{
|
|
||||||
Name: "from",
|
|
||||||
Usage: "Set `FROM` as proxy's patterns to match incoming requests",
|
|
||||||
Value: cli.NewStringSlice("*"),
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
Action: func(ctx *cli.Context) error {
|
Action: func(ctx *cli.Context) error {
|
||||||
baseFlags := clientFlag.GetBaseFlags(ctx)
|
baseFlags := clientFlag.GetBaseFlags(ctx)
|
||||||
|
@ -43,12 +35,12 @@ func CreateCommand() *cli.Command {
|
||||||
return errors.Wrap(err, "'to' parameter should be a valid url")
|
return errors.Wrap(err, "'to' parameter should be a valid url")
|
||||||
}
|
}
|
||||||
|
|
||||||
to, err := url.Parse(ctx.String("to"))
|
to, err := url.Parse(ctx.String(flag.KeyProxyTo))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "'to' parameter should be a valid url")
|
return errors.Wrap(err, "'to' parameter should be a valid url")
|
||||||
}
|
}
|
||||||
|
|
||||||
from := ctx.StringSlice("from")
|
from := ctx.StringSlice(flag.KeyProxyFrom)
|
||||||
|
|
||||||
client := client.New(baseFlags.ServerURL, client.WithToken(token))
|
client := client.New(baseFlags.ServerURL, client.WithToken(token))
|
||||||
|
|
||||||
|
|
|
@ -7,16 +7,9 @@ import (
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const FlagProxyName = "proxy-name"
|
|
||||||
|
|
||||||
func WithProxyFlags(flags ...cli.Flag) []cli.Flag {
|
func WithProxyFlags(flags ...cli.Flag) []cli.Flag {
|
||||||
baseFlags := clientFlag.ComposeFlags(
|
baseFlags := clientFlag.ComposeFlags(
|
||||||
&cli.StringFlag{
|
ProxyName(),
|
||||||
Name: FlagProxyName,
|
|
||||||
Usage: "use `PROXY_NAME` as targeted proxy",
|
|
||||||
Value: "",
|
|
||||||
Required: true,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
flags = append(flags, baseFlags...)
|
flags = append(flags, baseFlags...)
|
||||||
|
@ -24,8 +17,58 @@ func WithProxyFlags(flags ...cli.Flag) []cli.Flag {
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const KeyProxyName = "proxy-name"
|
||||||
|
|
||||||
|
func ProxyName() cli.Flag {
|
||||||
|
return &cli.StringFlag{
|
||||||
|
Name: KeyProxyName,
|
||||||
|
Usage: "use `PROXY_NAME` as targeted proxy",
|
||||||
|
Value: "",
|
||||||
|
Required: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyProxyTo = "proxy-to"
|
||||||
|
|
||||||
|
func ProxyTo() cli.Flag {
|
||||||
|
return &cli.StringFlag{
|
||||||
|
Name: KeyProxyTo,
|
||||||
|
Usage: "Set `PROXY_TO` as proxy's destination url",
|
||||||
|
Value: "",
|
||||||
|
Required: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyProxyFrom = "proxy-from"
|
||||||
|
|
||||||
|
func ProxyFrom() cli.Flag {
|
||||||
|
return &cli.StringSliceFlag{
|
||||||
|
Name: KeyProxyFrom,
|
||||||
|
Usage: "Set `PROXY_FROM` as proxy's patterns to match incoming requests",
|
||||||
|
Value: cli.NewStringSlice("*"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyProxyWeight = "proxy-weight"
|
||||||
|
|
||||||
|
func ProxyWeight() cli.Flag {
|
||||||
|
return &cli.IntFlag{
|
||||||
|
Name: KeyProxyWeight,
|
||||||
|
Usage: "Set `PROXY_WEIGHT` as proxy's weight",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const KeyProxyEnabled = "proxy-enabled"
|
||||||
|
|
||||||
|
func ProxyEnabled() cli.Flag {
|
||||||
|
return &cli.BoolFlag{
|
||||||
|
Name: KeyProxyEnabled,
|
||||||
|
Usage: "Enable or disable proxy",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func AssertProxyName(ctx *cli.Context) (store.ProxyName, error) {
|
func AssertProxyName(ctx *cli.Context) (store.ProxyName, error) {
|
||||||
rawProxyName := ctx.String(FlagProxyName)
|
rawProxyName := ctx.String(KeyProxyName)
|
||||||
|
|
||||||
name, err := store.ValidateName(rawProxyName)
|
name, err := store.ValidateName(rawProxyName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
"forge.cadoles.com/cadoles/bouncer/internal/client"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/apierr"
|
||||||
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
clientFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/flag"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
proxyFlag "forge.cadoles.com/cadoles/bouncer/internal/command/admin/proxy/flag"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
"forge.cadoles.com/cadoles/bouncer/internal/format"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -18,22 +19,10 @@ func UpdateCommand() *cli.Command {
|
||||||
Name: "update",
|
Name: "update",
|
||||||
Usage: "Update proxy",
|
Usage: "Update proxy",
|
||||||
Flags: proxyFlag.WithProxyFlags(
|
Flags: proxyFlag.WithProxyFlags(
|
||||||
&cli.StringFlag{
|
flag.ProxyTo(),
|
||||||
Name: "to",
|
flag.ProxyFrom(),
|
||||||
Usage: "Set `TO` as proxy's destination url",
|
flag.ProxyEnabled(),
|
||||||
},
|
flag.ProxyWeight(),
|
||||||
&cli.StringSliceFlag{
|
|
||||||
Name: "from",
|
|
||||||
Usage: "Set `FROM` as proxy's patterns to match incoming requests",
|
|
||||||
},
|
|
||||||
&cli.BoolFlag{
|
|
||||||
Name: "enabled",
|
|
||||||
Usage: "Enable or disable proxy",
|
|
||||||
},
|
|
||||||
&cli.IntFlag{
|
|
||||||
Name: "weight",
|
|
||||||
Usage: "Set `WEIGHT` as proxy's weight",
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
Action: func(ctx *cli.Context) error {
|
Action: func(ctx *cli.Context) error {
|
||||||
baseFlags := clientFlag.GetBaseFlags(ctx)
|
baseFlags := clientFlag.GetBaseFlags(ctx)
|
||||||
|
@ -50,27 +39,29 @@ func UpdateCommand() *cli.Command {
|
||||||
|
|
||||||
opts := &client.UpdateProxyOptions{}
|
opts := &client.UpdateProxyOptions{}
|
||||||
|
|
||||||
if ctx.IsSet("to") {
|
if ctx.IsSet(flag.KeyProxyTo) {
|
||||||
to := ctx.String("to")
|
to := ctx.String(flag.KeyProxyTo)
|
||||||
if _, err := url.Parse(to); err != nil {
|
if _, err := url.Parse(to); err != nil {
|
||||||
return errors.Wrap(err, "'to' parameter should be a valid url")
|
return errors.Wrapf(err, "'%s' parameter should be a valid url", flag.KeyProxyTo)
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.To = &to
|
opts.To = &to
|
||||||
}
|
}
|
||||||
|
|
||||||
from := ctx.StringSlice("from")
|
if ctx.IsSet(flag.KeyProxyFrom) {
|
||||||
if from != nil {
|
from := ctx.StringSlice(flag.KeyProxyFrom)
|
||||||
opts.From = from
|
if from != nil {
|
||||||
|
opts.From = from
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.IsSet("weight") {
|
if ctx.IsSet(flag.KeyProxyWeight) {
|
||||||
weight := ctx.Int("weight")
|
weight := ctx.Int(flag.KeyProxyWeight)
|
||||||
opts.Weight = &weight
|
opts.Weight = &weight
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.IsSet("enabled") {
|
if ctx.IsSet(flag.KeyProxyEnabled) {
|
||||||
enabled := ctx.Bool("enabled")
|
enabled := ctx.Bool(flag.KeyProxyEnabled)
|
||||||
opts.Enabled = &enabled
|
opts.Enabled = &enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,11 @@
|
||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/command/common"
|
"forge.cadoles.com/cadoles/bouncer/internal/command/common"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/config"
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/proxy"
|
"forge.cadoles.com/cadoles/bouncer/internal/proxy"
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director"
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/queue"
|
|
||||||
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
"forge.cadoles.com/cadoles/bouncer/internal/setup"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
@ -33,7 +28,7 @@ func RunCommand() *cli.Command {
|
||||||
logger.SetFormat(logger.Format(conf.Logger.Format))
|
logger.SetFormat(logger.Format(conf.Logger.Format))
|
||||||
logger.SetLevel(logger.Level(conf.Logger.Level))
|
logger.SetLevel(logger.Level(conf.Logger.Level))
|
||||||
|
|
||||||
layers, err := initDirectorLayers(ctx.Context, conf)
|
layers, err := setup.CreateLayers(ctx.Context, conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not initialize director layers")
|
return errors.Wrap(err, "could not initialize director layers")
|
||||||
}
|
}
|
||||||
|
@ -64,36 +59,3 @@ func RunCommand() *cli.Command {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func initDirectorLayers(ctx context.Context, conf *config.Config) ([]director.Layer, error) {
|
|
||||||
layers := make([]director.Layer, 0)
|
|
||||||
|
|
||||||
queue, err := initQueueLayer(ctx, conf)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err, "could not initialize queue layer")
|
|
||||||
}
|
|
||||||
|
|
||||||
layers = append(layers, queue)
|
|
||||||
|
|
||||||
return layers, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func initQueueLayer(ctx context.Context, conf *config.Config) (*queue.Queue, error) {
|
|
||||||
adapter, err := setup.NewQueueAdapter(ctx, conf.Redis)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.WithStack(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
options := []queue.OptionFunc{
|
|
||||||
queue.WithTemplateDir(string(conf.Layers.Queue.TemplateDir)),
|
|
||||||
}
|
|
||||||
|
|
||||||
if conf.Layers.Queue.DefaultKeepAlive != nil {
|
|
||||||
options = append(options, queue.WithDefaultKeepAlive(time.Duration(*conf.Layers.Queue.DefaultKeepAlive)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return queue.New(
|
|
||||||
adapter,
|
|
||||||
options...,
|
|
||||||
), nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
package setup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/config"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var defaultRegistry = NewRegistry()
|
||||||
|
|
||||||
|
func RegisterLayer(layerType store.LayerType, setupFunc LayerSetupFunc) {
|
||||||
|
defaultRegistry.RegisterLayer(layerType, setupFunc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateLayers(ctx context.Context, conf *config.Config) ([]director.Layer, error) {
|
||||||
|
layers, err := defaultRegistry.CreateLayers(ctx, conf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return layers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLayerTypes() []store.LayerType {
|
||||||
|
return defaultRegistry.GetLayerTypes()
|
||||||
|
}
|
||||||
|
|
||||||
|
func LayerTypeExists(layerType store.LayerType) bool {
|
||||||
|
return defaultRegistry.LayerTypeExists(layerType)
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package setup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/config"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/queue"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterLayer(queue.LayerType, setupQueueLayer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setupQueueLayer(ctx context.Context, conf *config.Config) (director.Layer, error) {
|
||||||
|
adapter, err := NewQueueAdapter(ctx, conf.Redis)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
options := []queue.OptionFunc{
|
||||||
|
queue.WithTemplateDir(string(conf.Layers.Queue.TemplateDir)),
|
||||||
|
}
|
||||||
|
|
||||||
|
if conf.Layers.Queue.DefaultKeepAlive != nil {
|
||||||
|
options = append(options, queue.WithDefaultKeepAlive(time.Duration(*conf.Layers.Queue.DefaultKeepAlive)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return queue.New(
|
||||||
|
adapter,
|
||||||
|
options...,
|
||||||
|
), nil
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package setup
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/config"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/proxy/director"
|
||||||
|
"forge.cadoles.com/cadoles/bouncer/internal/store"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Registry struct {
|
||||||
|
layers map[store.LayerType]LayerSetupFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
type LayerSetupFunc func(context.Context, *config.Config) (director.Layer, error)
|
||||||
|
|
||||||
|
func (r *Registry) RegisterLayer(layerType store.LayerType, layerSetup LayerSetupFunc) {
|
||||||
|
r.layers[layerType] = layerSetup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Registry) CreateLayers(ctx context.Context, conf *config.Config) ([]director.Layer, error) {
|
||||||
|
layers := make([]director.Layer, 0, len(r.layers))
|
||||||
|
|
||||||
|
for layerType, layerSetup := range r.layers {
|
||||||
|
layer, err := layerSetup(ctx, conf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "could not create layer '%s'", layerType)
|
||||||
|
}
|
||||||
|
|
||||||
|
layers = append(layers, layer)
|
||||||
|
}
|
||||||
|
|
||||||
|
return layers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Registry) LayerTypeExists(layerType store.LayerType) bool {
|
||||||
|
_, exists := r.layers[layerType]
|
||||||
|
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Registry) GetLayerTypes() []store.LayerType {
|
||||||
|
layerTypes := make([]store.LayerType, 0, len(r.layers))
|
||||||
|
|
||||||
|
for layerType := range r.layers {
|
||||||
|
layerTypes = append(layerTypes, layerType)
|
||||||
|
}
|
||||||
|
|
||||||
|
return layerTypes
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRegistry() *Registry {
|
||||||
|
return &Registry{
|
||||||
|
layers: make(map[store.LayerType]LayerSetupFunc),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue