Skip to content

Commit 79638ff

Browse files
committed
feat: support ingress resource
Signed-off-by: ashing <[email protected]>
1 parent 8c4d0c1 commit 79638ff

File tree

7 files changed

+654
-21
lines changed

7 files changed

+654
-21
lines changed

api/adc/types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,6 @@ type ResponseDetails struct {
540540
}
541541

542542
type ResponseData struct {
543-
Value map[string]interface{} `json:"value"`
544-
ErrorMsg string `json:"error_msg"`
543+
Value map[string]any `json:"value"`
544+
ErrorMsg string `json:"error_msg"`
545545
}

internal/controller/config/config.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func NewDefaultConfig() *Config {
2828
LeaderElectionID: DefaultLeaderElectionID,
2929
ProbeAddr: DefaultProbeAddr,
3030
MetricsAddr: DefaultMetricsAddr,
31+
IngressClass: DefaultIngressClass,
3132
}
3233
}
3334

@@ -161,3 +162,18 @@ func GatewayNameList() []string {
161162
}
162163
return gatewayNameList
163164
}
165+
166+
// GetIngressClass 获取 Ingress 类名
167+
func GetIngressClass() string {
168+
return ControllerConfig.IngressClass
169+
}
170+
171+
// GetIngressPublishService 获取 Ingress 发布服务
172+
func GetIngressPublishService() string {
173+
return ControllerConfig.IngressPublishService
174+
}
175+
176+
// GetIngressStatusAddress 获取 Ingress 状态地址
177+
func GetIngressStatusAddress() []string {
178+
return ControllerConfig.IngressStatusAddress
179+
}

internal/controller/config/types.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,29 @@ const (
1313
// DefaultLogLevel is the default log level for apisix-ingress-controller.
1414
DefaultLogLevel = "info"
1515

16+
// DefaultIngressClass is the default ingress class name for Ingress resources
17+
DefaultIngressClass = "api7"
18+
1619
DefaultMetricsAddr = ":8080"
1720
DefaultProbeAddr = ":8081"
1821
)
1922

2023
// Config contains all config items which are necessary for
2124
// apisix-ingress-controller's running.
2225
type Config struct {
23-
CertFilePath string `json:"cert_file" yaml:"cert_file"`
24-
KeyFilePath string `json:"key_file" yaml:"key_file"`
25-
LogLevel string `json:"log_level" yaml:"log_level"`
26-
ControllerName string `json:"controller_name" yaml:"controller_name"`
27-
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
28-
GatewayConfigs []*GatewayConfig `json:"gateway_configs" yaml:"gateway_configs"`
29-
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
30-
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
31-
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
32-
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
26+
CertFilePath string `json:"cert_file" yaml:"cert_file"`
27+
KeyFilePath string `json:"key_file" yaml:"key_file"`
28+
LogLevel string `json:"log_level" yaml:"log_level"`
29+
ControllerName string `json:"controller_name" yaml:"controller_name"`
30+
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
31+
GatewayConfigs []*GatewayConfig `json:"gateway_configs" yaml:"gateway_configs"`
32+
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
33+
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
34+
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
35+
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
36+
IngressClass string `json:"ingress_class" yaml:"ingress_class"`
37+
IngressPublishService string `json:"ingress_publish_service" yaml:"ingress_publish_service"`
38+
IngressStatusAddress []string `json:"ingress_status_address" yaml:"ingress_status_address"`
3339
}
3440

3541
type GatewayConfig struct {

internal/controller/indexer/indexer.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package indexer
33
import (
44
"context"
55

6+
networkingv1 "k8s.io/api/networking/v1"
67
ctrl "sigs.k8s.io/controller-runtime"
78
"sigs.k8s.io/controller-runtime/pkg/client"
89
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
@@ -13,6 +14,8 @@ const (
1314
ExtensionRef = "extensionRef"
1415
ParametersRef = "parametersRef"
1516
ParentRefs = "parentRefs"
17+
IngressClass = "ingressClass"
18+
SecretIndexRef = "secretRefs"
1619
)
1720

1821
func SetupIndexer(mgr ctrl.Manager) error {
@@ -22,6 +25,9 @@ func SetupIndexer(mgr ctrl.Manager) error {
2225
if err := setupHTTPRouteIndexer(mgr); err != nil {
2326
return err
2427
}
28+
if err := setupIngressIndexer(mgr); err != nil {
29+
return err
30+
}
2531
return nil
2632
}
2733

@@ -67,6 +73,88 @@ func setupHTTPRouteIndexer(mgr ctrl.Manager) error {
6773
return nil
6874
}
6975

76+
func setupIngressIndexer(mgr ctrl.Manager) error {
77+
// create IngressClass index
78+
if err := mgr.GetFieldIndexer().IndexField(
79+
context.Background(),
80+
&networkingv1.Ingress{},
81+
IngressClass,
82+
IngressClassIndexFunc,
83+
); err != nil {
84+
return err
85+
}
86+
87+
// create Service index for quick lookup of Ingresses using specific services
88+
if err := mgr.GetFieldIndexer().IndexField(
89+
context.Background(),
90+
&networkingv1.Ingress{},
91+
ServiceIndexRef,
92+
IngressServiceIndexFunc,
93+
); err != nil {
94+
return err
95+
}
96+
97+
// create secret index for TLS
98+
if err := mgr.GetFieldIndexer().IndexField(
99+
context.Background(),
100+
&networkingv1.Ingress{},
101+
SecretIndexRef,
102+
IngressSecretIndexFunc,
103+
); err != nil {
104+
return err
105+
}
106+
107+
return nil
108+
}
109+
110+
func IngressClassIndexFunc(rawObj client.Object) []string {
111+
ingress := rawObj.(*networkingv1.Ingress)
112+
if ingress.Spec.IngressClassName == nil {
113+
return nil
114+
}
115+
return []string{*ingress.Spec.IngressClassName}
116+
}
117+
118+
func IngressServiceIndexFunc(rawObj client.Object) []string {
119+
120+
ingress := rawObj.(*networkingv1.Ingress)
121+
var services []string
122+
123+
for _, rule := range ingress.Spec.Rules {
124+
if rule.HTTP == nil {
125+
continue
126+
}
127+
128+
for _, path := range rule.HTTP.Paths {
129+
if path.Backend.Service == nil {
130+
continue
131+
}
132+
133+
key := GenIndexKey(ingress.Namespace, path.Backend.Service.Name)
134+
services = append(services, key)
135+
}
136+
}
137+
138+
return services
139+
}
140+
141+
func IngressSecretIndexFunc(rawObj client.Object) []string {
142+
ingress := rawObj.(*networkingv1.Ingress)
143+
144+
secrets := make([]string, 0)
145+
146+
for _, tls := range ingress.Spec.TLS {
147+
if tls.SecretName == "" {
148+
continue
149+
}
150+
151+
key := GenIndexKey(ingress.Namespace, tls.SecretName)
152+
secrets = append(secrets, key)
153+
}
154+
155+
return secrets
156+
}
157+
70158
func GenIndexKey(namespace, name string) string {
71159
return client.ObjectKey{
72160
Namespace: namespace,

0 commit comments

Comments
 (0)