@ -158,10 +158,10 @@ func TransformSimpleToClusterConfig(ctx context.Context, runtime runtimes.Runtim
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Extra Node Configuration *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * /
// -> VOLUMES
nodeCount := len ( newCluster . Nodes )
nodeList := newCluster . Nodes
// -> VOLUMES
for _ , volumeWithNodeFilters := range simpleConfig . Volumes {
nodes , err := util . FilterNodes ( nodeList , volumeWithNodeFilters . NodeFilters )
if err != nil {
@ -174,76 +174,10 @@ 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 {
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 {
if err := TransformPorts ( ctx , runtime , & newCluster , simpleConfig . Ports ) ; 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 )
}
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" )
}
if err := addPortMappings ( newCluster . ServerLoadBalancer . Node , portmappings ) ; err != nil {
return nil , err
}
for _ , pm := range portmappings {
if err := loadbalancerAddPortConfigs ( newCluster . ServerLoadBalancer , pm , nodes ) ; err != nil {
return nil , err
}
}
} else if suffix == "direct" {
if len ( nodes ) > 1 {
return nil , fmt . Errorf ( "error: cannot apply a direct port-mapping (%s) to more than one node" , portmappings )
}
for _ , node := range nodes {
if err := addPortMappings ( node , portmappings ) ; err != nil {
return nil , err
}
}
} else if suffix != util . NodeFilterMapKeyAll {
return nil , fmt . Errorf ( "error adding port mappings: unknown suffix %s" , suffix )
}
}
}
// 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 {
@ -456,3 +390,79 @@ nodenameLoop:
return nil
}
func TransformPorts ( ctx context . Context , runtime runtimes . Runtime , cluster * k3d . Cluster , portsWithNodeFilters [ ] conf . PortWithNodeFilters ) error {
nodeCount := len ( cluster . Nodes )
nodeList := cluster . Nodes
for _ , portWithNodeFilters := range portsWithNodeFilters {
log . Tracef ( "inspecting port mapping for %s with nodefilters %s" , portWithNodeFilters . Port , portWithNodeFilters . NodeFilters )
if len ( portWithNodeFilters . NodeFilters ) == 0 && nodeCount > 1 {
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 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 fmt . Errorf ( "error parsing port spec '%s': %+v" , portWithNodeFilters . Port , err )
}
if suffix == "proxy" || suffix == util . NodeFilterSuffixNone { // proxy is the default suffix for port mappings
if cluster . ServerLoadBalancer == nil {
return fmt . Errorf ( "port-mapping of type 'proxy' specified, but loadbalancer is disabled" )
}
if err := addPortMappings ( cluster . ServerLoadBalancer . Node , portmappings ) ; err != nil {
return err
}
for _ , pm := range portmappings {
if err := loadbalancerAddPortConfigs ( cluster . ServerLoadBalancer , pm , nodes ) ; err != nil {
return err
}
}
} else if suffix == "direct" {
if len ( nodes ) > 1 {
return fmt . Errorf ( "error: cannot apply a direct port-mapping (%s) to more than one node" , portmappings )
}
for _ , node := range nodes {
if err := addPortMappings ( node , portmappings ) ; err != nil {
return err
}
}
} else if suffix != util . NodeFilterMapKeyAll {
return fmt . Errorf ( "error adding port mappings: unknown suffix %s" , suffix )
}
}
}
// print generated loadbalancer config
if log . GetLevel ( ) >= log . DebugLevel {
yamlized , err := yaml . Marshal ( cluster . ServerLoadBalancer . Config )
if err != nil {
log . Errorf ( "error printing loadbalancer config: %v" , err )
} else {
log . Debugf ( "generated loadbalancer config:\n%s" , string ( yamlized ) )
}
}
return nil
}