Skip to content

Commit

Permalink
Feat(entities): Add Developer
Browse files Browse the repository at this point in the history
  • Loading branch information
ChristianJacquot committed Sep 3, 2021
1 parent 5404a48 commit 88b03d0
Show file tree
Hide file tree
Showing 21 changed files with 1,105 additions and 0 deletions.
9 changes: 9 additions & 0 deletions diff/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ func (sc *Syncer) init() error {
types.Upstream, types.Target,

types.Consumer,
types.Developer,
types.ACLGroup, types.BasicAuth, types.KeyAuth,
types.HMACAuth, types.JWTAuth, types.OAuth2Cred,
types.MTLSAuth,
Expand Down Expand Up @@ -203,6 +204,10 @@ func (sc *Syncer) delete() error {
if err != nil {
return err
}
err = sc.entityDiffers[types.Developer].Deletes(sc.queueEvent)
if err != nil {
return err
}
err = sc.entityDiffers[types.Upstream].Deletes(sc.queueEvent)
if err != nil {
return err
Expand Down Expand Up @@ -291,6 +296,10 @@ func (sc *Syncer) createUpdate() error {
if err != nil {
return err
}
err = sc.entityDiffers[types.Developer].CreateAndUpdates(sc.queueEvent)
if err != nil {
return err
}
err = sc.entityDiffers[types.Upstream].CreateAndUpdates(sc.queueEvent)
if err != nil {
return err
Expand Down
41 changes: 41 additions & 0 deletions dump/dump.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,18 @@ func getEnterpriseRBACConfiguration(ctx context.Context, group *errgroup.Group,
})
}

func getDeveloperConfiguration(ctx context.Context, group *errgroup.Group,
client *kong.Client, config Config, state *utils.KongRawState) {
group.Go(func() error {
developers, err := GetAllDevelopers(ctx, client, config.SelectorTags)
if err != nil {
return fmt.Errorf("developers: %w", err)
}
state.Developers = developers
return nil
})
}

// Get queries all the entities using client and returns
// all the entities in KongRawState.
func Get(ctx context.Context, client *kong.Client, config Config) (*utils.KongRawState, error) {
Expand All @@ -258,6 +270,8 @@ func Get(ctx context.Context, client *kong.Client, config Config) (*utils.KongRa
getProxyConfiguration(ctx, group, client, config, &state)
if !config.SkipConsumers {
getConsumerConfiguration(ctx, group, client, config, &state)
} else {
getDeveloperConfiguration(ctx, group, client, config, &state)
}
}

Expand Down Expand Up @@ -450,6 +464,33 @@ func GetAllConsumers(ctx context.Context,
return consumers, nil
}

// GetAllDevelopers queries Kong for all the developers using client.
// Please use this method with caution if you have a lot of developers.
func GetAllDevelopers(ctx context.Context,
client *kong.Client, tags []string) ([]*kong.Developer, error) {
var developers []*kong.Developer
opt := newOpt(tags)

for {
s, nextopt, err := client.Developers.List(ctx, opt)
if err != nil {
return nil, err
}
if err := ctx.Err(); err != nil {
return nil, err
}
if err := ctx.Err(); err != nil {
return nil, err
}
developers = append(developers, s...)
if nextopt == nil {
break
}
opt = nextopt
}
return developers, nil
}

// GetAllUpstreams queries Kong for all the Upstreams using client.
func GetAllUpstreams(ctx context.Context,
client *kong.Client, tags []string) ([]*kong.Upstream, error) {
Expand Down
30 changes: 30 additions & 0 deletions file/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ func (b *stateBuilder) build() (*utils.KongRawState, *utils.KonnectRawState, err
b.routes()
b.upstreams()
b.consumers()
b.developers()
b.plugins()
b.enterprise()

Expand Down Expand Up @@ -601,6 +602,35 @@ func (b *stateBuilder) routes() {
}
}

func (b *stateBuilder) developers() {
if b.err != nil {
return
}

for _, d := range b.targetContent.Developers {
d := d
if utils.Empty(d.ID) {
developer, err := b.currentState.Developers.Get(*d.Email)
if err == state.ErrNotFound {
d.ID = uuid()
} else if err != nil {
b.err = err
return
} else {
d.ID = kong.String(*developer.ID)
}
}

b.rawState.Developers = append(b.rawState.Developers, &d.Developer)

err := b.intermediate.Developers.Add(state.Developer{Developer: d.Developer})
if err != nil {
b.err = err
return
}
}
}

func (b *stateBuilder) enterprise() {
b.rbacRoles()
}
Expand Down
85 changes: 85 additions & 0 deletions file/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,17 @@ func existingDocumentState() *state.KongState {
return s
}

func existingDeveloperState() *state.KongState {
s, _ := state.NewKongState()
s.Developers.Add(state.Developer{
Developer: kong.Developer{
ID: kong.String("4bfcb11f-c962-4817-83e5-9433cf20b663"),
Email: kong.String("foo"),
},
})
return s
}

var deterministicUUID = func() *string {
version := byte(4)
uuid := make([]byte, 16)
Expand Down Expand Up @@ -2489,3 +2500,77 @@ func Test_stateBuilder_fillPluginConfig(t *testing.T) {
})
}
}

func Test_stateBuilder_developers(t *testing.T) {
assert := assert.New(t)
rand.Seed(42)
type fields struct {
currentState *state.KongState
targetContent *Content
}
tests := []struct {
name string
fields fields
want *utils.KongRawState
}{
{
name: "generates ID for a non-existing developer",
fields: fields{
targetContent: &Content{
Developers: []FDeveloper{
{
Developer: kong.Developer{
Email: kong.String("[email protected]"),
},
},
},
},
currentState: emptyState(),
},
want: &utils.KongRawState{
Developers: []*kong.Developer{
{
ID: kong.String("538c7f96-b164-4f1b-97bb-9f4bb472e89f"),
Email: kong.String("[email protected]"),
},
},
},
},
{
name: "matches ID of an existing Developer",
fields: fields{
targetContent: &Content{
Developers: []FDeveloper{
{
Developer: kong.Developer{
Email: kong.String("[email protected]"),
},
},
},
},
currentState: existingDeveloperState(),
},
want: &utils.KongRawState{
Developers: []*kong.Developer{
{
ID: kong.String("5b1484f2-5209-49d9-b43e-92ba09dd9d52"),
Email: kong.String("[email protected]"),
},
},
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
})
}
}
11 changes: 11 additions & 0 deletions file/codegen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ var (
Required: []string{"id"},
},
}

anyOfEmailOrID = []*jsonschema.Type{
{
Required: []string{"Email"},
},
{
Required: []string{"id"},
},
}
)

func main() {
Expand All @@ -54,6 +63,8 @@ func main() {

schema.Definitions["FConsumer"].AnyOf = anyOfUsernameOrID

schema.Definitions["FDeveloper"].AnyOf = anyOfEmailOrID

schema.Definitions["FUpstream"].Required = []string{"name"}

schema.Definitions["FTarget"].Required = []string{"target"}
Expand Down
86 changes: 86 additions & 0 deletions file/kong_json_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@
},
"type": "array"
},
"developers": {
"items": {
"$schema": "http://json-schema.org/draft-04/schema#",
"$ref": "#/definitions/FDeveloper"
},
"type": "array"
},
"plugins": {
"items": {
"$ref": "#/definitions/FPlugin"
Expand Down Expand Up @@ -417,6 +424,58 @@
}
]
},
"FDeveloper": {
"properties": {
"created_at": {
"type": "integer"
},
"custom_id": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "string"
},
"meta": {
"type": "string"
},
"password": {
"type": "string"
},
"rbac_user": {
"$schema": "http://json-schema.org/draft-04/schema#",
"$ref": "#/definitions/RBACUser"
},
"roles": {
"items": {
"type": "string"
},
"type": "array"
},
"status": {
"type": "integer"
},
"updated_at": {
"type": "integer"
}
},
"additionalProperties": false,
"type": "object",
"anyOf": [
{
"required": [
"Email"
]
},
{
"required": [
"id"
]
}
]
},
"FDocument": {
"properties": {
"id": {
Expand Down Expand Up @@ -1214,6 +1273,33 @@
"additionalProperties": false,
"type": "object"
},
"RBACUser": {
"properties": {
"comment": {
"type": "string"
},
"created_at": {
"type": "integer"
},
"enabled": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"user_token": {
"type": "string"
},
"user_token_ident": {
"type": "string"
}
},
"additionalProperties": false,
"type": "object"
},
"Route": {
"properties": {
"created_at": {
Expand Down
Loading

0 comments on commit 88b03d0

Please sign in to comment.