Skip to content

Commit 62070ca

Browse files
committed
Merge remote-tracking branch 'origin/release-v2-dev' into chore/gateway_ingress_contoller
Signed-off-by: ashing <[email protected]>
2 parents d627153 + 9e4e35b commit 62070ca

30 files changed

+647
-247
lines changed

Dockerfile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ RUN apt update \
1616
&& apt autoremove -y wget
1717

1818
FROM gcr.io/distroless/cc-debian12:${BASE_IMAGE_TAG}
19+
20+
ARG TARGETARCH
21+
1922
WORKDIR /app
2023

2124
COPY --from=deps /bin/adc /bin/adc
22-
COPY ./bin/api7-ingress-controller .
25+
COPY ./bin/api7-ingress-controller_${TARGETARCH} ./api7-ingress-controller
2326
COPY ./config/samples/config.yaml ./conf/config.yaml
2427

2528
ENTRYPOINT ["/app/api7-ingress-controller"]

Makefile

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,28 @@ pull-infra-images:
156156

157157
.PHONY: build
158158
build: manifests generate fmt vet ## Build manager binary.
159-
GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=0 go build -o bin/api7-ingress-controller -ldflags $(GO_LDFLAGS) cmd/main.go
159+
GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=0 go build -o bin/api7-ingress-controller_$(GOARCH) -ldflags $(GO_LDFLAGS) cmd/main.go
160160

161161
linux-build:
162162
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bin/api7-ingress-controller -ldflags $(GO_LDFLAGS) cmd/main.go
163163

164164
.PHONY: build-image
165165
build-image: docker-build
166166

167+
.PHONY: build-multi-arch
168+
build-multi-arch:
169+
@CGO_ENABLED=0 GOARCH=amd64 go build -o bin/api7-ingress-controller_amd64 -ldflags $(GO_LDFLAGS) cmd/main.go
170+
@CGO_ENABLED=0 GOARCH=arm64 go build -o bin/api7-ingress-controller_arm64 -ldflags $(GO_LDFLAGS) cmd/main.go
171+
172+
.PHONY: build-multi-arch-image
173+
build-multi-arch-image: build-multi-arch
174+
# daemon.json: "features":{"containerd-snapshotter": true}
175+
@docker buildx build --load --platform linux/amd64,linux/arm64 -t $(IMG) .
176+
177+
.PHONY: build-push-multi-arch-image
178+
build-push-multi-arch-image: build-multi-arch
179+
@docker buildx build --push --platform linux/amd64,linux/arm64 -t $(IMG) .
180+
167181
.PHONY: run
168182
run: manifests generate fmt vet ## Run a controller from your host.
169183
go run ./cmd/main.go

api/adc/types.go

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import (
1010
"time"
1111

1212
"github.com/incubator4/go-resty-expr/expr"
13-
14-
"github.com/api7/api7-ingress-controller/api/common"
1513
)
1614

1715
const (
@@ -115,16 +113,16 @@ type Service struct {
115113
type Route struct {
116114
Metadata `json:",inline" yaml:",inline"`
117115

118-
EnableWebsocket *bool `json:"enable_websocket,omitempty" yaml:"enable_websocket,omitempty"`
119-
FilterFunc string `json:"filter_func,omitempty" yaml:"filter_func,omitempty"`
120-
Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"`
121-
Methods []string `json:"methods,omitempty" yaml:"methods,omitempty"`
122-
Plugins Plugins `json:"plugins,omitempty" yaml:"plugins,omitempty"`
123-
Priority *int64 `json:"priority,omitempty" yaml:"priority,omitempty"`
124-
RemoteAddrs []string `json:"remote_addrs,omitempty" yaml:"remote_addrs,omitempty"`
125-
Timeout *Timeout `json:"timeout,omitempty" yaml:"timeout,omitempty"`
126-
Uris []string `json:"uris" yaml:"uris"`
127-
Vars common.Vars `json:"vars,omitempty" yaml:"vars,omitempty"`
116+
EnableWebsocket *bool `json:"enable_websocket,omitempty" yaml:"enable_websocket,omitempty"`
117+
FilterFunc string `json:"filter_func,omitempty" yaml:"filter_func,omitempty"`
118+
Hosts []string `json:"hosts,omitempty" yaml:"hosts,omitempty"`
119+
Methods []string `json:"methods,omitempty" yaml:"methods,omitempty"`
120+
Plugins Plugins `json:"plugins,omitempty" yaml:"plugins,omitempty"`
121+
Priority *int64 `json:"priority,omitempty" yaml:"priority,omitempty"`
122+
RemoteAddrs []string `json:"remote_addrs,omitempty" yaml:"remote_addrs,omitempty"`
123+
Timeout *Timeout `json:"timeout,omitempty" yaml:"timeout,omitempty"`
124+
Uris []string `json:"uris" yaml:"uris"`
125+
Vars Vars `json:"vars,omitempty" yaml:"vars,omitempty"`
128126
}
129127

130128
type Timeout struct {
@@ -502,3 +500,49 @@ type ResponseData struct {
502500
Value map[string]any `json:"value"`
503501
ErrorMsg string `json:"error_msg"`
504502
}
503+
504+
// Vars represents the route match expressions of APISIX.
505+
type Vars [][]StringOrSlice
506+
507+
// UnmarshalJSON implements json.Unmarshaler interface.
508+
// lua-cjson doesn't distinguish empty array and table,
509+
// and by default empty array will be encoded as '{}'.
510+
// We have to maintain the compatibility.
511+
func (vars *Vars) UnmarshalJSON(p []byte) error {
512+
if p[0] == '{' {
513+
if len(p) != 2 {
514+
return errors.New("unexpected non-empty object")
515+
}
516+
return nil
517+
}
518+
var data [][]StringOrSlice
519+
if err := json.Unmarshal(p, &data); err != nil {
520+
return err
521+
}
522+
*vars = data
523+
return nil
524+
}
525+
526+
// StringOrSlice represents a string or a string slice.
527+
// TODO Do not use interface{} to avoid the reflection overheads.
528+
type StringOrSlice struct {
529+
StrVal string `json:"-"`
530+
SliceVal []StringOrSlice `json:"-"`
531+
}
532+
533+
func (s *StringOrSlice) MarshalJSON() ([]byte, error) {
534+
if s.SliceVal != nil {
535+
return json.Marshal(s.SliceVal)
536+
}
537+
return json.Marshal(s.StrVal)
538+
}
539+
540+
func (s *StringOrSlice) UnmarshalJSON(p []byte) error {
541+
if len(p) == 0 {
542+
return errors.New("empty object")
543+
}
544+
if p[0] == '[' {
545+
return json.Unmarshal(p, &s.SliceVal)
546+
}
547+
return json.Unmarshal(p, &s.StrVal)
548+
}

api/common/types.go

Lines changed: 0 additions & 64 deletions
This file was deleted.

api/common/zz_generated.deepcopy.go

Lines changed: 0 additions & 70 deletions
This file was deleted.

api/v1alpha1/backendtrafficpolicy_types.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package v1alpha1
22

33
import (
44
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5-
6-
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
75
)
86

97
// +kubebuilder:object:root=true
@@ -12,22 +10,18 @@ type BackendTrafficPolicy struct {
1210
metav1.TypeMeta `json:",inline"`
1311
metav1.ObjectMeta `json:"metadata,omitempty"`
1412

15-
Spec BackendTrafficPolicySpec `json:"spec,omitempty"`
16-
Status gatewayv1alpha2.PolicyStatus `json:"status,omitempty"`
13+
Spec BackendTrafficPolicySpec `json:"spec,omitempty"`
14+
Status PolicyStatus `json:"status,omitempty"`
1715
}
1816

1917
type BackendTrafficPolicySpec struct {
2018
// TargetRef identifies an API object to apply policy to.
2119
// Currently, Backends (i.e. Service, ServiceImport, or any
2220
// implementation-specific backendRef) are the only valid API
2321
// target references.
24-
// +listType=map
25-
// +listMapKey=group
26-
// +listMapKey=kind
27-
// +listMapKey=name
2822
// +kubebuilder:validation:MinItems=1
2923
// +kubebuilder:validation:MaxItems=16
30-
TargetRefs []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"`
24+
TargetRefs []BackendPolicyTargetReferenceWithSectionName `json:"targetRefs"`
3125
// LoadBalancer represents the load balancer configuration for Kubernetes Service.
3226
// The default strategy is round robin.
3327
LoadBalancer *LoadBalancer `json:"loadbalancer,omitempty" yaml:"loadbalancer,omitempty"`
@@ -74,9 +68,12 @@ type LoadBalancer struct {
7468
}
7569

7670
type Timeout struct {
71+
// +kubebuilder:default="60s"
7772
Connect metav1.Duration `json:"connect,omitempty" yaml:"connect,omitempty"`
78-
Send metav1.Duration `json:"send,omitempty" yaml:"send,omitempty"`
79-
Read metav1.Duration `json:"read,omitempty" yaml:"read,omitempty"`
73+
// +kubebuilder:default="60s"
74+
Send metav1.Duration `json:"send,omitempty" yaml:"send,omitempty"`
75+
// +kubebuilder:default="60s"
76+
Read metav1.Duration `json:"read,omitempty" yaml:"read,omitempty"`
8077
}
8178

8279
// +kubebuilder:object:root=true

api/v1alpha1/httproutepolicy_types.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ limitations under the License.
1717
package v1alpha1
1818

1919
import (
20+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2021
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122
gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
22-
23-
"github.com/api7/api7-ingress-controller/api/common"
2423
)
2524

2625
// HTTPRoutePolicySpec defines the desired state of HTTPRoutePolicy.
@@ -36,8 +35,8 @@ type HTTPRoutePolicySpec struct {
3635
// +kubebuilder:validation:MaxItems=16
3736
TargetRefs []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"`
3837

39-
Priority *int64 `json:"priority,omitempty" yaml:"priority,omitempty"`
40-
Vars Vars `json:"vars,omitempty" yaml:"vars,omitempty"`
38+
Priority *int64 `json:"priority,omitempty" yaml:"priority,omitempty"`
39+
Vars []apiextensionsv1.JSON `json:"vars,omitempty" yaml:"vars,omitempty"`
4140
}
4241

4342
// +kubebuilder:object:root=true
@@ -61,10 +60,6 @@ type HTTPRoutePolicyList struct {
6160
Items []HTTPRoutePolicy `json:"items"`
6261
}
6362

64-
// Vars represents the route match expressions of APISIX.
65-
// +kubebuilder:object:generate=false
66-
type Vars = common.Vars
67-
6863
func init() {
6964
SchemeBuilder.Register(&HTTPRoutePolicy{}, &HTTPRoutePolicyList{})
7065
}

api/v1alpha1/policies_type.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package v1alpha1
2+
3+
import gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2"
4+
5+
type PolicyStatus gatewayv1alpha2.PolicyStatus
6+
7+
// +kubebuilder:validation:XValidation:rule="self.kind == 'Service' && self.group == \"\""
8+
type BackendPolicyTargetReferenceWithSectionName gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName

0 commit comments

Comments
 (0)