fix: shuffle swarm network bug where it wasn't getting attached in swarm
This commit is contained in:
@@ -3454,7 +3454,6 @@ func deploySwarmService(dockercli *dockerclient.Client, name, image string, depl
|
|||||||
_ = service
|
_ = service
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
if strings.Contains(fmt.Sprintf("%s", err), "network") && strings.Contains(fmt.Sprintf("%s", err), "not found") {
|
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)
|
log.Printf("[DEBUG] Network %s not found. Trying to initialize it.", networkName)
|
||||||
networkErr := initSwarmNetwork()
|
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)
|
log.Printf("[DEBUG] Failed deploying %s with image %s: %s", name, image, err)
|
||||||
return 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)
|
log.Printf("[DEBUG] Successfully deployed service %s with image %s on port %d", name, image, deployport)
|
||||||
|
|||||||
Reference in New Issue
Block a user