Skip to content

Commit

Permalink
feat: adjusting the interface execution logic via json
Browse files Browse the repository at this point in the history
  • Loading branch information
maxwelbm committed May 17, 2024
1 parent c5556ed commit cdd0af0
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 66 deletions.
26 changes: 12 additions & 14 deletions pkg/cmd/delete/edge_storage/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,20 @@ func (b *bucket) runE(cmd *cobra.Command, _ []string) error {
err := client.DeleteBucket(ctx, b.name)
if err != nil {
if msg.ERROR_NO_EMPTY_BUCKET == err.Error() {
if utils.Confirm(b.factory.GlobalFlagAll, msg.ASK_NOT_EMPTY_BUCKET, false) || b.force {
logger.Info("Delete all objects bucket", zap.Any("bucket-name", b.name))
if err := deleteAllObjects(client, ctx, b.name, ""); err != nil {
return err
}
err := client.DeleteBucket(ctx, b.name)
if msg.ERROR_NO_EMPTY_BUCKET == err.Error() {
return schedule.NewSchedule(b.name, schedule.DeleteBucket{Name: b.name, Factory: b.factory})
if !b.force {
if !utils.Confirm(b.factory.GlobalFlagAll, msg.ASK_NOT_EMPTY_BUCKET, false) {
return nil
}
}
logger.Info("Delete all objects bucket", zap.Any("bucket-name", b.name))
if err := deleteAllObjects(client, ctx, b.name, ""); err != nil {
return err
}
err := client.DeleteBucket(ctx, b.name)
if msg.ERROR_NO_EMPTY_BUCKET == err.Error() {
logger.Info("schedules a delete for the bucket", zap.Any("bucket-name", b.name))
return schedule.NewSchedule(b.name, schedule.DELETE_BUCKET)
}
return nil
}
return fmt.Errorf(msg.ERROR_DELETE_BUCKET, err.Error())
Expand All @@ -81,16 +85,10 @@ func (f *bucket) addFlags(flags *pflag.FlagSet) {
}

func deleteAllObjects(client *api.Client, ctx context.Context, name, continuationToken string) error {
// maxWorkers := 10
// workerChan := make(chan struct{}, maxWorkers)

objects, err := client.ListObject(ctx, name, &contracts.ListOptions{ContinuationToken: continuationToken})
if err != nil {
return err
}

// errChan := make(chan error, len(objects.GetResults()))

if len(objects.GetResults()) > 0 {
for _, o := range objects.GetResults() {
err := client.DeleteObject(ctx, name, o.GetKey())
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/root/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func NewCobraCmd(rootCmd *RootCmd, f *cmdutil.Factory) *cobra.Command {
if strings.HasPrefix(configFlag, PREFIX_FLAG) {
return msg.ErrorPrefix
}
schedule.ExecSchedules()
schedule.ExecSchedules(f)
return doPreCommandCheck(cmd, f, PreCmd{
config: configFlag,
token: tokenFlag,
Expand Down
15 changes: 6 additions & 9 deletions pkg/schedule/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,13 @@ import (
api "github.com/aziontech/azion-cli/pkg/api/storage"
)

type DeleteBucket struct {
Factory *cmdutil.Factory
Name string
}
const DELETE_BUCKET = "DeleteBucket"

func (b DeleteBucket) TriggerEvent() error {
func TriggerDeleteBucket(f *cmdutil.Factory, name string) error {
client := api.NewClient(
b.Factory.HttpClient,
b.Factory.Config.GetString("storage_url"),
b.Factory.Config.GetString("token"))
f.HttpClient,
f.Config.GetString("storage_url"),
f.Config.GetString("token"))
ctx := context.Background()
return client.DeleteBucket(ctx, b.Name)
return client.DeleteBucket(ctx, name)
}
63 changes: 21 additions & 42 deletions pkg/schedule/schedule.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,27 @@ package schedule

import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
"time"

"github.com/aziontech/azion-cli/pkg/cmdutil"
"github.com/aziontech/azion-cli/pkg/config"
"github.com/aziontech/azion-cli/pkg/logger"
"go.uber.org/zap"
)

type Schedule struct {
Name string `json:"name"`
Time time.Time `json:"time"` // schedule creation time
Object SheduleInterface `json:"object"`
Name string `json:"name"`
Time time.Time `json:"time"` // schedule creation time
Kind string `json:"kind"`
}

type SheduleInterface interface {
TriggerEvent() error
}

func NewSchedule(name string, object SheduleInterface) error {
func NewSchedule(name string, kind string) error {
schedule := Schedule{
Name: name,
Time: time.Now(),
Object: object,
Name: name,
Time: time.Now(),
Kind: kind,
}

schedules, err := readFileShedule()
Expand All @@ -46,19 +41,15 @@ func NewSchedule(name string, object SheduleInterface) error {
}

func createFileShedule(shedule []Schedule) error {
fmt.Println(">> here: ", shedule)
b, err := json.MarshalIndent(shedule, " ", " ")
if err != nil {
fmt.Println(">>> err:", err.Error())
return err
}
fmt.Println(">> b: ", b)
configPath, err := config.Dir()
if err != nil {
return err
}
path := filepath.Join(configPath.Dir, configPath.Schedule)
fmt.Println(">> path: ", path)
return os.WriteFile(path, b, os.FileMode(os.O_CREATE))
}

Expand Down Expand Up @@ -101,39 +92,27 @@ func readFileShedule() ([]Schedule, error) {
return schedules, nil
}

func ExecSchedules() {
func ExecSchedules(factory *cmdutil.Factory) {
schedules, err := readFileShedule()
if err != nil {
logger.Debug("read shedule error", zap.Error(err))
return
}

var wg sync.WaitGroup
wg.Add(len(schedules))
errChan := make(chan error, len(schedules))
}

for _, s := range schedules {
go func(s Schedule) {
defer wg.Done()

// Checks if the current time is before 24 hours after the time 's'.
if time.Now().Before(s.Time.Add(24*time.Hour)) {
if err := s.Object.TriggerEvent(); err != nil {
errChan <- err
if CheckIf24HoursPassed(s.Time) {
if s.Kind == DELETE_BUCKET {
if err := TriggerDeleteBucket(factory, s.Name); err != nil {
logger.Debug("event execution error", zap.Error(err))
}
}
}(s)
}
}
wg.Wait()

go func() {
wg.Wait()
close(errChan)
}()
}

go func() {
for err := range errChan {
logger.Debug("event execution error", zap.Error(err))
}
}()
// CheckIf24HoursPassed Checks if the current time is before 24 hours after the time 's'.
func CheckIf24HoursPassed(passed time.Time) bool {
now := time.Now()
diff := now.Sub(passed)
return diff >= 24*time.Hour
}

0 comments on commit cdd0af0

Please sign in to comment.