Skip to content

Commit f1b4581

Browse files
committed
Implement prune command
In case of state store and load functions implemented we may prune objects in Adam to keep the logic to be as fast as possible. Signed-off-by: Petr Fedchenkov <[email protected]>
1 parent fdf746e commit f1b4581

5 files changed

Lines changed: 136 additions & 2 deletions

File tree

cmd/edenClean.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func newCleanCmd(configName, verbosity *string) *cobra.Command {
2323
PersistentPreRunE: preRunViperLoadFunction(cfg, configName, verbosity),
2424
Run: func(cmd *cobra.Command, args []string) {
2525
if err := openevec.EdenClean(*cfg, *configName, configDist, vmName, currentContext); err != nil {
26-
log.Fatalf("Setup eden failed: %s", err)
26+
log.Fatalf("Clean eden failed: %s", err)
2727
}
2828
},
2929
}
@@ -54,3 +54,21 @@ func newCleanCmd(configName, verbosity *string) *cobra.Command {
5454

5555
return cleanCmd
5656
}
57+
58+
func newPruneCmd(configName, verbosity *string) *cobra.Command {
59+
cfg := &openevec.EdenSetupArgs{}
60+
61+
var pruneCmd = &cobra.Command{
62+
Use: "prune",
63+
Short: "prune stored objects from the controller. Please save them before.",
64+
Long: `Prune stored objects from the controller. Please save them before.`,
65+
PersistentPreRunE: preRunViperLoadFunction(cfg, configName, verbosity),
66+
Run: func(cmd *cobra.Command, args []string) {
67+
if err := openevec.EdenPrune(*cfg); err != nil {
68+
log.Fatalf("Prune eden failed: %s", err)
69+
}
70+
},
71+
}
72+
73+
return pruneCmd
74+
}

cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func NewEdenCommand() *cobra.Command {
3535
newCleanCmd(&configName, &verbosity),
3636
newConfigCmd(&configName, &verbosity),
3737
newSdnCmd(&configName, &verbosity),
38+
newPruneCmd(&configName, &verbosity),
3839
},
3940
},
4041
{

pkg/controller/adam/adam.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package adam
22

33
import (
4+
"context"
45
"encoding/json"
56
"fmt"
67
"net/url"
@@ -10,6 +11,7 @@ import (
1011
"strings"
1112
"time"
1213

14+
"github.com/go-redis/redis/v9"
1315
"github.com/lf-edge/eden/pkg/controller/cachers"
1416
"github.com/lf-edge/eden/pkg/controller/eapps"
1517
"github.com/lf-edge/eden/pkg/controller/eflowlog"
@@ -405,3 +407,66 @@ func (adam *Ctx) GetGlobalOptions() (*types.GlobalOptions, error) {
405407
}
406408
return &globalOptions, nil
407409
}
410+
411+
func (adam *Ctx) cleanRedisStream(stream string) error {
412+
addr, password, databaseID, err := parseRedisURL(adam.AdamRedisURLEden)
413+
if err != nil {
414+
return err
415+
}
416+
client := redis.NewClient(&redis.Options{
417+
Addr: addr,
418+
Password: password,
419+
DB: databaseID,
420+
MaxRetries: defaults.DefaultRepeatCount,
421+
MinRetryBackoff: defaults.DefaultRepeatTimeout / 2,
422+
MaxRetryBackoff: defaults.DefaultRepeatTimeout * 2,
423+
})
424+
n, err := client.XTrimMaxLenApprox(context.TODO(), stream, 0, 0).Result()
425+
log.Debugf("XTrimMaxLenApprox(%s): %d", stream, n)
426+
return err
427+
}
428+
429+
// CleanInfo removes all info messages of device from controller
430+
func (adam *Ctx) CleanInfo(devUUID uuid.UUID) (err error) {
431+
if adam.AdamRemoteRedis {
432+
stream := adam.getInfoRedisStream(devUUID)
433+
return adam.cleanRedisStream(stream)
434+
}
435+
panic("implement me")
436+
}
437+
438+
// CleanMetrics removes all metric messages of device from controller
439+
func (adam *Ctx) CleanMetrics(devUUID uuid.UUID) (err error) {
440+
if adam.AdamRemoteRedis {
441+
stream := adam.getMetricsRedisStream(devUUID)
442+
return adam.cleanRedisStream(stream)
443+
}
444+
panic("implement me")
445+
}
446+
447+
// CleanLogs removes all logs messages of device from controller
448+
func (adam *Ctx) CleanLogs(devUUID uuid.UUID) (err error) {
449+
if adam.AdamRemoteRedis {
450+
stream := adam.getLogsRedisStream(devUUID)
451+
return adam.cleanRedisStream(stream)
452+
}
453+
panic("implement me")
454+
}
455+
456+
// CleanFlowLogs removes all flow logs messages of device from controller
457+
func (adam *Ctx) CleanFlowLogs(devUUID uuid.UUID) (err error) {
458+
if adam.AdamRemoteRedis {
459+
stream := adam.getFlowLogRedisStream(devUUID)
460+
return adam.cleanRedisStream(stream)
461+
}
462+
panic("implement me")
463+
}
464+
465+
// CleanAppLogs removes all app logs messages of app of device from controller
466+
func (adam *Ctx) CleanAppLogs(devUUID uuid.UUID, appUUID uuid.UUID) (err error) {
467+
if adam.AdamRemoteRedis {
468+
stream := adam.getAppsLogsRedisStream(devUUID, appUUID)
469+
return adam.cleanRedisStream(stream)
470+
}
471+
panic("implement me")
472+
}

pkg/controller/controller.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
uuid "github.com/satori/go.uuid"
1616
)
1717

18-
//Controller is an interface of controller
18+
// Controller is an interface of controller
1919
type Controller interface {
2020
CertsGet(devUUID uuid.UUID) (out string, err error)
2121
ConfigGet(devUUID uuid.UUID) (out string, err error)
@@ -28,6 +28,11 @@ type Controller interface {
2828
FlowLogLastCallback(devUUID uuid.UUID, q map[string]string, handler eflowlog.HandlerFunc) (err error)
2929
InfoChecker(devUUID uuid.UUID, q map[string]string, handler einfo.HandlerFunc, mode einfo.InfoCheckerMode, timeout time.Duration) (err error)
3030
InfoLastCallback(devUUID uuid.UUID, q map[string]string, handler einfo.HandlerFunc) (err error)
31+
CleanInfo(devUUID uuid.UUID) (err error)
32+
CleanMetrics(devUUID uuid.UUID) (err error)
33+
CleanLogs(devUUID uuid.UUID) (err error)
34+
CleanFlowLogs(devUUID uuid.UUID) (err error)
35+
CleanAppLogs(devUUID uuid.UUID, appUUID uuid.UUID) (err error)
3136
MetricChecker(devUUID uuid.UUID, q map[string]string, handler emetric.HandlerFunc, mode emetric.MetricCheckerMode, timeout time.Duration) (err error)
3237
MetricLastCallback(devUUID uuid.UUID, q map[string]string, handler emetric.HandlerFunc) (err error)
3338
RequestLastCallback(devUUID uuid.UUID, q map[string]string, handler erequest.HandlerFunc) (err error)

pkg/openevec/eden.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/lf-edge/eden/pkg/controller/types"
2323
"github.com/lf-edge/eden/pkg/defaults"
2424
"github.com/lf-edge/eden/pkg/eden"
25+
"github.com/lf-edge/eden/pkg/eve"
2526
"github.com/lf-edge/eden/pkg/models"
2627
"github.com/lf-edge/eden/pkg/utils"
2728
"github.com/lf-edge/eve/api/go/flowlog"
@@ -841,3 +842,47 @@ func EdenImport(tarFile string, rewriteRoot bool, cfg *EdenSetupArgs) error {
841842

842843
return nil
843844
}
845+
846+
// EdenPrune removes data from the controller
847+
//
848+
//nolint:cyclop
849+
func EdenPrune(_ EdenSetupArgs) error {
850+
changer := &adamChanger{}
851+
ctrl, dev, err := changer.getControllerAndDev()
852+
if err != nil {
853+
return fmt.Errorf("getControllerAndDev: %w", err)
854+
}
855+
state := eve.Init(ctrl, dev)
856+
if err := ctrl.InfoLastCallback(dev.GetID(), nil, state.InfoCallback()); err != nil {
857+
return fmt.Errorf("fail in get InfoLastCallback: %w", err)
858+
}
859+
if err := ctrl.MetricLastCallback(dev.GetID(), nil, state.MetricCallback()); err != nil {
860+
return fmt.Errorf("fail in get MetricLastCallback: %w", err)
861+
}
862+
err = state.Store()
863+
if err != nil {
864+
return fmt.Errorf("state.Store: %w", err)
865+
}
866+
if err := ctrl.CleanInfo(dev.GetID()); err != nil {
867+
return fmt.Errorf("fail in ctrl CleanInfo: %w", err)
868+
}
869+
if err := ctrl.CleanMetrics(dev.GetID()); err != nil {
870+
return fmt.Errorf("fail in ctrl CleanMetrics: %w", err)
871+
}
872+
if err := ctrl.CleanLogs(dev.GetID()); err != nil {
873+
return fmt.Errorf("fail in ctrl CleanLogs: %w", err)
874+
}
875+
if err := ctrl.CleanFlowLogs(dev.GetID()); err != nil {
876+
return fmt.Errorf("fail in ctrl CleanFlowLogs: %w", err)
877+
}
878+
for _, el := range dev.GetApplicationInstances() {
879+
appUUID, err := uuid.FromString(el)
880+
if err != nil {
881+
return err
882+
}
883+
if err := ctrl.CleanAppLogs(dev.GetID(), appUUID); err != nil {
884+
return fmt.Errorf("fail in ctrl CleanAppLogs: %w", err)
885+
}
886+
}
887+
return nil
888+
}

0 commit comments

Comments
 (0)