1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
package diff
import (
"github.com/kong/deck/crud"
"github.com/kong/deck/state"
"github.com/pkg/errors"
)
func (sc *Syncer) deletePlugins() error {
currentPlugins, err := sc.currentState.Plugins.GetAll()
if err != nil {
return errors.Wrap(err, "error fetching plugins from state")
}
for _, plugin := range currentPlugins {
n, err := sc.deletePlugin(plugin)
if err != nil {
return err
}
if n != nil {
err = sc.queueEvent(*n)
if err != nil {
return err
}
}
}
return nil
}
func (sc *Syncer) deletePlugin(plugin *state.Plugin) (*Event, error) {
plugin = &state.Plugin{Plugin: *plugin.DeepCopy()}
name := *plugin.Name
serviceID, routeID, consumerID := foreignNames(plugin)
_, err := sc.targetState.Plugins.GetByProp(name, serviceID, routeID,
consumerID)
if err == state.ErrNotFound {
return &Event{
Op: crud.Delete,
Kind: "plugin",
Obj: plugin,
}, nil
}
if err != nil {
return nil, errors.Wrapf(err, "looking up plugin '%v'", *plugin.ID)
}
return nil, nil
}
func (sc *Syncer) createUpdatePlugins() error {
targetPlugins, err := sc.targetState.Plugins.GetAll()
if err != nil {
return errors.Wrap(err, "error fetching plugins from state")
}
for _, plugin := range targetPlugins {
n, err := sc.createUpdatePlugin(plugin)
if err != nil {
return err
}
if n != nil {
err = sc.queueEvent(*n)
if err != nil {
return err
}
}
}
return nil
}
func (sc *Syncer) createUpdatePlugin(plugin *state.Plugin) (*Event, error) {
plugin = &state.Plugin{Plugin: *plugin.DeepCopy()}
name := *plugin.Name
serviceID, routeID, consumerID := foreignNames(plugin)
currentPlugin, err := sc.currentState.Plugins.GetByProp(name,
serviceID, routeID, consumerID)
if err == state.ErrNotFound {
// plugin not present, create it
return &Event{
Op: crud.Create,
Kind: "plugin",
Obj: plugin,
}, nil
}
if err != nil {
return nil, errors.Wrapf(err, "error looking up plugin %v",
*plugin.Name)
}
currentPlugin = &state.Plugin{Plugin: *currentPlugin.DeepCopy()}
// found, check if update needed
if !currentPlugin.EqualWithOpts(plugin, false, true, false) {
return &Event{
Op: crud.Update,
Kind: "plugin",
Obj: plugin,
OldObj: currentPlugin,
}, nil
}
return nil, nil
}
func foreignNames(p *state.Plugin) (serviceID, routeID, consumerID string) {
if p == nil {
return
}
if p.Service != nil && p.Service.ID != nil {
serviceID = *p.Service.ID
}
if p.Route != nil && p.Route.ID != nil {
routeID = *p.Route.ID
}
if p.Consumer != nil && p.Consumer.ID != nil {
consumerID = *p.Consumer.ID
}
return
}
|