Skip to content

Commit b3cb361

Browse files
authored
feat(gateway): impl gateway crd and opt route&domain crd (#313)
* feat(gateway): impl gateway crd and opt route&domain crd * feat(gateway):update manifests * feat(gateway): update app route * feat(gateway): update bucket route * feat(gateway): opt controller
1 parent ab8c969 commit b3cb361

14 files changed

+586
-151
lines changed

controllers/gateway/api/v1/domain_types.go

+24-13
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,39 @@ import (
2626
// DomainSpec defines the desired state of Domain
2727
type DomainSpec struct {
2828

29-
// Preferred 是提供域名使用位置的推荐项,是字符串类型,长度大于1小于10,必须存在
30-
// +kubebuilder:validation:MinLength=1
31-
// +kubebuilder:validation:MaxLength=10
29+
// Domain是域名,必须存在,匹配域名规则
30+
// +kubebuilder:validation:Pattern="^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$"
3231
// +kubebuilder:validation:Required
33-
Preferred string `json:"preferred"`
32+
Domain string `json:"domain"`
3433

35-
// Region 是域名设定的解析区域,是字符串类型,长度大于1小于10,可选存在
36-
// +kubebuilder:validation:MinLength=1
37-
// +kubebuilder:validation:MaxLength=10
38-
// +kubebuilder:validation:Optional
39-
Region string `json:"region,omitempty"`
34+
// BackendType是后端服务类型,必须存在APP;bucket;WEBSITE
35+
// +kubebuilder:validation:Enum=app;bucket;website
36+
// +kubebuilder:validation:Required
37+
BackendType BackendType `json:"backendType"`
4038

41-
// Domain 是域名,是字符串类型,规则匹配域名规则,必须存在
42-
// +kubebuilder:validation:Pattern="^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$"
39+
// Region 是区域 必须存在 由字符数组和-组成
40+
// +kubebuilder:validation:Pattern="^[a-zA-Z0-9-]+$"
4341
// +kubebuilder:validation:Required
44-
Domain string `json:"domain"`
42+
Region string `json:"region"`
4543

46-
// CertConfigRef 是字符串类型,是configMap的引用
44+
// Cluster 是网关集群配置 必须存在
4745
// +kubebuilder:validation:Required
46+
Cluster ClusterSpec `json:"cluster"`
47+
48+
// CertConfigRef 是字符串类型,是configMap的引用,可选存在
49+
// +kubebuilder:validation:Optional
4850
CertConfigRef string `json:"certConfigRef"`
4951
}
5052

53+
// ClusterSpec 是集群的规格
54+
type ClusterSpec struct {
55+
// url是集群的url,必须存在
56+
Url string `json:"url"`
57+
58+
// key是集群的key,必须存在
59+
Key string `json:"key"`
60+
}
61+
5162
// DomainStatus defines the observed state of Domain
5263
type DomainStatus struct {
5364
// CertConfigRef 是字符串类型,是configMap的引用

controllers/gateway/api/v1/gateway_types.go

+30-24
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@ import (
2323
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
2424
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
2525

26+
// BackendType 是后端服务类型
27+
type BackendType string
28+
29+
const (
30+
APP BackendType = "app"
31+
BUCKET BackendType = "bucket"
32+
WEBSITE BackendType = "website"
33+
)
34+
35+
// RouteState 是路由的状态
36+
type RouteState string
37+
38+
const (
39+
PREPARING RouteState = "preparing"
40+
CREATED RouteState = "created"
41+
)
42+
2643
// GatewaySpec defines the desired state of Gateway
2744
type GatewaySpec struct {
2845
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
@@ -33,7 +50,7 @@ type GatewaySpec struct {
3350
// AppId是应用id,字母数字组成,长度5至16位,必须存在
3451
// +kubebuilder:validation:Pattern="^[a-zA-Z0-9]{5,16}$"
3552
// +kubebuilder:validation:Required
36-
AppId string `json:"appId"`
53+
AppId string `json:"appid"`
3754

3855
// Buckets是存储桶, 是一个数组,可选存在
3956
// +kubebuilder:validation:Optional
@@ -49,37 +66,26 @@ type GatewayStatus struct {
4966
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
5067
// Important: Run "make" to regenerate code after modifying this file
5168

52-
// AppDomain 是应用域名,必须存在
53-
// +kubebuilder:validation:Required
54-
AppDomain string `json:"appDomain"`
69+
// AppRoute 是应用路由
70+
AppRoute *GatewayRoute `json:"appRoute,omitempty"`
5571

56-
// BucketDomains 是存储桶域名列表,是一个数组,可选存在
57-
// +kubebuilder:validation:Optional
58-
BucketDomains []string `json:"bucketDomains,omitempty"`
72+
// BucketRoutes 是存储桶路由
73+
BucketRoutes map[string]*GatewayRoute `json:"bucketRoutes,omitempty"`
5974

60-
// WebsiteDomains 是静态站点域名列表,是一个数组,可选存在
61-
// +kubebuilder:validation:Optional
62-
WebsiteDomains []string `json:"websiteDomains,omitempty"`
75+
// WebsiteRoutes 是静态站点路由
76+
WebsiteRoutes map[string]*GatewayRoute `json:"websiteRoutes,omitempty"`
6377
}
6478

65-
// BucketDomain 是存储桶位的域名配置
66-
type BucketDomain struct {
67-
// Name 是存储桶名称,必须存在
68-
// +kubebuilder:validation:Required
69-
Name string `json:"name"`
70-
71-
// Domain 是存储桶域名,必须存在
79+
type GatewayRoute struct {
80+
// DomainName 是域名名称,必须存在
7281
// +kubebuilder:validation:Required
73-
Domain string `json:"domain"`
74-
}
82+
DomainName string `json:"domainName"`
7583

76-
// WebsiteDomain 是静态站点的域名配置
77-
type WebsiteDomain struct {
78-
// Name 是静态站点名称,必须存在
84+
// DomainNamespace 是域名所在的命名空间,必须存在
7985
// +kubebuilder:validation:Required
80-
Name string `json:"name"`
86+
DomainNamespace string `json:"domainNamespace"`
8187

82-
// Domain 是静态站点域名,必须存在
88+
// Domain 是域名,必须存在
8389
// +kubebuilder:validation:Required
8490
Domain string `json:"domain"`
8591
}

controllers/gateway/api/v1/route_types.go

+8
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ type RouteSpec struct {
3636
// +kubebuilder:validation:Required
3737
Backend Backend `json:"backend"`
3838

39+
// DomainName 是域名名称,必须存在
40+
// +kubebuilder:validation:Required
41+
DomainName string `json:"domainName"`
42+
43+
// DomainNamespace 是域名所在的命名空间,必须存在
44+
// +kubebuilder:validation:Required
45+
DomainNamespace string `json:"domainNamespace"`
46+
3947
// CertConfigRef 是证书配置,可选存在
4048
// +kubebuilder:validation:Optional
4149
CertConfigRef string `json:"certConfigRef,omitempty"`

controllers/gateway/api/v1/zz_generated.deepcopy.go

+59-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

controllers/gateway/apisix/route.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ func (r *RouteClient) Put(id string, data map[string]interface{}) error {
1616

1717
// Delete 删除路由
1818
func (r *RouteClient) Delete(id string) error {
19-
url := r.client.baseURL + "routes/" + id
19+
url := r.client.baseURL + "/routes/" + id
2020
return r.client.Delete(url, "routes")
2121
}
-29
Original file line numberDiff line numberDiff line change
@@ -1,30 +1 @@
11
package apisix
2-
3-
import "testing"
4-
5-
func TestCreateRoute(t *testing.T) {
6-
// 创建RouteClient
7-
routeClient := NewRouteClient("http://localhost:9180", "edd1c9f034335f136f87ad84b625c8f1")
8-
routeData := map[string]interface{}{
9-
"uri": "/hello",
10-
"upstream": map[string]interface{}{
11-
"type": "roundrobin",
12-
"nodes": map[string]interface{}{
13-
"baidu.com": 1,
14-
},
15-
},
16-
"host": "test.com",
17-
}
18-
err := routeClient.PutRoute("test", routeData)
19-
if err != nil {
20-
panic(err)
21-
}
22-
}
23-
24-
func TestDeleteRoute(t *testing.T) {
25-
routeClient := NewRouteClient("http://localhost:9180", "edd1c9f034335f136f87ad84b625c8f1")
26-
err := routeClient.DeleteRoute("test")
27-
if err != nil {
28-
panic(err)
29-
}
30-
}

controllers/gateway/config/crd/bases/gateway.laf.dev_domains.yaml

+27-12
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,42 @@ spec:
3535
spec:
3636
description: DomainSpec defines the desired state of Domain
3737
properties:
38+
backendType:
39+
description: BackendType是后端服务类型,必须存在APP;bucket;WEBSITE
40+
enum:
41+
- app
42+
- bucket
43+
- website
44+
type: string
3845
certConfigRef:
39-
description: CertConfigRef 是字符串类型,是configMap的引用
46+
description: CertConfigRef 是字符串类型,是configMap的引用,可选存在
4047
type: string
48+
cluster:
49+
description: Cluster 是网关集群配置 必须存在
50+
properties:
51+
key:
52+
description: key是集群的key,必须存在
53+
type: string
54+
url:
55+
description: url是集群的url,必须存在
56+
type: string
57+
required:
58+
- key
59+
- url
60+
type: object
4161
domain:
42-
description: Domain 是域名,是字符串类型,规则匹配域名规则,必须存在
62+
description: Domain是域名,必须存在,匹配域名规则
4363
pattern: ^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
4464
type: string
45-
preferred:
46-
description: Preferred 是提供域名使用位置的推荐项,是字符串类型,长度大于1小于10,必须存在
47-
maxLength: 10
48-
minLength: 1
49-
type: string
5065
region:
51-
description: Region 是域名设定的解析区域,是字符串类型,长度大于1小于10,可选存在
52-
maxLength: 10
53-
minLength: 1
66+
description: Region 是区域 必须存在 由字符数组和-组成
67+
pattern: ^[a-zA-Z0-9-]+$
5468
type: string
5569
required:
56-
- certConfigRef
70+
- backendType
71+
- cluster
5772
- domain
58-
- preferred
73+
- region
5974
type: object
6075
status:
6176
description: DomainStatus defines the observed state of Domain

0 commit comments

Comments
 (0)