mirror of https://github.com/k3s-io/k3s
parent
791c694c21
commit
c771bf43c4
|
@ -168,7 +168,7 @@ type ebsManager interface {
|
||||||
// Detaches the disk from the kubelet's host machine.
|
// Detaches the disk from the kubelet's host machine.
|
||||||
DetachDisk(c *awsElasticBlockStoreCleaner) error
|
DetachDisk(c *awsElasticBlockStoreCleaner) error
|
||||||
// Creates a volume
|
// 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
|
// Deletes a volume
|
||||||
DeleteVolume(deleter *awsElasticBlockStoreDeleter) error
|
DeleteVolume(deleter *awsElasticBlockStoreDeleter) error
|
||||||
}
|
}
|
||||||
|
@ -409,7 +409,7 @@ type awsElasticBlockStoreProvisioner struct {
|
||||||
var _ volume.Provisioner = &awsElasticBlockStoreProvisioner{}
|
var _ volume.Provisioner = &awsElasticBlockStoreProvisioner{}
|
||||||
|
|
||||||
func (c *awsElasticBlockStoreProvisioner) Provision(pv *api.PersistentVolume) error {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -417,6 +417,16 @@ func (c *awsElasticBlockStoreProvisioner) Provision(pv *api.PersistentVolume) er
|
||||||
pv.Spec.Capacity = api.ResourceList{
|
pv.Spec.Capacity = api.ResourceList{
|
||||||
api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,8 +117,10 @@ func (fake *fakePDManager) DetachDisk(c *awsElasticBlockStoreCleaner) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, err error) {
|
func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) {
|
||||||
return "test-aws-volume-name", 100, nil
|
labels = make(map[string]string)
|
||||||
|
labels["fakepdmanager"] = "yes"
|
||||||
|
return "test-aws-volume-name", 100, labels, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *fakePDManager) DeleteVolume(cd *awsElasticBlockStoreDeleter) error {
|
func (fake *fakePDManager) DeleteVolume(cd *awsElasticBlockStoreDeleter) error {
|
||||||
|
@ -239,6 +241,10 @@ func TestPlugin(t *testing.T) {
|
||||||
t.Errorf("Provision() returned unexpected volume size: %v", size)
|
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
|
// Test Deleter
|
||||||
volSpec := &volume.Spec{
|
volSpec := &volume.Spec{
|
||||||
PersistentVolume: persistentSpec,
|
PersistentVolume: persistentSpec,
|
||||||
|
|
|
@ -126,10 +126,12 @@ func (util *AWSDiskUtil) DeleteVolume(d *awsElasticBlockStoreDeleter) error {
|
||||||
return nil
|
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()
|
cloud, err := getCloudProvider()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", 0, err
|
return "", 0, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// AWS volumes don't have Name field, store the name in Name tag
|
// AWS volumes don't have Name field, store the name in Name tag
|
||||||
|
@ -152,10 +154,17 @@ func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (volum
|
||||||
name, err := cloud.CreateDisk(volumeOptions)
|
name, err := cloud.CreateDisk(volumeOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(2).Infof("Error creating EBS Disk volume: %v", err)
|
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)
|
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.
|
// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails.
|
||||||
|
|
|
@ -168,7 +168,7 @@ type pdManager interface {
|
||||||
// Detaches the disk from the kubelet's host machine.
|
// Detaches the disk from the kubelet's host machine.
|
||||||
DetachDisk(c *gcePersistentDiskCleaner) error
|
DetachDisk(c *gcePersistentDiskCleaner) error
|
||||||
// Creates a volume
|
// 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
|
// Deletes a volume
|
||||||
DeleteVolume(deleter *gcePersistentDiskDeleter) error
|
DeleteVolume(deleter *gcePersistentDiskDeleter) error
|
||||||
}
|
}
|
||||||
|
@ -371,7 +371,7 @@ type gcePersistentDiskProvisioner struct {
|
||||||
var _ volume.Provisioner = &gcePersistentDiskProvisioner{}
|
var _ volume.Provisioner = &gcePersistentDiskProvisioner{}
|
||||||
|
|
||||||
func (c *gcePersistentDiskProvisioner) Provision(pv *api.PersistentVolume) error {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -379,6 +379,16 @@ func (c *gcePersistentDiskProvisioner) Provision(pv *api.PersistentVolume) error
|
||||||
pv.Spec.Capacity = api.ResourceList{
|
pv.Spec.Capacity = api.ResourceList{
|
||||||
api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,10 @@ func (fake *fakePDManager) DetachDisk(c *gcePersistentDiskCleaner) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, err error) {
|
func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) {
|
||||||
return "test-gce-volume-name", 100, nil
|
labels = make(map[string]string)
|
||||||
|
labels["fakepdmanager"] = "yes"
|
||||||
|
return "test-gce-volume-name", 100, labels, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fake *fakePDManager) DeleteVolume(cd *gcePersistentDiskDeleter) error {
|
func (fake *fakePDManager) DeleteVolume(cd *gcePersistentDiskDeleter) error {
|
||||||
|
@ -235,6 +237,10 @@ func TestPlugin(t *testing.T) {
|
||||||
t.Errorf("Provision() returned unexpected volume size: %v", size)
|
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
|
// Test Deleter
|
||||||
volSpec := &volume.Spec{
|
volSpec := &volume.Spec{
|
||||||
PersistentVolume: persistentSpec,
|
PersistentVolume: persistentSpec,
|
||||||
|
|
|
@ -127,10 +127,12 @@ func (util *GCEDiskUtil) DeleteVolume(d *gcePersistentDiskDeleter) error {
|
||||||
return nil
|
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()
|
cloud, err := getCloudProvider()
|
||||||
if err != nil {
|
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
|
name := volume.GenerateVolumeName(c.options.ClusterName, c.options.PVName, 63) // GCE PD name can have up to 63 characters
|
||||||
|
@ -143,16 +145,23 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (volum
|
||||||
zone, err := cloud.GetZone()
|
zone, err := cloud.GetZone()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(2).Infof("error getting zone information from GCE: %v", err)
|
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)
|
err = cloud.CreateDisk(name, zone.FailureDomain, int64(requestGB), *c.options.CloudTags)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(2).Infof("Error creating GCE PD volume: %v", err)
|
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)
|
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.
|
// Attaches the specified persistent disk device to node, verifies that it is attached, and retries if it fails.
|
||||||
|
|
Loading…
Reference in New Issue