dotnet / Docker.DotNet

:whale: .NET (C#) Client Library for Docker API
https://www.nuget.org/packages/Docker.DotNet/
MIT License
2.23k stars 381 forks source link

Swarm.CreateServiceAsync doesn't return "Version" which means unable to do an UpdateServiceAsync afterwards #675

Open dazinator opened 5 months ago

dazinator commented 5 months ago

When creating a swarm service

        var createService = new ServiceCreateParameters
        {
            Service = serviceSpec
        };

        var response = await client.Swarm.CreateServiceAsync(createService);

The response does not contain the "Version.Index". The version index (this is sometimes represented as a long and other times a ulong in this library) is required in order to call UpdateServiceAsync - if you don't specify it you can get exceptions back about the update being out of sequence.

To workaround this, after creating the service, I have to do an intermediary ListServicesAsync to fetch it again, because that API does return a Version.

 var listServiceResult = await client.Swarm.ListServicesAsync(new ServicesListParameters()
        {
            Filters = new ServiceFilter()
            {
                Name = new string[]
                {
                    testServiceName
                }
            }
        });
var results = listServiceResult.ToList();
var service = results.Single();

Then I can do


  var updatePlacementConstraintResponse = await client.Swarm.UpdateServiceAsync(testServiceName, new ServiceUpdateParameters()
                {
                    Version = (long)service.Version.Index,
                    Service = serviceSpec,
                });

Note: I have to cast from ulong to long - ideally these types could be aligned?

You may wonder why I am doing a create then an immediate update. I am writing a test to check that I can update a service and it has the intended behaviour. At the start of the test I need to create the service first as a test subject. In normal application usage I don't envisage I'd want to create then immediately update a service.