@@ -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
2122const (
@@ -207,23 +208,25 @@ func NewMinionConfiguration(ing *networking.Ingress) *MinionConfiguration {
207208
208209// VirtualServerConfiguration holds a VirtualServer along with its VirtualServerRoutes.
209210type 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