mirror of https://github.com/kubernetes/kops.git
Merge pull request #9746 from spotinst/feat-launchspec-itypes
Spotinst: Support for Instance Types in Ocean Launch Spec
This commit is contained in:
commit
847273b1b6
|
|
@ -157,6 +157,7 @@ metadata:
|
||||||
| `spotinst.io/ocean-default-launchspec` | Specify whether to use the InstanceGroup's spec as the default Launch Spec for the Ocean cluster. | none |
|
| `spotinst.io/ocean-default-launchspec` | Specify whether to use the InstanceGroup's spec as the default Launch Spec for the Ocean cluster. | none |
|
||||||
| `spotinst.io/ocean-instance-types-whitelist` | Specify whether to whitelist specific instance types. | none |
|
| `spotinst.io/ocean-instance-types-whitelist` | Specify whether to whitelist specific instance types. | none |
|
||||||
| `spotinst.io/ocean-instance-types-blacklist` | Specify whether to blacklist specific instance types. | none |
|
| `spotinst.io/ocean-instance-types-blacklist` | Specify whether to blacklist specific instance types. | none |
|
||||||
|
| `spotinst.io/ocean-instance-types` | Specify a list of instance types that should be used by the Ocean Launch Spec. | none |
|
||||||
| `spotinst.io/autoscaler-disabled` | Specify whether the auto scaler should be disabled. | `false` |
|
| `spotinst.io/autoscaler-disabled` | Specify whether the auto scaler should be disabled. | `false` |
|
||||||
| `spotinst.io/autoscaler-default-node-labels` | Specify whether default node labels should be set for the auto scaler. | `false` |
|
| `spotinst.io/autoscaler-default-node-labels` | Specify whether default node labels should be set for the auto scaler. | `false` |
|
||||||
| `spotinst.io/autoscaler-headroom-cpu-per-unit` | Specify the number of CPUs to allocate for headroom. CPUs are denoted in millicores, where 1000 millicores = 1 vCPU. | none |
|
| `spotinst.io/autoscaler-headroom-cpu-per-unit` | Specify the number of CPUs to allocate for headroom. CPUs are denoted in millicores, where 1000 millicores = 1 vCPU. | none |
|
||||||
|
|
|
||||||
2
go.mod
2
go.mod
|
|
@ -93,7 +93,7 @@ require (
|
||||||
github.com/spf13/cobra v0.0.7
|
github.com/spf13/cobra v0.0.7
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/spf13/viper v1.4.0
|
github.com/spf13/viper v1.4.0
|
||||||
github.com/spotinst/spotinst-sdk-go v1.56.0
|
github.com/spotinst/spotinst-sdk-go v1.58.0
|
||||||
github.com/stretchr/testify v1.5.1
|
github.com/stretchr/testify v1.5.1
|
||||||
github.com/urfave/cli v1.20.0
|
github.com/urfave/cli v1.20.0
|
||||||
github.com/weaveworks/mesh v0.0.0-20170419100114-1f158d31de55
|
github.com/weaveworks/mesh v0.0.0-20170419100114-1f158d31de55
|
||||||
|
|
|
||||||
4
go.sum
4
go.sum
|
|
@ -794,8 +794,8 @@ github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
|
||||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
|
github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
|
||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
github.com/spotinst/spotinst-sdk-go v1.56.0 h1:w7OnAWXWPxvOvqjYv4i0kN70KWGTNcyoNB72suIA30g=
|
github.com/spotinst/spotinst-sdk-go v1.58.0 h1:h7617CMlfHL3W+CMlhs883kVy3MPdGML/Z4+mW+ddgc=
|
||||||
github.com/spotinst/spotinst-sdk-go v1.56.0/go.mod h1:nWi2DyjUi1WUZclpsqZFXvImsU0T39ppqqHwC4/T5mw=
|
github.com/spotinst/spotinst-sdk-go v1.58.0/go.mod h1:nWi2DyjUi1WUZclpsqZFXvImsU0T39ppqqHwC4/T5mw=
|
||||||
github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
|
github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,7 @@ const (
|
||||||
// specific instance types.
|
// specific instance types.
|
||||||
InstanceGroupLabelOceanInstanceTypesWhitelist = "spotinst.io/ocean-instance-types-whitelist"
|
InstanceGroupLabelOceanInstanceTypesWhitelist = "spotinst.io/ocean-instance-types-whitelist"
|
||||||
InstanceGroupLabelOceanInstanceTypesBlacklist = "spotinst.io/ocean-instance-types-blacklist"
|
InstanceGroupLabelOceanInstanceTypesBlacklist = "spotinst.io/ocean-instance-types-blacklist"
|
||||||
|
InstanceGroupLabelOceanInstanceTypes = "spotinst.io/ocean-instance-types" // launchspec
|
||||||
|
|
||||||
// InstanceGroupLabelAutoScalerDisabled is the metadata label used on the
|
// InstanceGroupLabelAutoScalerDisabled is the metadata label used on the
|
||||||
// instance group to specify whether the auto scaler should be enabled.
|
// instance group to specify whether the auto scaler should be enabled.
|
||||||
|
|
@ -509,6 +510,17 @@ func (b *InstanceGroupModelBuilder) buildLaunchSpec(c *fi.ModelBuilderContext,
|
||||||
Ocean: ocean, // link to Ocean
|
Ocean: ocean, // link to Ocean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instance types.
|
||||||
|
for k, v := range ig.ObjectMeta.Labels {
|
||||||
|
switch k {
|
||||||
|
case InstanceGroupLabelOceanInstanceTypesWhitelist, InstanceGroupLabelOceanInstanceTypes:
|
||||||
|
launchSpec.InstanceTypes, err = parseStringSlice(v)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Capacity.
|
// Capacity.
|
||||||
minSize, maxSize := b.buildCapacity(ig)
|
minSize, maxSize := b.buildCapacity(ig)
|
||||||
ocean.MinSize = fi.Int64(fi.Int64Value(ocean.MinSize) + fi.Int64Value(minSize))
|
ocean.MinSize = fi.Int64(fi.Int64Value(ocean.MinSize) + fi.Int64Value(minSize))
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ type LaunchSpec struct {
|
||||||
Subnets []*awstasks.Subnet
|
Subnets []*awstasks.Subnet
|
||||||
IAMInstanceProfile *awstasks.IAMInstanceProfile
|
IAMInstanceProfile *awstasks.IAMInstanceProfile
|
||||||
ImageID *string
|
ImageID *string
|
||||||
|
InstanceTypes []string
|
||||||
Tags map[string]string
|
Tags map[string]string
|
||||||
RootVolumeOpts *RootVolumeOpts
|
RootVolumeOpts *RootVolumeOpts
|
||||||
AutoScalerOpts *AutoScalerOpts
|
AutoScalerOpts *AutoScalerOpts
|
||||||
|
|
@ -207,6 +208,13 @@ func (o *LaunchSpec) Find(c *fi.Context) (*LaunchSpec, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instance types.
|
||||||
|
{
|
||||||
|
if itypes := spec.InstanceTypes; itypes != nil {
|
||||||
|
actual.InstanceTypes = itypes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Tags.
|
// Tags.
|
||||||
{
|
{
|
||||||
if len(spec.Tags) > 0 {
|
if len(spec.Tags) > 0 {
|
||||||
|
|
@ -376,6 +384,13 @@ func (_ *LaunchSpec) create(cloud awsup.AWSCloud, a, e, changes *LaunchSpec) err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instance types.
|
||||||
|
{
|
||||||
|
if e.InstanceTypes != nil {
|
||||||
|
spec.SetInstanceTypes(e.InstanceTypes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Tags.
|
// Tags.
|
||||||
{
|
{
|
||||||
if e.Tags != nil {
|
if e.Tags != nil {
|
||||||
|
|
@ -545,6 +560,15 @@ func (_ *LaunchSpec) update(cloud awsup.AWSCloud, a, e, changes *LaunchSpec) err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Instance types.
|
||||||
|
{
|
||||||
|
if changes.InstanceTypes != nil {
|
||||||
|
spec.SetInstanceTypes(e.InstanceTypes)
|
||||||
|
changes.InstanceTypes = nil
|
||||||
|
changed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Tags.
|
// Tags.
|
||||||
{
|
{
|
||||||
if changes.Tags != nil {
|
if changes.Tags != nil {
|
||||||
|
|
@ -647,6 +671,7 @@ type terraformLaunchSpec struct {
|
||||||
UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"`
|
UserData *terraform.Literal `json:"user_data,omitempty" cty:"user_data"`
|
||||||
IAMInstanceProfile *terraform.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"`
|
IAMInstanceProfile *terraform.Literal `json:"iam_instance_profile,omitempty" cty:"iam_instance_profile"`
|
||||||
KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"`
|
KeyName *terraform.Literal `json:"key_name,omitempty" cty:"key_name"`
|
||||||
|
InstanceTypes []string `json:"instance_types,omitempty" cty:"instance_types"`
|
||||||
SubnetIDs []*terraform.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"`
|
SubnetIDs []*terraform.Literal `json:"subnet_ids,omitempty" cty:"subnet_ids"`
|
||||||
SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"`
|
SecurityGroups []*terraform.Literal `json:"security_groups,omitempty" cty:"security_groups"`
|
||||||
Taints []*corev1.Taint `json:"taints,omitempty" cty:"taints"`
|
Taints []*corev1.Taint `json:"taints,omitempty" cty:"taints"`
|
||||||
|
|
@ -659,8 +684,9 @@ func (_ *LaunchSpec) RenderTerraform(t *terraform.TerraformTarget, a, e, changes
|
||||||
cloud := t.Cloud.(awsup.AWSCloud)
|
cloud := t.Cloud.(awsup.AWSCloud)
|
||||||
|
|
||||||
tf := &terraformLaunchSpec{
|
tf := &terraformLaunchSpec{
|
||||||
Name: e.Name,
|
Name: e.Name,
|
||||||
OceanID: e.Ocean.TerraformLink(),
|
OceanID: e.Ocean.TerraformLink(),
|
||||||
|
InstanceTypes: e.InstanceTypes,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Image.
|
// Image.
|
||||||
|
|
|
||||||
26
vendor/github.com/spotinst/spotinst-sdk-go/service/elastigroup/providers/aws/aws.go
generated
vendored
26
vendor/github.com/spotinst/spotinst-sdk-go/service/elastigroup/providers/aws/aws.go
generated
vendored
|
|
@ -356,6 +356,7 @@ type Route53Integration struct {
|
||||||
type Domain struct {
|
type Domain struct {
|
||||||
HostedZoneID *string `json:"hostedZoneId,omitempty"`
|
HostedZoneID *string `json:"hostedZoneId,omitempty"`
|
||||||
SpotinstAccountID *string `json:"spotinstAccountId,omitempty"`
|
SpotinstAccountID *string `json:"spotinstAccountId,omitempty"`
|
||||||
|
RecordSetType *string `json:"recordSetType,omitempty"`
|
||||||
RecordSets []*RecordSet `json:"recordSets,omitempty"`
|
RecordSets []*RecordSet `json:"recordSets,omitempty"`
|
||||||
|
|
||||||
forceSendFields []string
|
forceSendFields []string
|
||||||
|
|
@ -363,8 +364,9 @@ type Domain struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type RecordSet struct {
|
type RecordSet struct {
|
||||||
UsePublicIP *bool `json:"usePublicIp,omitempty"`
|
Name *string `json:"name,omitempty"`
|
||||||
Name *string `json:"name,omitempty"`
|
UsePublicIP *bool `json:"usePublicIp,omitempty"`
|
||||||
|
UsePublicDNS *bool `json:"usePublicDns,omitempty"`
|
||||||
|
|
||||||
forceSendFields []string
|
forceSendFields []string
|
||||||
nullFields []string
|
nullFields []string
|
||||||
|
|
@ -2083,6 +2085,13 @@ func (o *Domain) SetSpotinstAccountID(v *string) *Domain {
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *Domain) SetRecordSetType(v *string) *Domain {
|
||||||
|
if o.RecordSetType = v; o.RecordSetType == nil {
|
||||||
|
o.nullFields = append(o.nullFields, "RecordSetType")
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
func (o *Domain) SetRecordSets(v []*RecordSet) *Domain {
|
func (o *Domain) SetRecordSets(v []*RecordSet) *Domain {
|
||||||
if o.RecordSets = v; o.RecordSets == nil {
|
if o.RecordSets = v; o.RecordSets == nil {
|
||||||
o.nullFields = append(o.nullFields, "RecordSets")
|
o.nullFields = append(o.nullFields, "RecordSets")
|
||||||
|
|
@ -2100,6 +2109,13 @@ func (o RecordSet) MarshalJSON() ([]byte, error) {
|
||||||
return jsonutil.MarshalJSON(raw, o.forceSendFields, o.nullFields)
|
return jsonutil.MarshalJSON(raw, o.forceSendFields, o.nullFields)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *RecordSet) SetName(v *string) *RecordSet {
|
||||||
|
if o.Name = v; o.Name == nil {
|
||||||
|
o.nullFields = append(o.nullFields, "Name")
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
func (o *RecordSet) SetUsePublicIP(v *bool) *RecordSet {
|
func (o *RecordSet) SetUsePublicIP(v *bool) *RecordSet {
|
||||||
if o.UsePublicIP = v; o.UsePublicIP == nil {
|
if o.UsePublicIP = v; o.UsePublicIP == nil {
|
||||||
o.nullFields = append(o.nullFields, "UsePublicIP")
|
o.nullFields = append(o.nullFields, "UsePublicIP")
|
||||||
|
|
@ -2107,9 +2123,9 @@ func (o *RecordSet) SetUsePublicIP(v *bool) *RecordSet {
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *RecordSet) SetName(v *string) *RecordSet {
|
func (o *RecordSet) SetUsePublicDNS(v *bool) *RecordSet {
|
||||||
if o.Name = v; o.Name == nil {
|
if o.UsePublicDNS = v; o.UsePublicDNS == nil {
|
||||||
o.nullFields = append(o.nullFields, "Name")
|
o.nullFields = append(o.nullFields, "UsePublicDNS")
|
||||||
}
|
}
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ type LaunchSpec struct {
|
||||||
RootVolumeSize *int `json:"rootVolumeSize,omitempty"`
|
RootVolumeSize *int `json:"rootVolumeSize,omitempty"`
|
||||||
SecurityGroupIDs []string `json:"securityGroupIds,omitempty"`
|
SecurityGroupIDs []string `json:"securityGroupIds,omitempty"`
|
||||||
SubnetIDs []string `json:"subnetIds,omitempty"`
|
SubnetIDs []string `json:"subnetIds,omitempty"`
|
||||||
|
InstanceTypes []string `json:"instanceTypes,omitempty"`
|
||||||
ResourceLimits *ResourceLimits `json:"resourceLimits,omitempty"`
|
ResourceLimits *ResourceLimits `json:"resourceLimits,omitempty"`
|
||||||
IAMInstanceProfile *IAMInstanceProfile `json:"iamInstanceProfile,omitempty"`
|
IAMInstanceProfile *IAMInstanceProfile `json:"iamInstanceProfile,omitempty"`
|
||||||
AutoScale *AutoScale `json:"autoScale,omitempty"`
|
AutoScale *AutoScale `json:"autoScale,omitempty"`
|
||||||
|
|
@ -397,6 +398,13 @@ func (o *LaunchSpec) SetSubnetIDs(v []string) *LaunchSpec {
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *LaunchSpec) SetInstanceTypes(v []string) *LaunchSpec {
|
||||||
|
if o.InstanceTypes = v; o.InstanceTypes == nil {
|
||||||
|
o.nullFields = append(o.nullFields, "InstanceTypes")
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
func (o *LaunchSpec) SetRootVolumeSize(v *int) *LaunchSpec {
|
func (o *LaunchSpec) SetRootVolumeSize(v *int) *LaunchSpec {
|
||||||
if o.RootVolumeSize = v; o.RootVolumeSize == nil {
|
if o.RootVolumeSize = v; o.RootVolumeSize == nil {
|
||||||
o.nullFields = append(o.nullFields, "RootVolumeSize")
|
o.nullFields = append(o.nullFields, "RootVolumeSize")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package spotinst
|
package spotinst
|
||||||
|
|
||||||
// SDKVersion is the current version of the SDK.
|
// SDKVersion is the current version of the SDK.
|
||||||
const SDKVersion = "1.56.0"
|
const SDKVersion = "1.58.0"
|
||||||
|
|
||||||
// SDKName is the name of the SDK.
|
// SDKName is the name of the SDK.
|
||||||
const SDKName = "spotinst-sdk-go"
|
const SDKName = "spotinst-sdk-go"
|
||||||
|
|
|
||||||
|
|
@ -516,7 +516,7 @@ github.com/spf13/pflag
|
||||||
# github.com/spf13/viper v1.4.0
|
# github.com/spf13/viper v1.4.0
|
||||||
## explicit
|
## explicit
|
||||||
github.com/spf13/viper
|
github.com/spf13/viper
|
||||||
# github.com/spotinst/spotinst-sdk-go v1.56.0
|
# github.com/spotinst/spotinst-sdk-go v1.58.0
|
||||||
## explicit
|
## explicit
|
||||||
github.com/spotinst/spotinst-sdk-go/service/elastigroup
|
github.com/spotinst/spotinst-sdk-go/service/elastigroup
|
||||||
github.com/spotinst/spotinst-sdk-go/service/elastigroup/providers/aws
|
github.com/spotinst/spotinst-sdk-go/service/elastigroup/providers/aws
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue