This is an automated email from the ASF dual-hosted git repository.
tokers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
The following commit(s) were added to refs/heads/master by this push:
new 2da94e9 feat: simplify apisix client (#373)
2da94e9 is described below
commit 2da94e9d5d5d8d79a20ba7c6d095ea0965ee35e6
Author: Alex Zhang <[email protected]>
AuthorDate: Thu Apr 15 13:31:23 2021 +0800
feat: simplify apisix client (#373)
---
pkg/apisix/cache/cache.go | 6 +-
pkg/apisix/cache/memdb.go | 16 ++--
pkg/apisix/cache/memdb_test.go | 62 +++++++------
pkg/apisix/cache/schema.go | 6 +-
pkg/apisix/resource.go | 91 ++------------------
pkg/apisix/resource_test.go | 7 +-
pkg/apisix/route.go | 106 +++++++----------------
pkg/apisix/route_test.go | 21 ++---
pkg/apisix/ssl.go | 68 ++++++---------
pkg/apisix/ssl_test.go | 10 +--
pkg/apisix/upstream.go | 148 +++++++-------------------------
pkg/apisix/upstream_test.go | 24 ++----
pkg/ingress/endpoint.go | 2 +-
pkg/ingress/types.go | 22 -----
pkg/kube/translation/apisix_route.go | 48 +++++------
pkg/kube/translation/apisix_ssl.go | 12 ++-
pkg/kube/translation/ingress.go | 25 +++---
pkg/kube/translation/ingress_test.go | 24 +++---
pkg/kube/translation/plugin_test.go | 22 ++---
pkg/kube/translation/translator.go | 10 ++-
pkg/kube/translation/translator_test.go | 12 +--
pkg/kube/translation/util.go | 9 +-
pkg/types/apisix/v1/types.go | 69 +++++++++------
test/e2e/ingress/resourcepushing.go | 2 +-
24 files changed, 278 insertions(+), 544 deletions(-)
diff --git a/pkg/apisix/cache/cache.go b/pkg/apisix/cache/cache.go
index 7cc9031..8ea26be 100644
--- a/pkg/apisix/cache/cache.go
+++ b/pkg/apisix/cache/cache.go
@@ -30,11 +30,11 @@ type Cache interface {
// InsertUpstream adds or updates upstream to cache.
InsertUpstream(*v1.Upstream) error
- // GetRoute finds the route from cache according to the primary index.
+ // GetRoute finds the route from cache according to the primary index
(id).
GetRoute(string) (*v1.Route, error)
- // GetSSL finds the ssl from cache according to the primary index.
+ // GetSSL finds the ssl from cache according to the primary index (id).
GetSSL(string) (*v1.Ssl, error)
- // GetUpstream finds the upstream from cache according to the primary
index.
+ // GetUpstream finds the upstream from cache according to the primary
index (id).
GetUpstream(string) (*v1.Upstream, error)
// ListRoutes lists all routes in cache.
diff --git a/pkg/apisix/cache/memdb.go b/pkg/apisix/cache/memdb.go
index f610a6d..b488e54 100644
--- a/pkg/apisix/cache/memdb.go
+++ b/pkg/apisix/cache/memdb.go
@@ -68,34 +68,34 @@ func (c *dbCache) insert(table string, obj interface{})
error {
return nil
}
-func (c *dbCache) GetRoute(key string) (*v1.Route, error) {
- obj, err := c.get("route", key)
+func (c *dbCache) GetRoute(id string) (*v1.Route, error) {
+ obj, err := c.get("route", id)
if err != nil {
return nil, err
}
return obj.(*v1.Route).DeepCopy(), nil
}
-func (c *dbCache) GetSSL(key string) (*v1.Ssl, error) {
- obj, err := c.get("ssl", key)
+func (c *dbCache) GetSSL(id string) (*v1.Ssl, error) {
+ obj, err := c.get("ssl", id)
if err != nil {
return nil, err
}
return obj.(*v1.Ssl).DeepCopy(), nil
}
-func (c *dbCache) GetUpstream(key string) (*v1.Upstream, error) {
- obj, err := c.get("upstream", key)
+func (c *dbCache) GetUpstream(id string) (*v1.Upstream, error) {
+ obj, err := c.get("upstream", id)
if err != nil {
return nil, err
}
return obj.(*v1.Upstream).DeepCopy(), nil
}
-func (c *dbCache) get(table, key string) (interface{}, error) {
+func (c *dbCache) get(table, id string) (interface{}, error) {
txn := c.db.Txn(false)
defer txn.Abort()
- obj, err := txn.First(table, "id", key)
+ obj, err := txn.First(table, "id", id)
if err != nil {
if err == memdb.ErrNotFound {
return nil, ErrNotFound
diff --git a/pkg/apisix/cache/memdb_test.go b/pkg/apisix/cache/memdb_test.go
index 7bdd933..da820f2 100644
--- a/pkg/apisix/cache/memdb_test.go
+++ b/pkg/apisix/cache/memdb_test.go
@@ -29,32 +29,32 @@ func TestMemDBCacheRoute(t *testing.T) {
r1 := &v1.Route{
Metadata: v1.Metadata{
- FullName: "abc",
- Name: "abc",
+ ID: "1",
+ Name: "abc",
},
}
assert.Nil(t, c.InsertRoute(r1), "inserting route 1")
- r, err := c.GetRoute("abc")
+ r, err := c.GetRoute("1")
assert.Nil(t, err)
assert.Equal(t, r1, r)
r2 := &v1.Route{
Metadata: v1.Metadata{
- FullName: "def",
- Name: "def",
+ ID: "2",
+ Name: "def",
},
}
r3 := &v1.Route{
Metadata: v1.Metadata{
- FullName: "ghi",
- Name: "ghi",
+ ID: "3",
+ Name: "ghi",
},
}
assert.Nil(t, c.InsertRoute(r2), "inserting route r2")
assert.Nil(t, c.InsertRoute(r3), "inserting route r3")
- r, err = c.GetRoute("ghi")
+ r, err = c.GetRoute("3")
assert.Nil(t, err)
assert.Equal(t, r3, r)
@@ -63,7 +63,7 @@ func TestMemDBCacheRoute(t *testing.T) {
routes, err := c.ListRoutes()
assert.Nil(t, err, "listing routes")
- if routes[0].FullName > routes[1].FullName {
+ if routes[0].Name > routes[1].Name {
routes[0], routes[1] = routes[1], routes[0]
}
assert.Equal(t, routes[0], r1)
@@ -71,8 +71,8 @@ func TestMemDBCacheRoute(t *testing.T) {
r4 := &v1.Route{
Metadata: v1.Metadata{
- FullName: "name4",
- Name: "name4",
+ ID: "4",
+ Name: "name4",
},
}
assert.Error(t, ErrNotFound, c.DeleteRoute(r4))
@@ -83,8 +83,7 @@ func TestMemDBCacheSSL(t *testing.T) {
assert.Nil(t, err, "NewMemDBCache")
s1 := &v1.Ssl{
- ID: "abc",
- FullName: "abc",
+ ID: "abc",
}
assert.Nil(t, c.InsertSSL(s1), "inserting ssl 1")
@@ -93,12 +92,10 @@ func TestMemDBCacheSSL(t *testing.T) {
assert.Equal(t, s1, s)
s2 := &v1.Ssl{
- ID: "def",
- FullName: "def",
+ ID: "def",
}
s3 := &v1.Ssl{
- ID: "ghi",
- FullName: "ghi",
+ ID: "ghi",
}
assert.Nil(t, c.InsertSSL(s2), "inserting ssl 2")
assert.Nil(t, c.InsertSSL(s3), "inserting ssl 3")
@@ -130,33 +127,33 @@ func TestMemDBCacheUpstream(t *testing.T) {
u1 := &v1.Upstream{
Metadata: v1.Metadata{
- FullName: "abc",
- Name: "abc",
+ ID: "1",
+ Name: "abc",
},
}
err = c.InsertUpstream(u1)
assert.Nil(t, err, "inserting upstream 1")
- u, err := c.GetUpstream("abc")
+ u, err := c.GetUpstream("1")
assert.Nil(t, err)
assert.Equal(t, u1, u)
u2 := &v1.Upstream{
Metadata: v1.Metadata{
- FullName: "def",
- Name: "def",
+ Name: "def",
+ ID: "2",
},
}
u3 := &v1.Upstream{
Metadata: v1.Metadata{
- FullName: "ghi",
- Name: "ghi",
+ Name: "ghi",
+ ID: "3",
},
}
assert.Nil(t, c.InsertUpstream(u2), "inserting upstream 2")
assert.Nil(t, c.InsertUpstream(u3), "inserting upstream 3")
- u, err = c.GetUpstream("ghi")
+ u, err = c.GetUpstream("3")
assert.Nil(t, err)
assert.Equal(t, u3, u)
@@ -165,7 +162,7 @@ func TestMemDBCacheUpstream(t *testing.T) {
upstreams, err := c.ListUpstreams()
assert.Nil(t, err, "listing upstreams")
- if upstreams[0].FullName > upstreams[1].FullName {
+ if upstreams[0].Name > upstreams[1].Name {
upstreams[0], upstreams[1] = upstreams[1], upstreams[0]
}
assert.Equal(t, upstreams[0], u1)
@@ -173,8 +170,8 @@ func TestMemDBCacheUpstream(t *testing.T) {
u4 := &v1.Upstream{
Metadata: v1.Metadata{
- FullName: "name4",
- Name: "name4",
+ Name: "name4",
+ ID: "4",
},
}
assert.Error(t, ErrNotFound, c.DeleteUpstream(u4))
@@ -183,16 +180,15 @@ func TestMemDBCacheUpstream(t *testing.T) {
func TestMemDBCacheReference(t *testing.T) {
r := &v1.Route{
Metadata: v1.Metadata{
- FullName: "route",
- Name: "route",
+ Name: "route",
+ ID: "1",
},
UpstreamId: "1",
}
u := &v1.Upstream{
Metadata: v1.Metadata{
- ID: "1",
- FullName: "upstream",
- Name: "upstream",
+ ID: "1",
+ Name: "upstream",
},
}
diff --git a/pkg/apisix/cache/schema.go b/pkg/apisix/cache/schema.go
index 159dcfc..40293f4 100644
--- a/pkg/apisix/cache/schema.go
+++ b/pkg/apisix/cache/schema.go
@@ -28,7 +28,7 @@ var (
"id": {
Name: "id",
Unique: true,
- Indexer:
&memdb.StringFieldIndex{Field: "FullName"},
+ Indexer:
&memdb.StringFieldIndex{Field: "ID"},
},
"name": {
Name: "name",
@@ -50,7 +50,7 @@ var (
"id": {
Name: "id",
Unique: true,
- Indexer:
&memdb.StringFieldIndex{Field: "FullName"},
+ Indexer:
&memdb.StringFieldIndex{Field: "ID"},
},
"name": {
Name: "name",
@@ -66,7 +66,7 @@ var (
"id": {
Name: "id",
Unique: true,
- Indexer:
&memdb.StringFieldIndex{Field: "FullName"},
+ Indexer:
&memdb.StringFieldIndex{Field: "ID"},
},
},
},
diff --git a/pkg/apisix/resource.go b/pkg/apisix/resource.go
index c2effe2..6be51fd 100644
--- a/pkg/apisix/resource.go
+++ b/pkg/apisix/resource.go
@@ -48,7 +48,7 @@ type node struct {
type items []item
-// items implements json.Unmarshaler interface.
+// UnmarshalJSON implements json.Unmarshaler interface.
// lua-cjson doesn't distinguish empty array and table,
// and by default empty array will be encoded as '{}'.
// We have to maintain the compatibility.
@@ -72,77 +72,34 @@ type item struct {
Value json.RawMessage `json:"value"`
}
-type routeItem struct {
- UpstreamId string `json:"upstream_id"`
- RemoteAddrs []string `json:"remote_addrs"`
- Host string `json:"host"`
- Hosts []string `json:"hosts"`
- URI string `json:"uri"`
- Vars [][]v1.StringOrSlice `json:"vars"`
- Uris []string `json:"uris"`
- Desc string `json:"desc"`
- Methods []string `json:"methods"`
- Priority int `json:"priority"`
- Plugins map[string]interface{} `json:"plugins"`
-}
-
// route decodes item.Value and converts it to v1.Route.
-func (i *item) route(clusterName string) (*v1.Route, error) {
+func (i *item) route() (*v1.Route, error) {
log.Debugf("got route: %s", string(i.Value))
list := strings.Split(i.Key, "/")
if len(list) < 1 {
return nil, fmt.Errorf("bad route config key: %s", i.Key)
}
- var route routeItem
+ var route v1.Route
if err := json.Unmarshal(i.Value, &route); err != nil {
return nil, err
}
-
- fullName := genFullName(route.Desc, clusterName)
-
- return &v1.Route{
- Metadata: v1.Metadata{
- ID: list[len(list)-1],
- FullName: fullName,
- Group: clusterName,
- Name: route.Desc,
- },
- Host: route.Host,
- Path: route.URI,
- Uris: route.Uris,
- Vars: route.Vars,
- Methods: route.Methods,
- RemoteAddrs: route.RemoteAddrs,
- UpstreamId: route.UpstreamId,
- Plugins: route.Plugins,
- Hosts: route.Hosts,
- Priority: route.Priority,
- }, nil
+ return &route, nil
}
// upstream decodes item.Value and converts it to v1.Upstream.
-func (i *item) upstream(clusterName string) (*v1.Upstream, error) {
+func (i *item) upstream() (*v1.Upstream, error) {
log.Debugf("got upstream: %s", string(i.Value))
list := strings.Split(i.Key, "/")
if len(list) < 1 {
return nil, fmt.Errorf("bad upstream config key: %s", i.Key)
}
- var ups upstreamItem
+ var ups v1.Upstream
if err := json.Unmarshal(i.Value, &ups); err != nil {
return nil, err
}
- var nodes []v1.UpstreamNode
- for _, node := range ups.Nodes {
- nodes = append(nodes, v1.UpstreamNode{
- IP: node.Host,
- Port: node.Port,
- Weight: node.Weight,
- })
- }
-
// This is a work around scheme to avoid APISIX's
// health check schema about the health checker intervals.
if ups.Checks != nil && ups.Checks.Active != nil {
@@ -153,47 +110,15 @@ func (i *item) upstream(clusterName string)
(*v1.Upstream, error) {
ups.Checks.Active.Healthy.Interval =
int(v1.ActiveHealthCheckMinInterval.Seconds())
}
}
-
- fullName := genFullName(ups.Desc, clusterName)
-
- return &v1.Upstream{
- Metadata: v1.Metadata{
- ID: list[len(list)-1],
- FullName: fullName,
- Group: clusterName,
- Name: ups.Desc,
- },
- Type: ups.LBType,
- Key: ups.Key,
- HashOn: ups.HashOn,
- Nodes: nodes,
- Scheme: ups.Scheme,
- Checks: ups.Checks,
- Retries: ups.Retries,
- Timeout: ups.Timeout,
- }, nil
+ return &ups, nil
}
// ssl decodes item.Value and converts it to v1.Ssl.
-func (i *item) ssl(clusterName string) (*v1.Ssl, error) {
+func (i *item) ssl() (*v1.Ssl, error) {
log.Debugf("got ssl: %s", string(i.Value))
var ssl v1.Ssl
if err := json.Unmarshal(i.Value, &ssl); err != nil {
return nil, err
}
-
- list := strings.Split(i.Key, "/")
- id := list[len(list)-1]
- ssl.ID = id
- ssl.Group = clusterName
- ssl.FullName = id
return &ssl, nil
}
-
-func genFullName(name string, clusterName string) string {
- fullName := name
- if clusterName != "" {
- fullName = clusterName + "_" + fullName
- }
- return fullName
-}
diff --git a/pkg/apisix/resource_test.go b/pkg/apisix/resource_test.go
index 0d08750..51ea1eb 100644
--- a/pkg/apisix/resource_test.go
+++ b/pkg/apisix/resource_test.go
@@ -59,19 +59,18 @@ func TestItemConvertRoute(t *testing.T) {
"upstream_id": "13",
"host": "foo.com",
"uri": "/shop/133/details",
- "desc": "unknown",
+ "name": "unknown",
"methods": ["GET", "POST"]
}
`),
}
- r, err := item.route("qa")
+ r, err := item.route()
assert.Nil(t, err)
assert.Equal(t, r.UpstreamId, "13")
assert.Equal(t, r.Host, "foo.com")
- assert.Equal(t, r.Path, "/shop/133/details")
+ assert.Equal(t, r.Uri, "/shop/133/details")
assert.Equal(t, r.Methods[0], "GET")
assert.Equal(t, r.Methods[1], "POST")
assert.Equal(t, r.Name, "unknown")
- assert.Equal(t, r.FullName, "qa_unknown")
}
diff --git a/pkg/apisix/route.go b/pkg/apisix/route.go
index ca238f7..21561c1 100644
--- a/pkg/apisix/route.go
+++ b/pkg/apisix/route.go
@@ -28,80 +28,66 @@ import (
v1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
)
-type routeReqBody struct {
- Desc string `json:"desc,omitempty"`
- Name string `json:"name,omitempty"`
- URI string `json:"uri,omitempty"`
- Priority int `json:"priority,omitempty"`
- Uris []string `json:"uris,omitempty"`
- Vars [][]v1.StringOrSlice `json:"vars,omitempty"`
- Host string `json:"host,omitempty"`
- Hosts []string `json:"hosts,omitempty"`
- RemoteAddrs []string `json:"remote_addrs,omitempty"`
- UpstreamId string `json:"upstream_id,omitempty"`
- Plugins v1.Plugins `json:"plugins,omitempty"`
-}
-
type routeClient struct {
- clusterName string
- url string
- cluster *cluster
+ url string
+ cluster *cluster
}
func newRouteClient(c *cluster) Route {
return &routeClient{
- clusterName: c.name,
- url: c.baseURL + "/routes",
- cluster: c,
+ url: c.baseURL + "/routes",
+ cluster: c,
}
}
+// Get returns the Route.
// FIXME, currently if caller pass a non-existent resource, the Get always
passes
// through cache.
-func (r *routeClient) Get(ctx context.Context, fullname string) (*v1.Route,
error) {
+func (r *routeClient) Get(ctx context.Context, name string) (*v1.Route, error)
{
log.Debugw("try to look up route",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", r.url),
- zap.String("cluster", r.clusterName),
+ zap.String("cluster", "default"),
)
- route, err := r.cluster.cache.GetRoute(fullname)
+ rid := id.GenID(name)
+ route, err := r.cluster.cache.GetRoute(rid)
if err == nil {
return route, nil
}
if err != cache.ErrNotFound {
log.Errorw("failed to find route in cache, will try to lookup
from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
} else {
log.Debugw("failed to find route in cache, will try to lookup
from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
}
// TODO Add mutex here to avoid dog-pile effection.
- url := r.url + "/" + id.GenID(fullname)
+ url := r.url + "/" + rid
resp, err := r.cluster.getResource(ctx, url)
if err != nil {
if err == cache.ErrNotFound {
log.Warnw("route not found",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", r.clusterName),
+ zap.String("cluster", "default"),
)
} else {
log.Errorw("failed to get route from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", r.clusterName),
+ zap.String("cluster", "default"),
zap.Error(err),
)
}
return nil, err
}
- route, err = resp.Item.route(r.clusterName)
+ route, err = resp.Item.route()
if err != nil {
log.Errorw("failed to convert route item",
zap.String("url", r.url),
@@ -122,7 +108,7 @@ func (r *routeClient) Get(ctx context.Context, fullname
string) (*v1.Route, erro
// to APISIX.
func (r *routeClient) List(ctx context.Context) ([]*v1.Route, error) {
log.Debugw("try to list routes in APISIX",
- zap.String("cluster", r.clusterName),
+ zap.String("cluster", "default"),
zap.String("url", r.url),
)
routeItems, err := r.cluster.listResource(ctx, r.url)
@@ -133,7 +119,7 @@ func (r *routeClient) List(ctx context.Context)
([]*v1.Route, error) {
var items []*v1.Route
for i, item := range routeItems.Node.Items {
- route, err := item.route(r.clusterName)
+ route, err := item.route()
if err != nil {
log.Errorw("failed to convert route item",
zap.String("url", r.url),
@@ -153,27 +139,15 @@ func (r *routeClient) List(ctx context.Context)
([]*v1.Route, error) {
func (r *routeClient) Create(ctx context.Context, obj *v1.Route) (*v1.Route,
error) {
log.Debugw("try to create route",
zap.String("host", obj.Host),
- zap.String("fullname", obj.FullName),
- zap.String("cluster", r.clusterName),
+ zap.String("name", obj.Name),
+ zap.String("cluster", "default"),
zap.String("url", r.url),
)
if err := r.cluster.HasSynced(ctx); err != nil {
return nil, err
}
- data, err := json.Marshal(routeReqBody{
- Priority: obj.Priority,
- Desc: obj.Name,
- Name: obj.Name,
- URI: obj.Path,
- Host: obj.Host,
- Hosts: obj.Hosts,
- UpstreamId: obj.UpstreamId,
- Uris: obj.Uris,
- Plugins: obj.Plugins,
- Vars: obj.Vars,
- RemoteAddrs: obj.RemoteAddrs,
- })
+ data, err := json.Marshal(obj)
if err != nil {
return nil, err
}
@@ -186,11 +160,7 @@ func (r *routeClient) Create(ctx context.Context, obj
*v1.Route) (*v1.Route, err
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
- route, err := resp.Item.route(clusterName)
+ route, err := resp.Item.route()
if err != nil {
return nil, err
}
@@ -204,8 +174,8 @@ func (r *routeClient) Create(ctx context.Context, obj
*v1.Route) (*v1.Route, err
func (r *routeClient) Delete(ctx context.Context, obj *v1.Route) error {
log.Debugw("try to delete route",
zap.String("id", obj.ID),
- zap.String("fullname", obj.FullName),
- zap.String("cluster", r.clusterName),
+ zap.String("name", obj.Name),
+ zap.String("cluster", "default"),
zap.String("url", r.url),
)
if err := r.cluster.HasSynced(ctx); err != nil {
@@ -225,27 +195,15 @@ func (r *routeClient) Delete(ctx context.Context, obj
*v1.Route) error {
func (r *routeClient) Update(ctx context.Context, obj *v1.Route) (*v1.Route,
error) {
log.Debugw("try to update route",
zap.String("id", obj.ID),
- zap.String("fullname", obj.FullName),
- zap.String("cluster", r.clusterName),
+ zap.String("name", obj.Name),
+ zap.String("cluster", "default"),
zap.String("url", r.url),
)
if err := r.cluster.HasSynced(ctx); err != nil {
return nil, err
}
// FIXME use unified v1.Route, removing routeReqBody.
- body, err := json.Marshal(routeReqBody{
- Priority: obj.Priority,
- Desc: obj.Name,
- Name: obj.Name,
- URI: obj.Path,
- Host: obj.Host,
- Hosts: obj.Hosts,
- UpstreamId: obj.UpstreamId,
- Uris: obj.Uris,
- Plugins: obj.Plugins,
- Vars: obj.Vars,
- RemoteAddrs: obj.RemoteAddrs,
- })
+ body, err := json.Marshal(obj)
if err != nil {
return nil, err
}
@@ -255,11 +213,7 @@ func (r *routeClient) Update(ctx context.Context, obj
*v1.Route) (*v1.Route, err
if err != nil {
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
- route, err := resp.Item.route(clusterName)
+ route, err := resp.Item.route()
if err != nil {
return nil, err
}
diff --git a/pkg/apisix/route_test.go b/pkg/apisix/route_test.go
index 1624e1a..9aef459 100644
--- a/pkg/apisix/route_test.go
+++ b/pkg/apisix/route_test.go
@@ -181,12 +181,11 @@ func TestRouteClient(t *testing.T) {
// Create
obj, err := cli.Create(context.Background(), &v1.Route{
Metadata: v1.Metadata{
- ID: "1",
- Name: "test",
- FullName: "test",
+ ID: "1",
+ Name: "test",
},
Host: "www.foo.com",
- Path: "/bar",
+ Uri: "/bar",
UpstreamId: "1",
})
assert.Nil(t, err)
@@ -194,12 +193,11 @@ func TestRouteClient(t *testing.T) {
obj, err = cli.Create(context.Background(), &v1.Route{
Metadata: v1.Metadata{
- ID: "2",
- Name: "test",
- FullName: "test",
+ ID: "2",
+ Name: "test",
},
Host: "www.foo.com",
- Path: "/bar",
+ Uri: "/bar",
UpstreamId: "1",
})
assert.Nil(t, err)
@@ -222,12 +220,11 @@ func TestRouteClient(t *testing.T) {
// Patch then List
_, err = cli.Update(context.Background(), &v1.Route{
Metadata: v1.Metadata{
- ID: "2",
- Name: "test",
- FullName: "test",
+ ID: "2",
+ Name: "test",
},
Host: "www.foo.com",
- Path: "/bar",
+ Uri: "/bar",
UpstreamId: "112",
})
assert.Nil(t, err)
diff --git a/pkg/apisix/ssl.go b/pkg/apisix/ssl.go
index 7069c48..a860842 100644
--- a/pkg/apisix/ssl.go
+++ b/pkg/apisix/ssl.go
@@ -29,63 +29,61 @@ import (
)
type sslClient struct {
- url string
- clusterName string
- cluster *cluster
+ url string
+ cluster *cluster
}
func newSSLClient(c *cluster) SSL {
return &sslClient{
- url: c.baseURL + "/ssl",
- cluster: c,
- clusterName: c.name,
+ url: c.baseURL + "/ssl",
+ cluster: c,
}
}
-func (s *sslClient) Get(ctx context.Context, fullname string) (*v1.Ssl, error)
{
+func (s *sslClient) Get(ctx context.Context, name string) (*v1.Ssl, error) {
log.Debugw("try to look up ssl",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", s.url),
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
)
-
- ssl, err := s.cluster.cache.GetSSL(fullname)
+ sid := id.GenID(name)
+ ssl, err := s.cluster.cache.GetSSL(sid)
if err == nil {
return ssl, nil
}
if err != cache.ErrNotFound {
log.Errorw("failed to find ssl in cache, will try to lookup
from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
} else {
log.Debugw("failed to find ssl in cache, will try to lookup
from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
}
// TODO Add mutex here to avoid dog-pile effection.
- url := s.url + "/" + id.GenID(fullname)
+ url := s.url + "/" + sid
resp, err := s.cluster.getResource(ctx, url)
if err != nil {
if err == cache.ErrNotFound {
log.Warnw("ssl not found",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
)
} else {
log.Errorw("failed to get ssl from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
zap.Error(err),
)
}
return nil, err
}
- ssl, err = resp.Item.ssl(s.clusterName)
+ ssl, err = resp.Item.ssl()
if err != nil {
log.Errorw("failed to convert ssl item",
zap.String("url", s.url),
@@ -107,7 +105,7 @@ func (s *sslClient) Get(ctx context.Context, fullname
string) (*v1.Ssl, error) {
func (s *sslClient) List(ctx context.Context) ([]*v1.Ssl, error) {
log.Debugw("try to list ssl in APISIX",
zap.String("url", s.url),
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
)
sslItems, err := s.cluster.listResource(ctx, s.url)
@@ -118,7 +116,7 @@ func (s *sslClient) List(ctx context.Context) ([]*v1.Ssl,
error) {
var items []*v1.Ssl
for i, item := range sslItems.Node.Items {
- ssl, err := item.ssl(s.clusterName)
+ ssl, err := item.ssl()
if err != nil {
log.Errorw("failed to convert ssl item",
zap.String("url", s.url),
@@ -136,7 +134,7 @@ func (s *sslClient) List(ctx context.Context) ([]*v1.Ssl,
error) {
func (s *sslClient) Create(ctx context.Context, obj *v1.Ssl) (*v1.Ssl, error) {
log.Debugw("try to create ssl",
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
zap.String("url", s.url),
zap.String("id", obj.ID),
)
@@ -161,12 +159,7 @@ func (s *sslClient) Create(ctx context.Context, obj
*v1.Ssl) (*v1.Ssl, error) {
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
-
- ssl, err := resp.Item.ssl(clusterName)
+ ssl, err := resp.Item.ssl()
if err != nil {
return nil, err
}
@@ -180,8 +173,7 @@ func (s *sslClient) Create(ctx context.Context, obj
*v1.Ssl) (*v1.Ssl, error) {
func (s *sslClient) Delete(ctx context.Context, obj *v1.Ssl) error {
log.Debugw("try to delete ssl",
zap.String("id", obj.ID),
- zap.String("cluster", s.clusterName),
- zap.String("fullName", obj.FullName),
+ zap.String("cluster", "default"),
zap.String("url", s.url),
)
if err := s.cluster.HasSynced(ctx); err != nil {
@@ -201,20 +193,14 @@ func (s *sslClient) Delete(ctx context.Context, obj
*v1.Ssl) error {
func (s *sslClient) Update(ctx context.Context, obj *v1.Ssl) (*v1.Ssl, error) {
log.Debugw("try to update ssl",
zap.String("id", obj.ID),
- zap.String("cluster", s.clusterName),
+ zap.String("cluster", "default"),
zap.String("url", s.url),
)
if err := s.cluster.HasSynced(ctx); err != nil {
return nil, err
}
url := s.url + "/" + obj.ID
- data, err := json.Marshal(v1.Ssl{
- ID: obj.ID,
- Snis: obj.Snis,
- Cert: obj.Cert,
- Key: obj.Key,
- Status: obj.Status,
- })
+ data, err := json.Marshal(obj)
if err != nil {
return nil, err
}
@@ -223,11 +209,7 @@ func (s *sslClient) Update(ctx context.Context, obj
*v1.Ssl) (*v1.Ssl, error) {
if err != nil {
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
- ssl, err := resp.Item.ssl(clusterName)
+ ssl, err := resp.Item.ssl()
if err != nil {
return nil, err
}
diff --git a/pkg/apisix/ssl_test.go b/pkg/apisix/ssl_test.go
index 4717143..4f8585c 100644
--- a/pkg/apisix/ssl_test.go
+++ b/pkg/apisix/ssl_test.go
@@ -158,17 +158,15 @@ func TestSSLClient(t *testing.T) {
// Create
obj, err := cli.Create(context.TODO(), &v1.Ssl{
- ID: "1",
- Group: "default",
- Snis: []string{"bar.com"},
+ ID: "1",
+ Snis: []string{"bar.com"},
})
assert.Nil(t, err)
assert.Equal(t, obj.ID, "1")
obj, err = cli.Create(context.TODO(), &v1.Ssl{
- ID: "2",
- Group: "default",
- Snis: []string{"bar.com"},
+ ID: "2",
+ Snis: []string{"bar.com"},
})
assert.Nil(t, err)
assert.Equal(t, obj.ID, "2")
diff --git a/pkg/apisix/upstream.go b/pkg/apisix/upstream.go
index 94c5178..06e634b 100644
--- a/pkg/apisix/upstream.go
+++ b/pkg/apisix/upstream.go
@@ -18,7 +18,6 @@ import (
"bytes"
"context"
"encoding/json"
- "errors"
"go.uber.org/zap"
@@ -29,105 +28,62 @@ import (
)
type upstreamClient struct {
- clusterName string
- url string
- cluster *cluster
+ url string
+ cluster *cluster
}
-type upstreamNode struct {
- Host string `json:"host,omitempty" yaml:"ip,omitempty"`
- Port int `json:"port,omitempty" yaml:"port,omitempty"`
- Weight int `json:"weight,omitempty" yaml:"weight,omitempty"`
-}
-
-type upstreamNodes []upstreamNode
-
-// items implements json.Unmarshaler interface.
-// lua-cjson doesn't distinguish empty array and table,
-// and by default empty array will be encoded as '{}'.
-// We have to maintain the compatibility.
-func (n *upstreamNodes) UnmarshalJSON(p []byte) error {
- if p[0] == '{' {
- if len(p) != 2 {
- return errors.New("unexpected non-empty object")
- }
- return nil
- }
- var data []upstreamNode
- if err := json.Unmarshal(p, &data); err != nil {
- return err
- }
- *n = data
- return nil
-}
-
-type upstreamReqBody struct {
- LBType string `json:"type"`
- HashOn string `json:"hash_on,omitempty"`
- Key string `json:"key,omitempty"`
- Nodes upstreamNodes `json:"nodes"`
- Desc string `json:"desc"`
- Name string `json:"name"`
- Scheme string `json:"scheme,omitempty"`
- Retries int `json:"retries,omitempty"`
- Timeout *v1.UpstreamTimeout `json:"timeout,omitempty"`
- Checks *v1.UpstreamHealthCheck `json:"checks,omitempty"`
-}
-
-type upstreamItem upstreamReqBody
-
func newUpstreamClient(c *cluster) Upstream {
return &upstreamClient{
- url: c.baseURL + "/upstreams",
- cluster: c,
- clusterName: c.name,
+ url: c.baseURL + "/upstreams",
+ cluster: c,
}
}
-func (u *upstreamClient) Get(ctx context.Context, fullname string)
(*v1.Upstream, error) {
+func (u *upstreamClient) Get(ctx context.Context, name string) (*v1.Upstream,
error) {
log.Debugw("try to look up upstream",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", u.url),
- zap.String("cluster", u.clusterName),
+ zap.String("cluster", "default"),
)
- ups, err := u.cluster.cache.GetUpstream(fullname)
+ uid := id.GenID(name)
+ ups, err := u.cluster.cache.GetUpstream(uid)
if err == nil {
return ups, nil
}
if err != cache.ErrNotFound {
log.Errorw("failed to find upstream in cache, will try to
lookup from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
} else {
log.Debugw("failed to find upstream in cache, will try to
lookup from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.Error(err),
)
}
// TODO Add mutex here to avoid dog-pile effection.
- url := u.url + "/" + id.GenID(fullname)
+ url := u.url + "/" + uid
resp, err := u.cluster.getResource(ctx, url)
if err != nil {
if err == cache.ErrNotFound {
log.Warnw("upstream not found",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", u.clusterName),
+ zap.String("cluster", "default"),
)
} else {
log.Errorw("failed to get upstream from APISIX",
- zap.String("fullname", fullname),
+ zap.String("name", name),
zap.String("url", url),
- zap.String("cluster", u.clusterName),
+ zap.String("cluster", "default"),
zap.Error(err),
)
}
return nil, err
}
- ups, err = resp.Item.upstream(u.clusterName)
+ ups, err = resp.Item.upstream()
if err != nil {
log.Errorw("failed to convert upstream item",
zap.String("url", u.url),
@@ -149,7 +105,7 @@ func (u *upstreamClient) Get(ctx context.Context, fullname
string) (*v1.Upstream
func (u *upstreamClient) List(ctx context.Context) ([]*v1.Upstream, error) {
log.Debugw("try to list upstreams in APISIX",
zap.String("url", u.url),
- zap.String("cluster", u.clusterName),
+ zap.String("cluster", "default"),
)
upsItems, err := u.cluster.listResource(ctx, u.url)
@@ -160,7 +116,7 @@ func (u *upstreamClient) List(ctx context.Context)
([]*v1.Upstream, error) {
var items []*v1.Upstream
for i, item := range upsItems.Node.Items {
- ups, err := item.upstream(u.clusterName)
+ ups, err := item.upstream()
if err != nil {
log.Errorw("failed to convert upstream item",
zap.String("url", u.url),
@@ -177,35 +133,16 @@ func (u *upstreamClient) List(ctx context.Context)
([]*v1.Upstream, error) {
func (u *upstreamClient) Create(ctx context.Context, obj *v1.Upstream)
(*v1.Upstream, error) {
log.Debugw("try to create upstream",
- zap.String("fullname", obj.FullName),
+ zap.String("name", obj.Name),
zap.String("url", u.url),
- zap.String("cluster", u.clusterName),
+ zap.String("cluster", "default"),
)
if err := u.cluster.HasSynced(ctx); err != nil {
return nil, err
}
- nodes := make(upstreamNodes, 0, len(obj.Nodes))
- for _, node := range obj.Nodes {
- nodes = append(nodes, upstreamNode{
- Host: node.IP,
- Port: node.Port,
- Weight: node.Weight,
- })
- }
- body, err := json.Marshal(upstreamReqBody{
- LBType: obj.Type,
- HashOn: obj.HashOn,
- Key: obj.Key,
- Nodes: nodes,
- Desc: obj.Name,
- Name: obj.Name,
- Scheme: obj.Scheme,
- Checks: obj.Checks,
- Retries: obj.Retries,
- Timeout: obj.Timeout,
- })
+ body, err := json.Marshal(obj)
if err != nil {
return nil, err
}
@@ -217,11 +154,7 @@ func (u *upstreamClient) Create(ctx context.Context, obj
*v1.Upstream) (*v1.Upst
log.Errorf("failed to create upstream: %s", err)
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
- ups, err := resp.Item.upstream(clusterName)
+ ups, err := resp.Item.upstream()
if err != nil {
return nil, err
}
@@ -235,8 +168,8 @@ func (u *upstreamClient) Create(ctx context.Context, obj
*v1.Upstream) (*v1.Upst
func (u *upstreamClient) Delete(ctx context.Context, obj *v1.Upstream) error {
log.Debugw("try to delete upstream",
zap.String("id", obj.ID),
- zap.String("fullname", obj.FullName),
- zap.String("cluster", u.clusterName),
+ zap.String("name", obj.Name),
+ zap.String("cluster", "default"),
zap.String("url", u.url),
)
@@ -257,8 +190,8 @@ func (u *upstreamClient) Delete(ctx context.Context, obj
*v1.Upstream) error {
func (u *upstreamClient) Update(ctx context.Context, obj *v1.Upstream)
(*v1.Upstream, error) {
log.Debugw("try to update upstream",
zap.String("id", obj.ID),
- zap.String("fullname", obj.FullName),
- zap.String("cluster", u.clusterName),
+ zap.String("name", obj.Name),
+ zap.String("cluster", "default"),
zap.String("url", u.url),
)
@@ -266,26 +199,7 @@ func (u *upstreamClient) Update(ctx context.Context, obj
*v1.Upstream) (*v1.Upst
return nil, err
}
- nodes := make(upstreamNodes, 0, len(obj.Nodes))
- for _, node := range obj.Nodes {
- nodes = append(nodes, upstreamNode{
- Host: node.IP,
- Port: node.Port,
- Weight: node.Weight,
- })
- }
- body, err := json.Marshal(upstreamReqBody{
- LBType: obj.Type,
- HashOn: obj.HashOn,
- Key: obj.Key,
- Nodes: nodes,
- Desc: obj.Name,
- Name: obj.Name,
- Scheme: obj.Scheme,
- Checks: obj.Checks,
- Retries: obj.Retries,
- Timeout: obj.Timeout,
- })
+ body, err := json.Marshal(obj)
if err != nil {
return nil, err
}
@@ -296,11 +210,7 @@ func (u *upstreamClient) Update(ctx context.Context, obj
*v1.Upstream) (*v1.Upst
if err != nil {
return nil, err
}
- var clusterName string
- if obj.Group != "" {
- clusterName = obj.Group
- }
- ups, err := resp.Item.upstream(clusterName)
+ ups, err := resp.Item.upstream()
if err != nil {
return nil, err
}
diff --git a/pkg/apisix/upstream_test.go b/pkg/apisix/upstream_test.go
index 9fa7045..13ef65b 100644
--- a/pkg/apisix/upstream_test.go
+++ b/pkg/apisix/upstream_test.go
@@ -159,15 +159,13 @@ func TestUpstreamClient(t *testing.T) {
// Create
key := "upstream/abc"
lbType := "roundrobin"
- fullName := "default_test"
- group := "default"
name := "test"
ip := "10.0.11.153"
port := 15006
weight := 100
- nodes := []v1.UpstreamNode{
+ nodes := v1.UpstreamNodes{
{
- IP: ip,
+ Host: ip,
Port: port,
Weight: weight,
},
@@ -175,10 +173,8 @@ func TestUpstreamClient(t *testing.T) {
obj, err := cli.Create(context.TODO(), &v1.Upstream{
Metadata: v1.Metadata{
- ID: "1",
- FullName: fullName,
- Group: group,
- Name: name,
+ ID: "1",
+ Name: name,
},
Type: lbType,
Key: key,
@@ -190,10 +186,8 @@ func TestUpstreamClient(t *testing.T) {
id2 := "2"
obj, err = cli.Create(context.TODO(), &v1.Upstream{
Metadata: v1.Metadata{
- ID: id2,
- FullName: fullName,
- Group: group,
- Name: name,
+ ID: id2,
+ Name: name,
},
Type: lbType,
Key: key,
@@ -219,10 +213,8 @@ func TestUpstreamClient(t *testing.T) {
// Patch then List
_, err = cli.Update(context.Background(), &v1.Upstream{
Metadata: v1.Metadata{
- ID: "2",
- FullName: fullName,
- Group: group,
- Name: name,
+ ID: "2",
+ Name: name,
},
Type: "chash",
Key: key,
diff --git a/pkg/ingress/endpoint.go b/pkg/ingress/endpoint.go
index f839150..42c2e63 100644
--- a/pkg/ingress/endpoint.go
+++ b/pkg/ingress/endpoint.go
@@ -128,7 +128,7 @@ func (c *endpointsController) sync(ctx context.Context, ev
*types.Event) error {
return nil
}
-func (c *endpointsController) syncToCluster(ctx context.Context, cluster
apisix.Cluster, nodes []apisixv1.UpstreamNode, upsName string) error {
+func (c *endpointsController) syncToCluster(ctx context.Context, cluster
apisix.Cluster, nodes apisixv1.UpstreamNodes, upsName string) error {
upstream, err := cluster.Upstream().Get(ctx, upsName)
if err != nil {
if err == apisixcache.ErrNotFound {
diff --git a/pkg/ingress/types.go b/pkg/ingress/types.go
deleted file mode 100644
index 640ba00..0000000
--- a/pkg/ingress/types.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package ingress
-
-const (
- ADD = "ADD"
- UPDATE = "UPDATE"
- DELETE = "DELETE"
- WatchFromKind = "watch"
-)
diff --git a/pkg/kube/translation/apisix_route.go
b/pkg/kube/translation/apisix_route.go
index 4cfc37a..dd8917c 100644
--- a/pkg/kube/translation/apisix_route.go
+++ b/pkg/kube/translation/apisix_route.go
@@ -62,16 +62,13 @@ func (t *translator) TranslateRouteV1(ar
*configv1.ApisixRoute) ([]*apisixv1.Rou
upsId := id.GenID(upstreamName)
route := &apisixv1.Route{
Metadata: apisixv1.Metadata{
- ID: id.GenID(routeName),
- FullName: routeName,
- ResourceVersion: ar.ResourceVersion,
- Name: routeName,
+ ID: id.GenID(routeName),
+ Name: routeName,
},
- Host: r.Host,
- Path: p.Path,
- UpstreamName: upstreamName,
- UpstreamId: upsId,
- Plugins: pluginMap,
+ Host: r.Host,
+ Uri: p.Path,
+ UpstreamId: upsId,
+ Plugins: pluginMap,
}
routes = append(routes, route)
@@ -80,11 +77,9 @@ func (t *translator) TranslateRouteV1(ar
*configv1.ApisixRoute) ([]*apisixv1.Rou
if err != nil {
return nil, nil, err
}
- ups.FullName = upstreamName
ups.ID = upsId
- ups.ResourceVersion = ar.ResourceVersion
ups.Name = upstreamName
- upstreamMap[ups.FullName] = ups
+ upstreamMap[ups.Name] = ups
}
}
}
@@ -179,20 +174,17 @@ func (t *translator) TranslateRouteV2alpha1(ar
*configv2alpha1.ApisixRoute) ([]*
upsId := id.GenID(upstreamName)
route := &apisixv1.Route{
Metadata: apisixv1.Metadata{
- FullName: routeName,
- Name: routeName,
- ID: id.GenID(routeName),
- ResourceVersion: ar.ResourceVersion,
+ Name: routeName,
+ ID: id.GenID(routeName),
},
- Priority: part.Priority,
- RemoteAddrs: part.Match.RemoteAddrs,
- Vars: exprs,
- Hosts: part.Match.Hosts,
- Uris: part.Match.Paths,
- Methods: part.Match.Methods,
- UpstreamName: upstreamName,
- UpstreamId: upsId,
- Plugins: pluginMap,
+ Priority: part.Priority,
+ RemoteAddrs: part.Match.RemoteAddrs,
+ Vars: exprs,
+ Hosts: part.Match.Hosts,
+ Uris: part.Match.Paths,
+ Methods: part.Match.Methods,
+ UpstreamId: upsId,
+ Plugins: pluginMap,
}
if len(backends) > 0 {
@@ -209,8 +201,8 @@ func (t *translator) TranslateRouteV2alpha1(ar
*configv2alpha1.ApisixRoute) ([]*
return nil, nil, err
}
for _, u := range ups {
- if _, ok := upstreamMap[u.FullName]; !ok {
- upstreamMap[u.FullName] = u
+ if _, ok := upstreamMap[u.Name]; !ok {
+ upstreamMap[u.Name] = u
}
}
route.Plugins["traffic-split"] = plugin
@@ -222,7 +214,7 @@ func (t *translator) TranslateRouteV2alpha1(ar
*configv2alpha1.ApisixRoute) ([]*
if err != nil {
return nil, nil, err
}
- upstreamMap[ups.FullName] = ups
+ upstreamMap[ups.Name] = ups
}
}
diff --git a/pkg/kube/translation/apisix_ssl.go
b/pkg/kube/translation/apisix_ssl.go
index 9572b3b..51f4de8 100644
--- a/pkg/kube/translation/apisix_ssl.go
+++ b/pkg/kube/translation/apisix_ssl.go
@@ -45,14 +45,12 @@ func (t *translator) TranslateSSL(tls *configv1.ApisixTls)
(*apisixv1.Ssl, error
}
var snis []string
snis = append(snis, tls.Spec.Hosts...)
- fullname := tls.Namespace + "_" + tls.Name
ssl := &apisix.Ssl{
- ID: id.GenID(fullname),
- FullName: fullname,
- Snis: snis,
- Cert: string(cert),
- Key: string(key),
- Status: 1,
+ ID: id.GenID(tls.Namespace + "_" + tls.Name),
+ Snis: snis,
+ Cert: string(cert),
+ Key: string(key),
+ Status: 1,
}
return ssl, nil
}
diff --git a/pkg/kube/translation/ingress.go b/pkg/kube/translation/ingress.go
index ca80370..d1e3f8e 100644
--- a/pkg/kube/translation/ingress.go
+++ b/pkg/kube/translation/ingress.go
@@ -73,13 +73,12 @@ func (t *translator) translateIngressV1(ing
*networkingv1.Ingress) ([]*apisixv1.
}
route := &apisixv1.Route{
Metadata: apisixv1.Metadata{
- FullName:
composeIngressRouteName(rule.Host, pathRule.Path),
+ Name:
composeIngressRouteName(rule.Host, pathRule.Path),
},
Host: rule.Host,
Uris: uris,
}
- route.ID = id.GenID(route.FullName)
- route.Name = route.FullName
+ route.ID = id.GenID(route.Name)
if ups != nil {
route.UpstreamId = ups.ID
}
@@ -133,13 +132,12 @@ func (t *translator) translateIngressV1beta1(ing
*networkingv1beta1.Ingress) ([]
}
route := &apisixv1.Route{
Metadata: apisixv1.Metadata{
- FullName:
composeIngressRouteName(rule.Host, pathRule.Path),
+ Name:
composeIngressRouteName(rule.Host, pathRule.Path),
},
Host: rule.Host,
Uris: uris,
}
- route.Name = route.FullName
- route.ID = id.GenID(route.FullName)
+ route.ID = id.GenID(route.Name)
if ups != nil {
route.UpstreamId = ups.ID
}
@@ -175,9 +173,8 @@ func (t *translator)
translateUpstreamFromIngressV1(namespace string, backend *n
if err != nil {
return nil, err
}
- ups.FullName = apisixv1.ComposeUpstreamName(namespace, backend.Name,
svcPort)
- ups.Name = ups.FullName
- ups.ID = id.GenID(ups.FullName)
+ ups.Name = apisixv1.ComposeUpstreamName(namespace, backend.Name,
svcPort)
+ ups.ID = id.GenID(ups.Name)
return ups, nil
}
@@ -226,13 +223,12 @@ func (t *translator)
translateIngressExtensionsV1beta1(ing *extensionsv1beta1.In
}
route := &apisixv1.Route{
Metadata: apisixv1.Metadata{
- FullName:
composeIngressRouteName(rule.Host, pathRule.Path),
+ Name:
composeIngressRouteName(rule.Host, pathRule.Path),
},
Host: rule.Host,
Uris: uris,
}
- route.Name = route.FullName
- route.ID = id.GenID(route.FullName)
+ route.ID = id.GenID(route.Name)
if ups != nil {
route.UpstreamId = ups.ID
}
@@ -268,9 +264,8 @@ func (t *translator)
translateUpstreamFromIngressV1beta1(namespace string, svcNa
if err != nil {
return nil, err
}
- ups.FullName = apisixv1.ComposeUpstreamName(namespace, svcName,
portNumber)
- ups.Name = ups.FullName
- ups.ID = id.GenID(ups.FullName)
+ ups.Name = apisixv1.ComposeUpstreamName(namespace, svcName, portNumber)
+ ups.ID = id.GenID(ups.Name)
return ups, nil
}
diff --git a/pkg/kube/translation/ingress_test.go
b/pkg/kube/translation/ingress_test.go
index ecf3226..b6d44c5 100644
--- a/pkg/kube/translation/ingress_test.go
+++ b/pkg/kube/translation/ingress_test.go
@@ -302,17 +302,17 @@ func TestTranslateIngressV1(t *testing.T) {
assert.Equal(t, upstreams[0].Scheme, "http")
assert.Len(t, upstreams[0].Nodes, 2)
assert.Equal(t, upstreams[0].Nodes[0].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[0].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[0].Nodes[1].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[0].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, upstreams[1].Type, "roundrobin")
assert.Equal(t, upstreams[1].Scheme, "http")
assert.Len(t, upstreams[1].Nodes, 2)
assert.Equal(t, upstreams[1].Nodes[0].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[1].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[1].Nodes[1].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[1].Nodes[1].Host, "192.168.1.2")
}
func TestTranslateIngressV1beta1NoBackend(t *testing.T) {
@@ -525,17 +525,17 @@ func TestTranslateIngressV1beta1(t *testing.T) {
assert.Equal(t, upstreams[0].Scheme, "http")
assert.Len(t, upstreams[0].Nodes, 2)
assert.Equal(t, upstreams[0].Nodes[0].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[0].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[0].Nodes[1].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[0].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, upstreams[1].Type, "roundrobin")
assert.Equal(t, upstreams[1].Scheme, "http")
assert.Len(t, upstreams[1].Nodes, 2)
assert.Equal(t, upstreams[1].Nodes[0].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[1].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[1].Nodes[1].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[1].Nodes[1].Host, "192.168.1.2")
}
func TestTranslateIngressExtensionsV1beta1(t *testing.T) {
@@ -638,17 +638,17 @@ func TestTranslateIngressExtensionsV1beta1(t *testing.T) {
assert.Equal(t, upstreams[0].Scheme, "http")
assert.Len(t, upstreams[0].Nodes, 2)
assert.Equal(t, upstreams[0].Nodes[0].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[0].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[0].Nodes[1].Port, 9080)
- assert.Equal(t, upstreams[0].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[0].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, upstreams[1].Type, "roundrobin")
assert.Equal(t, upstreams[1].Scheme, "http")
assert.Len(t, upstreams[1].Nodes, 2)
assert.Equal(t, upstreams[1].Nodes[0].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, upstreams[1].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, upstreams[1].Nodes[1].Port, 9443)
- assert.Equal(t, upstreams[1].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, upstreams[1].Nodes[1].Host, "192.168.1.2")
}
func TestTranslateIngressExtensionsV1beta1BackendWithInvalidService(t
*testing.T) {
diff --git a/pkg/kube/translation/plugin_test.go
b/pkg/kube/translation/plugin_test.go
index 28916fe..e8ab921 100644
--- a/pkg/kube/translation/plugin_test.go
+++ b/pkg/kube/translation/plugin_test.go
@@ -180,16 +180,16 @@ func TestTranslateTrafficSplitPlugin(t *testing.T) {
assert.Nil(t, err)
assert.Len(t, ups, 2)
- assert.Equal(t, ups[0].FullName, "test_svc-1_80")
+ assert.Equal(t, ups[0].Name, "test_svc-1_80")
assert.Len(t, ups[0].Nodes, 2)
- assert.Equal(t, ups[0].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, ups[0].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, ups[0].Nodes[0].Port, 9080)
- assert.Equal(t, ups[0].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, ups[0].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, ups[0].Nodes[1].Port, 9080)
- assert.Equal(t, ups[1].FullName, "test_svc-1_443")
+ assert.Equal(t, ups[1].Name, "test_svc-1_443")
assert.Len(t, ups[1].Nodes, 1)
- assert.Equal(t, ups[1].Nodes[0].IP, "10.0.5.3")
+ assert.Equal(t, ups[1].Nodes[0].Host, "10.0.5.3")
assert.Equal(t, ups[1].Nodes[0].Port, 443)
assert.Len(t, cfg.Rules, 1)
@@ -351,18 +351,18 @@ func TestTranslateTrafficSplitPluginWithSameUpstreams(t
*testing.T) {
// Here ups has two elements, but the duplicated one will be
// removed in TranslateApisixRouteV2alpha1.
assert.Len(t, ups, 2)
- assert.Equal(t, ups[0].FullName, "test_svc-1_80")
+ assert.Equal(t, ups[0].Name, "test_svc-1_80")
assert.Len(t, ups[0].Nodes, 2)
- assert.Equal(t, ups[0].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, ups[0].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, ups[0].Nodes[0].Port, 9080)
- assert.Equal(t, ups[0].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, ups[0].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, ups[0].Nodes[1].Port, 9080)
- assert.Equal(t, ups[1].FullName, "test_svc-1_80")
+ assert.Equal(t, ups[1].Name, "test_svc-1_80")
assert.Len(t, ups[1].Nodes, 2)
- assert.Equal(t, ups[1].Nodes[0].IP, "192.168.1.1")
+ assert.Equal(t, ups[1].Nodes[0].Host, "192.168.1.1")
assert.Equal(t, ups[1].Nodes[0].Port, 9080)
- assert.Equal(t, ups[1].Nodes[1].IP, "192.168.1.2")
+ assert.Equal(t, ups[1].Nodes[1].Host, "192.168.1.2")
assert.Equal(t, ups[1].Nodes[1].Port, 9080)
assert.Len(t, cfg.Rules, 1)
diff --git a/pkg/kube/translation/translator.go
b/pkg/kube/translation/translator.go
index 705bf35..4a6765a 100644
--- a/pkg/kube/translation/translator.go
+++ b/pkg/kube/translation/translator.go
@@ -45,7 +45,7 @@ func (te *translateError) Error() string {
type Translator interface {
// TranslateUpstreamNodes translate Endpoints resources to APISIX
Upstream nodes
// according to the give port.
- TranslateUpstreamNodes(*corev1.Endpoints, int32)
([]apisixv1.UpstreamNode, error)
+ TranslateUpstreamNodes(*corev1.Endpoints, int32)
(apisixv1.UpstreamNodes, error)
// TranslateUpstreamConfig translates ApisixUpstreamConfig (part of
ApisixUpstream)
// to APISIX Upstream, it doesn't fill the the Upstream metadata and
nodes.
TranslateUpstreamConfig(*configv1.ApisixUpstreamConfig)
(*apisixv1.Upstream, error)
@@ -144,7 +144,7 @@ func (t *translator) TranslateUpstream(namespace, name
string, port int32) (*api
return ups, nil
}
-func (t *translator) TranslateUpstreamNodes(endpoints *corev1.Endpoints, port
int32) ([]apisixv1.UpstreamNode, error) {
+func (t *translator) TranslateUpstreamNodes(endpoints *corev1.Endpoints, port
int32) (apisixv1.UpstreamNodes, error) {
svc, err :=
t.ServiceLister.Services(endpoints.Namespace).Get(endpoints.Name)
if err != nil {
return nil, &translateError{
@@ -166,7 +166,9 @@ func (t *translator) TranslateUpstreamNodes(endpoints
*corev1.Endpoints, port in
reason: "port not defined",
}
}
- var nodes []apisixv1.UpstreamNode
+ // As nodes is not optional, here we create an empty slice,
+ // not a nil slice.
+ nodes := make(apisixv1.UpstreamNodes, 0)
for _, subset := range endpoints.Subsets {
var epPort *corev1.EndpointPort
for _, port := range subset.Ports {
@@ -178,7 +180,7 @@ func (t *translator) TranslateUpstreamNodes(endpoints
*corev1.Endpoints, port in
if epPort != nil {
for _, addr := range subset.Addresses {
nodes = append(nodes, apisixv1.UpstreamNode{
- IP: addr.IP,
+ Host: addr.IP,
Port: int(epPort.Port),
// FIXME Custom node weight
Weight: _defaultWeight,
diff --git a/pkg/kube/translation/translator_test.go
b/pkg/kube/translation/translator_test.go
index 51bc1c8..e056130 100644
--- a/pkg/kube/translation/translator_test.go
+++ b/pkg/kube/translation/translator_test.go
@@ -184,14 +184,14 @@ func TestTranslateUpstreamNodes(t *testing.T) {
nodes, err = tr.TranslateUpstreamNodes(endpoints, 80)
assert.Nil(t, err)
- assert.Equal(t, nodes, []apisixv1.UpstreamNode{
+ assert.Equal(t, nodes, apisixv1.UpstreamNodes{
{
- IP: "192.168.1.1",
+ Host: "192.168.1.1",
Port: 9080,
Weight: 100,
},
{
- IP: "192.168.1.2",
+ Host: "192.168.1.2",
Port: 9080,
Weight: 100,
},
@@ -199,14 +199,14 @@ func TestTranslateUpstreamNodes(t *testing.T) {
nodes, err = tr.TranslateUpstreamNodes(endpoints, 443)
assert.Nil(t, err)
- assert.Equal(t, nodes, []apisixv1.UpstreamNode{
+ assert.Equal(t, nodes, apisixv1.UpstreamNodes{
{
- IP: "192.168.1.1",
+ Host: "192.168.1.1",
Port: 9443,
Weight: 100,
},
{
- IP: "192.168.1.2",
+ Host: "192.168.1.2",
Port: 9443,
Weight: 100,
},
diff --git a/pkg/kube/translation/util.go b/pkg/kube/translation/util.go
index a66b7dd..76af4d3 100644
--- a/pkg/kube/translation/util.go
+++ b/pkg/kube/translation/util.go
@@ -76,17 +76,16 @@ func (t *translator) translateUpstream(namespace, svcName,
svcResolveGranularity
return nil, err
}
if svcResolveGranularity == "service" {
- ups.Nodes = []apisixv1.UpstreamNode{
+ ups.Nodes = apisixv1.UpstreamNodes{
{
- IP: svcClusterIP,
+ Host: svcClusterIP,
Port: int(svcPort),
Weight: _defaultWeight,
},
}
}
- ups.FullName = apisixv1.ComposeUpstreamName(namespace, svcName, svcPort)
- ups.Name = ups.FullName
- ups.ID = id.GenID(ups.FullName)
+ ups.Name = apisixv1.ComposeUpstreamName(namespace, svcName, svcPort)
+ ups.ID = id.GenID(ups.Name)
return ups, nil
}
diff --git a/pkg/types/apisix/v1/types.go b/pkg/types/apisix/v1/types.go
index 5128ba8..4eec171 100644
--- a/pkg/types/apisix/v1/types.go
+++ b/pkg/types/apisix/v1/types.go
@@ -70,11 +70,8 @@ const (
// Metadata contains all meta information about resources.
type Metadata struct {
- ID string `json:"id,omitempty" yaml:"id,omitempty"`
- FullName string `json:"full_name,omitempty"
yaml:"full_name,omitempty"`
- Name string `json:"name,omitempty" yaml:"name,omitempty"`
- ResourceVersion string `json:"resource_version,omitempty"
yaml:"resource_version,omitempty"`
- Group string `json:"group,omitempty" yaml:"group,omitempty"`
+ ID string `json:"id,omitempty" yaml:"id,omitempty"`
+ Name string `json:"name,omitempty" yaml:"name,omitempty"`
}
// Route apisix route object
@@ -82,19 +79,19 @@ type Metadata struct {
type Route struct {
Metadata `json:",inline" yaml:",inline"`
- Host string `json:"host,omitempty"
yaml:"host,omitempty"`
- Hosts []string `json:"hosts,omitempty"
yaml:"hosts,omitempty"`
- Path string `json:"path,omitempty"
yaml:"path,omitempty"`
- Priority int `json:"priority,omitempty"
yaml:"priority,omitempty"`
- Vars [][]StringOrSlice `json:"vars,omitempty"
yaml:"vars,omitempty"`
- Uris []string `json:"uris,omitempty"
yaml:"uris,omitempty"`
- Methods []string `json:"methods,omitempty"
yaml:"methods,omitempty"`
- RemoteAddrs []string `json:"remote_addrs,omitempty"
yaml:"remote_addrs,omitempty"`
- UpstreamId string `json:"upstream_id,omitempty"
yaml:"upstream_id,omitempty"`
- UpstreamName string `json:"upstream_name,omitempty"
yaml:"upstream_name,omitempty"`
- Plugins Plugins `json:"plugins,omitempty"
yaml:"plugins,omitempty"`
+ Host string `json:"host,omitempty"
yaml:"host,omitempty"`
+ Hosts []string `json:"hosts,omitempty"
yaml:"hosts,omitempty"`
+ Uri string `json:"uri,omitempty"
yaml:"uri,omitempty"`
+ Priority int `json:"priority,omitempty"
yaml:"priority,omitempty"`
+ Vars [][]StringOrSlice `json:"vars,omitempty"
yaml:"vars,omitempty"`
+ Uris []string `json:"uris,omitempty"
yaml:"uris,omitempty"`
+ Methods []string `json:"methods,omitempty"
yaml:"methods,omitempty"`
+ RemoteAddrs []string `json:"remote_addrs,omitempty"
yaml:"remote_addrs,omitempty"`
+ UpstreamId string `json:"upstream_id,omitempty"
yaml:"upstream_id,omitempty"`
+ Plugins Plugins `json:"plugins,omitempty"
yaml:"plugins,omitempty"`
}
+// StringOrSlice represents a string or a string slice.
// TODO Do not use interface{} to avoid the reflection overheads.
// +k8s:deepcopy-gen=true
type StringOrSlice struct {
@@ -154,7 +151,7 @@ type Upstream struct {
HashOn string `json:"hash_on,omitempty"
yaml:"hash_on,omitempty"`
Key string `json:"key,omitempty" yaml:"key,omitempty"`
Checks *UpstreamHealthCheck `json:"checks,omitempty"
yaml:"checks,omitempty"`
- Nodes []UpstreamNode `json:"nodes,omitempty"
yaml:"nodes,omitempty"`
+ Nodes UpstreamNodes `json:"nodes" yaml:"nodes"`
Scheme string `json:"scheme,omitempty"
yaml:"scheme,omitempty"`
Retries int `json:"retries,omitempty"
yaml:"retries,omitempty"`
Timeout *UpstreamTimeout `json:"timeout,omitempty"
yaml:"timeout,omitempty"`
@@ -170,10 +167,32 @@ type UpstreamTimeout struct {
Read int `json:"read" yaml:"read"`
}
-// Node the node in upstream
+// UpstreamNodes is the upstream node list.
+type UpstreamNodes []UpstreamNode
+
+// UnmarshalJSON implements json.Unmarshaler interface.
+// lua-cjson doesn't distinguish empty array and table,
+// and by default empty array will be encoded as '{}'.
+// We have to maintain the compatibility.
+func (n *UpstreamNodes) UnmarshalJSON(p []byte) error {
+ if p[0] == '{' {
+ if len(p) != 2 {
+ return errors.New("unexpected non-empty object")
+ }
+ return nil
+ }
+ var data []UpstreamNode
+ if err := json.Unmarshal(p, &data); err != nil {
+ return err
+ }
+ *n = data
+ return nil
+}
+
+// UpstreamNode is the node in upstream
// +k8s:deepcopy-gen=true
type UpstreamNode struct {
- IP string `json:"ip,omitempty" yaml:"ip,omitempty"`
+ Host string `json:"host,omitempty" yaml:"host,omitempty"`
Port int `json:"port,omitempty" yaml:"port,omitempty"`
Weight int `json:"weight,omitempty" yaml:"weight,omitempty"`
}
@@ -249,13 +268,11 @@ type UpstreamPassiveHealthCheckUnhealthy struct {
// Ssl apisix ssl object
// +k8s:deepcopy-gen=true
type Ssl struct {
- ID string `json:"id,omitempty" yaml:"id,omitempty"`
- FullName string `json:"full_name,omitempty"
yaml:"full_name,omitempty"`
- Snis []string `json:"snis,omitempty" yaml:"snis,omitempty"`
- Cert string `json:"cert,omitempty" yaml:"cert,omitempty"`
- Key string `json:"key,omitempty" yaml:"key,omitempty"`
- Status int `json:"status,omitempty" yaml:"status,omitempty"`
- Group string `json:"group,omitempty" yaml:"group,omitempty"`
+ ID string `json:"id,omitempty" yaml:"id,omitempty"`
+ Snis []string `json:"snis,omitempty" yaml:"snis,omitempty"`
+ Cert string `json:"cert,omitempty" yaml:"cert,omitempty"`
+ Key string `json:"key,omitempty" yaml:"key,omitempty"`
+ Status int `json:"status,omitempty" yaml:"status,omitempty"`
}
// TrafficSplitConfig is the config of traffic-split plugin.
diff --git a/test/e2e/ingress/resourcepushing.go
b/test/e2e/ingress/resourcepushing.go
index 54f64de..fd93d99 100644
--- a/test/e2e/ingress/resourcepushing.go
+++ b/test/e2e/ingress/resourcepushing.go
@@ -216,7 +216,7 @@ spec:
// Upstream doesn't change.
assert.Equal(ginkgo.GinkgoT(), newUpstreams[0].ID,
upstreams[0].ID)
- assert.Equal(ginkgo.GinkgoT(), newUpstreams[0].FullName,
upstreams[0].FullName)
+ assert.Equal(ginkgo.GinkgoT(), newUpstreams[0].Name,
upstreams[0].Name)
s.NewAPISIXClient().GET("/ip").WithHeader("Host",
"httpbin.com").Expect().
Status(http.StatusNotFound).