Skip to content

Commit

Permalink
feat(konnect) add license agent (#3883)
Browse files Browse the repository at this point in the history
Add a license agent, which retrieves licenses from an upstream API and makes 
them available to other KIC subsystems.

Add a client for the Konnect license API.

Add parser logic to include licenses in a config bundle if available.

Extract several API clients from the dataplane package into a dedicated clients 
package.

---------

Co-authored-by: Tao Yi  <tao.yi@konghq.com>
Co-authored-by: Grzegorz Burzyński <czeslavo@gmail.com>
Co-authored-by: Patryk Małek <patryk.malek@konghq.com>
  • Loading branch information
4 people committed Apr 25, 2023
1 parent 4fd0555 commit eb974e7
Show file tree
Hide file tree
Showing 28 changed files with 517 additions and 74 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ Adding a new version? You'll need three changes:
configuration. Previously KIC added any UDPRoute that indicated an associated
Gateway as its parent regardless of Listener configuration or status.
[#3832](https://github.com/Kong/kubernetes-ingress-controller/pull/3832)
- Added license agent for Konnect-managed instances.
[#3883](https://github.com/Kong/kubernetes-ingress-controller/pull/3883)

### Fixed

Expand Down
9 changes: 5 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/go-logr/logr v1.2.4
github.com/google/go-cmp v0.5.9
github.com/google/uuid v1.3.0
github.com/kong/deck v1.19.1
github.com/kong/deck v1.20.0
github.com/kong/go-kong v0.40.0
github.com/kong/kubernetes-telemetry v0.0.2
github.com/kong/kubernetes-testing-framework v0.30.1
Expand Down Expand Up @@ -57,6 +57,7 @@ require (
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.4.0 // indirect
github.com/shoenig/go-m1cpu v0.1.4 // indirect
go.uber.org/atomic v1.10.0 // indirect
golang.org/x/net v0.9.0 // indirect
)
Expand Down Expand Up @@ -86,7 +87,7 @@ require (
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/fatih/camelcase v1.0.0 // indirect
github.com/fatih/color v1.14.1 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/fvbommel/sortorder v1.0.1 // indirect
github.com/go-errors/errors v1.0.1 // indirect
Expand Down Expand Up @@ -114,7 +115,7 @@ require (
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/huandu/xstrings v1.3.3 // indirect
github.com/imdario/mergo v0.3.14 // indirect
github.com/imdario/mergo v0.3.15 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
Expand Down Expand Up @@ -143,7 +144,7 @@ require (
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shirou/gopsutil/v3 v3.23.2 // indirect
github.com/shirou/gopsutil/v3 v3.23.3 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
github.com/sourcegraph/conc v0.3.0
github.com/spf13/cast v1.5.0 // indirect
Expand Down
22 changes: 13 additions & 9 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZM
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
Expand Down Expand Up @@ -473,8 +473,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.14 h1:fOqeC1+nCuuk6PKQdg9YmosXX7Y7mHX6R/0ZldI9iHo=
github.com/imdario/mergo v0.3.14/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM=
github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
Expand Down Expand Up @@ -508,8 +508,8 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/kong/deck v1.19.1 h1:sCO7Raf5vNneQbAIhPXL+UPJ+7SNG3xQOoQefFAi7D8=
github.com/kong/deck v1.19.1/go.mod h1:FQkU8gw3eBIhoJQauzpsRzcFNLezs8zAOZHn3xy7fhc=
github.com/kong/deck v1.20.0 h1:q8+8VBnvv0O+9mYjcPdJP5prG3KzbvR4XfePwkTx+Zc=
github.com/kong/deck v1.20.0/go.mod h1:yJWEu6/xnYiaNBg2vP4EsYLtbt33J67Zsolye3JpJmI=
github.com/kong/go-kong v0.40.0 h1:6rd70L4GbPz90j3ey+wjHd4aC21uFgbqsoASJhbcbdU=
github.com/kong/go-kong v0.40.0/go.mod h1:t3siZEEGBB3FA5EQv9CL5EcaiogPTG0A175VQ6KvEHE=
github.com/kong/kubernetes-telemetry v0.0.2 h1:ZLoctQzvo0onCxbMgFMGsIGu6qAXWaMrd4o5Rv//C68=
Expand Down Expand Up @@ -704,8 +704,12 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI=
github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE=
github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU=
github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M=
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVbozs=
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
Expand Down Expand Up @@ -1083,7 +1087,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
Expand Down
14 changes: 9 additions & 5 deletions internal/adminapi/konnect.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,15 @@ import (
)

type KonnectConfig struct {
ConfigSynchronizationEnabled bool
RuntimeGroupID string
Address string
RefreshNodePeriod time.Duration
TLSClient TLSClientConfig
// TODO https://github.com/Kong/kubernetes-ingress-controller/issues/3922
// ConfigSynchronizationEnabled is the only toggle we had prior to the addition of the license agent.
// We likely want to combine these into a single Konnect toggle or piggyback off other Konnect functionality.
ConfigSynchronizationEnabled bool
LicenseSynchronizationEnabled bool
RuntimeGroupID string
Address string
RefreshNodePeriod time.Duration
TLSClient TLSClientConfig
}

func NewKongClientForKonnectRuntimeGroup(c KonnectConfig) (*Client, error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dataplane
package clients

import (
"context"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
package dataplane_test
package clients

import (
"context"
"testing"
"time"

"github.com/go-logr/logr/testr"

"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane"
)

func TestChannelConfigNotifier(t *testing.T) {
logger := testr.New(t)
n := dataplane.NewChannelConfigNotifier(logger)
n := NewChannelConfigNotifier(logger)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

ch := n.SubscribeConfigStatus()

// Call NotifyConfigStatus 5 times to make sure that the method is non-blocking.
for i := 0; i < 5; i++ {
n.NotifyConfigStatus(ctx, dataplane.ConfigStatusOK)
n.NotifyConfigStatus(ctx, ConfigStatusOK)
}

for i := 0; i < 5; i++ {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dataplane
package clients

import (
"context"
Expand Down Expand Up @@ -268,3 +268,10 @@ func (c *AdminAPIClientsManager) closeGatewayClientsSubscribers() {
close(sub)
}
}

// AdminAPIClientsProvider allows fetching the most recent list of Admin API clients of Gateways that
// we should configure.
type AdminAPIClientsProvider interface {
AllClients() []*adminapi.Client
GatewayClients() []*adminapi.Client
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dataplane
package clients

import (
"context"
Expand Down
10 changes: 9 additions & 1 deletion internal/controllers/gateway/gateway_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"github.com/kong/kubernetes-ingress-controller/v2/internal/annotations"
ctrlref "github.com/kong/kubernetes-ingress-controller/v2/internal/controllers/reference"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane"
"github.com/kong/kubernetes-ingress-controller/v2/internal/util"
)

// -----------------------------------------------------------------------------
Expand Down Expand Up @@ -415,12 +416,15 @@ func (r *GatewayReconciler) reconcileUnmanagedGateway(ctx context.Context, log l
debug(log, gateway, "gathering the gateway publish service") // this will also be done by the validating webhook, this is a fallback
var gatewayServices []*corev1.Service
for _, ref := range serviceRefs {
r.Log.V(util.DebugLevel).Info("determining service for ref", "ref", ref)
svc, err := r.determineServiceForGateway(ctx, ref)
if err != nil {
log.Error(err, "could not determine service for gateway", "namespace", gateway.Namespace, "name", gateway.Name)
return ctrl.Result{Requeue: true}, err
}
gatewayServices = append(gatewayServices, svc)
if svc != nil {
gatewayServices = append(gatewayServices, svc)
}
}

// set the Gateway as scheduled to indicate that validation is complete and reconciliation work
Expand Down Expand Up @@ -573,6 +577,10 @@ func (r *GatewayReconciler) determineServiceForGateway(ctx context.Context, ref

// retrieve the service for the kong gateway
svc := &corev1.Service{}
if name.Name == "" && name.Namespace == "" {
r.Log.V(util.DebugLevel).Info("service not configured, discarding it", "ref", ref)
return nil, nil
}
return svc, r.Client.Get(ctx, name, svc)
}

Expand Down
9 changes: 9 additions & 0 deletions internal/dataplane/deckgen/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,15 @@ func ToDeckContent(
return strings.Compare(*content.CACertificates[i].Cert, *content.CACertificates[j].Cert) > 0
})

for _, c := range k8sState.Licenses {
content.Licenses = append(content.Licenses,
file.FLicense{License: c})
}

sort.SliceStable(content.Licenses, func(i, j int) bool {
return strings.Compare(*content.Licenses[i].Payload, *content.Licenses[j].Payload) > 0
})

for _, c := range k8sState.Consumers {
consumer := file.FConsumer{Consumer: c.Consumer}

Expand Down
40 changes: 25 additions & 15 deletions internal/dataplane/kong_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

"github.com/kong/kubernetes-ingress-controller/v2/internal/adminapi"
"github.com/kong/kubernetes-ingress-controller/v2/internal/clients"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/deckgen"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/failures"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/kongstate"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/parser"
"github.com/kong/kubernetes-ingress-controller/v2/internal/dataplane/sendconfig"
"github.com/kong/kubernetes-ingress-controller/v2/internal/license"
"github.com/kong/kubernetes-ingress-controller/v2/internal/metrics"
"github.com/kong/kubernetes-ingress-controller/v2/internal/store"
"github.com/kong/kubernetes-ingress-controller/v2/internal/util"
Expand All @@ -40,13 +42,6 @@ const (
KongConfigurationApplyFailedEventReason = "KongConfigurationApplyFailed"
)

// AdminAPIClientsProvider allows fetching the most recent list of Admin API clients of Gateways that
// we should configure.
type AdminAPIClientsProvider interface {
AllClients() []*adminapi.Client
GatewayClients() []*adminapi.Client
}

// -----------------------------------------------------------------------------
// Dataplane Client - Kong - Public Types
// -----------------------------------------------------------------------------
Expand Down Expand Up @@ -126,16 +121,23 @@ type KongClient struct {
SHAs []string

// clientsProvider allows retrieving the most recent set of clients.
clientsProvider AdminAPIClientsProvider
clientsProvider clients.AdminAPIClientsProvider

// configStatusNotifier notifies status of configuring kong gateway.
configStatusNotifier ConfigStatusNotifier
configStatusNotifier clients.ConfigStatusNotifier

// updateStrategyResolver resolves the update strategy for a given Kong Gateway.
updateStrategyResolver sendconfig.UpdateStrategyResolver

// configChangeDetector detects changes in the configuration.
configChangeDetector sendconfig.ConfigurationChangeDetector

// licenseAgent manages Konnect license retrieval.
licenseAgent licenseGetter
}

type licenseGetter interface {
GetLicense() kong.License
}

// NewKongClient provides a new KongClient object after connecting to the
Expand All @@ -148,7 +150,7 @@ func NewKongClient(
kongConfig sendconfig.Config,
eventRecorder record.EventRecorder,
dbMode string,
clientsProvider AdminAPIClientsProvider,
clientsProvider clients.AdminAPIClientsProvider,
updateStrategyResolver sendconfig.UpdateStrategyResolver,
configChangeDetector sendconfig.ConfigurationChangeDetector,
) (*KongClient, error) {
Expand All @@ -165,7 +167,7 @@ func NewKongClient(
eventRecorder: eventRecorder,
dbmode: dbMode,
clientsProvider: clientsProvider,
configStatusNotifier: NoOpConfigStatusNotifier{},
configStatusNotifier: clients.NoOpConfigStatusNotifier{},
updateStrategyResolver: updateStrategyResolver,
configChangeDetector: configChangeDetector,
}
Expand Down Expand Up @@ -370,6 +372,10 @@ func (c *KongClient) AreCombinedServiceRoutesEnabled() bool {
return c.enableCombinedServiceRoutes
}

func (c *KongClient) EnableLicenseAgent(agent *license.Agent) {
c.licenseAgent = agent
}

// -----------------------------------------------------------------------------
// Dataplane Client - Kong - Interface Implementation
// -----------------------------------------------------------------------------
Expand Down Expand Up @@ -405,6 +411,10 @@ func (c *KongClient) Update(ctx context.Context) error {
if c.AreCombinedServiceRoutesEnabled() {
p.EnableCombinedServiceRoutes()
}
if c.licenseAgent != nil {
c.logger.Debug("retrieving license from agent and adding it to config")
p.InjectLicense(c.licenseAgent.GetLicense())
}
formatVersion := "1.1"
if versions.GetKongVersion().MajorMinorOnly().GTE(versions.ExplicitRegexPathVersionCutoff) {
p.EnableRegexPathPrefix()
Expand All @@ -424,17 +434,17 @@ func (c *KongClient) Update(ctx context.Context) error {

shas, err := c.sendOutToClients(ctx, kongstate, formatVersion, c.kongConfig)
if err != nil {
c.configStatusNotifier.NotifyConfigStatus(ctx, ConfigStatusApplyFailed)
c.configStatusNotifier.NotifyConfigStatus(ctx, clients.ConfigStatusApplyFailed)
return err
}

// succeeded to apply configuration to Kong gateway.
// notify the receiver of config status that translation error happened when there are translation errors,
// otherwise notify that config status is OK.
if len(translationFailures) > 0 {
c.configStatusNotifier.NotifyConfigStatus(ctx, ConfigStatusTranslationErrorHappened)
c.configStatusNotifier.NotifyConfigStatus(ctx, clients.ConfigStatusTranslationErrorHappened)
} else {
c.configStatusNotifier.NotifyConfigStatus(ctx, ConfigStatusOK)
c.configStatusNotifier.NotifyConfigStatus(ctx, clients.ConfigStatusOK)
}

// report on configured Kubernetes objects if enabled
Expand Down Expand Up @@ -542,7 +552,7 @@ func HandleSendToClientResult(client sendconfig.KonnectAwareClient, logger logru

// SetConfigStatusNotifier sets a notifier which notifies subscribers about configuration sending results.
// Currently it is used for uploading the node status to konnect runtime group.
func (c *KongClient) SetConfigStatusNotifier(n ConfigStatusNotifier) {
func (c *KongClient) SetConfigStatusNotifier(n clients.ConfigStatusNotifier) {
c.lock.Lock()
defer c.lock.Unlock()

Expand Down
1 change: 1 addition & 0 deletions internal/dataplane/kongstate/kongstate.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type KongState struct {
Upstreams []Upstream
Certificates []Certificate
CACertificates []kong.CACertificate
Licenses []kong.License
Plugins []Plugin
Consumers []Consumer
Version semver.Version
Expand Down
Loading

0 comments on commit eb974e7

Please sign in to comment.