Skip to content

Commit a0fa24d

Browse files
committed
move update to eventstream, adding progress type
1 parent 5be93c5 commit a0fa24d

File tree

8 files changed

+91
-80
lines changed

8 files changed

+91
-80
lines changed

cmd/arduino-app-cli/system/system.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"github.com/arduino/arduino-app-cli/cmd/arduino-app-cli/internal/servicelocator"
2727
"github.com/arduino/arduino-app-cli/cmd/feedback"
28+
"github.com/arduino/arduino-app-cli/internal/eventstream"
2829
"github.com/arduino/arduino-app-cli/internal/helpers"
2930
"github.com/arduino/arduino-app-cli/internal/orchestrator"
3031
"github.com/arduino/arduino-app-cli/internal/orchestrator/config"
@@ -115,7 +116,7 @@ func newUpdateCmd() *cobra.Command {
115116
for event := range events {
116117
feedback.Printf("[%s] %s", event.Type.String(), event.Data)
117118

118-
if event.Type == update.DoneEvent {
119+
if event.Type == eventstream.DoneEvent {
119120
break
120121
}
121122
}

cmd/gendoc/docs.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ import (
3131

3232
"github.com/arduino/arduino-app-cli/internal/api/handlers"
3333
"github.com/arduino/arduino-app-cli/internal/api/models"
34+
"github.com/arduino/arduino-app-cli/internal/eventstream"
3435
"github.com/arduino/arduino-app-cli/internal/orchestrator"
3536
"github.com/arduino/arduino-app-cli/internal/orchestrator/app"
3637
"github.com/arduino/arduino-app-cli/internal/orchestrator/bricks"
37-
"github.com/arduino/arduino-app-cli/internal/update"
3838
)
3939

4040
type Tag string
@@ -81,10 +81,10 @@ func NewOpenApiGenerator(version string) *Generator {
8181
openapi3.SchemaOrRef{
8282
Schema: &openapi3.Schema{
8383
UniqueItems: f.Ptr(true),
84-
Enum: f.Map(update.PackageType("").AllowedStatuses(), func(v update.PackageType) interface{} { return v }),
84+
Enum: f.Map(eventstream.PackageType("").AllowedStatuses(), func(v eventstream.PackageType) interface{} { return v }),
8585
Type: f.Ptr(openapi3.SchemaTypeString),
8686
Description: f.Ptr("Package type"),
87-
ReflectType: reflect.TypeOf(update.PackageType("")),
87+
ReflectType: reflect.TypeOf(eventstream.PackageType("")),
8888
},
8989
},
9090
)
@@ -216,7 +216,7 @@ func NewOpenApiGenerator(version string) *Generator {
216216
})
217217
}
218218

219-
if params.Value.Type() == reflect.TypeOf(update.PackageType("")) {
219+
if params.Value.Type() == reflect.TypeOf(eventstream.PackageType("")) {
220220
params.Schema.WithRef("#/components/schemas/PackageType")
221221
return true, nil
222222
}

internal/api/handlers/update.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"log/slog"
2424

2525
"github.com/arduino/arduino-app-cli/internal/api/models"
26+
"github.com/arduino/arduino-app-cli/internal/eventstream"
2627
"github.com/arduino/arduino-app-cli/internal/render"
2728
"github.com/arduino/arduino-app-cli/internal/update"
2829
)
@@ -127,7 +128,7 @@ func HandleUpdateEvents(updater *update.Manager) http.HandlerFunc {
127128
slog.Info("APT event channel closed, stopping SSE stream")
128129
return
129130
}
130-
if event.Type == update.ErrorEvent {
131+
if event.Type == eventstream.ErrorEvent {
131132
sseStream.SendError(render.SSEErrorData{
132133
Code: render.InternalServiceErr,
133134
Message: event.Data,

internal/update/event.go renamed to internal/eventstream/event_stream.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// Arduino software without disclosing the source code of your own applications.
1414
// To purchase a commercial license, send an email to license@arduino.cc.
1515

16-
package update
16+
package eventstream
1717

1818
// EventType defines the type of upgrade event.
1919
type EventType int
@@ -24,13 +24,15 @@ const (
2424
RestartEvent
2525
DoneEvent
2626
ErrorEvent
27+
ProgressEvent
2728
)
2829

2930
// Event represents a single event in the upgrade process.
3031
type Event struct {
31-
Type EventType
32-
Data string
33-
Err error // Optional error field for error events
32+
Type EventType
33+
Data string
34+
Err error // Optional error field for error events
35+
Progress float32
3436
}
3537

3638
func (t EventType) String() string {
@@ -45,6 +47,8 @@ func (t EventType) String() string {
4547
return "done"
4648
case ErrorEvent:
4749
return "error"
50+
case ProgressEvent:
51+
return "progress"
4852
default:
4953
panic("unreachable")
5054
}

internal/update/apt/service.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/arduino/go-paths-helper"
3131
"go.bug.st/f"
3232

33+
"github.com/arduino/arduino-app-cli/internal/eventstream"
3334
"github.com/arduino/arduino-app-cli/internal/orchestrator"
3435
"github.com/arduino/arduino-app-cli/internal/update"
3536
)
@@ -74,11 +75,11 @@ func (s *Service) ListUpgradablePackages(ctx context.Context, matcher func(updat
7475
// UpgradePackages upgrades the specified packages using the `apt-get upgrade` command.
7576
// It publishes events to subscribers during the upgrade process.
7677
// It returns an error if the upgrade is already in progress or if the upgrade command fails.
77-
func (s *Service) UpgradePackages(ctx context.Context, names []string) (<-chan update.Event, error) {
78+
func (s *Service) UpgradePackages(ctx context.Context, names []string) (<-chan eventstream.Event, error) {
7879
if !s.lock.TryLock() {
7980
return nil, update.ErrOperationAlreadyInProgress
8081
}
81-
eventsCh := make(chan update.Event, 100)
82+
eventsCh := make(chan eventstream.Event, 100)
8283

8384
go func() {
8485
defer s.lock.Unlock()
@@ -87,72 +88,72 @@ func (s *Service) UpgradePackages(ctx context.Context, names []string) (<-chan u
8788
ctx, cancel := context.WithTimeout(ctx, 10*time.Minute)
8889
defer cancel()
8990

90-
eventsCh <- update.Event{Type: update.StartEvent, Data: "Upgrade is starting"}
91+
eventsCh <- eventstream.Event{Type: eventstream.StartEvent, Data: "Upgrade is starting"}
9192
stream := runUpgradeCommand(ctx, names)
9293
for line, err := range stream {
9394
if err != nil {
94-
eventsCh <- update.Event{
95-
Type: update.ErrorEvent,
95+
eventsCh <- eventstream.Event{
96+
Type: eventstream.ErrorEvent,
9697
Err: err,
9798
Data: "Error running upgrade command",
9899
}
99100
slog.Error("error processing upgrade command output", "error", err)
100101
return
101102
}
102-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line}
103+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: line}
103104
}
104-
eventsCh <- update.Event{Type: update.StartEvent, Data: "apt cleaning cache is starting"}
105+
eventsCh <- eventstream.Event{Type: eventstream.StartEvent, Data: "apt cleaning cache is starting"}
105106
for line, err := range runAptCleanCommand(ctx) {
106107
if err != nil {
107-
eventsCh <- update.Event{
108-
Type: update.ErrorEvent,
108+
eventsCh <- eventstream.Event{
109+
Type: eventstream.ErrorEvent,
109110
Err: err,
110111
Data: "Error running apt clean command",
111112
}
112113
slog.Error("error processing apt clean command output", "error", err)
113114
return
114115
}
115-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line}
116+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: line}
116117
}
117118
// TEMPORARY PATCH: stopping and destroying docker containers and images since IDE does not implement it yet.
118119
// TODO: Remove this workaround once IDE implements it.
119120
// Tracking issue: https://github.com/arduino/arduino-app-cli/issues/623
120-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: "Stop and destroy docker containers and images ..."}
121+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: "Stop and destroy docker containers and images ..."}
121122
streamCleanup := cleanupDockerContainers(ctx)
122123
for line, err := range streamCleanup {
123124
if err != nil {
124125
// TODO: maybe we should retun an error or a better feedback to the user?
125126
// currently, we just log the error and continue considenring not blocking
126127
slog.Error("Error stopping and destroying docker containers", "error", err)
127128
}
128-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line}
129+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: line}
129130
}
130131

131132
// TEMPORARY PATCH: Install the latest docker images and show the logs to the users.
132133
// TODO: Remove this workaround once docker image versions are no longer hardcoded in arduino-app-cli.
133134
// Tracking issue: https://github.com/arduino/arduino-app-cli/issues/600
134135
// Currently, we need to launch `arduino-app-cli system init` to pull the latest docker images because
135136
// the version of the docker images are hardcoded in the (new downloaded) version of the arduino-app-cli.
136-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: "Pulling the latest docker images ..."}
137+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: "Pulling the latest docker images ..."}
137138
streamDocker := pullDockerImages(ctx)
138139
for line, err := range streamDocker {
139140
if err != nil {
140-
eventsCh <- update.Event{
141-
Type: update.ErrorEvent,
141+
eventsCh <- eventstream.Event{
142+
Type: eventstream.ErrorEvent,
142143
Err: err,
143144
Data: "Error upgrading docker images",
144145
}
145146
slog.Error("error upgrading docker images", "error", err)
146147
return
147148
}
148-
eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line}
149+
eventsCh <- eventstream.Event{Type: eventstream.UpgradeLineEvent, Data: line}
149150
}
150-
eventsCh <- update.Event{Type: update.RestartEvent, Data: "Upgrade completed. Restarting ..."}
151+
eventsCh <- eventstream.Event{Type: eventstream.RestartEvent, Data: "Upgrade completed. Restarting ..."}
151152

152153
err := restartServices(ctx)
153154
if err != nil {
154-
eventsCh <- update.Event{
155-
Type: update.ErrorEvent,
155+
eventsCh <- eventstream.Event{
156+
Type: eventstream.ErrorEvent,
156157
Err: err,
157158
Data: "Error restart services after upgrade",
158159
}
@@ -361,7 +362,7 @@ func parseListUpgradableOutput(r io.Reader) []update.UpgradablePackage {
361362
name := strings.Split(matches[1], "/")[0]
362363

363364
pkg := update.UpgradablePackage{
364-
Type: update.Debian,
365+
Type: eventstream.Debian,
365366
Name: name,
366367
ToVersion: matches[2],
367368
Architecture: matches[3],

internal/update/apt/service_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121

2222
"github.com/stretchr/testify/require"
2323

24+
"github.com/arduino/arduino-app-cli/internal/eventstream"
2425
"github.com/arduino/arduino-app-cli/internal/update"
2526
)
2627

@@ -46,7 +47,7 @@ func TestParseListUpgradableOutput(t *testing.T) {
4647
input: "nano/bionic-updates 2.9.3-2 amd64",
4748
expected: []update.UpgradablePackage{
4849
{
49-
Type: update.Debian,
50+
Type: eventstream.Debian,
5051
Name: "nano",
5152
ToVersion: "2.9.3-2",
5253
FromVersion: "",
@@ -59,7 +60,7 @@ func TestParseListUpgradableOutput(t *testing.T) {
5960
input: "apt/focal-updates 2.0.11 amd64 [upgradable from: 2.0.10]",
6061
expected: []update.UpgradablePackage{
6162
{
62-
Type: update.Debian,
63+
Type: eventstream.Debian,
6364
Name: "apt",
6465
ToVersion: "2.0.11",
6566
FromVersion: "2.0.10",
@@ -77,28 +78,28 @@ containerd.io/focal 1.7.27-1 amd64 [upgradable from: 1.7.25-1]
7778
`,
7879
expected: []update.UpgradablePackage{
7980
{
80-
Type: update.Debian,
81+
Type: eventstream.Debian,
8182
Name: "distro-info-data",
8283
ToVersion: "0.43ubuntu1.18",
8384
FromVersion: "0.43ubuntu1.16",
8485
Architecture: "all",
8586
},
8687
{
87-
Type: update.Debian,
88+
Type: eventstream.Debian,
8889
Name: "apt",
8990
ToVersion: "2.0.11",
9091
FromVersion: "2.0.10",
9192
Architecture: "amd64",
9293
},
9394
{
94-
Type: update.Debian,
95+
Type: eventstream.Debian,
9596
Name: "code",
9697
ToVersion: "1.100.3-1748872405",
9798
FromVersion: "1.100.2-1747260578",
9899
Architecture: "amd64",
99100
},
100101
{
101-
Type: update.Debian,
102+
Type: eventstream.Debian,
102103
Name: "containerd.io",
103104
ToVersion: "1.7.27-1",
104105
FromVersion: "1.7.25-1",

0 commit comments

Comments
 (0)