Skip to content

Commit 4ad0143

Browse files
committed
refactor(deployment): reorganize container management functions for improved modularity
1 parent ce524f3 commit 4ad0143

File tree

3 files changed

+95
-96
lines changed

3 files changed

+95
-96
lines changed

pkg/deployment/container.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"regexp"
88
"strings"
99
"time"
10+
"unicode"
1011

1112
"github.com/yarlson/ftl/pkg/config"
1213
)
@@ -125,3 +126,96 @@ func (d *Deployment) performHealthChecks(container string, healthCheck *config.H
125126

126127
return fmt.Errorf("container failed to become healthy\n\x1b[93mOutput from the container:\x1b[0m\n%s", grayOutput)
127128
}
129+
130+
func (d *Deployment) startContainer(service *config.Service) error {
131+
_, err := d.runCommand(context.Background(), "docker", "start", service.Name)
132+
if err != nil {
133+
return fmt.Errorf("failed to start container for %s: %v", service.Name, err)
134+
}
135+
136+
return nil
137+
}
138+
139+
func (d *Deployment) createContainer(project string, service *config.Service, suffix string) error {
140+
svcName := service.Name
141+
142+
args := []string{"run", "-d", "--name", svcName + suffix, "--network", project, "--network-alias", svcName + suffix, "--restart", "unless-stopped"}
143+
144+
for _, value := range service.Env {
145+
args = append(args, "-e", value)
146+
}
147+
148+
for _, volume := range service.Volumes {
149+
if unicode.IsLetter(rune(volume[0])) {
150+
volume = fmt.Sprintf("%s-%s", project, volume)
151+
}
152+
args = append(args, "-v", volume)
153+
}
154+
155+
if service.HealthCheck != nil {
156+
args = append(args, "--health-cmd", fmt.Sprintf("curl -sf http://localhost:%d%s || exit 1", service.Port, service.HealthCheck.Path))
157+
args = append(args, "--health-interval", fmt.Sprintf("%ds", int(service.HealthCheck.Interval.Seconds())))
158+
args = append(args, "--health-retries", fmt.Sprintf("%d", service.HealthCheck.Retries))
159+
args = append(args, "--health-timeout", fmt.Sprintf("%ds", int(service.HealthCheck.Timeout.Seconds())))
160+
}
161+
162+
for _, port := range service.LocalPorts {
163+
args = append(args, "-p", fmt.Sprintf("127.0.0.1:%d:%d", port, port))
164+
}
165+
166+
if len(service.Forwards) > 0 {
167+
for _, forward := range service.Forwards {
168+
args = append(args, "-p", forward)
169+
}
170+
}
171+
172+
hash, err := service.Hash()
173+
if err != nil {
174+
return fmt.Errorf("failed to generate config hash: %w", err)
175+
}
176+
args = append(args, "--label", fmt.Sprintf("ftl.config-hash=%s", hash))
177+
178+
if len(service.Entrypoint) > 0 {
179+
args = append(args, "--entrypoint", strings.Join(service.Entrypoint, " "))
180+
}
181+
182+
image := service.Image
183+
if image == "" {
184+
image = fmt.Sprintf("%s-%s", project, service.Name)
185+
}
186+
args = append(args, image)
187+
188+
if service.Command != "" {
189+
args = append(args, service.Command)
190+
}
191+
192+
_, err = d.runCommand(context.Background(), "docker", args...)
193+
return err
194+
}
195+
196+
func (d *Deployment) containerShouldBeUpdated(project string, service *config.Service) (bool, error) {
197+
containerInfo, err := d.getContainerInfo(project, service.Name)
198+
if err != nil {
199+
return false, fmt.Errorf("failed to get container info: %w", err)
200+
}
201+
202+
imageHash, err := d.getImageHash(service.Image)
203+
if err != nil {
204+
return false, fmt.Errorf("failed to get image hash: %w", err)
205+
}
206+
207+
if service.Image == "" && service.ImageUpdated {
208+
return true, nil
209+
}
210+
211+
if service.Image != "" && containerInfo.Image != imageHash {
212+
return true, nil
213+
}
214+
215+
hash, err := service.Hash()
216+
if err != nil {
217+
return false, fmt.Errorf("failed to generate config hash: %w", err)
218+
}
219+
220+
return containerInfo.Config.Labels["ftl.config-hash"] != hash, nil
221+
}

pkg/deployment/image.go

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,30 +51,3 @@ func (d *Deployment) getImageHash(imageName string) (string, error) {
5151

5252
return strings.TrimSpace(output), nil
5353
}
54-
55-
func (d *Deployment) containerShouldBeUpdated(project string, service *config.Service) (bool, error) {
56-
containerInfo, err := d.getContainerInfo(project, service.Name)
57-
if err != nil {
58-
return false, fmt.Errorf("failed to get container info: %w", err)
59-
}
60-
61-
imageHash, err := d.getImageHash(service.Image)
62-
if err != nil {
63-
return false, fmt.Errorf("failed to get image hash: %w", err)
64-
}
65-
66-
if service.Image == "" && service.ImageUpdated {
67-
return true, nil
68-
}
69-
70-
if service.Image != "" && containerInfo.Image != imageHash {
71-
return true, nil
72-
}
73-
74-
hash, err := service.Hash()
75-
if err != nil {
76-
return false, fmt.Errorf("failed to generate config hash: %w", err)
77-
}
78-
79-
return containerInfo.Config.Labels["ftl.config-hash"] != hash, nil
80-
}

pkg/deployment/service.go

Lines changed: 1 addition & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@ package deployment
33
import (
44
"context"
55
"fmt"
6+
"github.com/yarlson/ftl/pkg/config"
67
"strings"
78
"sync"
89
"time"
9-
"unicode"
10-
11-
"github.com/yarlson/ftl/pkg/config"
1210
)
1311

1412
func (d *Deployment) deployServices(ctx context.Context, project string, services []config.Service) error {
@@ -163,72 +161,6 @@ func (d *Deployment) recreateService(project string, service *config.Service) er
163161
return nil
164162
}
165163

166-
func (d *Deployment) startContainer(service *config.Service) error {
167-
_, err := d.runCommand(context.Background(), "docker", "start", service.Name)
168-
if err != nil {
169-
return fmt.Errorf("failed to start container for %s: %v", service.Name, err)
170-
}
171-
172-
return nil
173-
}
174-
175-
func (d *Deployment) createContainer(project string, service *config.Service, suffix string) error {
176-
svcName := service.Name
177-
178-
args := []string{"run", "-d", "--name", svcName + suffix, "--network", project, "--network-alias", svcName + suffix, "--restart", "unless-stopped"}
179-
180-
for _, value := range service.Env {
181-
args = append(args, "-e", value)
182-
}
183-
184-
for _, volume := range service.Volumes {
185-
if unicode.IsLetter(rune(volume[0])) {
186-
volume = fmt.Sprintf("%s-%s", project, volume)
187-
}
188-
args = append(args, "-v", volume)
189-
}
190-
191-
if service.HealthCheck != nil {
192-
args = append(args, "--health-cmd", fmt.Sprintf("curl -sf http://localhost:%d%s || exit 1", service.Port, service.HealthCheck.Path))
193-
args = append(args, "--health-interval", fmt.Sprintf("%ds", int(service.HealthCheck.Interval.Seconds())))
194-
args = append(args, "--health-retries", fmt.Sprintf("%d", service.HealthCheck.Retries))
195-
args = append(args, "--health-timeout", fmt.Sprintf("%ds", int(service.HealthCheck.Timeout.Seconds())))
196-
}
197-
198-
for _, port := range service.LocalPorts {
199-
args = append(args, "-p", fmt.Sprintf("127.0.0.1:%d:%d", port, port))
200-
}
201-
202-
if len(service.Forwards) > 0 {
203-
for _, forward := range service.Forwards {
204-
args = append(args, "-p", forward)
205-
}
206-
}
207-
208-
hash, err := service.Hash()
209-
if err != nil {
210-
return fmt.Errorf("failed to generate config hash: %w", err)
211-
}
212-
args = append(args, "--label", fmt.Sprintf("ftl.config-hash=%s", hash))
213-
214-
if len(service.Entrypoint) > 0 {
215-
args = append(args, "--entrypoint", strings.Join(service.Entrypoint, " "))
216-
}
217-
218-
image := service.Image
219-
if image == "" {
220-
image = fmt.Sprintf("%s-%s", project, service.Name)
221-
}
222-
args = append(args, image)
223-
224-
if service.Command != "" {
225-
args = append(args, service.Command)
226-
}
227-
228-
_, err = d.runCommand(context.Background(), "docker", args...)
229-
return err
230-
}
231-
232164
func (d *Deployment) switchTraffic(project, service string) (string, error) {
233165
newContainer := service + newContainerSuffix
234166
oldContainer, err := d.getContainerID(project, service)

0 commit comments

Comments
 (0)