Skip to content

Commit

Permalink
ports: no nodefilter or loadbalancer nodefilter should default to use…
Browse files Browse the repository at this point in the history
… all servers & agents as upstream
  • Loading branch information
iwilltry42 committed Jul 7, 2021
1 parent 9ad422e commit 99490ca
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 15 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
- port-mapping now go via the loadbalancer (serverlb) by default
- the `--port` flag has the `proxy` opt (see new nodefilter syntax above) set by default
- to leverage the old behavior of direct port-mappings, use the `direct` opt on the port flag
- the nodefilter `loadbalancer` will now do the same as `servers:*;agents:*` (proxied via the loadbalancer)

### Fixes

Expand Down
2 changes: 1 addition & 1 deletion pkg/client/loadbalancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func GetLoadbalancerConfig(ctx context.Context, runtime runtimes.Runtime, cluste
file = bytes.Trim(file[512:], "\x00") // trim control characters, etc.

if err := yaml.Unmarshal(file, &cfg); err != nil {
return cfg, err
return cfg, fmt.Errorf("error unmarshalling loadbalancer config: %w", err)
}

return cfg, nil
Expand Down
43 changes: 31 additions & 12 deletions pkg/config/transform.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ import (
log "github.com/sirupsen/logrus"
)

var (
DefaultTargetsNodefiltersPortMappings = []string{"servers:*:proxy", "agents:*:proxy"}
)

// TransformSimpleToClusterConfig transforms a simple configuration to a full-fledged cluster configuration
func TransformSimpleToClusterConfig(ctx context.Context, runtime runtimes.Runtime, simpleConfig conf.SimpleConfig) (*conf.ClusterConfig, error) {

Expand Down Expand Up @@ -171,32 +175,37 @@ func TransformSimpleToClusterConfig(ctx context.Context, runtime runtimes.Runtim

// -> PORTS
for _, portWithNodeFilters := range simpleConfig.Ports {
log.Tracef("inspecting port mapping for %s with nodefilters %s", portWithNodeFilters.Port, portWithNodeFilters.NodeFilters)
if len(portWithNodeFilters.NodeFilters) == 0 && nodeCount > 1 {
return nil, fmt.Errorf("Portmapping '%s' lacks a node filter, but there's more than one node", portWithNodeFilters.Port)
log.Infof("portmapping '%s' lacks a nodefilter, but there's more than one node: defaulting to %s", portWithNodeFilters.Port, DefaultTargetsNodefiltersPortMappings)
portWithNodeFilters.NodeFilters = DefaultTargetsNodefiltersPortMappings
}

for _, f := range portWithNodeFilters.NodeFilters {
if strings.HasPrefix(f, "loadbalancer") {
log.Infof("portmapping '%s' targets the loadbalancer: defaulting to %s", portWithNodeFilters.Port, DefaultTargetsNodefiltersPortMappings)
portWithNodeFilters.NodeFilters = DefaultTargetsNodefiltersPortMappings
break
}
}

filteredNodes, err := util.FilterNodesWithSuffix(nodeList, portWithNodeFilters.NodeFilters)
if err != nil {
return nil, err
}

nn := ""
for _, n := range filteredNodes["proxy"] {
nn = strings.Join([]string{nn, n.Name}, ",")
}
log.Debugf("Filtered nodes: %#v", nn)

for suffix, nodes := range filteredNodes {
portmappings, err := nat.ParsePortSpec(portWithNodeFilters.Port)
if err != nil {
return nil, fmt.Errorf("error parsing port spec '%s': %+v", portWithNodeFilters.Port, err)
}

for _, n := range nodes {
if n.Role == k3d.LoadBalancerRole && n.Name == newCluster.ServerLoadBalancer.Node.Name {
log.Infoln("loadbalancer in filtered list for port mappings: defaulting to all servers and agents as upstream targets")
var err error
nodes, err = util.FilterNodes(newCluster.Nodes, []string{"agents:*", "servers:*"})
if err != nil {
return nil, err
}
}
}

if suffix == "proxy" || suffix == util.NodeFilterSuffixNone { // proxy is the default suffix for port mappings
if newCluster.ServerLoadBalancer == nil {
return nil, fmt.Errorf("port-mapping of type 'proxy' specified, but loadbalancer is disabled")
Expand All @@ -222,6 +231,16 @@ func TransformSimpleToClusterConfig(ctx context.Context, runtime runtimes.Runtim

}

// print generated loadbalancer config
if log.GetLevel() >= log.DebugLevel {
yamlized, err := yaml.Marshal(newCluster.ServerLoadBalancer.Config)
if err != nil {
log.Errorf("error printing loadbalancer config: %v", err)
} else {
log.Debugf("generated loadbalancer config:\n%s", string(yamlized))
}
}

// -> K3S NODE LABELS
for _, k3sNodeLabelWithNodeFilters := range simpleConfig.Options.K3sOptions.NodeLabels {
if len(k3sNodeLabelWithNodeFilters.NodeFilters) == 0 && nodeCount > 1 {
Expand Down
6 changes: 4 additions & 2 deletions pkg/util/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ func FilterNodesWithSuffix(nodes []*k3d.Node, nodefilters []string) (map[string]
suffix = sf
}

result[suffix] = make([]*k3d.Node, 0) // init map for this suffix
if _, ok := result[suffix]; !ok {
result[suffix] = make([]*k3d.Node, 0) // init map for this suffix, if not exists
}

filteredNodes, err := FilterNodes(nodes, []string{nf})
if err != nil {
Expand All @@ -86,7 +88,7 @@ func FilterNodesWithSuffix(nodes []*k3d.Node, nodefilters []string) (map[string]

log.Tracef("Filtered %d nodes for suffix '%s' (filter: %s)", len(filteredNodes), suffix, nf)

result[suffix] = filteredNodes
result[suffix] = append(result[suffix], filteredNodes...)
}

return result, nil
Expand Down

0 comments on commit 99490ca

Please sign in to comment.