Skip to content

Commit f693dcc

Browse files
committed
feat(join secrets and services views)
1 parent 78ba524 commit f693dcc

9 files changed

Lines changed: 689 additions & 32 deletions

File tree

internal/dao/docker.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,10 @@ func (d *DockerClient) RemoveSecret(id string) error {
314314
return d.Secret.Remove(id)
315315
}
316316

317+
func (d *DockerClient) CreateSecret(name string, data []byte) error {
318+
return d.Secret.Create(name, data)
319+
}
320+
317321
func (d *DockerClient) StopComposeProject(projectName string) error {
318322
return d.Compose.Stop(projectName)
319323
}
@@ -367,6 +371,34 @@ func (d *DockerClient) GetServiceSecrets(id string) ([]*swarm.SecretReference, e
367371
return d.Service.GetSecrets(id)
368372
}
369373

374+
func (d *DockerClient) SetServiceSecrets(id string, secretRefs []*swarm.SecretReference) error {
375+
return d.Service.SetSecrets(id, secretRefs)
376+
}
377+
378+
379+
func (d *DockerClient) ListServicesForSecret(secretID string) ([]common.Resource, error) {
380+
services, err := d.Service.List()
381+
if err != nil {
382+
return nil, err
383+
}
384+
385+
var filtered []common.Resource
386+
for _, svc := range services {
387+
// Check if this service uses the secret
388+
secrets, err := d.Service.GetSecrets(svc.GetID())
389+
if err == nil {
390+
for _, s := range secrets {
391+
if s.SecretID == secretID {
392+
filtered = append(filtered, svc)
393+
break
394+
}
395+
}
396+
}
397+
}
398+
399+
return filtered, nil
400+
}
401+
370402
func (d *DockerClient) GetComposeLogs(projectName string, since string, tail string, timestamps bool) (io.ReadCloser, error) {
371403
return d.Compose.Logs(projectName, since, tail, timestamps)
372404
}

internal/dao/docker/secret/secret.go

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ package secret
22

33
import (
44
"context"
5+
"fmt"
56
"strings"
67

78
"github.com/docker/docker/api/types"
9+
"github.com/docker/docker/api/types/swarm"
810
"github.com/docker/docker/client"
911
"github.com/gdamore/tcell/v2"
1012
"github.com/jr-k/d4s/internal/dao/common"
@@ -22,11 +24,12 @@ func NewManager(cli *client.Client, ctx context.Context) *Manager {
2224

2325
// Secret Model
2426
type Secret struct {
25-
ID string
26-
Name string
27-
Created string
28-
Updated string
29-
Labels string
27+
ID string
28+
Name string
29+
Services int
30+
Created string
31+
Updated string
32+
Labels string
3033
}
3134

3235
func (s Secret) GetID() string { return s.ID }
@@ -35,7 +38,8 @@ func (s Secret) GetCells() []string {
3538
if len(id) > 12 {
3639
id = id[:12]
3740
}
38-
return []string{id, s.Name, s.Created, s.Updated, s.Labels}
41+
servicesStr := fmt.Sprintf("%d", s.Services)
42+
return []string{id, s.Name, servicesStr, s.Created, s.Updated, s.Labels}
3943
}
4044

4145
func (s Secret) GetStatusColor() (tcell.Color, tcell.Color) {
@@ -48,6 +52,8 @@ func (s Secret) GetColumnValue(column string) string {
4852
return s.ID
4953
case "name":
5054
return s.Name
55+
case "services":
56+
return fmt.Sprintf("%d", s.Services)
5157
case "created":
5258
return s.Created
5359
case "updated":
@@ -72,16 +78,30 @@ func (m *Manager) List() ([]common.Resource, error) {
7278
return nil, err
7379
}
7480

81+
// Count services per secret
82+
counts := make(map[string]int)
83+
services, err := m.cli.ServiceList(m.ctx, types.ServiceListOptions{})
84+
if err == nil {
85+
for _, svc := range services {
86+
if svc.Spec.TaskTemplate.ContainerSpec != nil {
87+
for _, secretRef := range svc.Spec.TaskTemplate.ContainerSpec.Secrets {
88+
counts[secretRef.SecretID]++
89+
}
90+
}
91+
}
92+
}
93+
7594
var res []common.Resource
7695
for _, s := range list {
7796
labels := formatLabels(s.Spec.Labels)
7897

7998
res = append(res, Secret{
80-
ID: s.ID,
81-
Name: s.Spec.Name,
82-
Created: common.FormatTime(s.CreatedAt.Unix()),
83-
Updated: common.FormatTime(s.UpdatedAt.Unix()),
84-
Labels: labels,
99+
ID: s.ID,
100+
Name: s.Spec.Name,
101+
Services: counts[s.ID],
102+
Created: common.FormatTime(s.CreatedAt.Unix()),
103+
Updated: common.FormatTime(s.UpdatedAt.Unix()),
104+
Labels: labels,
85105
})
86106
}
87107
return res, nil
@@ -91,6 +111,16 @@ func (m *Manager) Remove(id string) error {
91111
return m.cli.SecretRemove(m.ctx, id)
92112
}
93113

114+
func (m *Manager) Create(name string, data []byte) error {
115+
_, err := m.cli.SecretCreate(m.ctx, swarm.SecretSpec{
116+
Annotations: swarm.Annotations{
117+
Name: name,
118+
},
119+
Data: data,
120+
})
121+
return err
122+
}
123+
94124
func formatLabels(labels map[string]string) string {
95125
if len(labels) == 0 {
96126
return "-"

internal/dao/swarm/service/service.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,3 +239,19 @@ func (m *Manager) GetSecrets(id string) ([]*swarm.SecretReference, error) {
239239

240240
return service.Spec.TaskTemplate.ContainerSpec.Secrets, nil
241241
}
242+
243+
func (m *Manager) SetSecrets(id string, secretRefs []*swarm.SecretReference) error {
244+
service, _, err := m.cli.ServiceInspectWithRaw(m.ctx, id, swarm.ServiceInspectOptions{})
245+
if err != nil {
246+
return err
247+
}
248+
249+
if service.Spec.TaskTemplate.ContainerSpec == nil {
250+
return fmt.Errorf("service has no container spec")
251+
}
252+
253+
service.Spec.TaskTemplate.ContainerSpec.Secrets = secretRefs
254+
255+
_, err = m.cli.ServiceUpdate(m.ctx, id, service.Version, service.Spec, swarm.ServiceUpdateOptions{})
256+
return err
257+
}

0 commit comments

Comments
 (0)