Skip to content

Commit d666ff5

Browse files
committed
feat: Support ECS Managed Daemons
1 parent 54d7eac commit d666ff5

20 files changed

Lines changed: 923 additions & 67 deletions

.github/workflows/publish-image.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
packages: write
2222
steps:
2323
- name: Checkout repository
24-
uses: actions/checkout@v4
24+
uses: actions/checkout@v6
2525

2626
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
2727
- name: Log in to the Container registry

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ jobs:
1515
runs-on: ubuntu-latest
1616
steps:
1717
- name: Checkout code
18-
uses: actions/checkout@v4
18+
uses: actions/checkout@v6
1919
with:
2020
fetch-depth: 0
2121
# - run: git fetch --force --tags
2222
- name: Setup GO
23-
uses: actions/setup-go@v5
23+
uses: actions/setup-go@v6
2424
with:
2525
go-version-file: go.mod
2626
- name: Release

.github/workflows/test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ jobs:
1313
name: Test
1414
runs-on: ubuntu-latest
1515
steps:
16-
- uses: actions/checkout@v4
16+
- uses: actions/checkout@v6
1717

1818
- name: Set up Go
19-
uses: actions/setup-go@v5
19+
uses: actions/setup-go@v6
2020
with:
2121
go-version-file: go.mod
2222

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ go 1.26
55
require (
66
github.com/BurntSushi/toml v1.4.0
77
github.com/atotto/clipboard v0.1.4
8-
github.com/aws/aws-sdk-go-v2 v1.41.7
8+
github.com/aws/aws-sdk-go-v2 v1.42.0
99
github.com/aws/aws-sdk-go-v2/config v1.32.17
1010
github.com/aws/aws-sdk-go-v2/service/account v1.31.0
1111
github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13
1212
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.2
1313
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.71.1
14-
github.com/aws/aws-sdk-go-v2/service/ecs v1.74.0
14+
github.com/aws/aws-sdk-go-v2/service/ecs v1.83.0
1515
github.com/aws/aws-sdk-go-v2/service/ssm v1.68.3
1616
github.com/gdamore/tcell/v2 v2.13.9
1717
github.com/keidarcy/aws-regions/v3 v3.0.0-20260309105808-fbc1ba25ea42
@@ -26,16 +26,16 @@ require (
2626
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect
2727
github.com/aws/aws-sdk-go-v2/credentials v1.19.16 // indirect
2828
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 // indirect
29-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 // indirect
30-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect
30+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect
3131
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 // indirect
3232
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect
3333
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect
3434
github.com/aws/aws-sdk-go-v2/service/signin v1.0.11 // indirect
3535
github.com/aws/aws-sdk-go-v2/service/sso v1.30.17 // indirect
3636
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 // indirect
3737
github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 // indirect
38-
github.com/aws/smithy-go v1.25.1 // indirect
38+
github.com/aws/smithy-go v1.27.1 // indirect
3939
github.com/fsnotify/fsnotify v1.7.0 // indirect
4040
github.com/gdamore/encoding v1.0.1 // indirect
4141
github.com/hashicorp/hcl v1.0.0 // indirect

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0
22
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
33
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
44
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
5-
github.com/aws/aws-sdk-go-v2 v1.41.7 h1:DWpAJt66FmnnaRIOT/8ASTucrvuDPZASqhhLey6tLY8=
6-
github.com/aws/aws-sdk-go-v2 v1.41.7/go.mod h1:4LAfZOPHNVNQEckOACQx60Y8pSRjIkNZQz1w92xpMJc=
5+
github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA=
6+
github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg=
77
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho=
88
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY=
99
github.com/aws/aws-sdk-go-v2/config v1.32.17 h1:FpL4/758/diKwqbytU0prpuiu60fgXKUWCpDJtApclU=
@@ -12,10 +12,10 @@ github.com/aws/aws-sdk-go-v2/credentials v1.19.16 h1:r3RJBuU7X9ibt8RHbMjWE6y60Qb
1212
github.com/aws/aws-sdk-go-v2/credentials v1.19.16/go.mod h1:6cx7zqDENJDbBIIWX6P8s0h6hqHC8Avbjh9Dseo27ug=
1313
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23 h1:UuSfcORqNSz/ey3VPRS8TcVH2Ikf0/sC+Hdj400QI6U=
1414
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.23/go.mod h1:+G/OSGiOFnSOkYloKj/9M35s74LgVAdJBSD5lsFfqKg=
15-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23 h1:GpT/TrnBYuE5gan2cZbTtvP+JlHsutdmlV2YfEyNde0=
16-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.23/go.mod h1:xYWD6BS9ywC5bS3sz9Xh04whO/hzK2plt2Zkyrp4JuA=
17-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23 h1:bpd8vxhlQi2r1hiueOw02f/duEPTMK59Q4QMAoTTtTo=
18-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.23/go.mod h1:15DfR2nw+CRHIk0tqNyifu3G1YdAOy68RftkhMDDwYk=
15+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko=
16+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc=
17+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY=
18+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA=
1919
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24 h1:OQqn11BtaYv1WLUowvcA30MpzIu8Ti4pcLPIIyoKZrA=
2020
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.24/go.mod h1:X5ZJyfwVrWA96GzPmUCWFQaEARPR7gCrpq2E92PJwAE=
2121
github.com/aws/aws-sdk-go-v2/service/account v1.31.0 h1:AdQH4Jtf/2gu8h1lyUpwJmhtW/3ppyj4emi/PThI9Zw=
@@ -26,8 +26,8 @@ github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.2 h1:mleWBVIxwceEzyItUVoqM
2626
github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.2/go.mod h1:cMApt548kNgu87UsBTNWVv+fpzjbUTFRSFjD1688SBs=
2727
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.71.1 h1:p0A8HO2B++3LfOTRxQScOPc3QhFWgyAXQQ6W92RT7Yk=
2828
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.71.1/go.mod h1:MLJu3PUd8fp5Qvj4CiLvyY5H8y7kxHKlTp060Wsd+Vc=
29-
github.com/aws/aws-sdk-go-v2/service/ecs v1.74.0 h1:YS5TXaEvzDb+sV+wdQFUtuCAk0GeFR9Ai6HFdxpz6q8=
30-
github.com/aws/aws-sdk-go-v2/service/ecs v1.74.0/go.mod h1:10kBgdaNJz0FO/+JWDUH+0rtSjkn5yafgavDDmmhFzs=
29+
github.com/aws/aws-sdk-go-v2/service/ecs v1.83.0 h1:LQKIHuVHqdbU9LUt5c2G9f+CcQAzolxQmAch3RTORMc=
30+
github.com/aws/aws-sdk-go-v2/service/ecs v1.83.0/go.mod h1:0vahPCh3slyORHbSuAP8YDyJKLEUQAMX7+bzYGxEnVI=
3131
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA=
3232
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk=
3333
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw=
@@ -42,8 +42,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21 h1:+1Kl1zx6bWi4X7cKi3VYh29
4242
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.21/go.mod h1:4vIRDq+CJB2xFAXZ+YgGUTiEft7oAQlhIs71xcSeuVg=
4343
github.com/aws/aws-sdk-go-v2/service/sts v1.42.1 h1:F/M5Y9I3nwr2IEpshZgh1GeHpOItExNM9L1euNuh/fk=
4444
github.com/aws/aws-sdk-go-v2/service/sts v1.42.1/go.mod h1:mTNxImtovCOEEuD65mKW7DCsL+2gjEH+RPEAexAzAio=
45-
github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI=
46-
github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
45+
github.com/aws/smithy-go v1.27.1 h1:4T340VFndXtADGF52gYa1POyL7s9E4Z1OeZ1hCscIw8=
46+
github.com/aws/smithy-go v1.27.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
4747
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
4848
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4949
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

internal/api/daemon.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package api
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
7+
"github.com/aws/aws-sdk-go-v2/service/ecs"
8+
"github.com/aws/aws-sdk-go-v2/service/ecs/types"
9+
)
10+
11+
// Equivalent to
12+
// aws ecs list-daemons --cluster ${cluster}
13+
func (store *Store) ListDaemons(clusterArn *string) ([]types.DaemonSummary, error) {
14+
limit := int32(100)
15+
params := &ecs.ListDaemonsInput{
16+
ClusterArn: clusterArn,
17+
MaxResults: &limit,
18+
}
19+
20+
results := []types.DaemonSummary{}
21+
22+
for {
23+
output, err := store.ecs.ListDaemons(context.Background(), params)
24+
if err != nil {
25+
slog.Warn("failed to run aws api to list daemons", "error", err)
26+
if len(results) == 0 {
27+
return nil, err
28+
}
29+
break
30+
}
31+
32+
results = append(results, output.DaemonSummariesList...)
33+
34+
if output.NextToken != nil {
35+
params.NextToken = output.NextToken
36+
} else {
37+
break
38+
}
39+
}
40+
41+
return results, nil
42+
}
43+
44+
// Equivalent to
45+
// aws ecs describe-daemon --daemon-arn ${daemonArn}
46+
func (store *Store) DescribeDaemon(daemonArn *string) (*types.DaemonDetail, error) {
47+
output, err := store.ecs.DescribeDaemon(context.Background(), &ecs.DescribeDaemonInput{
48+
DaemonArn: daemonArn,
49+
})
50+
if err != nil {
51+
slog.Warn("failed to run aws api to describe daemon", "error", err)
52+
return nil, err
53+
}
54+
return output.Daemon, nil
55+
}
56+
57+
// Equivalent to
58+
// aws ecs list-daemon-task-definitions --family ${family}
59+
// aws ecs describe-daemon-task-definition --daemon-task-definition ${arn}
60+
func (store *Store) ListDaemonTaskDefinitions(family *string) ([]types.DaemonTaskDefinition, error) {
61+
limit := int32(20)
62+
output, err := store.ecs.ListDaemonTaskDefinitions(context.Background(), &ecs.ListDaemonTaskDefinitionsInput{
63+
Family: family,
64+
MaxResults: &limit,
65+
Sort: types.SortOrderDesc,
66+
})
67+
if err != nil {
68+
slog.Warn("failed to run aws api to list daemon task definitions", "error", err)
69+
return nil, err
70+
}
71+
72+
results := []types.DaemonTaskDefinition{}
73+
for _, summary := range output.DaemonTaskDefinitions {
74+
if summary.Arn == nil {
75+
continue
76+
}
77+
td, err := store.DescribeDaemonTaskDefinition(summary.Arn)
78+
if err != nil {
79+
slog.Warn("failed to describe daemon task definition", "arn", *summary.Arn, "error", err)
80+
continue
81+
}
82+
results = append(results, *td)
83+
}
84+
85+
return results, nil
86+
}
87+
88+
// Equivalent to
89+
// aws ecs describe-daemon-task-definition --daemon-task-definition ${arn}
90+
func (store *Store) DescribeDaemonTaskDefinition(arn *string) (*types.DaemonTaskDefinition, error) {
91+
output, err := store.ecs.DescribeDaemonTaskDefinition(context.Background(), &ecs.DescribeDaemonTaskDefinitionInput{
92+
DaemonTaskDefinition: arn,
93+
})
94+
if err != nil {
95+
slog.Warn("failed to run aws api to describe daemon task definition", "error", err)
96+
return nil, err
97+
}
98+
return output.DaemonTaskDefinition, nil
99+
}
100+
101+
// Equivalent to
102+
// aws ecs describe-daemon-revisions --daemon-revision-arns ${arns}
103+
func (store *Store) DescribeDaemonRevisions(arns []string) ([]types.DaemonRevision, error) {
104+
output, err := store.ecs.DescribeDaemonRevisions(context.Background(), &ecs.DescribeDaemonRevisionsInput{
105+
DaemonRevisionArns: arns,
106+
})
107+
if err != nil {
108+
slog.Warn("failed to run aws api to describe daemon revisions", "error", err)
109+
return nil, err
110+
}
111+
return output.DaemonRevisions, nil
112+
}

internal/view/app.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,22 @@ var globalRegion string
2626

2727
// Entity contains ECS resources to show, use uppercase to make items like app.cluster easy to access
2828
type Entity struct {
29-
cluster *types.Cluster
30-
service *types.Service
31-
task *types.Task
32-
container *types.Container
33-
taskDefinition *types.TaskDefinition
34-
events []types.ServiceEvent
35-
metrics *api.MetricsData
36-
autoScaling *api.AutoScalingData
37-
instance *types.ContainerInstance
38-
serviceDeployment *types.ServiceDeployment
39-
serviceRevision *types.ServiceRevision
40-
profile string
41-
region *api.Region
42-
entityName string
29+
cluster *types.Cluster
30+
service *types.Service
31+
task *types.Task
32+
container *types.Container
33+
taskDefinition *types.TaskDefinition
34+
daemonSummary *types.DaemonSummary
35+
daemonTaskDefinition *types.DaemonTaskDefinition
36+
events []types.ServiceEvent
37+
metrics *api.MetricsData
38+
autoScaling *api.AutoScalingData
39+
instance *types.ContainerInstance
40+
serviceDeployment *types.ServiceDeployment
41+
serviceRevision *types.ServiceRevision
42+
profile string
43+
region *api.Region
44+
entityName string
4345
}
4446

4547
type Option struct {
@@ -287,6 +289,12 @@ func (app *App) getPageHandle() string {
287289
switch app.kind {
288290
case ServiceKind:
289291
name = *app.cluster.ClusterArn
292+
case DaemonKind:
293+
name = *app.cluster.ClusterArn
294+
case DaemonTaskDefinitionKind:
295+
if app.daemonSummary != nil && app.daemonSummary.DaemonArn != nil {
296+
name = *app.daemonSummary.DaemonArn
297+
}
290298
case TaskKind, TaskDefinitionKind, ServiceDeploymentKind:
291299
name = *app.service.ServiceArn
292300
case ContainerKind:
@@ -347,7 +355,7 @@ func (app *App) start() error {
347355
// Show Primary kind page
348356
func (app *App) showPrimaryKindPage(k kind, reload bool) error {
349357
var err error
350-
if k == TaskDefinitionKind {
358+
if k == TaskDefinitionKind || k == DaemonTaskDefinitionKind {
351359
app.backKind = app.kind
352360
}
353361
app.kind = k
@@ -364,6 +372,10 @@ func (app *App) showPrimaryKindPage(k kind, reload bool) error {
364372
err = app.showContainersPage(reload)
365373
case TaskDefinitionKind:
366374
err = app.showTaskDefinitionPage(reload)
375+
case DaemonKind:
376+
err = app.showDaemonsPage(reload)
377+
case DaemonTaskDefinitionKind:
378+
err = app.showDaemonTaskDefinitionPage(reload)
367379
case ServiceDeploymentKind:
368380
err = app.showServiceDeploymentPage(reload)
369381
default:

internal/view/cluster.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,22 @@ import (
1313

1414
type clusterView struct {
1515
view
16-
clusters []types.Cluster
16+
clusters []types.Cluster
17+
daemonCounts map[string]int
1718
}
1819

19-
func newClusterView(clusters []types.Cluster, app *App) *clusterView {
20+
func newClusterView(clusters []types.Cluster, daemonCounts map[string]int, app *App) *clusterView {
2021
keys := append(basicKeyInputs, []keyDescriptionPair{
2122
hotKeyMap["n"],
2223
hotKeyMap["N"],
24+
hotKeyMap["M"],
2325
}...)
2426
return &clusterView{
2527
view: *newView(app, keys, secondaryPageKeyMap{
2628
DescriptionKind: describePageKeys,
2729
}),
28-
clusters: clusters,
30+
clusters: clusters,
31+
daemonCounts: daemonCounts,
2932
}
3033
}
3134

@@ -44,7 +47,14 @@ func (app *App) showClustersPage(reload bool) error {
4447
resources, err = app.Store.ListClusters()
4548
}
4649
err = buildResourcePage(resources, app, err, func() resourceViewBuilder {
47-
return newClusterView(resources, app)
50+
daemonCounts := make(map[string]int)
51+
for _, c := range resources {
52+
daemons, dErr := app.Store.ListDaemons(c.ClusterArn)
53+
if dErr == nil {
54+
daemonCounts[*c.ClusterArn] = len(daemons)
55+
}
56+
}
57+
return newClusterView(resources, daemonCounts, app)
4858
})
4959
return err
5060
}
@@ -141,6 +151,7 @@ func (v *clusterView) tableParamsBuilder() (title string, headers []string, rows
141151
"Name",
142152
"Status",
143153
"Services",
154+
"Daemons",
144155
"Tasks",
145156
"Container instances",
146157
"Capacity providers",
@@ -151,10 +162,13 @@ func (v *clusterView) tableParamsBuilder() (title string, headers []string, rows
151162
// calculate tasks
152163
tasks := fmt.Sprintf(color.TableClusterTasksFmt, c.PendingTasksCount, c.RunningTasksCount)
153164

165+
daemonCount := v.daemonCounts[*c.ClusterArn]
166+
154167
row := []string{}
155168
row = append(row, utils.ShowString(c.ClusterName))
156169
row = append(row, utils.ShowGreenGrey(c.Status, "active"))
157170
row = append(row, utils.ShowInt(&c.ActiveServicesCount))
171+
row = append(row, strconv.Itoa(daemonCount))
158172
row = append(row, tasks)
159173
row = append(row, utils.ShowInt(&c.RegisteredContainerInstancesCount)+" EC2")
160174
row = append(row, utils.ShowArray(c.CapacityProviders))

internal/view/cluster_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ func getClusterViews() []clusterView {
4545
cluster2.ActiveServicesCount = *clusterServices2
4646

4747
app, _ := newApp(Option{})
48-
clusterView1 := newClusterView([]types.Cluster{cluster1}, app)
49-
clusterView2 := newClusterView([]types.Cluster{cluster2}, app)
48+
clusterView1 := newClusterView([]types.Cluster{cluster1}, map[string]int{}, app)
49+
clusterView2 := newClusterView([]types.Cluster{cluster2}, map[string]int{}, app)
5050

5151
return []clusterView{*clusterView1, *clusterView2}
5252
}

0 commit comments

Comments
 (0)