From 7be4e6adf5d5dd05efca58114c195ab9a707188d Mon Sep 17 00:00:00 2001 From: Aditya <60684641+0x0elliot@users.noreply.github.com> Date: Wed, 12 Nov 2025 02:48:32 +0530 Subject: [PATCH] fix: shuffle swarm network bug where it wasn't getting attached in swarm --- functions/onprem/worker/worker.go | 58 ++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/functions/onprem/worker/worker.go b/functions/onprem/worker/worker.go index 5a858888..c0596a8a 100644 --- a/functions/onprem/worker/worker.go +++ b/functions/onprem/worker/worker.go @@ -3454,7 +3454,6 @@ func deploySwarmService(dockercli *dockerclient.Client, name, image string, depl _ = service if err != nil { - if strings.Contains(fmt.Sprintf("%s", err), "network") && strings.Contains(fmt.Sprintf("%s", err), "not found") { log.Printf("[DEBUG] Network %s not found. Trying to initialize it.", networkName) networkErr := initSwarmNetwork() @@ -3481,6 +3480,63 @@ func deploySwarmService(dockercli *dockerclient.Client, name, image string, depl log.Printf("[DEBUG] Failed deploying %s with image %s: %s", name, image, err) return err + } else { + // wait for service to be ready + time.Sleep(time.Duration(rand.Intn(4)+1) * time.Second) + //log.Printf("[DEBUG] Servicecreate request: %#v %#v", service, err) + // patch service network + // this is an edgecase that we noticed on docker version 29 + // and API version 1.44 + + // get networkID of swarmNetworkName + networkID := "" + + ctx := context.Background() + + // find network ID + networks, err := dockercli.NetworkList(ctx, network.ListOptions{}) + if err == nil { + for _, net := range networks { + if net.Name == networkName { + if net.Scope == "swarm" { + log.Printf("[DEBUG] Found swarm-scoped network: %s (%s)", networkName, net.ID) + networkID = net.ID + } else { + log.Printf("[WARNING] Network %s exists but is not swarm scoped (scope=%s)", networkName, net.Scope) + } + break + } + } + } + + if networkID == "" { + log.Printf("[ERROR] Network %s not found", networkName) + networkID = networkName + } + + services, serr := dockercli.ServiceList(ctx, types.ServiceListOptions{}) + if serr == nil { + for _, svc := range services { + if svc.ID == service.ID { + log.Printf("[DEBUG] Found service %s (%s) — patching network attach", service.ID, svc.ID) + + spec := svc.Spec + spec.TaskTemplate.Networks = append(spec.TaskTemplate.Networks, swarm.NetworkAttachmentConfig{ + Target: networkID, + }) + + _, uerr := dockercli.ServiceUpdate(ctx, svc.ID, svc.Version, spec, types.ServiceUpdateOptions{}) + if uerr != nil { + log.Printf("[WARNING] Failed to patch service %s with network %s: %v", service.ID, networkID, uerr) + } else { + log.Printf("[INFO] Successfully attached network %s to service %s", networkID, service.ID) + } + break + } + } + } else { + log.Printf("[WARNING] Failed to list services for patching network attach: %v", serr) + } } log.Printf("[DEBUG] Successfully deployed service %s with image %s on port %d", name, image, deployport)