Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ubernetes Lite: apply auto-labels to dynamically provisioned volumes #22602

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 12 additions & 2 deletions pkg/volume/aws_ebs/aws_ebs.go
Expand Up @@ -168,7 +168,7 @@ type ebsManager interface {
// Detaches the disk from the kubelet's host machine.
DetachDisk(c *awsElasticBlockStoreCleaner) error
// Creates a volume
CreateVolume(provisioner *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, err error)
CreateVolume(provisioner *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error)
// Deletes a volume
DeleteVolume(deleter *awsElasticBlockStoreDeleter) error
}
Expand Down Expand Up @@ -409,14 +409,24 @@ type awsElasticBlockStoreProvisioner struct {
var _ volume.Provisioner = &awsElasticBlockStoreProvisioner{}

func (c *awsElasticBlockStoreProvisioner) Provision(pv *api.PersistentVolume) error {
volumeID, sizeGB, err := c.manager.CreateVolume(c)
volumeID, sizeGB, labels, err := c.manager.CreateVolume(c)
if err != nil {
return err
}
pv.Spec.PersistentVolumeSource.AWSElasticBlockStore.VolumeID = volumeID
pv.Spec.Capacity = api.ResourceList{
api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
}

if len(labels) != 0 {
if pv.Labels == nil {
pv.Labels = make(map[string]string)
}
for k, v := range labels {
pv.Labels[k] = v
}
}

return nil
}

Expand Down
10 changes: 8 additions & 2 deletions pkg/volume/aws_ebs/aws_ebs_test.go
Expand Up @@ -117,8 +117,10 @@ func (fake *fakePDManager) DetachDisk(c *awsElasticBlockStoreCleaner) error {
return nil
}

func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, err error) {
return "test-aws-volume-name", 100, nil
func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) {
labels = make(map[string]string)
labels["fakepdmanager"] = "yes"
return "test-aws-volume-name", 100, labels, nil
}

func (fake *fakePDManager) DeleteVolume(cd *awsElasticBlockStoreDeleter) error {
Expand Down Expand Up @@ -239,6 +241,10 @@ func TestPlugin(t *testing.T) {
t.Errorf("Provision() returned unexpected volume size: %v", size)
}

if persistentSpec.Labels["fakepdmanager"] != "yes" {
t.Errorf("Provision() returned unexpected labels: %v", persistentSpec.Labels)
}

// Test Deleter
volSpec := &volume.Spec{
PersistentVolume: persistentSpec,
Expand Down
17 changes: 13 additions & 4 deletions pkg/volume/aws_ebs/aws_util.go
Expand Up @@ -126,10 +126,12 @@ func (util *AWSDiskUtil) DeleteVolume(d *awsElasticBlockStoreDeleter) error {
return nil
}

func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, err error) {
// CreateVolume creates an AWS EBS volume.
// Returns: volumeID, volumeSizeGB, labels, error
func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (string, int, map[string]string, error) {
cloud, err := getCloudProvider()
if err != nil {
return "", 0, err
return "", 0, nil, err
}

// AWS volumes don't have Name field, store the name in Name tag
Expand All @@ -152,10 +154,17 @@ func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (volum
name, err := cloud.CreateDisk(volumeOptions)
if err != nil {
glog.V(2).Infof("Error creating EBS Disk volume: %v", err)
return "", 0, err
return "", 0, nil, err
}
glog.V(2).Infof("Successfully created EBS Disk volume %s", name)
return name, int(requestGB), nil

labels, err := cloud.GetVolumeLabels(name)
if err != nil {
// We don't really want to leak the volume here...
glog.Errorf("error building labels for new EBS volume %q: %v", name, err)
}

return name, int(requestGB), labels, nil
}

// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails.
Expand Down
14 changes: 12 additions & 2 deletions pkg/volume/gce_pd/gce_pd.go
Expand Up @@ -168,7 +168,7 @@ type pdManager interface {
// Detaches the disk from the kubelet's host machine.
DetachDisk(c *gcePersistentDiskCleaner) error
// Creates a volume
CreateVolume(provisioner *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, err error)
CreateVolume(provisioner *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error)
// Deletes a volume
DeleteVolume(deleter *gcePersistentDiskDeleter) error
}
Expand Down Expand Up @@ -371,14 +371,24 @@ type gcePersistentDiskProvisioner struct {
var _ volume.Provisioner = &gcePersistentDiskProvisioner{}

func (c *gcePersistentDiskProvisioner) Provision(pv *api.PersistentVolume) error {
volumeID, sizeGB, err := c.manager.CreateVolume(c)
volumeID, sizeGB, labels, err := c.manager.CreateVolume(c)
if err != nil {
return err
}
pv.Spec.PersistentVolumeSource.GCEPersistentDisk.PDName = volumeID
pv.Spec.Capacity = api.ResourceList{
api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
}

if len(labels) != 0 {
if pv.Labels == nil {
pv.Labels = make(map[string]string)
}
for k, v := range labels {
pv.Labels[k] = v
}
}

return nil
}

Expand Down
10 changes: 8 additions & 2 deletions pkg/volume/gce_pd/gce_pd_test.go
Expand Up @@ -113,8 +113,10 @@ func (fake *fakePDManager) DetachDisk(c *gcePersistentDiskCleaner) error {
return nil
}

func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, err error) {
return "test-gce-volume-name", 100, nil
func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) {
labels = make(map[string]string)
labels["fakepdmanager"] = "yes"
return "test-gce-volume-name", 100, labels, nil
}

func (fake *fakePDManager) DeleteVolume(cd *gcePersistentDiskDeleter) error {
Expand Down Expand Up @@ -235,6 +237,10 @@ func TestPlugin(t *testing.T) {
t.Errorf("Provision() returned unexpected volume size: %v", size)
}

if persistentSpec.Labels["fakepdmanager"] != "yes" {
t.Errorf("Provision() returned unexpected labels: %v", persistentSpec.Labels)
}

// Test Deleter
volSpec := &volume.Spec{
PersistentVolume: persistentSpec,
Expand Down
19 changes: 14 additions & 5 deletions pkg/volume/gce_pd/gce_util.go
Expand Up @@ -127,10 +127,12 @@ func (util *GCEDiskUtil) DeleteVolume(d *gcePersistentDiskDeleter) error {
return nil
}

func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, err error) {
// CreateVolume creates a GCE PD.
// Returns: volumeID, volumeSizeGB, labels, error
func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (string, int, map[string]string, error) {
cloud, err := getCloudProvider()
if err != nil {
return "", 0, err
return "", 0, nil, err
}

name := volume.GenerateVolumeName(c.options.ClusterName, c.options.PVName, 63) // GCE PD name can have up to 63 characters
Expand All @@ -143,16 +145,23 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (volum
zone, err := cloud.GetZone()
if err != nil {
glog.V(2).Infof("error getting zone information from GCE: %v", err)
return "", 0, err
return "", 0, nil, err
}

err = cloud.CreateDisk(name, zone.FailureDomain, int64(requestGB), *c.options.CloudTags)
if err != nil {
glog.V(2).Infof("Error creating GCE PD volume: %v", err)
return "", 0, err
return "", 0, nil, err
}
glog.V(2).Infof("Successfully created GCE PD volume %s", name)
return name, int(requestGB), nil

labels, err := cloud.GetAutoLabelsForPD(name)
if err != nil {
// We don't really want to leak the volume here...
glog.Errorf("error getting labels for volume %q: %v", name, err)
}

return name, int(requestGB), labels, nil
}

// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails.
Expand Down