diff --git a/provisioner/openstack/config.go b/provisioner/openstack/config.go index 902a8e5..82ea56f 100644 --- a/provisioner/openstack/config.go +++ b/provisioner/openstack/config.go @@ -13,6 +13,8 @@ type Config struct { Image string `json:"openstack-image"` // Machine flavor to use for nodes Flavor string `json:"openstack-flavor"` + // Server group to use for nodes + ServerGroup string `json:"openstack-server-group"` // Networks to attach to nodes Networks []servers.Network `json:"openstack-network,omitempty"` // Security groups to attach to nodes diff --git a/provisioner/openstack/provisioner.go b/provisioner/openstack/provisioner.go index 2107005..9c5c266 100644 --- a/provisioner/openstack/provisioner.go +++ b/provisioner/openstack/provisioner.go @@ -12,6 +12,7 @@ import ( "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs" + "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" "golang.org/x/crypto/ssh" ) @@ -101,8 +102,7 @@ func (p *Provisioner) GetName() string { func (p *Provisioner) Provision(nodeName string) (scheduler.Node, error) { name := fmt.Sprintf("alfred-%s", nodeName) - - server, err := servers.Create(p.client, keypairs.CreateOptsExt{ + var optsBuilder servers.CreateOptsBuilder = keypairs.CreateOptsExt{ CreateOptsBuilder: servers.CreateOpts{ Name: name, ImageRef: p.config.Image, @@ -115,7 +115,17 @@ func (p *Provisioner) Provision(nodeName string) (scheduler.Node, error) { }, }, KeyName: p.keypairName, - }).Extract() + } + if p.config.ServerGroup != "" { + optsBuilder = schedulerhints.CreateOptsExt{ + CreateOptsBuilder: optsBuilder, + SchedulerHints: schedulerhints.SchedulerHints{ + Group: p.config.ServerGroup, + }, + } + } + + server, err := servers.Create(p.client, optsBuilder).Extract() if err != nil { return nil, fmt.Errorf("failed to create server '%s': %w", name, err) } diff --git a/server/flags/flags.go b/server/flags/flags.go index 9357cf2..a191d07 100644 --- a/server/flags/flags.go +++ b/server/flags/flags.go @@ -29,6 +29,7 @@ const ( OpenstackDockerHost = "openstack-docker-host" OpenstackFlavor = "openstack-flavor" + OpenstackServerGroup = "openstack-server-group" OpenstackImage = "openstack-image" OpenstackNetworks = "openstack-networks" OpenstackSecurityGroups = "openstack-security-groups" @@ -55,6 +56,7 @@ func init() { // Openstack flags.String(OpenstackDockerHost, "", "docker host on the nodes") flags.String(OpenstackFlavor, "", "flavor to use for provisioning") + flags.String(OpenstackServerGroup, "", "server group to use for provisioning") flags.String(OpenstackImage, "", "image to use for provisioning") flags.StringSlice(OpenstackNetworks, nil, "networks attached to the nodes") flags.StringSlice(OpenstackSecurityGroups, nil, "security groups defined for the nodes") diff --git a/server/scheduler.go b/server/scheduler.go index 4f2f1ef..8bd9a9f 100644 --- a/server/scheduler.go +++ b/server/scheduler.go @@ -83,9 +83,10 @@ func createProvisioner() (schedulerpkg.Provisioner, error) { case "openstack": config := openstack.Config{ - Logger: logger, - Image: viper.GetString(flags.OpenstackImage), - Flavor: viper.GetString(flags.OpenstackFlavor), + Logger: logger, + Image: viper.GetString(flags.OpenstackImage), + Flavor: viper.GetString(flags.OpenstackFlavor), + ServerGroup: viper.GetString(flags.OpenstackServerGroup), Networks: lo.Map( viper.GetStringSlice(flags.OpenstackNetworks), func(s string, _ int) servers.Network {