Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

API Gateway Controller Logic #16058

Merged
merged 46 commits into from
Feb 3, 2023
Merged
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
33cec65
Add controller stubs for API Gateway (#15837)
sarahalsmiller Dec 20, 2022
10c8eb8
APIGateway TCPRoute validation (#15855)
Dec 21, 2022
b4ca767
Format imports
nathancoleman Jan 11, 2023
c10faa7
Move into a new package and flesh out binding
Jan 6, 2023
644e666
Fill in the actual binding logic
Jan 9, 2023
dbea0a6
Bind to all listeners if not specified
Jan 11, 2023
53822c5
Move bind code up to gateways package
Jan 11, 2023
f441909
Add UpsertRoute to listeners
Jan 12, 2023
f48376e
Add RemoveRoute to listener
Jan 12, 2023
31e0015
Implement binding as associated functions
Jan 12, 2023
5af8918
checkpoint, to squash
sarahalsmiller Jan 12, 2023
33156c8
checkpoint
sarahalsmiller Jan 12, 2023
805c69f
checkpoint
sarahalsmiller Jan 12, 2023
e2d9aaf
checkpoint, rearranging things for unit testing
sarahalsmiller Jan 17, 2023
76861dd
checkpoint
sarahalsmiller Jan 20, 2023
179f576
checkpoint, pull in thomas's code
sarahalsmiller Jan 20, 2023
37a51e6
mocks, test skeleton, need to fix merge errors
sarahalsmiller Jan 24, 2023
8521fd8
test
sarahalsmiller Jan 24, 2023
38e9201
pull from main
sarahalsmiller Jan 24, 2023
9499222
working tests, likely needs a rebase
sarahalsmiller Jan 24, 2023
da01a33
Update agent/consul/gateways/controller_gateways.go
sarahalsmiller Jan 25, 2023
6687a5a
incorperated feedback
sarahalsmiller Jan 26, 2023
d75af0b
checkout from main
sarahalsmiller Jan 27, 2023
a902d60
integrate with thomas's stuff
sarahalsmiller Jan 27, 2023
532c9b4
had to add listener reconcilliation code in order for unit tests to pass
sarahalsmiller Jan 27, 2023
0b3f968
fix linting issue, clean up test code
sarahalsmiller Jan 30, 2023
4476082
Merge branch 'main' into gateway-controller-logic
sarahalsmiller Jan 30, 2023
b1ea3fd
Merge branch 'main' into gateway-controller-logic
sarahalsmiller Jan 31, 2023
a44341e
Update agent/consul/fsm_data_store.go
sarahalsmiller Jan 31, 2023
ccaca56
Update agent/consul/gateways/controller_gateways.go
sarahalsmiller Jan 31, 2023
37573de
checkpoint
sarahalsmiller Jan 31, 2023
1b4368a
Merge branch 'gateway-controller-logic' of github.com:hashicorp/consu…
sarahalsmiller Jan 31, 2023
2c77bc5
some cleanup based on comments
sarahalsmiller Jan 31, 2023
026e56b
Merge branch 'main' into gateway-controller-logic
sarahalsmiller Jan 31, 2023
c3ffcf2
pull in status work
sarahalsmiller Jan 31, 2023
550603e
update function calls in leader election
sarahalsmiller Jan 31, 2023
d5f374d
wrap errors
sarahalsmiller Feb 2, 2023
0de5fd8
Merge branch 'main' into gateway-controller-logic
sarahalsmiller Feb 2, 2023
1af1d2d
Update agent/consul/gateways/controller_gateways.go
sarahalsmiller Feb 2, 2023
6af984e
pulled interface into gateways package
sarahalsmiller Feb 3, 2023
7bebafb
clarified confusing comment
sarahalsmiller Feb 3, 2023
5b0163f
Update agent/consul/gateways/controller_gateways.go
sarahalsmiller Feb 3, 2023
e3d5e09
Update agent/consul/gateways/controller_gateways.go
sarahalsmiller Feb 3, 2023
e0803c8
moved logging statement to begining of function
sarahalsmiller Feb 3, 2023
e0ae7a0
Merge branch 'gateway-controller-logic' of github.com:hashicorp/consu…
sarahalsmiller Feb 3, 2023
73a7c21
Merge branch 'main' into gateway-controller-logic
sarahalsmiller Feb 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
checkpoint, to squash
sarahalsmiller committed Jan 27, 2023
commit 5af89184a68f4d11bd55752e1ae8b94938a671cf
71 changes: 71 additions & 0 deletions agent/consul/gateways/controller_gateways.go
Original file line number Diff line number Diff line change
@@ -7,18 +7,89 @@ import (

"github.com/hashicorp/consul/agent/consul/controller"
"github.com/hashicorp/consul/agent/consul/fsm"
"github.com/hashicorp/consul/agent/consul/gateways/updater"
"github.com/hashicorp/consul/agent/consul/state"
"github.com/hashicorp/consul/agent/consul/stream"

"github.com/hashicorp/go-hclog"
"github.com/hashicorp/consul/agent/structs"
)

type apiGatewayReconciler struct {
fsm *fsm.FSM
logger hclog.Logger
updater updater.Updater
}

func (r apiGatewayReconciler) Reconcile(ctx context.Context, req controller.Request) error {
store := r.fsm.State()

_, entry, err := store.ConfigEntry(nil, req.Kind, req.Name, req.Meta)
if err != nil {
return err
}

if entry == nil {
r.logger.Error("cleaning up deleted gateway object", "request", req)
if err := r.updater.Delete(&structs.BoundGatewayConfigEntry{
Kind: structs.BoundGateway,
Name: req.Name,
EnterpriseMeta: req.Meta,
}); err != nil {
return err
}
return nil
}

gateway := entry.(*structs.GatewayConfigEntry)
// TODO: do initial distributed validation here, if we're invalid, then set the status

var state *structs.BoundGatewayConfigEntry
_, boundEntry, err := store.ConfigEntry(nil, structs.BoundGateway, req.Name, &req.Meta)
if err != nil {
return err
}
if boundEntry == nil {
state = &structs.BoundGatewayConfigEntry{
Kind: structs.BoundGateway,
Name: gateway.Name,
EnterpriseMeta: gateway.EnterpriseMeta,
}
} else {
state = boundEntry.(*structs.BoundGatewayConfigEntry)
}

r.logger.Debug("started reconciling gateway")
routes, err := BindTCPRoutes(store, state)
if err != nil {
return err
}

// now update the gateway state
r.logger.Debug("persisting gateway state", "state", state)
if err := r.updater.Update(state); err != nil {
r.logger.Error("error persisting state", "error", err)
return err
}

// then update the gateway status
r.logger.Debug("persisting gateway status", "gateway", gateway)
if err := r.updater.UpdateStatus(gateway); err != nil {
return err
}

// and update the route statuses
for _, route := range routes {
r.logger.Debug("persisting route status", "route", route)
if err := r.updater.UpdateStatus(route); err != nil {
return err
}
}

r.logger.Debug("finished reconciling gateway")
return nil
}
}

func NewAPIGatewayController(fsm *fsm.FSM, publisher state.EventPublisher, logger hclog.Logger) controller.Controller {
reconciler := apiGatewayReconciler{
9 changes: 9 additions & 0 deletions agent/consul/gateways/updater/updater.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package updater

import "github.com/hashicorp/consul/agent/structs"

type Updater interface {
UpdateStatus(entry structs.ConfigEntry) error
Update(entry structs.ConfigEntry) error
Delete(entry structs.ConfigEntry) error
}