Skip to content

Commit 0d9f21e

Browse files
victorvarzaVictor Varza
andauthored
Db refactoring (#5)
* improve db access * fix e2e Co-authored-by: Victor Varza <[email protected]>
1 parent 3f796d2 commit 0d9f21e

File tree

21 files changed

+447
-368
lines changed

21 files changed

+447
-368
lines changed

cmd/api/api.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
_ "github.com/adobe/cluster-registry/pkg/api/docs"
1919
"github.com/adobe/cluster-registry/pkg/api/monitoring"
2020
"github.com/adobe/cluster-registry/pkg/api/sqs"
21+
"github.com/adobe/cluster-registry/pkg/api/utils"
2122
echoSwagger "github.com/swaggo/echo-swagger"
2223
)
2324

@@ -37,6 +38,8 @@ import (
3738
// @in header
3839
// @name Authorization
3940
func main() {
41+
42+
appConfig := utils.LoadApiConfig()
4043
a := api.NewRouter()
4144

4245
a.GET("/api/swagger/*", echoSwagger.WrapHandler)
@@ -46,11 +49,11 @@ func main() {
4649
m := monitoring.NewMetrics("cluster_registry_api", nil, false)
4750
m.Use(a)
4851

49-
d := database.NewDb(m)
50-
h := api.NewHandler(d, m)
52+
d := database.NewDb(appConfig, m)
53+
h := api.NewHandler(appConfig, d, m)
5154
h.Register(v1)
5255

53-
c := sqs.NewConsumer(d, m)
56+
c := sqs.NewConsumer(appConfig, d, m)
5457
go c.Consume()
5558

5659
a.Logger.Fatal(a.Start(":8080"))

cmd/cc/client.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"os"
1818

1919
"github.com/adobe/cluster-registry/pkg/api/sqs"
20+
"github.com/adobe/cluster-registry/pkg/api/utils"
2021
"github.com/adobe/cluster-registry/pkg/cc/controllers"
2122
"github.com/adobe/cluster-registry/pkg/cc/monitoring"
2223

@@ -55,6 +56,7 @@ func main() {
5556
var probeAddr string
5657
var alertmanagerWebhookAddr string
5758
var namespace string
59+
5860
flag.StringVar(&configFile, "config", "",
5961
"The controller will load its initial configuration from this file. "+
6062
"Omit this flag to use the default configuration values. "+
@@ -118,11 +120,14 @@ func main() {
118120
os.Exit(1)
119121
}
120122

123+
appConfig := utils.LoadClientConfig()
124+
sqsProducer := sqs.NewProducer(appConfig, m)
125+
121126
if err = (&controllers.ClusterReconciler{
122127
Client: mgr.GetClient(),
123128
Log: ctrl.Log.WithName("controllers").WithName("Cluster"),
124129
Scheme: mgr.GetScheme(),
125-
Queue: sqs.NewProducer(m),
130+
Queue: sqsProducer,
126131
CAData: base64.StdEncoding.EncodeToString(mgr.GetConfig().CAData),
127132
}).SetupWithManager(mgr); err != nil {
128133
setupLog.Error(err, "unable to create controller", "controller", "Cluster")

local/.env.local

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export AWS_REGION="aws-region"
44
export DB_AWS_REGION="db-aws-region"
55
export DB_ENDPOINT="http://localhost:8000"
66
export DB_TABLE_NAME="cluster-registry-local"
7+
export "DB_INDEX_NAME"="search-index-local"
78
export SQS_ENDPOINT="http://localhost:9324"
89
export SQS_AWS_REGION="sqs-aws-region"
910
export SQS_QUEUE_NAME="cluster-registry-local"

local/db/import.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ import (
88

99
"github.com/adobe/cluster-registry/pkg/api/database"
1010
"github.com/adobe/cluster-registry/pkg/api/monitoring"
11+
"github.com/adobe/cluster-registry/pkg/api/utils"
1112
registryv1 "github.com/adobe/cluster-registry/pkg/cc/api/registry/v1"
1213
"gopkg.in/yaml.v2"
1314
)
1415

1516
func main() {
1617
var clusters []registryv1.Cluster
18+
1719
m := monitoring.NewMetrics("cluster_registry_api_local", nil, false)
18-
d := database.NewDb(m)
20+
appConfig := utils.LoadApiConfig()
21+
d := database.NewDb(appConfig, m)
1922

2023
input_file := flag.String("input-file", "dummy-data.yaml", "yaml file path")
2124
flag.Parse()

local/db/schema.json

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,45 @@
11
{
2+
"TableName": "cluster-registry-local",
23
"AttributeDefinitions": [
3-
{
4-
"AttributeName": "name",
5-
"AttributeType": "S"
6-
}
4+
{
5+
"AttributeName": "name",
6+
"AttributeType": "S"
7+
},
8+
{
9+
"AttributeName": "kind",
10+
"AttributeType": "S"
11+
}
712
],
813
"ProvisionedThroughput": {
9-
"WriteCapacityUnits": 5,
10-
"ReadCapacityUnits": 5
14+
"WriteCapacityUnits": 5,
15+
"ReadCapacityUnits": 5
1116
},
12-
"TableName": "cluster-registry-local",
1317
"KeySchema": [
14-
{
15-
"KeyType": "HASH",
16-
"AttributeName": "name"
18+
{
19+
"KeyType": "HASH",
20+
"AttributeName": "name"
21+
}
22+
],
23+
"GlobalSecondaryIndexes": [
24+
{
25+
"IndexName": "search-index-local",
26+
"KeySchema": [
27+
{
28+
"AttributeName": "kind",
29+
"KeyType": "HASH"
30+
},
31+
{
32+
"AttributeName": "name",
33+
"KeyType": "RANGE"
34+
}
35+
],
36+
"Projection": {
37+
"ProjectionType": "ALL"
38+
},
39+
"ProvisionedThroughput": {
40+
"ReadCapacityUnits": 5,
41+
"WriteCapacityUnits": 5
42+
}
1743
}
1844
]
19-
}
45+
}

local/setup.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,13 @@ if [[ "${RUN_API}" == 1 ]]; then
8181
docker run -d \
8282
--name ${CONTAINER_API} \
8383
-p 8080:8080 \
84+
-e AWS_REGION \
8485
-e AWS_ACCESS_KEY_ID \
8586
-e AWS_SECRET_ACCESS_KEY \
8687
-e DB_AWS_REGION \
8788
-e DB_ENDPOINT=http://${CONTAINER_DB}:8000 \
8889
-e DB_TABLE_NAME=${DB_TABLE_NAME} \
90+
-e DB_INDEX_NAME=${DB_INDEX_NAME} \
8991
-e OIDC_ISSUER_URL=http://${CONTAINER_OIDC} \
9092
-e OIDC_CLIENT_ID \
9193
-e SQS_AWS_REGION \

pkg/api/api/handler.go

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ governing permissions and limitations under the License.
1313
package api
1414

1515
import (
16-
"fmt"
1716
"net/http"
1817
"strconv"
1918

@@ -35,21 +34,23 @@ type Handler interface {
3534

3635
// handler struct
3736
type handler struct {
38-
db database.Db
39-
met monitoring.MetricsI
37+
db database.Db
38+
appConfig *utils.AppConfig
39+
metrics monitoring.MetricsI
4040
}
4141

4242
// NewHandler func
43-
func NewHandler(d database.Db, m monitoring.MetricsI) Handler {
43+
func NewHandler(appConfig *utils.AppConfig, d database.Db, m monitoring.MetricsI) Handler {
4444
h := &handler{
45-
db: d,
46-
met: m,
45+
db: d,
46+
metrics: m,
47+
appConfig: appConfig,
4748
}
4849
return h
4950
}
5051

5152
func (h *handler) Register(v1 *echo.Group) {
52-
a, err := authz.NewAuthenticator(h.met)
53+
a, err := authz.NewAuthenticator(h.appConfig, h.metrics)
5354
if err != nil {
5455
log.Fatalf("Failed to initialize authenticator: %v", err)
5556
}
@@ -88,30 +89,27 @@ func (h *handler) GetCluster(ctx echo.Context) error {
8889

8990
// ListClusters godoc
9091
// @Summary List all clusters
91-
// @Description List all clusters. Use query parameters to filter results. Auth is required
92+
// @Description List all clusters. Use query parametricsers to filter results. Auth is required
9293
// @ID get-clusters
9394
// @Tags cluster
9495
// @Accept json
9596
// @Produce json
9697
// @Param region query string false "Filter by region"
9798
// @Param environment query string false "Filter by environment"
98-
// @Param businessUnit query string false "Filter by businessUnit"
9999
// @Param status query string false "Filter by status"
100-
// @Param limit query integer false "Limit number of clusters returned (default is 10)"
101-
// @Param offset query integer false "Offset/skip number of clusters (default is 0)"
100+
// @Param offset query integer false "Offset to start pagination search results (default is 0)"
101+
// @Param limit query integer false "The number of results per page (default is 200)"
102102
// @Success 200 {object} clusterList
103103
// @Failure 500 {object} utils.Error
104104
// @Security bearerAuth
105105
// @Router /v1/clusters [get]
106106
func (h *handler) ListClusters(ctx echo.Context) error {
107-
var (
108-
clusters []registryv1.Cluster
109-
count int
110-
)
111107

112-
region := ctx.QueryParam("region")
108+
var clusters []registryv1.Cluster
109+
var count int
110+
113111
environment := ctx.QueryParam("environment")
114-
businessUnit := ctx.QueryParam("businessUnit")
112+
region := ctx.QueryParam("region")
115113
status := ctx.QueryParam("status")
116114

117115
offset, err := strconv.Atoi(ctx.QueryParam("offset"))
@@ -121,11 +119,9 @@ func (h *handler) ListClusters(ctx echo.Context) error {
121119

122120
limit, err := strconv.Atoi(ctx.QueryParam("limit"))
123121
if err != nil {
124-
limit = 20
122+
limit = 200
125123
}
126124

127-
fmt.Println(limit, offset)
128-
clusters, count, _ = h.db.ListClusters(region, environment, businessUnit, status)
129-
130-
return ctx.JSON(http.StatusOK, newClusterListResponse(clusters, count))
125+
clusters, count, more, _ := h.db.ListClusters(offset, limit, region, environment, status)
126+
return ctx.JSON(http.StatusOK, newClusterListResponse(clusters, count, offset, limit, more))
131127
}

pkg/api/api/handler_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ import (
2020

2121
"github.com/adobe/cluster-registry/pkg/api/database"
2222
"github.com/adobe/cluster-registry/pkg/api/monitoring"
23+
"github.com/adobe/cluster-registry/pkg/api/utils"
2324
registryv1 "github.com/adobe/cluster-registry/pkg/cc/api/registry/v1"
2425
_ "github.com/jinzhu/gorm/dialects/sqlite"
2526
"github.com/labstack/echo/v4"
2627
"github.com/stretchr/testify/assert"
2728
)
2829

29-
// mockDatabase database.db
30+
// mockDatabase extends database.db
3031
type mockDatabase struct {
3132
database.Db
3233
clusters []registryv1.Cluster
@@ -41,20 +42,23 @@ func (m mockDatabase) GetCluster(name string) (*registryv1.Cluster, error) {
4142
return nil, nil
4243
}
4344

44-
func (m mockDatabase) ListClusters(region string, environment string, businessUnit string, status string) ([]registryv1.Cluster, int, error) {
45-
return m.clusters, len(m.clusters), nil
45+
func (m mockDatabase) ListClusters(offset int, limit int, environment string, region string, status string) ([]registryv1.Cluster, int, bool, error) {
46+
return m.clusters, len(m.clusters), false, nil
4647
}
4748

4849
func TestNewHandler(t *testing.T) {
4950
test := assert.New(t)
51+
appConfig := &utils.AppConfig{}
5052
d := mockDatabase{}
5153
m := monitoring.NewMetrics("cluster_registry_api_handler_test", nil, true)
52-
h := NewHandler(d, m)
54+
h := NewHandler(appConfig, d, m)
5355
test.NotNil(h)
5456
}
5557

5658
func TestGetCluster(t *testing.T) {
5759
test := assert.New(t)
60+
appConfig := &utils.AppConfig{}
61+
5862
tcs := []struct {
5963
name string
6064
clusterName string
@@ -95,7 +99,7 @@ func TestGetCluster(t *testing.T) {
9599

96100
d := mockDatabase{clusters: tc.clusters}
97101
m := monitoring.NewMetrics("cluster_registry_api_handler_test", nil, true)
98-
h := NewHandler(d, m)
102+
h := NewHandler(appConfig, d, m)
99103
r := NewRouter()
100104

101105
req := httptest.NewRequest(echo.GET, "/api/v1/clusters/:name", nil)
@@ -123,6 +127,8 @@ func TestGetCluster(t *testing.T) {
123127

124128
func TestListClusters(t *testing.T) {
125129
test := assert.New(t)
130+
appConfig := &utils.AppConfig{}
131+
126132
tcs := []struct {
127133
name string
128134
clusters []registryv1.Cluster
@@ -156,7 +162,7 @@ func TestListClusters(t *testing.T) {
156162

157163
d := mockDatabase{clusters: tc.clusters}
158164
m := monitoring.NewMetrics("cluster_registry_api_handler_test", nil, true)
159-
h := NewHandler(d, m)
165+
h := NewHandler(appConfig, d, m)
160166
r := NewRouter()
161167

162168
req := httptest.NewRequest(echo.GET, "/api/v1/clusters", nil)

pkg/api/api/response.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,30 @@ import (
1919

2020
type clusterList struct {
2121
Items []*registryv1.ClusterSpec `json:"items"`
22-
ItemsCount int `json:"itemsCount"`
22+
ItemsCount int `json:"itemsCount"` // TODO: should be rename to total
23+
Offset int `json:"offset"`
24+
Limit int `json:"limit"`
25+
More bool `json:"more"`
2326
}
2427

2528
func newClusterResponse(ctx echo.Context, c *registryv1.Cluster) *registryv1.ClusterSpec {
2629
cs := &c.Spec
2730
return cs
2831
}
2932

30-
func newClusterListResponse(clusters []registryv1.Cluster, count int) *clusterList {
33+
func newClusterListResponse(clusters []registryv1.Cluster, count int, offset int, limit int, more bool) *clusterList {
3134
r := new(clusterList)
32-
r.Items = make([]*registryv1.ClusterSpec, 0)
35+
r.Items = make([]*registryv1.ClusterSpec, 0) // TODO: check memory allocation
3336

3437
for _, c := range clusters {
3538
cs := c.Spec
3639
r.Items = append(r.Items, &cs)
3740
}
3841

3942
r.ItemsCount = count
43+
r.Offset = offset
44+
r.Limit = limit
45+
r.More = more
46+
4047
return r
4148
}

pkg/api/authz/jwt.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"errors"
1717
"fmt"
1818
"net/http"
19-
"os"
2019
"time"
2120

2221
"github.com/adobe/cluster-registry/pkg/api/monitoring"
@@ -33,8 +32,6 @@ const (
3332
)
3433

3534
var (
36-
clientID = os.Getenv("OIDC_CLIENT_ID")
37-
issuerURL = os.Getenv("OIDC_ISSUER_URL")
3835
tokenLookup = "Authorization"
3936
authScheme = "Bearer"
4037
)
@@ -47,16 +44,16 @@ type Authenticator struct {
4744
}
4845

4946
// NewAuthenticator creates new Authenticator
50-
func NewAuthenticator(m monitoring.MetricsI) (*Authenticator, error) {
47+
func NewAuthenticator(appConfig *utils.AppConfig, m monitoring.MetricsI) (*Authenticator, error) {
5148
ctx := context.Background()
52-
provider, err := oidc.NewProvider(ctx, issuerURL)
49+
provider, err := oidc.NewProvider(ctx, appConfig.OidcIssuerUrl)
5350

5451
if err != nil {
5552
return nil, fmt.Errorf("init verifier failed: %v", err)
5653
}
5754

5855
config := &oidc.Config{
59-
ClientID: clientID,
56+
ClientID: appConfig.OidcClientId,
6057
}
6158

6259
verifier := provider.Verifier(config)

0 commit comments

Comments
 (0)