Skip to content

Commit 5c1d721

Browse files
committed
fix rebase
Signed-off-by: Haywood Shannon <[email protected]> Signed-off-by: Haywood Shannon <[email protected]>
1 parent b19b03a commit 5c1d721

File tree

8 files changed

+994
-1965
lines changed

8 files changed

+994
-1965
lines changed

internal/configs/virtualserver.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/nginx/kubernetes-ingress/internal/nginx"
2020
conf_v1 "github.com/nginx/kubernetes-ingress/pkg/apis/configuration/v1"
2121
api_v1 "k8s.io/api/core/v1"
22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2223
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2324
"k8s.io/apimachinery/pkg/labels"
2425
"k8s.io/apimachinery/pkg/runtime"
@@ -573,6 +574,41 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
573574
vsrPoliciesFromVs[name] = r.Policies
574575
}
575576

577+
continue
578+
} else if r.RouteSelector != nil {
579+
580+
// get vsr name
581+
582+
selector := &metav1.LabelSelector{
583+
MatchLabels: r.RouteSelector.MatchLabels,
584+
}
585+
sel, _ := metav1.LabelSelectorAsSelector(selector)
586+
587+
selectorKey := sel.String()
588+
vsrKeys := vsEx.VirtualServerSelectorRoutes[selectorKey]
589+
590+
// store route location snippet for the referenced VirtualServerRoute in case they don't define their own
591+
if r.LocationSnippets != "" {
592+
for _, name := range vsrKeys {
593+
vsrLocationSnippetsFromVs[name] = r.LocationSnippets
594+
}
595+
}
596+
597+
// store route error pages and route index for the referenced VirtualServerRoute in case they don't define their own
598+
if len(r.ErrorPages) > 0 {
599+
for _, name := range vsrKeys {
600+
vsrErrorPagesFromVs[name] = errorPages.pages
601+
vsrErrorPagesRouteIndex[name] = errorPages.index
602+
}
603+
}
604+
605+
// store route policies for the referenced VirtualServerRoute in case they don't define their own
606+
if len(r.Policies) > 0 {
607+
for _, name := range vsrKeys {
608+
vsrPoliciesFromVs[name] = r.Policies
609+
}
610+
}
611+
576612
continue
577613
}
578614

internal/k8s/configuration.go

Lines changed: 78 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"k8s.io/apimachinery/pkg/runtime"
1717

1818
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19+
"k8s.io/apimachinery/pkg/labels"
1920
)
2021

2122
const (
@@ -207,23 +208,25 @@ func NewMinionConfiguration(ing *networking.Ingress) *MinionConfiguration {
207208

208209
// VirtualServerConfiguration holds a VirtualServer along with its VirtualServerRoutes.
209210
type VirtualServerConfiguration struct {
210-
VirtualServer *conf_v1.VirtualServer
211-
VirtualServerRoutes []*conf_v1.VirtualServerRoute
212-
Warnings []string
213-
HTTPPort int
214-
HTTPSPort int
215-
HTTPIPv4 string
216-
HTTPIPv6 string
217-
HTTPSIPv4 string
218-
HTTPSIPv6 string
211+
VirtualServer *conf_v1.VirtualServer
212+
VirtualServerRoutes []*conf_v1.VirtualServerRoute
213+
VirtualServerRouteSelectors map[string][]string
214+
Warnings []string
215+
HTTPPort int
216+
HTTPSPort int
217+
HTTPIPv4 string
218+
HTTPIPv6 string
219+
HTTPSIPv4 string
220+
HTTPSIPv6 string
219221
}
220222

221223
// NewVirtualServerConfiguration creates a VirtualServerConfiguration.
222-
func NewVirtualServerConfiguration(vs *conf_v1.VirtualServer, vsrs []*conf_v1.VirtualServerRoute, warnings []string) *VirtualServerConfiguration {
224+
func NewVirtualServerConfiguration(vs *conf_v1.VirtualServer, vsrs []*conf_v1.VirtualServerRoute, vsrSelectors map[string][]string, warnings []string) *VirtualServerConfiguration {
223225
return &VirtualServerConfiguration{
224-
VirtualServer: vs,
225-
VirtualServerRoutes: vsrs,
226-
Warnings: warnings,
226+
VirtualServer: vs,
227+
VirtualServerRoutes: vsrs,
228+
VirtualServerRouteSelectors: vsrSelectors,
229+
Warnings: warnings,
227230
}
228231
}
229232

@@ -1488,13 +1491,13 @@ func (c *Configuration) buildHostsAndResources() (newHosts map[string]Resource,
14881491
for _, key := range getSortedVirtualServerKeys(c.virtualServers) {
14891492
vs := c.virtualServers[key]
14901493

1491-
vsrs, warnings := c.buildVirtualServerRoutes(vs)
1494+
vsrs, vsrSelectors, warnings := c.buildVirtualServerRoutes(vs)
14921495
for _, vsr := range challengesVSR {
14931496
if vs.Spec.Host == vsr.Spec.Host {
14941497
vsrs = append(vsrs, vsr)
14951498
}
14961499
}
1497-
resource := NewVirtualServerConfiguration(vs, vsrs, warnings)
1500+
resource := NewVirtualServerConfiguration(vs, vsrs, vsrSelectors, warnings)
14981501

14991502
c.buildListenersForVSConfiguration(resource)
15001503

@@ -1648,40 +1651,77 @@ func (c *Configuration) buildMinionConfigs(masterHost string) ([]*MinionConfigur
16481651
return minionConfigs, childWarnings
16491652
}
16501653

1651-
func (c *Configuration) buildVirtualServerRoutes(vs *conf_v1.VirtualServer) ([]*conf_v1.VirtualServerRoute, []string) {
1654+
func (c *Configuration) buildVirtualServerRoutes(vs *conf_v1.VirtualServer) ([]*conf_v1.VirtualServerRoute, map[string][]string, []string) {
16521655
var vsrs []*conf_v1.VirtualServerRoute
16531656
var warnings []string
1657+
var vsrSelectors map[string][]string
16541658

16551659
for _, r := range vs.Spec.Routes {
1656-
if r.Route == "" {
1657-
continue
1658-
}
1660+
if r.Route != "" {
1661+
vsrKey := r.Route
16591662

1660-
vsrKey := r.Route
1663+
// if route is defined without a namespace, use the namespace of VirtualServer.
1664+
if !strings.Contains(r.Route, "/") {
1665+
vsrKey = fmt.Sprintf("%s/%s", vs.Namespace, r.Route)
1666+
}
16611667

1662-
// if route is defined without a namespace, use the namespace of VirtualServer.
1663-
if !strings.Contains(r.Route, "/") {
1664-
vsrKey = fmt.Sprintf("%s/%s", vs.Namespace, r.Route)
1665-
}
1668+
vsr, exists := c.virtualServerRoutes[vsrKey]
16661669

1667-
vsr, exists := c.virtualServerRoutes[vsrKey]
1668-
if !exists {
1669-
warning := fmt.Sprintf("VirtualServerRoute %s doesn't exist or invalid", vsrKey)
1670-
warnings = append(warnings, warning)
1671-
continue
1672-
}
1670+
// if route is defined
1671+
if !exists {
1672+
warning := fmt.Sprintf("VirtualServerRoute %s doesn't exist or invalid", vsrKey)
1673+
warnings = append(warnings, warning)
1674+
continue
1675+
}
16731676

1674-
err := c.virtualServerValidator.ValidateVirtualServerRouteForVirtualServer(vsr, vs.Spec.Host, r.Path)
1675-
if err != nil {
1676-
warning := fmt.Sprintf("VirtualServerRoute %s is invalid: %v", vsrKey, err)
1677-
warnings = append(warnings, warning)
1678-
continue
1679-
}
1677+
err := c.virtualServerValidator.ValidateVirtualServerRouteForVirtualServer(vsr, vs.Spec.Host, r.Path)
1678+
if err != nil {
1679+
warning := fmt.Sprintf("VirtualServerRoute %s is invalid: %v", vsrKey, err)
1680+
warnings = append(warnings, warning)
1681+
continue
1682+
}
1683+
1684+
vsrs = append(vsrs, vsr)
1685+
} else if r.RouteSelector != nil {
1686+
if vsrSelectors == nil {
1687+
vsrSelectors = make(map[string][]string)
1688+
}
16801689

1681-
vsrs = append(vsrs, vsr)
1690+
selector := &metav1.LabelSelector{
1691+
MatchLabels: r.RouteSelector.MatchLabels,
1692+
}
1693+
sel, err := metav1.LabelSelectorAsSelector(selector)
1694+
1695+
if err != nil {
1696+
warning := fmt.Sprintf("VirtualServerRoute LabelSelector %s is invalid: %v", selector, err)
1697+
warnings = append(warnings, warning)
1698+
continue
1699+
}
1700+
1701+
selectorStr := sel.String()
1702+
// Initialize the selector entry regardless of whether routes match
1703+
if vsrSelectors[selectorStr] == nil {
1704+
vsrSelectors[selectorStr] = make([]string, 0)
1705+
}
1706+
1707+
for vsrKey, vsr := range c.virtualServerRoutes {
1708+
if sel.Matches(labels.Set(vsr.ObjectMeta.Labels)) {
1709+
err := c.virtualServerValidator.ValidateVirtualServerRouteForVirtualServer(vsr, vs.Spec.Host, r.Path)
1710+
if err != nil {
1711+
warning := fmt.Sprintf("VirtualServerRoute %s is invalid: %v", vsrKey, err)
1712+
warnings = append(warnings, warning)
1713+
continue
1714+
}
1715+
vsrs = append(vsrs, vsr)
1716+
1717+
// Add to selectors map
1718+
vsrSelectors[selectorStr] = append(vsrSelectors[selectorStr], vsrKey)
1719+
}
1720+
}
1721+
}
16821722
}
16831723

1684-
return vsrs, warnings
1724+
return vsrs, vsrSelectors, warnings
16851725
}
16861726

16871727
// GetTransportServerMetrics returns metrics about TransportServers

0 commit comments

Comments
 (0)