feat(master): show built-from-source services but never update them (#7)

This commit is contained in:
2026-10-12 19:30:38 +02:00
parent c3bd4ca1ed
commit 3d3dfb47e6
8 changed files with 33 additions and 6 deletions
@@ -1,5 +1,6 @@
ALTER TABLE services ADD COLUMN config_files text NOT NULL DEFAULT '';
ALTER TABLE services ADD COLUMN desired_ref text NOT NULL DEFAULT '';
ALTER TABLE services ADD COLUMN built boolean NOT NULL DEFAULT false;
CREATE TABLE update_jobs (
id bigserial PRIMARY KEY,
+6 -5
View File
@@ -40,13 +40,14 @@ func lockActiveAgent(ctx context.Context, tx pgx.Tx, agentID int64) error {
const upsertServiceSQL = `
INSERT INTO services (
kind, location_key, agent_id, compose_project, compose_service, working_dir, config_files,
swarm_cluster_id, swarm_service, container_name, image_repo, actual_ref, actual_digest,
built, swarm_cluster_id, swarm_service, container_name, image_repo, actual_ref, actual_digest,
status, self, first_seen_at, updated_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $16)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $17)
ON CONFLICT (location_key) DO UPDATE SET
agent_id = EXCLUDED.agent_id,
working_dir = EXCLUDED.working_dir,
config_files = EXCLUDED.config_files,
built = EXCLUDED.built,
image_repo = EXCLUDED.image_repo,
actual_ref = EXCLUDED.actual_ref,
actual_digest = EXCLUDED.actual_digest,
@@ -62,7 +63,7 @@ func upsertService(ctx context.Context, db execer, agentID int64, clusterID stri
}
_, err := db.Exec(ctx, upsertServiceSQL,
string(svc.Kind), model.LocationKey(agentID, clusterID, svc.Key()), agentID,
svc.ComposeProject, svc.ComposeService, svc.WorkingDir, svc.ConfigFiles,
svc.ComposeProject, svc.ComposeService, svc.WorkingDir, svc.ConfigFiles, svc.Built,
clusterCol, svc.SwarmService, svc.ContainerName,
imageref.Parse(svc.Image).Repo, svc.Image, svc.Digest,
svc.Status, svc.Self, at)
@@ -146,7 +147,7 @@ func (s *Store) RemoveService(ctx context.Context, agentID int64, clusterID, age
}
const serviceColumns = `s.id, s.kind, s.location_key, s.agent_id, COALESCE(a.name, ''),
s.compose_project, s.compose_service, s.working_dir, s.config_files, s.swarm_cluster_id,
s.compose_project, s.compose_service, s.working_dir, s.config_files, s.built, s.swarm_cluster_id,
s.swarm_service, s.container_name, s.image_repo, s.desired_ref, s.actual_ref, s.actual_digest,
s.status, s.self, s.update_mode, s.first_seen_at, s.updated_at, s.removed_at`
@@ -154,7 +155,7 @@ func scanService(row pgx.Row) (model.Service, error) {
var m model.Service
var kind string
err := row.Scan(&m.ID, &kind, &m.LocationKey, &m.AgentID, &m.AgentName,
&m.ComposeProject, &m.ComposeService, &m.WorkingDir, &m.ConfigFiles, &m.SwarmClusterID,
&m.ComposeProject, &m.ComposeService, &m.WorkingDir, &m.ConfigFiles, &m.Built, &m.SwarmClusterID,
&m.SwarmService, &m.ContainerName, &m.ImageRepo, &m.DesiredRef, &m.ActualRef, &m.ActualDigest,
&m.Status, &m.Self, &m.UpdateMode, &m.FirstSeenAt, &m.UpdatedAt, &m.RemovedAt)
m.Kind = protocol.Kind(kind)
@@ -193,3 +193,23 @@ func TestApplySnapshot_StoresConfigFiles(t *testing.T) {
require.Len(t, got, 1)
assert.Equal(t, withFiles.ConfigFiles, got[0].ConfigFiles)
}
func TestApplySnapshot_StoresBuilt(t *testing.T) {
s := openTestStore(t)
ctx := context.Background()
id := newAgent(t, s, "node-2")
built := slusk
built.Built = true
require.NoError(t, s.ApplySnapshot(ctx, id, worker, []protocol.Service{built}, t0))
got, err := s.ListServices(ctx)
require.NoError(t, err)
require.Len(t, got, 1)
assert.True(t, got[0].Built)
// A later report without the flag clears it.
require.NoError(t, s.UpsertService(ctx, id, "", slusk, t0.Add(time.Minute)))
got, err = s.ListServices(ctx)
require.NoError(t, err)
assert.False(t, got[0].Built)
}