From b79d4a69e6cdbd8152759744d7baf13bf4438e76 Mon Sep 17 00:00:00 2001 From: Sergio Cazzolato Date: Tue, 3 Feb 2026 16:39:19 -0300 Subject: [PATCH 1/2] Make availability zone optional in openstack To increase the chances of finding available hosts in openstack when requestin a new server, IS recomended to make it optional, so openstack will try in all the available AZ to create the server (when the location is not specified), otherwise Openstack tries just in that AZ. --- spread/openstack.go | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/spread/openstack.go b/spread/openstack.go index 97c17fca..fd1fda08 100644 --- a/spread/openstack.go +++ b/spread/openstack.go @@ -312,18 +312,6 @@ func (p *openstackProvider) findImage(imageName string) (*glance.ImageDetail, er return nil, &FatalError{fmt.Errorf("cannot find matching image for %q", imageName)} } -func (p *openstackProvider) findAvailabilityZone() (*nova.AvailabilityZone, error) { - zones, err := p.computeClient.ListAvailabilityZones() - if err != nil { - return nil, fmt.Errorf("cannot retrieve availability zones: %v", &openstackError{err}) - } - - if len(zones) == 0 { - return nil, &FatalError{errors.New("cannot find any availability zones")} - } - return &zones[0], nil -} - func (p *openstackProvider) findSecurityGroupNames(names []string) ([]nova.SecurityGroupName, error) { var secGroupNames []nova.SecurityGroupName @@ -577,11 +565,6 @@ func (p *openstackProvider) createMachine(ctx context.Context, system *System) ( return nil, err } - availabilityZone, err := p.findAvailabilityZone() - if err != nil { - return nil, err - } - // cloud init script cloudconfig := fmt.Sprintf(openstackCloudInitScript, p.options.Password) @@ -594,13 +577,12 @@ func (p *openstackProvider) createMachine(ctx context.Context, system *System) ( } opts := nova.RunServerOpts{ - Name: name, - FlavorId: flavor.Id, - ImageId: image.Id, - AvailabilityZone: availabilityZone.Name, - Networks: networks, - Metadata: tags, - UserData: []byte(cloudconfig), + Name: name, + FlavorId: flavor.Id, + ImageId: image.Id, + Networks: networks, + Metadata: tags, + UserData: []byte(cloudconfig), } if len(system.Groups) > 0 { @@ -611,6 +593,10 @@ func (p *openstackProvider) createMachine(ctx context.Context, system *System) ( opts.SecurityGroupNames = sgNames } + if len(p.backend.Location) > 0 { + opts.AvailabilityZone = p.backend.Location + } + server, err := p.computeClient.RunServer(opts) if err != nil { return nil, fmt.Errorf("cannot create instance: %v", &openstackError{err}) From 1b07e2d95204ca16809d4ce1910e689d29d2cc3d Mon Sep 17 00:00:00 2001 From: Sergio Cazzolato Date: Wed, 4 Feb 2026 12:07:04 -0300 Subject: [PATCH 2/2] Use Backend.Zone to identify the Openstack AZ --- spread/openstack.go | 4 ++-- spread/project.go | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/spread/openstack.go b/spread/openstack.go index fd1fda08..cfaa2ca1 100644 --- a/spread/openstack.go +++ b/spread/openstack.go @@ -593,8 +593,8 @@ func (p *openstackProvider) createMachine(ctx context.Context, system *System) ( opts.SecurityGroupNames = sgNames } - if len(p.backend.Location) > 0 { - opts.AvailabilityZone = p.backend.Location + if p.backend.Zone != "" { + opts.AvailabilityZone = p.backend.Zone } server, err := p.computeClient.RunServer(opts) diff --git a/spread/project.go b/spread/project.go index 2c9d01b1..a2802361 100644 --- a/spread/project.go +++ b/spread/project.go @@ -69,6 +69,7 @@ type Backend struct { Endpoint string Networks []string Groups []string + Zone string Systems SystemsMap