@@ -2,6 +2,8 @@ package k8s
22
33import (
44 "fmt"
5+ "github.com/golang/glog"
6+ "k8s.io/apimachinery/pkg/labels"
57 "reflect"
68 "sort"
79 "strings"
@@ -570,6 +572,7 @@ func (c *Configuration) AddOrUpdateVirtualServerRoute(vsr *conf_v1.VirtualServer
570572 if ! c .hasCorrectIngressClass (vsr ) {
571573 delete (c .virtualServerRoutes , key )
572574 } else {
575+ glog .Infof ("labels: %v" , vsr .ObjectMeta .Labels )
573576 validationError = c .virtualServerValidator .ValidateVirtualServerRoute (vsr )
574577 if validationError != nil {
575578 delete (c .virtualServerRoutes , key )
@@ -1636,32 +1639,57 @@ func (c *Configuration) buildVirtualServerRoutes(vs *conf_v1.VirtualServer) ([]*
16361639 var warnings []string
16371640
16381641 for _ , r := range vs .Spec .Routes {
1639- if r .Route == "" {
1640- continue
1641- }
1642+ if r .Route != "" {
1643+ vsrKey := r .Route
16421644
1643- vsrKey := r .Route
1645+ // if route is defined without a namespace, use the namespace of VirtualServer.
1646+ if ! strings .Contains (r .Route , "/" ) {
1647+ vsrKey = fmt .Sprintf ("%s/%s" , vs .Namespace , r .Route )
1648+ }
16441649
1645- // if route is defined without a namespace, use the namespace of VirtualServer.
1646- if ! strings .Contains (r .Route , "/" ) {
1647- vsrKey = fmt .Sprintf ("%s/%s" , vs .Namespace , r .Route )
1648- }
1650+ vsr , exists := c .virtualServerRoutes [vsrKey ]
16491651
1650- vsr , exists := c .virtualServerRoutes [vsrKey ]
1651- if ! exists {
1652- warning := fmt .Sprintf ("VirtualServerRoute %s doesn't exist or invalid" , vsrKey )
1653- warnings = append (warnings , warning )
1654- continue
1655- }
1652+ // if route is defined
1653+ if ! exists {
1654+ warning := fmt .Sprintf ("VirtualServerRoute %s doesn't exist or invalid" , vsrKey )
1655+ warnings = append (warnings , warning )
1656+ continue
1657+ }
1658+
1659+ err := c .virtualServerValidator .ValidateVirtualServerRouteForVirtualServer (vsr , vs .Spec .Host , r .Path )
1660+ if err != nil {
1661+ warning := fmt .Sprintf ("VirtualServerRoute %s is invalid: %v" , vsrKey , err )
1662+ warnings = append (warnings , warning )
1663+ continue
1664+ }
1665+
1666+ vsrs = append (vsrs , vsr )
1667+ } else if r .RouteSelector != nil {
1668+ selector := & metav1.LabelSelector {
1669+ MatchLabels : r .RouteSelector .MatchLabels ,
1670+ }
1671+ sel , err := metav1 .LabelSelectorAsSelector (selector )
1672+
1673+ if err != nil {
1674+ warning := fmt .Sprintf ("VirtualServerRoute LabelSelector %s is invalid: %v" , selector , err )
1675+ warnings = append (warnings , warning )
1676+ continue
1677+ }
1678+ for vsrKey , vsr := range c .virtualServerRoutes {
1679+ if sel .Matches (labels .Set (vsr .ObjectMeta .Labels )) {
1680+ err := c .virtualServerValidator .ValidateVirtualServerRouteForVirtualServer (vsr , vs .Spec .Host , r .Path )
1681+ if err != nil {
1682+ warning := fmt .Sprintf ("VirtualServerRoute %s is invalid: %v" , vsrKey , err )
1683+ warnings = append (warnings , warning )
1684+ continue
1685+ }
1686+ glog .Infof ("VirtualServerRoute %s found for label selector %v" , vsrKey , selector )
1687+ vsrs = append (vsrs , vsr )
1688+ }
1689+ }
16561690
1657- err := c .virtualServerValidator .ValidateVirtualServerRouteForVirtualServer (vsr , vs .Spec .Host , r .Path )
1658- if err != nil {
1659- warning := fmt .Sprintf ("VirtualServerRoute %s is invalid: %v" , vsrKey , err )
1660- warnings = append (warnings , warning )
1661- continue
16621691 }
16631692
1664- vsrs = append (vsrs , vsr )
16651693 }
16661694
16671695 return vsrs , warnings
0 commit comments