Make interface optional like aws api.

This commit is contained in:
Jan Mußler 2021-01-08 18:46:00 +01:00
parent d4b5e6a781
commit bff8b09c42
3 changed files with 34 additions and 6 deletions

View File

@ -63,9 +63,16 @@ func (c *Cluster) syncVolumes() error {
func (c *Cluster) syncUnderlyingEBSVolume() error { func (c *Cluster) syncUnderlyingEBSVolume() error {
c.logger.Infof("starting to sync EBS volume: type, iops, throughput and size") c.logger.Infof("starting to sync EBS volume: type, iops, throughput and size")
var err error
targetValue := c.Spec.Volume targetValue := c.Spec.Volume
newSize, err := resource.ParseQuantity(targetValue.Size)
targetSize := quantityToGigabyte(newSize)
awsGp3 := aws.String("gp3") awsGp3 := aws.String("gp3")
awsIo2 := aws.String("io2")
errors := []string{}
for _, volume := range c.EBSVolumes { for _, volume := range c.EBSVolumes {
var modifyIops *int64 var modifyIops *int64
@ -85,9 +92,17 @@ func (c *Cluster) syncUnderlyingEBSVolume() error {
} }
} }
if targetSize > volume.Size {
modifySize = &targetSize
}
if modifyIops != nil || modifyThroughput != nil || modifySize != nil { if modifyIops != nil || modifyThroughput != nil || modifySize != nil {
if modifyThroughput != nil || modifyIops != nil { if modifyThroughput != nil || modifyIops != nil {
// we default to gp3 if iops and throughput are configured
modifyType = awsGp3 modifyType = awsGp3
if targetValue.VolumeType == "io2" {
modifyType = awsIo2
}
} else if targetValue.VolumeType == "gp3" && volume.VolumeType != "gp3" { } else if targetValue.VolumeType == "gp3" && volume.VolumeType != "gp3" {
modifyType = awsGp3 modifyType = awsGp3
} else { } else {
@ -95,10 +110,20 @@ func (c *Cluster) syncUnderlyingEBSVolume() error {
modifyType = nil modifyType = nil
} }
err = c.VolumeResizer.ModifyVolume(volume.VolumeID, modifyType, volume.Size, 3000, 125) err = c.VolumeResizer.ModifyVolume(volume.VolumeID, modifyType, &volume.Size, modifyIops, modifyThroughput)
if err != nil {
errors = append(errors, fmt.Sprintf("modify volume failed: volume=%s size=%d iops=%d throughput=%d", volume.VolumeID, volume.Size, volume.Iops, volume.Throughput))
}
}
}
if len(errors) > 0 {
for _, s := range errors {
c.logger.Warningf(s)
} }
// c.logger.Errorf("failed to modify %d of %d volumes", len(c.EBSVolumes), len(errors))
} }
return nil
} }
func (c *Cluster) populateVolumeMetaData() error { func (c *Cluster) populateVolumeMetaData() error {
@ -446,10 +471,13 @@ func (c *Cluster) executeEBSMigration() error {
return err return err
} }
var i3000 int64 = 3000
var i125 int64 = 125
for _, volume := range awsVolumes { for _, volume := range awsVolumes {
if volume.VolumeType == "gp2" && volume.Size < c.OpConfig.EnableEBSGp3MigrationMaxSize { if volume.VolumeType == "gp2" && volume.Size < c.OpConfig.EnableEBSGp3MigrationMaxSize {
c.logger.Infof("modifying EBS volume %s to type gp3 migration (%d)", volume.VolumeID, volume.Size) c.logger.Infof("modifying EBS volume %s to type gp3 migration (%d)", volume.VolumeID, volume.Size)
err = c.VolumeResizer.ModifyVolume(volume.VolumeID, "gp3", volume.Size, 3000, 125) err = c.VolumeResizer.ModifyVolume(volume.VolumeID, aws.String("gp3"), &volume.Size, &i3000, &i125)
if nil != err { if nil != err {
c.logger.Warningf("modifying volume %s failed: %v", volume.VolumeID, err) c.logger.Warningf("modifying volume %s failed: %v", volume.VolumeID, err)
} }

View File

@ -141,7 +141,7 @@ func (r *EBSVolumeResizer) ResizeVolume(volumeID string, newSize int64) error {
} }
// ModifyVolume Modify EBS volume // ModifyVolume Modify EBS volume
func (r *EBSVolumeResizer) ModifyVolume(volumeID string, newType string, newSize int64, iops int64, throughput int64) error { func (r *EBSVolumeResizer) ModifyVolume(volumeID string, newType *string, newSize *int64, iops *int64, throughput *int64) error {
/* first check if the volume is already of a requested size */ /* first check if the volume is already of a requested size */
volumeOutput, err := r.connection.DescribeVolumes(&ec2.DescribeVolumesInput{VolumeIds: []*string{&volumeID}}) volumeOutput, err := r.connection.DescribeVolumes(&ec2.DescribeVolumesInput{VolumeIds: []*string{&volumeID}})
if err != nil { if err != nil {
@ -152,7 +152,7 @@ func (r *EBSVolumeResizer) ModifyVolume(volumeID string, newType string, newSize
return fmt.Errorf("describe volume %q returned information about a non-matching volume %q", volumeID, *vol.VolumeId) return fmt.Errorf("describe volume %q returned information about a non-matching volume %q", volumeID, *vol.VolumeId)
} }
input := ec2.ModifyVolumeInput{Size: &newSize, VolumeId: &volumeID, VolumeType: &newType, Iops: &iops, Throughput: &throughput} input := ec2.ModifyVolumeInput{Size: newSize, VolumeId: &volumeID, VolumeType: newType, Iops: iops, Throughput: throughput}
output, err := r.connection.ModifyVolume(&input) output, err := r.connection.ModifyVolume(&input)
if err != nil { if err != nil {
return fmt.Errorf("could not modify persistent volume: %v", err) return fmt.Errorf("could not modify persistent volume: %v", err)

View File

@ -21,7 +21,7 @@ type VolumeResizer interface {
GetProviderVolumeID(pv *v1.PersistentVolume) (string, error) GetProviderVolumeID(pv *v1.PersistentVolume) (string, error)
ExtractVolumeID(volumeID string) (string, error) ExtractVolumeID(volumeID string) (string, error)
ResizeVolume(providerVolumeID string, newSize int64) error ResizeVolume(providerVolumeID string, newSize int64) error
ModifyVolume(providerVolumeID string, newType string, newSize int64, iops int64, throughput int64) error ModifyVolume(providerVolumeID string, newType *string, newSize *int64, iops *int64, throughput *int64) error
DisconnectFromProvider() error DisconnectFromProvider() error
DescribeVolumes(providerVolumesID []string) ([]VolumeProperties, error) DescribeVolumes(providerVolumesID []string) ([]VolumeProperties, error)
} }