Skip to content

Commit ab0a67d

Browse files
authored
feat: support ingress resource (#77)
Signed-off-by: ashing <[email protected]>
1 parent 93dae45 commit ab0a67d

File tree

13 files changed

+665
-12
lines changed

13 files changed

+665
-12
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ dist
3030
.tmp
3131
api7-ingress-controller
3232
api7-ingress-controller-conformance-report.yaml
33+
34+
*.mdx

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
}

config/rbac/role.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,27 @@ rules:
133133
verbs:
134134
- get
135135
- update
136+
- apiGroups:
137+
- networking.k8s.io
138+
resources:
139+
- ingressclasses
140+
verbs:
141+
- get
142+
- list
143+
- watch
144+
- apiGroups:
145+
- networking.k8s.io
146+
resources:
147+
- ingresses
148+
verbs:
149+
- get
150+
- list
151+
- update
152+
- watch
153+
- apiGroups:
154+
- networking.k8s.io
155+
resources:
156+
- ingresses/status
157+
verbs:
158+
- get
159+
- update

config/samples/config.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ controller_name: gateway.api7.io/api7-ingress-controller # The controller name
88
leader_election_id: "api7-ingress-controller-leader" # The leader election ID for the API7 Ingress Controller.
99
# The default value is "api7-ingress-controller-leader".
1010

11+
ingress_class: api7 # The ingress class name of the API7 Ingress Controller.
12+
ingress_publish_service: "" # The service name of the ingress publish service.
13+
ingress_status_address: [] # The status address of the ingress.
14+
1115
gateway_configs: # The configuration of the API7 Gateway.
1216
- name: api7 # The name of the Gateway in the Gateway API.
1317
control_plane:

internal/controller/config/config.go

Lines changed: 17 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,19 @@ func GatewayNameList() []string {
161162
}
162163
return gatewayNameList
163164
}
165+
166+
func GetIngressClass() string {
167+
return ControllerConfig.IngressClass
168+
}
169+
170+
func GetIngressPublishService() string {
171+
return ControllerConfig.IngressPublishService
172+
}
173+
174+
func GetIngressStatusAddress() []string {
175+
return ControllerConfig.IngressStatusAddress
176+
}
177+
178+
func GetControllerName() string {
179+
return ControllerConfig.ControllerName
180+
}

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: 103 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,9 @@ const (
1314
ExtensionRef = "extensionRef"
1415
ParametersRef = "parametersRef"
1516
ParentRefs = "parentRefs"
17+
IngressClass = "ingressClass"
18+
SecretIndexRef = "secretRefs"
19+
IngressClassRef = "ingressClassRef"
1620
)
1721

1822
func SetupIndexer(mgr ctrl.Manager) error {
@@ -22,6 +26,9 @@ func SetupIndexer(mgr ctrl.Manager) error {
2226
if err := setupHTTPRouteIndexer(mgr); err != nil {
2327
return err
2428
}
29+
if err := setupIngressIndexer(mgr); err != nil {
30+
return err
31+
}
2532
return nil
2633
}
2734

@@ -67,6 +74,102 @@ func setupHTTPRouteIndexer(mgr ctrl.Manager) error {
6774
return nil
6875
}
6976

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

0 commit comments

Comments
 (0)