Skip to content

Commit

Permalink
feat: add ApisixPluginConfig controller loop and e2e test case (apach…
Browse files Browse the repository at this point in the history
…e#815)

Co-authored-by: Jintao Zhang <zhangjintao9020@gmail.com>
  • Loading branch information
2 people authored and Sindweller committed Dec 31, 2021
1 parent 18cefe0 commit c992531
Show file tree
Hide file tree
Showing 36 changed files with 1,887 additions and 131 deletions.
2 changes: 2 additions & 0 deletions pkg/apisix/apisix.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ type Cluster interface {
HealthCheck(context.Context) error
// Plugin returns a Plugin interface that can operate Plugin resources.
Plugin() Plugin
// PluginConfig returns a PluginConfig interface that can operate PluginConfig resources.
PluginConfig() PluginConfig
// Schema returns a Schema interface that can fetch schema of APISIX objects.
Schema() Schema
}
Expand Down
17 changes: 17 additions & 0 deletions pkg/apisix/cache/memdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ func (c *dbCache) DeleteSchema(schema *v1.Schema) error {
}

func (c *dbCache) DeletePluginConfig(pc *v1.PluginConfig) error {
if err := c.checkPluginConfigReference(pc); err != nil {
return err
}
return c.delete("plugin_config", pc)
}

Expand Down Expand Up @@ -347,3 +350,17 @@ func (c *dbCache) checkUpstreamReference(u *v1.Upstream) error {
}
return nil
}

func (c *dbCache) checkPluginConfigReference(u *v1.PluginConfig) error {
// PluginConfig is referenced by Route.
txn := c.db.Txn(false)
defer txn.Abort()
obj, err := txn.First("route", "plugin_config_id", u.ID)
if err != nil && err != memdb.ErrNotFound {
return err
}
if obj != nil {
return ErrStillInUse
}
return nil
}
20 changes: 19 additions & 1 deletion pkg/apisix/cache/memdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package cache
import (
"testing"

"github.com/hashicorp/go-memdb"
"github.com/stretchr/testify/assert"

v1 "github.com/apache/apisix-ingress-controller/pkg/types/apisix/v1"
Expand Down Expand Up @@ -183,7 +184,8 @@ func TestMemDBCacheReference(t *testing.T) {
Name: "route",
ID: "1",
},
UpstreamId: "1",
UpstreamId: "1",
PluginConfigId: "1",
}
u := &v1.Upstream{
Metadata: v1.Metadata{
Expand All @@ -201,20 +203,36 @@ func TestMemDBCacheReference(t *testing.T) {
ID: "1",
UpstreamId: "2",
}
pc := &v1.PluginConfig{
Metadata: v1.Metadata{
ID: "1",
Name: "pluginConfig",
},
}
pc2 := &v1.PluginConfig{
Metadata: v1.Metadata{
ID: "2",
Name: "pluginConfig",
},
}

db, err := NewMemDBCache()
assert.Nil(t, err, "NewMemDBCache")
assert.Nil(t, db.InsertRoute(r))
assert.Nil(t, db.InsertUpstream(u))
assert.Nil(t, db.InsertStreamRoute(sr))
assert.Nil(t, db.InsertUpstream(u2))
assert.Nil(t, db.InsertPluginConfig(pc))

assert.Error(t, ErrStillInUse, db.DeleteUpstream(u))
assert.Error(t, ErrStillInUse, db.DeleteUpstream(u2))
assert.Error(t, ErrStillInUse, db.DeletePluginConfig(pc))
assert.Equal(t, memdb.ErrNotFound, db.DeletePluginConfig(pc2))
assert.Nil(t, db.DeleteRoute(r))
assert.Nil(t, db.DeleteUpstream(u))
assert.Nil(t, db.DeleteStreamRoute(sr))
assert.Nil(t, db.DeleteUpstream(u2))
assert.Nil(t, db.DeletePluginConfig(pc))
}

func TestMemDBCacheStreamRoute(t *testing.T) {
Expand Down
6 changes: 6 additions & 0 deletions pkg/apisix/cache/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ var (
Indexer: &memdb.StringFieldIndex{Field: "UpstreamId"},
AllowMissing: true,
},
"plugin_config_id": {
Name: "plugin_config_id",
Unique: false,
Indexer: &memdb.StringFieldIndex{Field: "PluginConfigId"},
AllowMissing: true,
},
},
},
"upstream": {
Expand Down
20 changes: 20 additions & 0 deletions pkg/apisix/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ func (c *cluster) syncCacheOnce(ctx context.Context) (bool, error) {
log.Errorf("failed to list consumers in APISIX: %s", err)
return false, err
}
pluginConfigs, err := c.pluginConfig.List(ctx)
if err != nil {
log.Errorf("failed to list plugin_configs in APISIX: %s", err)
return false, err
}

for _, r := range routes {
if err := c.cache.InsertRoute(r); err != nil {
Expand Down Expand Up @@ -293,6 +298,16 @@ func (c *cluster) syncCacheOnce(ctx context.Context) (bool, error) {
)
}
}
for _, u := range pluginConfigs {
if err := c.cache.InsertPluginConfig(u); err != nil {
log.Errorw("failed to insert pluginConfig to cache",
zap.String("pluginConfig", u.ID),
zap.String("cluster", c.name),
zap.String("error", err.Error()),
)
return false, err
}
}
return true, nil
}

Expand Down Expand Up @@ -433,6 +448,11 @@ func (c *cluster) Plugin() Plugin {
return c.plugin
}

// PluginConfig implements Cluster.PluginConfig method.
func (c *cluster) PluginConfig() PluginConfig {
return c.pluginConfig
}

// Schema implements Cluster.Schema method.
func (c *cluster) Schema() Schema {
return c.schema
Expand Down
9 changes: 9 additions & 0 deletions pkg/apisix/cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,13 @@ func TestNonExistentCluster(t *testing.T) {
assert.Equal(t, ErrClusterNotExist, err)
err = apisix.Cluster("non-existent-cluster").SSL().Delete(context.Background(), &v1.Ssl{})
assert.Equal(t, ErrClusterNotExist, err)

_, err = apisix.Cluster("non-existent-cluster").PluginConfig().List(context.Background())
assert.Equal(t, ErrClusterNotExist, err)
_, err = apisix.Cluster("non-existent-cluster").PluginConfig().Create(context.Background(), &v1.PluginConfig{})
assert.Equal(t, ErrClusterNotExist, err)
_, err = apisix.Cluster("non-existent-cluster").PluginConfig().Update(context.Background(), &v1.PluginConfig{})
assert.Equal(t, ErrClusterNotExist, err)
err = apisix.Cluster("non-existent-cluster").PluginConfig().Delete(context.Background(), &v1.PluginConfig{})
assert.Equal(t, ErrClusterNotExist, err)
}
4 changes: 4 additions & 0 deletions pkg/apisix/nonexistentclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,10 @@ func (nc *nonExistentCluster) Plugin() Plugin {
return nc.plugin
}

func (nc *nonExistentCluster) PluginConfig() PluginConfig {
return nc.pluginConfig
}

func (nc *nonExistentCluster) Schema() Schema {
return nc.schema
}
Expand Down
Loading

0 comments on commit c992531

Please sign in to comment.