Skip to content

Commit

Permalink
Created PVs are owned by their respective Nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc Villacorta committed Jul 1, 2019
1 parent 8428280 commit 06dc635
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 7 deletions.
6 changes: 5 additions & 1 deletion pkg/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import (

"hash/fnv"

"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/informers"
Expand Down Expand Up @@ -165,6 +165,7 @@ type LocalPVConfig struct {
MountOptions []string
FsType *string
Labels map[string]string
OwnerReference *metav1.OwnerReference
}

// BuildConfigFromFlags being defined to enable mocking during unit testing
Expand Down Expand Up @@ -210,6 +211,9 @@ func CreateLocalPVSpec(config *LocalPVConfig) *v1.PersistentVolume {
Annotations: map[string]string{
AnnProvisionedBy: config.ProvisionerName,
},
OwnerReferences: []metav1.OwnerReference{
*config.OwnerReference,
},
},
Spec: v1.PersistentVolumeSpec{
PersistentVolumeReclaimPolicy: config.ReclaimPolicy,
Expand Down
14 changes: 12 additions & 2 deletions pkg/deleter/deleter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
"sigs.k8s.io/sig-storage-local-static-provisioner/pkg/util"

batch_v1 "k8s.io/api/batch/v1"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

Expand All @@ -42,6 +42,8 @@ import (
const (
testHostDir = "/mnt/disks"
testMountDir = "/discoveryPath"
testNodeName = "somehost.acme.com"
testNodeUID = "d9607e19-f88f-11e6-a518-42010a800195"
testStorageClass = "sc1"
)

Expand Down Expand Up @@ -558,6 +560,11 @@ func testSetup(t *testing.T, config *testConfig, cleanupCmd []string, useJobForC
Name: pvName,
HostPath: fakePath,
StorageClass: testStorageClass,
OwnerReference: &meta_v1.OwnerReference{
Kind: "Node",
Name: testNodeName,
UID: testNodeUID,
},
}
// If volume mode has been explicitly specified in the volume config, then explicitly set it in the PV.
switch vol.VolumeMode {
Expand Down Expand Up @@ -598,7 +605,10 @@ func testSetup(t *testing.T, config *testConfig, cleanupCmd []string, useJobForC
BlockCleanerCommand: cleanupCmd,
},
},
Node: &v1.Node{ObjectMeta: meta_v1.ObjectMeta{Name: "somehost.acme.com"}},
Node: &v1.Node{ObjectMeta: meta_v1.ObjectMeta{
Name: testNodeName,
UID: testNodeUID,
}},
UseJobForCleaning: useJobForCleaning,
JobContainerImage: containerImage,
Namespace: ns,
Expand Down
33 changes: 30 additions & 3 deletions pkg/discovery/discovery.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import (
"sigs.k8s.io/sig-storage-local-static-provisioner/pkg/common"
"sigs.k8s.io/sig-storage-local-static-provisioner/pkg/metrics"

"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
storagev1listers "k8s.io/client-go/listers/storage/v1"
"k8s.io/client-go/tools/cache"
esUtil "sigs.k8s.io/sig-storage-lib-external-provisioner/util"
Expand All @@ -45,6 +46,7 @@ type Discoverer struct {
nodeAffinityAnn string
nodeAffinity *v1.VolumeNodeAffinity
classLister storagev1listers.StorageClassLister
ownerReference *metav1.OwnerReference
}

// NewDiscoverer creates a Discoverer object that will scan through
Expand Down Expand Up @@ -72,6 +74,12 @@ func NewDiscoverer(config *common.RuntimeConfig, cleanupTracker *deleter.Cleanup
labelMap[labelName] = labelValue
}

// Generate owner reference
ownerRef, err := generateOwnerReference(config.Node)
if err != nil {
return nil, fmt.Errorf("Failed to generate owner reference: %v", err)
}

if config.UseAlphaAPI {
nodeAffinity, err := generateNodeAffinity(config.Node)
if err != nil {
Expand All @@ -87,7 +95,8 @@ func NewDiscoverer(config *common.RuntimeConfig, cleanupTracker *deleter.Cleanup
Labels: labelMap,
CleanupTracker: cleanupTracker,
classLister: sharedInformer.Lister(),
nodeAffinityAnn: tmpAnnotations[common.AlphaStorageNodeAffinityAnnotation]}, nil
nodeAffinityAnn: tmpAnnotations[common.AlphaStorageNodeAffinityAnnotation],
ownerReference: ownerRef}, nil
}

volumeNodeAffinity, err := generateVolumeNodeAffinity(config.Node)
Expand All @@ -100,7 +109,24 @@ func NewDiscoverer(config *common.RuntimeConfig, cleanupTracker *deleter.Cleanup
Labels: labelMap,
CleanupTracker: cleanupTracker,
classLister: sharedInformer.Lister(),
nodeAffinity: volumeNodeAffinity}, nil
nodeAffinity: volumeNodeAffinity,
ownerReference: ownerRef}, nil
}

func generateOwnerReference(node *v1.Node) (*metav1.OwnerReference, error) {
if node.GetName() == "" {
return nil, fmt.Errorf("Node does not have name")
}

if node.GetUID() == "" {
return nil, fmt.Errorf("Node does not have UID")
}

return &metav1.OwnerReference{
Kind: "Node",
Name: node.GetName(),
UID: node.UID,
}, nil
}

func generateNodeAffinity(node *v1.Node) (*v1.NodeAffinity, error) {
Expand Down Expand Up @@ -314,6 +340,7 @@ func (d *Discoverer) createPV(file, class string, reclaimPolicy v1.PersistentVol
VolumeMode: volMode,
Labels: d.Labels,
MountOptions: mountOptions,
OwnerReference: d.ownerReference,
}

if d.UseAlphaAPI {
Expand Down
22 changes: 21 additions & 1 deletion pkg/discovery/discovery_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
"sigs.k8s.io/sig-storage-local-static-provisioner/pkg/deleter"
"sigs.k8s.io/sig-storage-local-static-provisioner/pkg/util"

"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
storagev1 "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -45,6 +45,7 @@ const (
testHostDir = "/mnt/disks"
testMountDir = "/discoveryPath"
testNodeName = "test-node"
testNodeUID = "d9607e19-f88f-11e6-a518-42010a800195"
testProvisionerName = "test-provisioner"
)

Expand Down Expand Up @@ -74,6 +75,7 @@ var testNode = &v1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: testNodeName,
Labels: nodeLabels,
UID: testNodeUID,
},
}

Expand Down Expand Up @@ -555,6 +557,23 @@ func verifyMountOptions(t *testing.T, createdPV *v1.PersistentVolume) {
}
}

func verifyOwnerReference(t *testing.T, pv *v1.PersistentVolume) {
ownerReference := &pv.ObjectMeta.OwnerReferences[0]
if ownerReference == nil {
t.Errorf("No owner reference found")
}

if ownerReference.Name != testNodeName {
t.Errorf("Owner reference name is %s, expected %s", ownerReference.Name, testNodeName)
return
}

if ownerReference.UID != testNodeUID {
t.Errorf("Owner reference UID is %s, expected %s", ownerReference.UID, testNodeUID)
return
}
}

// testPVInfo contains all the fields we are intested in validating.
type testPVInfo struct {
pvName string
Expand Down Expand Up @@ -615,6 +634,7 @@ func verifyCreatedPVs(t *testing.T, test *testConfig) {
verifyCapacity(t, createdPV, expectedPV)
verifyVolumeMode(t, createdPV, expectedPV)
verifyMountOptions(t, createdPV)
verifyOwnerReference(t, createdPV)
// TODO: Verify volume type once that is supported in the API.
}
}
Expand Down

0 comments on commit 06dc635

Please sign in to comment.