Skip to content

Commit 20837ef

Browse files
authored
Merge pull request #3 from arshamalh/rm-rename-conts-imgs
Remove and Rename functionality for Images and Containers
2 parents d94170e + 2d36845 commit 20837ef

28 files changed

+903
-274
lines changed

.env.example

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TOKEN="telgram-bot-token"

.gitignore

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
11
.env
2-
log.json
2+
.github
3+
.vscode/
4+
vendor
5+
log
6+
/.idea/
7+

api/api.go

-30
This file was deleted.

cmd/start.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"os"
55
"time"
66

7-
"github.com/arshamalh/dockeroller/contracts"
87
"github.com/arshamalh/dockeroller/docker"
98
"github.com/arshamalh/dockeroller/log"
109
"github.com/arshamalh/dockeroller/repo/ephemeral"
@@ -53,7 +52,7 @@ func start(token string, whitelistedIDs []int64) {
5352
startTelegram(docker, token, whitelistedIDs)
5453
}
5554

56-
func startTelegram(docker contracts.Docker, token string, whitelistedIDs []int64) {
55+
func startTelegram(docker docker.Docker, token string, whitelistedIDs []int64) {
5756
bot, err := telebot.NewBot(telebot.Settings{
5857
Token: token,
5958
Poller: &telebot.LongPoller{Timeout: 10 * time.Second},

contracts/docker.go

-18
This file was deleted.

docker/containers.go

+11
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,14 @@ func (d *docker) ContainerStart(containerID string) error {
5858
func (d *docker) ContainerStop(containerID string) error {
5959
return d.cli.ContainerStop(context.TODO(), containerID, nil)
6060
}
61+
62+
func (d *docker) ContainerRemove(containerID string, removeForm *models.ContainerRemoveForm) error {
63+
return d.cli.ContainerRemove(context.TODO(), containerID, types.ContainerRemoveOptions{
64+
RemoveVolumes: removeForm.RemoveVolumes,
65+
Force: removeForm.Force,
66+
})
67+
}
68+
69+
func (d *docker) ContainerRename(containerID, newName string) error {
70+
return d.cli.ContainerRename(context.TODO(), containerID, newName)
71+
}

docker/docker.go

+19
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11
package docker
22

33
import (
4+
"context"
5+
"io"
6+
47
"github.com/arshamalh/dockeroller/log"
8+
"github.com/arshamalh/dockeroller/models"
59
"github.com/moby/moby/client"
610
)
711

12+
type Docker interface {
13+
GetContainer(containerID string) (*models.Container, error)
14+
ContainersList() []*models.Container
15+
ContainerLogs(containerID string) (io.ReadCloser, error)
16+
ContainerStats(containerID string) (io.ReadCloser, error)
17+
ContainerStart(containerID string) error
18+
ContainerStop(containerID string) error
19+
ContainerRemove(containerID string, removeForm *models.ContainerRemoveForm) error
20+
ContainerRename(containerID, newName string) error
21+
22+
ImagesList() []*models.Image
23+
ImageTag(ctx context.Context, imageID, newTag string) error
24+
ImageRemove(ctx context.Context, imageID string, force, pruneChildren bool) error
25+
}
26+
827
func New() *docker {
928
cli, err := client.NewClientWithOpts(client.FromEnv)
1029
if err != nil {

docker/images.go

+49-5
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,63 @@ package docker
22

33
import (
44
"context"
5+
"fmt"
6+
"time"
57

68
"github.com/arshamalh/dockeroller/models"
79
"github.com/docker/docker/api/types"
810
)
911

10-
func (d docker) ImagesList() (images []*models.Image) {
12+
func (d *docker) ImagesList() (images []*models.Image) {
1113
raw_images, _ := d.cli.ImageList(context.TODO(), types.ImageListOptions{All: true})
12-
for _, rimg := range raw_images {
14+
for _, raw_img := range raw_images {
15+
status := d.getImageStatus(context.TODO(), raw_img)
1316
images = append(images, &models.Image{
14-
ID: rimg.ID,
15-
Size: rimg.Size,
16-
Tags: rimg.RepoTags,
17+
ID: raw_img.ID,
18+
Size: raw_img.Size,
19+
Tags: raw_img.RepoTags,
20+
Status: models.ImageStatus(status),
21+
CreatedAt: fmt.Sprint(time.Unix(raw_img.Created, 0).Format("2006-01-02 15:04:05")),
1722
})
1823
}
1924
return
2025
}
26+
27+
func (d *docker) ImageTag(ctx context.Context, imageID, newTag string) error {
28+
return d.cli.ImageTag(ctx, imageID, newTag)
29+
}
30+
31+
func (d *docker) ImageRemove(ctx context.Context, imageID string, force, pruneChildren bool) error {
32+
_, err := d.cli.ImageRemove(ctx, imageID,
33+
types.ImageRemoveOptions{
34+
Force: force,
35+
PruneChildren: pruneChildren,
36+
},
37+
)
38+
return err
39+
}
40+
41+
func (d *docker) getImageStatus(ctx context.Context, image types.ImageSummary) (status string) {
42+
if len(image.RepoTags) == 0 {
43+
status = string(models.ImageStatusUnUsedDangling)
44+
}
45+
46+
containers, _ := d.cli.ContainerList(ctx, types.ContainerListOptions{})
47+
newImgs := make(map[string][]string)
48+
for _, cont := range containers {
49+
if cont.ImageID != image.ID {
50+
status = string(models.ImageStatusUnUsed)
51+
} else {
52+
newSlice := newImgs[image.ID]
53+
if newSlice == nil {
54+
newSlice = make([]string, 0)
55+
}
56+
newSlice = append(newSlice, cont.ID)
57+
newImgs[image.ID] = newSlice
58+
59+
status = string(models.ImageStatusInUse)
60+
}
61+
}
62+
63+
return
64+
}

go.mod

+5-18
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,20 @@ require (
99
)
1010

1111
require (
12-
github.com/gin-contrib/sse v0.1.0 // indirect
13-
github.com/go-playground/locales v0.14.0 // indirect
14-
github.com/go-playground/universal-translator v0.18.0 // indirect
15-
github.com/go-playground/validator/v10 v10.10.0 // indirect
16-
github.com/goccy/go-json v0.9.7 // indirect
1712
github.com/inconshreveable/mousetrap v1.1.0 // indirect
18-
github.com/json-iterator/go v1.1.12 // indirect
19-
github.com/leodido/go-urn v1.2.1 // indirect
20-
github.com/mattn/go-isatty v0.0.14 // indirect
21-
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
22-
github.com/modern-go/reflect2 v1.0.2 // indirect
23-
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
13+
github.com/moby/term v0.5.0 // indirect
14+
github.com/morikuni/aec v1.0.0 // indirect
2415
github.com/spf13/pflag v1.0.5 // indirect
25-
github.com/ugorji/go/codec v1.2.7 // indirect
2616
go.uber.org/multierr v1.10.0 // indirect
27-
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
28-
golang.org/x/text v0.3.6 // indirect
29-
google.golang.org/protobuf v1.28.0 // indirect
30-
gopkg.in/yaml.v2 v2.4.0 // indirect
17+
golang.org/x/time v0.4.0 // indirect
18+
gotest.tools/v3 v3.5.1 // indirect
3119
)
3220

3321
require (
3422
github.com/Microsoft/go-winio v0.5.2 // indirect
3523
github.com/docker/distribution v2.8.1+incompatible // indirect
3624
github.com/docker/go-connections v0.4.0 // indirect
3725
github.com/docker/go-units v0.4.0 // indirect
38-
github.com/gin-gonic/gin v1.8.1
3926
github.com/gogo/protobuf v1.3.2 // indirect
4027
github.com/moby/moby v20.10.18+incompatible
4128
github.com/opencontainers/go-digest v1.0.0 // indirect
@@ -45,5 +32,5 @@ require (
4532
github.com/spf13/cobra v1.7.0
4633
go.uber.org/zap v1.26.0
4734
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
48-
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
35+
golang.org/x/sys v0.1.0 // indirect
4936
)

0 commit comments

Comments
 (0)