Skip to content

Commit 2c41fbb

Browse files
Merge pull request #151 from lu1as/add-openstack-server-group-support
2 parents 04e3bd3 + 662c843 commit 2c41fbb

File tree

2 files changed

+82
-9
lines changed

2 files changed

+82
-9
lines changed

drivers/openstack/client.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
1515
compute_ips "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips"
1616
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
17+
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/schedulerhints"
18+
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/servergroups"
1719
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/startstop"
1820
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach"
1921
"github.com/gophercloud/gophercloud/openstack/compute/v2/flavors"
@@ -48,6 +50,7 @@ type Client interface {
4850
GetNetworkID(d *Driver) (string, error)
4951
GetFlavorID(d *Driver) (string, error)
5052
GetImageID(d *Driver) (string, error)
53+
GetServerGroupID(d *Driver) (string, error)
5154
AssignFloatingIP(d *Driver, floatingIP *FloatingIP) error
5255
DeleteFloatingIP(d *Driver, floatingIP *FloatingIP) error
5356
GetFloatingIPs(d *Driver) ([]FloatingIP, error)
@@ -95,6 +98,15 @@ func (c *GenericClient) CreateInstance(d *Driver) (string, error) {
9598
KeyName: d.KeyPairName,
9699
}
97100

101+
if d.ServerGroupId != "" {
102+
serverOpts = &schedulerhints.CreateOptsExt{
103+
CreateOptsBuilder: serverOpts,
104+
SchedulerHints: schedulerhints.SchedulerHints{
105+
Group: d.ServerGroupId,
106+
},
107+
}
108+
}
109+
98110
log.Info("Creating machine...")
99111

100112
var server *servers.Server
@@ -370,6 +382,29 @@ func (c *GenericClient) GetImageID(d *Driver) (string, error) {
370382
return imageID, err
371383
}
372384

385+
func (c *GenericClient) GetServerGroupID(d *Driver) (string, error) {
386+
pager := servergroups.List(c.Compute)
387+
serverGroupID := ""
388+
389+
err := pager.EachPage(func(page pagination.Page) (bool, error) {
390+
serverGroupList, err := servergroups.ExtractServerGroups(page)
391+
if err != nil {
392+
return false, err
393+
}
394+
395+
for _, i := range serverGroupList {
396+
if i.Name == d.ServerGroupName {
397+
serverGroupID = i.ID
398+
return false, nil
399+
}
400+
}
401+
402+
return true, nil
403+
})
404+
405+
return serverGroupID, err
406+
}
407+
373408
func (c *GenericClient) GetPublicKey(keyPairName string) ([]byte, error) {
374409
kp, err := keypairs.Get(c.Compute, keyPairName).Extract()
375410
if err != nil {

drivers/openstack/openstack.go

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ type Driver struct {
5050
FlavorId string
5151
ImageName string
5252
ImageId string
53+
ServerGroupName string
54+
ServerGroupId string
5355
KeyPairName string
5456
NetworkName string
5557
NetworkId string
@@ -223,6 +225,18 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
223225
Usage: "OpenStack image name to use for the instance",
224226
Value: "",
225227
},
228+
mcnflag.StringFlag{
229+
EnvVar: "OS_SERVER_GROUP_ID",
230+
Name: "openstack-server-group-id",
231+
Usage: "OpenStack server group id to use for the instance",
232+
Value: "",
233+
},
234+
mcnflag.StringFlag{
235+
EnvVar: "OS_SERVER_GROUP_NAME",
236+
Name: "openstack-server-group-name",
237+
Usage: "OpenStack server group name to use for the instance",
238+
Value: "",
239+
},
226240
mcnflag.StringFlag{
227241
EnvVar: "OS_KEYPAIR_NAME",
228242
Name: "openstack-keypair-name",
@@ -426,6 +440,8 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
426440
d.FlavorName = flags.String("openstack-flavor-name")
427441
d.ImageId = flags.String("openstack-image-id")
428442
d.ImageName = flags.String("openstack-image-name")
443+
d.ServerGroupId = flags.String("openstack-server-group-id")
444+
d.ServerGroupName = flags.String("openstack-server-group-name")
429445
d.NetworkId = flags.String("openstack-net-id")
430446
d.NetworkName = flags.String("openstack-net-name")
431447
if flags.String("openstack-sec-groups") != "" {
@@ -668,15 +684,16 @@ func (d *Driver) Remove() error {
668684
}
669685

670686
const (
671-
errorMandatoryEnvOrOption string = "%s must be specified either using the environment variable %s or the CLI option %s"
672-
errorMandatoryOption string = "%s must be specified using the CLI option %s"
673-
errorExclusiveOptions string = "Either %s or %s must be specified, not both"
674-
errorBothOptions string = "Both %s and %s must be specified"
675-
errorWrongEndpointType string = "Endpoint type must be 'publicURL', 'adminURL' or 'internalURL'"
676-
errorUnknownFlavorName string = "Unable to find flavor named %s"
677-
errorUnknownImageName string = "Unable to find image named %s"
678-
errorUnknownNetworkName string = "Unable to find network named %s"
679-
errorUnknownTenantName string = "Unable to find tenant named %s"
687+
errorMandatoryEnvOrOption string = "%s must be specified either using the environment variable %s or the CLI option %s"
688+
errorMandatoryOption string = "%s must be specified using the CLI option %s"
689+
errorExclusiveOptions string = "Either %s or %s must be specified, not both"
690+
errorBothOptions string = "Both %s and %s must be specified"
691+
errorWrongEndpointType string = "Endpoint type must be 'publicURL', 'adminURL' or 'internalURL'"
692+
errorUnknownFlavorName string = "Unable to find flavor named %s"
693+
errorUnknownImageName string = "Unable to find image named %s"
694+
errorUnknownServerGroupName string = "Unable to find server group named %s"
695+
errorUnknownNetworkName string = "Unable to find network named %s"
696+
errorUnknownTenantName string = "Unable to find tenant named %s"
680697
)
681698

682699
func (d *Driver) parseAuthConfig() (*gophercloud.AuthOptions, error) {
@@ -801,6 +818,27 @@ func (d *Driver) resolveIds() error {
801818
})
802819
}
803820

821+
if d.ServerGroupName != "" {
822+
if err := d.initCompute(); err != nil {
823+
return err
824+
}
825+
serverGroupId, err := d.client.GetServerGroupID(d)
826+
827+
if err != nil {
828+
return err
829+
}
830+
831+
if serverGroupId == "" {
832+
return fmt.Errorf(errorUnknownServerGroupName, d.ServerGroupName)
833+
}
834+
835+
d.ServerGroupId = serverGroupId
836+
log.Debug("Found server group id using its name", map[string]string{
837+
"Name": d.ServerGroupName,
838+
"ID": d.ServerGroupId,
839+
})
840+
}
841+
804842
if d.FloatingIpPool != "" && !d.ComputeNetwork {
805843
if err := d.initNetwork(); err != nil {
806844
return err

0 commit comments

Comments
 (0)