@@ -123,6 +123,7 @@ type Configurator struct {
123
123
templateExecutorV2 * version2.TemplateExecutor
124
124
ingresses map [string ]* IngressEx
125
125
minions map [string ]map [string ]bool
126
+ mergeableIngresses map [string ]* MergeableIngresses
126
127
virtualServers map [string ]* VirtualServerEx
127
128
transportServers map [string ]* TransportServerEx
128
129
tlsPassthroughPairs map [string ]tlsPassthroughPair
@@ -180,6 +181,7 @@ func NewConfigurator(p ConfiguratorParams) *Configurator {
180
181
templateExecutor : p .TemplateExecutor ,
181
182
templateExecutorV2 : p .TemplateExecutorV2 ,
182
183
minions : make (map [string ]map [string ]bool ),
184
+ mergeableIngresses : make (map [string ]* MergeableIngresses ),
183
185
tlsPassthroughPairs : make (map [string ]tlsPassthroughPair ),
184
186
isPlus : p .IsPlus ,
185
187
isWildcardEnabled : p .IsWildcardEnabled ,
@@ -475,6 +477,9 @@ func (cnf *Configurator) addOrUpdateMergeableIngress(mergeableIngs *MergeableIng
475
477
minionName := objectMetaToFileName (& minion .Ingress .ObjectMeta )
476
478
cnf.minions [name ][minionName ] = true
477
479
}
480
+
481
+ cnf .mergeableIngresses [name ] = mergeableIngs
482
+
478
483
if (cnf .isPlus && cnf .isPrometheusEnabled ) || cnf .isLatencyMetricsEnabled {
479
484
cnf .updateIngressMetricsLabels (mergeableIngs .Master , nginxCfg .Upstreams )
480
485
}
@@ -955,6 +960,7 @@ func (cnf *Configurator) DeleteIngress(key string, skipReload bool) error {
955
960
956
961
delete (cnf .ingresses , name )
957
962
delete (cnf .minions , name )
963
+ delete (cnf .mergeableIngresses , name )
958
964
959
965
if (cnf .isPlus && cnf .isPrometheusEnabled ) || cnf .isLatencyMetricsEnabled {
960
966
cnf .deleteIngressMetricsLabels (key )
@@ -1542,6 +1548,106 @@ func (cnf *Configurator) GetIngressCounts() map[string]int {
1542
1548
return counters
1543
1549
}
1544
1550
1551
+ // GetServiceCount returns the total number of unique services referenced by Ingresses, VS's, VSR's, and TS's
1552
+ func (cnf * Configurator ) GetServiceCount () int {
1553
+ setOfUniqueServices := make (map [string ]bool )
1554
+ cnf .addVSAndVSRServicesToSet (setOfUniqueServices )
1555
+ cnf .addTSServicesToSet (setOfUniqueServices )
1556
+ cnf .addIngressesServicesToSet (setOfUniqueServices )
1557
+ return len (setOfUniqueServices )
1558
+ }
1559
+
1560
+ // addVSAndVSRServicesToSet adds services from VirtualServers and VirtualServerRoutes to the set
1561
+ func (cnf * Configurator ) addVSAndVSRServicesToSet (set map [string ]bool ) {
1562
+ for _ , vs := range cnf .virtualServers {
1563
+ ns := vs .VirtualServer .Namespace
1564
+ for _ , upstream := range vs .VirtualServer .Spec .Upstreams {
1565
+ svc := upstream .Service
1566
+ addServiceToSet (set , ns , svc )
1567
+
1568
+ if upstream .Backup != "" {
1569
+ addServiceToSet (set , ns , upstream .Backup )
1570
+ }
1571
+
1572
+ if upstream .HealthCheck != nil && upstream .HealthCheck .GRPCService != "" {
1573
+ addServiceToSet (set , ns , upstream .HealthCheck .GRPCService )
1574
+ }
1575
+ }
1576
+
1577
+ for _ , vsr := range vs .VirtualServerRoutes {
1578
+ ns := vsr .Namespace
1579
+ for _ , upstream := range vsr .Spec .Upstreams {
1580
+ svc := upstream .Service
1581
+ addServiceToSet (set , ns , svc )
1582
+
1583
+ if upstream .Backup != "" {
1584
+ addServiceToSet (set , ns , upstream .Backup )
1585
+ }
1586
+
1587
+ if upstream .HealthCheck != nil && upstream .HealthCheck .GRPCService != "" {
1588
+ addServiceToSet (set , ns , upstream .HealthCheck .GRPCService )
1589
+ }
1590
+ }
1591
+ }
1592
+ }
1593
+ }
1594
+
1595
+ // addTSServicesToSet adds services from TransportServers to the set
1596
+ func (cnf * Configurator ) addTSServicesToSet (set map [string ]bool ) {
1597
+ for _ , ts := range cnf .transportServers {
1598
+ ns := ts .TransportServer .Namespace
1599
+ for _ , upstream := range ts .TransportServer .Spec .Upstreams {
1600
+ svc := upstream .Service
1601
+ addServiceToSet (set , ns , svc )
1602
+
1603
+ if upstream .Backup != "" {
1604
+ addServiceToSet (set , ns , upstream .Backup )
1605
+ }
1606
+
1607
+ }
1608
+ }
1609
+ }
1610
+
1611
+ // addIngressesServicesToSet adds services from Ingresses to the set
1612
+ func (cnf * Configurator ) addIngressesServicesToSet (set map [string ]bool ) {
1613
+ for _ , ing := range cnf .ingresses {
1614
+ cnf .addIngressServicesToSet (ing , set )
1615
+ }
1616
+ for _ , mergeIngs := range cnf .mergeableIngresses {
1617
+ cnf .addIngressServicesToSet (mergeIngs .Master , set )
1618
+ for _ , minion := range mergeIngs .Minions {
1619
+ cnf .addIngressServicesToSet (minion , set )
1620
+ }
1621
+ }
1622
+ }
1623
+
1624
+ // addIngressServicesToSet processes a single ingress and adds its services to the set
1625
+ func (cnf * Configurator ) addIngressServicesToSet (ing * IngressEx , set map [string ]bool ) {
1626
+ if ing == nil || ing .Ingress == nil {
1627
+ return
1628
+ }
1629
+ ns := ing .Ingress .Namespace
1630
+ if ing .Ingress .Spec .DefaultBackend != nil && ing .Ingress .Spec .DefaultBackend .Service != nil {
1631
+ svc := ing .Ingress .Spec .DefaultBackend .Service .Name
1632
+ addServiceToSet (set , ns , svc )
1633
+ }
1634
+ for _ , rule := range ing .Ingress .Spec .Rules {
1635
+ if rule .HTTP != nil {
1636
+ for _ , path := range rule .HTTP .Paths {
1637
+ if path .Backend .Service != nil {
1638
+ svc := path .Backend .Service .Name
1639
+ addServiceToSet (set , ns , svc )
1640
+ }
1641
+ }
1642
+ }
1643
+ }
1644
+ }
1645
+
1646
+ // Helper function to add services to the set
1647
+ func addServiceToSet (set map [string ]bool , ns string , svc string ) {
1648
+ set [fmt .Sprintf ("%s/%s" , ns , svc )] = true
1649
+ }
1650
+
1545
1651
// GetVirtualServerCounts returns the total count of
1546
1652
// VirtualServer and VirtualServerRoute resources that are handled by the Ingress Controller
1547
1653
func (cnf * Configurator ) GetVirtualServerCounts () (int , int ) {
0 commit comments