Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
129 changes: 3 additions & 126 deletions internal/kube/adaptor/config_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,143 +99,20 @@ func (c *ConfigSync) configEvent(key string, configmap *corev1.ConfigMap) error
if err := c.syncSslProfileCredentialsToDisk(desired.SslProfiles); err != nil {
return err
}
if err := c.syncSslProfilesToRouter(desired.SslProfiles); err != nil {
if err := qdr.SyncSslProfilesToRouter(c.agentPool, desired.SslProfiles); err != nil {
return err
}
if err := c.syncBridgeConfig(&desired.Bridges); err != nil {
if err := qdr.SyncBridgeConfig(c.agentPool, &desired.Bridges); err != nil {
c.logger.Error("sync failed", slog.Any("error", err))
return err
}
if err := c.syncRouterConfig(desired); err != nil {
if err := qdr.SyncRouterConfig(c.agentPool, desired, true); err != nil {
c.logger.Error("sync failed", slog.Any("error", err))
return err
}
return nil
}

func syncBridgeConfig(agent *qdr.Agent, desired *qdr.BridgeConfig) (bool, error) {
actual, err := agent.GetLocalBridgeConfig()
if err != nil {
return false, fmt.Errorf("Error retrieving bridges: %s", err)
}
differences := actual.Difference(desired)
if differences.Empty() {
return true, nil
} else {
if err = agent.UpdateLocalBridgeConfig(differences); err != nil {
return false, fmt.Errorf("Error syncing bridges: %s", err)
}
return false, nil
}
}

func (c *ConfigSync) syncBridgeConfig(desired *qdr.BridgeConfig) error {
agent, err := c.agentPool.Get()
if err != nil {
return fmt.Errorf("Could not get management agent : %s", err)
}
var synced bool

synced, err = syncBridgeConfig(agent, desired)

c.agentPool.Put(agent)
if err != nil {
return fmt.Errorf("Error while syncing bridge config : %s", err)
}
if !synced {
return fmt.Errorf("Bridge config is not synchronised yet")
}
return nil
}

func (c *ConfigSync) syncRouterConfig(desired *qdr.RouterConfig) error {
agent, err := c.agentPool.Get()
if err != nil {
return fmt.Errorf("Could not get management agent : %s", err)
}

err = syncRouterConfig(agent, desired)

c.agentPool.Put(agent)
if err != nil {
return fmt.Errorf("Error while syncing router config : %s", err)
}
return nil
}

func syncRouterConfig(agent *qdr.Agent, desired *qdr.RouterConfig) error {
if err := syncConnectors(agent, desired); err != nil {
return err
}
if err := syncListeners(agent, desired); err != nil {
return err
}
return nil
}

func syncConnectors(agent *qdr.Agent, desired *qdr.RouterConfig) error {
actual, err := agent.GetLocalConnectors()
if err != nil {
return fmt.Errorf("Error retrieving local connectors: %s", err)
}

ignorePrefix := "auto-mesh"
if differences := qdr.ConnectorsDifference(actual, desired, &ignorePrefix); !differences.Empty() {
if err = agent.UpdateConnectorConfig(differences, true); err != nil {
return fmt.Errorf("Error syncing connectors: %s", err)
}
}
return nil
}

func syncListeners(agent *qdr.Agent, desired *qdr.RouterConfig) error {
actual, err := agent.GetLocalListeners()
if err != nil {
return fmt.Errorf("Error retrieving local listeners: %s", err)
}

if differences := qdr.ListenersDifference(qdr.FilterListeners(actual, qdr.IsNotProtectedListener), desired.GetMatchingListeners(qdr.IsNotProtectedListener)); !differences.Empty() {
if err := agent.UpdateListenerConfig(differences); err != nil {
return fmt.Errorf("Error syncing listeners: %s", err)
}
}
return nil
}

func (c *ConfigSync) syncSslProfilesToRouter(desired map[string]qdr.SslProfile) error {
agent, err := c.agentPool.Get()
if err != nil {
return err
}
defer c.agentPool.Put(agent)
actual, err := agent.GetSslProfiles()
if err != nil {
return err
}

for _, profile := range desired {
current, ok := actual[profile.Name]
if !ok {
if err := agent.CreateSslProfile(profile); err != nil {
return err
}
}
if current != profile {
if err := agent.UpdateSslProfile(profile); err != nil {
return err
}
}
}
for _, profile := range actual {
if _, ok := desired[profile.Name]; !ok {
if err := agent.Delete("io.skupper.router.sslProfile", profile.Name); err != nil {
return err
}
}
}
return nil
}

func (c *ConfigSync) syncSslProfileCredentialsToDisk(profiles map[string]qdr.SslProfile) error {
delta := c.profileSyncer.Expect(profiles)
return delta.Error()
Expand Down
8 changes: 5 additions & 3 deletions internal/nonkube/controller/system_adaptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package controller

import (
"fmt"
"log"
"log/slog"
"os"
"path"

Expand All @@ -13,13 +13,15 @@ import (
type SystemAdaptor struct {
agentPool *qdr.AgentPool
namespace string
logger *slog.Logger
}

func NewSystemAdaptor(namespace string, agentPool *qdr.AgentPool) *SystemAdaptor {

systemAdaptor := &SystemAdaptor{
namespace: namespace,
agentPool: agentPool,
logger: slog.New(slog.Default().Handler()).With(slog.String("component", "system.controller.SystemAdaptor")),
}
return systemAdaptor
}
Expand All @@ -36,14 +38,14 @@ func (s *SystemAdaptor) syncWithRouter(desired *qdr.RouterConfig) error {
return err
}
if err := qdr.SyncBridgeConfig(s.agentPool, &desired.Bridges); err != nil {
log.Printf("sync failed: %s", err)
s.logger.Error("SYSTEM_ADAPTOR: sync failed", slog.Any("error", err), slog.Any("namespace", s.namespace))
return err
}

//Do not double-check that certificates exist; it has been done by previous syncSslProfileCredentialsToDisk
// Also, the paths included in the ssl profiles are relative to the router instead of the runtime directory
if err := qdr.SyncRouterConfig(s.agentPool, desired, false); err != nil {
log.Printf("sync failed: %s", err)
s.logger.Error("SYSTEM_ADAPTOR: sync failed", slog.Any("error", err), slog.Any("namespace", s.namespace))
return err
}
return nil
Expand Down
5 changes: 2 additions & 3 deletions internal/qdr/sync_router_ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ package qdr

import (
"fmt"
"log"
)

//TODO: use this in config-sync

func SyncSslProfilesToRouter(agentPool *AgentPool, desired map[string]SslProfile) error {

agent, err := agentPool.Get()
Expand Down Expand Up @@ -56,7 +55,7 @@ func SyncBridgeConfig(agentPool *AgentPool, desired *BridgeConfig) error {
return fmt.Errorf("Error while syncing bridge config : %s", err)
}
if !synced {
return fmt.Errorf("Bridge config is not synchronised yet")
log.Default().Println("Bridge config is not synchronised yet")
}
return nil
}
Expand Down
Loading