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

Disable default PV for Experiment with resume from volume #1552

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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test-go.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
- name: Setup Go
uses: actions/setup-go@v2
with:
go-version: 1.15.8
go-version: 1.15.13

# Verify that go.mod and go.sum is synchronized
- name: Check Go modules
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1368,6 +1368,7 @@ k8s.io/csi-translation-lib v0.20.4/go.mod h1:WisLItCdoDKB4lr6nkhzQsfgBNBJDI/TD9m
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE=
k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
Expand Down
7 changes: 0 additions & 7 deletions pkg/controller.v1beta1/consts/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,19 +119,12 @@ const (
// DefaultContainerSuggestionVolumeMountPath is the default mount path in suggestion container
DefaultContainerSuggestionVolumeMountPath = "/opt/katib/data"

// DefaultSuggestionStorageClassName is the default value for suggestion's volume storage class name
DefaultSuggestionStorageClassName = "katib-suggestion"

// DefaultSuggestionVolumeStorage is the default value for suggestion's volume storage
DefaultSuggestionVolumeStorage = "1Gi"

// DefaultSuggestionVolumeAccessMode is the default value for suggestion's volume access mode
DefaultSuggestionVolumeAccessMode = corev1.ReadWriteOnce

// DefaultSuggestionVolumeLocalPathPrefix is the default cluster local path prefix for suggestion volume
// Full default local path = /tmp/katib/suggestions/<suggestion-name>-<suggestion-algorithm>-<suggestion-namespace>
DefaultSuggestionVolumeLocalPathPrefix = "/tmp/katib/suggestions/"

// ReconcileErrorReason is the reason when there is a reconcile error.
ReconcileErrorReason = "ReconcileError"

Expand Down
22 changes: 8 additions & 14 deletions pkg/controller.v1beta1/suggestion/composer/composer.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand Down Expand Up @@ -257,17 +258,15 @@ func (g *General) desiredContainers(s *suggestionsv1beta1.Suggestion,
return containers
}

// DesiredVolume returns desired PVC and PV for suggestion.
// If StorageClassName != DefaultSuggestionStorageClassName returns only PVC.
// DesiredVolume returns desired PVC and PV for Suggestion.
// If PV doesn't exist in Katib config return nil for PV.
func (g *General) DesiredVolume(s *suggestionsv1beta1.Suggestion) (*corev1.PersistentVolumeClaim, *corev1.PersistentVolume, error) {

suggestionConfigData, err := katibconfig.GetSuggestionConfigData(s.Spec.Algorithm.AlgorithmName, g.Client)
if err != nil {
return nil, nil, err
}

persistentVolumeName := util.GetSuggestionPersistentVolumeName(s)

pvc := &corev1.PersistentVolumeClaim{
ObjectMeta: metav1.ObjectMeta{
Name: util.GetSuggestionPersistentVolumeClaimName(s),
Expand All @@ -282,24 +281,19 @@ func (g *General) DesiredVolume(s *suggestionsv1beta1.Suggestion) (*corev1.Persi
}

var pv *corev1.PersistentVolume
// Create PV with local hostPath by default
if *pvc.Spec.StorageClassName == consts.DefaultSuggestionStorageClassName {
localLabel := map[string]string{"type": "local"}
// Create PV if Katib config contains it.
if !equality.Semantic.DeepEqual(suggestionConfigData.PersistentVolumeSpec, corev1.PersistentVolumeSpec{}) {

persistentVolumeName := util.GetSuggestionPersistentVolumeName(s)

pv = &corev1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: persistentVolumeName,
Labels: localLabel,
Labels: suggestionConfigData.PersistentVolumeLabels,
},
Spec: suggestionConfigData.PersistentVolumeSpec,
}

// If default host path is specified attach pv name to the path.
// Full default local path = DefaultSuggestionVolumeLocalPathPrefix<suggestion-name>-<suggestion-algorithm>-<suggestion-namespace>
if pv.Spec.PersistentVolumeSource.HostPath != nil &&
pv.Spec.PersistentVolumeSource.HostPath.Path == consts.DefaultSuggestionVolumeLocalPathPrefix {
pv.Spec.PersistentVolumeSource.HostPath.Path = pv.Spec.PersistentVolumeSource.HostPath.Path + persistentVolumeName
}
}

return pvc, pv, nil
Expand Down
112 changes: 20 additions & 92 deletions pkg/controller.v1beta1/suggestion/composer/composer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ var (

refFlag bool = true

storageClassName = consts.DefaultSuggestionStorageClassName
storageClassName = "test-storage-class"
pvLabels = map[string]string{"type": "local"}
)

func TestMain(m *testing.M) {
Expand Down Expand Up @@ -401,106 +402,36 @@ func TestDesiredVolume(t *testing.T) {
suggestion: newFakeSuggestion(),
configMap: newFakeKatibConfig(newFakeSuggestionConfig(), newFakeEarlyStoppingConfig()),
expectedPVC: newFakePVC(),
expectedPV: newFakePV(),
err: false,
testDescription: "Desired Volume valid run with default pvc and pv",
},
{
suggestion: newFakeSuggestion(),
configMap: func() *corev1.ConfigMap {
sc := newFakeSuggestionConfig()
storageClass := "custom-storage-class"
volumeStorage, _ := resource.ParseQuantity("5Gi")

sc.PersistentVolumeClaimSpec = corev1.PersistentVolumeClaimSpec{
StorageClassName: &storageClass,
AccessModes: []corev1.PersistentVolumeAccessMode{
corev1.ReadWriteOnce,
corev1.ReadOnlyMany,
},
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceStorage: volumeStorage,
},
},
}
cm := newFakeKatibConfig(sc, newFakeEarlyStoppingConfig())
return cm
}(),
expectedPVC: func() *corev1.PersistentVolumeClaim {
pvc := newFakePVC()
storageClass := "custom-storage-class"
volumeStorage, _ := resource.ParseQuantity("5Gi")

pvc.Spec.StorageClassName = &storageClass
pvc.Spec.AccessModes = append(pvc.Spec.AccessModes, corev1.ReadOnlyMany)
pvc.Spec.Resources.Requests[corev1.ResourceStorage] = volumeStorage
return pvc
}(),
expectedPV: nil,
err: false,
testDescription: "Custom PVC with not default storage class",
testDescription: "Desired Volume valid run with default PVC",
},
{
suggestion: newFakeSuggestion(),
configMap: func() *corev1.ConfigMap {
sc := newFakeSuggestionConfig()
mode := corev1.PersistentVolumeFilesystem
accessModes := []corev1.PersistentVolumeAccessMode{
corev1.ReadWriteOnce,
corev1.ReadOnlyMany,
}
volumeStorage, _ := resource.ParseQuantity("10Gi")

sc.PersistentVolumeClaimSpec = corev1.PersistentVolumeClaimSpec{
VolumeMode: &mode,
AccessModes: accessModes,
}

sc.PersistentVolumeSpec = corev1.PersistentVolumeSpec{
VolumeMode: &mode,
AccessModes: accessModes,
PersistentVolumeSource: corev1.PersistentVolumeSource{
GCEPersistentDisk: &corev1.GCEPersistentDiskVolumeSource{
PDName: "pd-name",
FSType: "fs-type",
},
},
Capacity: corev1.ResourceList{
corev1.ResourceStorage: volumeStorage,
},
}

sc.PersistentVolumeClaimSpec = newFakePVC().Spec

// Change StorageClass and volume storage.
sc.PersistentVolumeClaimSpec.StorageClassName = &storageClassName

sc.PersistentVolumeSpec = newFakePV().Spec
// This policy will be changed to "Delete".
sc.PersistentVolumeSpec.PersistentVolumeReclaimPolicy = corev1.PersistentVolumeReclaimRetain
sc.PersistentVolumeLabels = pvLabels

cm := newFakeKatibConfig(sc, newFakeEarlyStoppingConfig())
return cm
}(),
expectedPVC: func() *corev1.PersistentVolumeClaim {
pvc := newFakePVC()
mode := corev1.PersistentVolumeFilesystem

pvc.Spec.VolumeMode = &mode
pvc.Spec.AccessModes = append(pvc.Spec.AccessModes, corev1.ReadOnlyMany)
pvc.Spec.StorageClassName = &storageClassName
return pvc
}(),
expectedPV: func() *corev1.PersistentVolume {
pv := newFakePV()
mode := corev1.PersistentVolumeFilesystem
volumeStorage, _ := resource.ParseQuantity("10Gi")

pv.Spec.VolumeMode = &mode
pv.Spec.AccessModes = append(pv.Spec.AccessModes, corev1.ReadOnlyMany)
pv.Spec.PersistentVolumeSource = corev1.PersistentVolumeSource{
GCEPersistentDisk: &corev1.GCEPersistentDiskVolumeSource{
PDName: "pd-name",
FSType: "fs-type",
},
}
pv.Spec.Capacity = corev1.ResourceList{
corev1.ResourceStorage: volumeStorage,
}
return pv
}(),
expectedPV: newFakePV(),
err: false,
testDescription: "Custom PVC and PV with default storage class",
testDescription: "Custom PVC and PV",
},
}

Expand Down Expand Up @@ -915,7 +846,6 @@ func newFakePVC() *corev1.PersistentVolumeClaim {
},
},
Spec: corev1.PersistentVolumeClaimSpec{
StorageClassName: &storageClassName,
AccessModes: []corev1.PersistentVolumeAccessMode{
consts.DefaultSuggestionVolumeAccessMode,
},
Expand All @@ -934,10 +864,8 @@ func newFakePV() *corev1.PersistentVolume {

return &corev1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
Name: pvName,
Labels: map[string]string{
"type": "local",
},
Name: pvName,
Labels: pvLabels,
},
Spec: corev1.PersistentVolumeSpec{
StorageClassName: storageClassName,
Expand All @@ -947,7 +875,7 @@ func newFakePV() *corev1.PersistentVolume {
},
PersistentVolumeSource: corev1.PersistentVolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: consts.DefaultSuggestionVolumeLocalPathPrefix + pvName,
Path: "tmp/katib/suggestion" + pvName,
},
},
Capacity: corev1.ResourceList{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,6 @@ func TestReconcile(t *testing.T) {
return c.Get(context.TODO(), types.NamespacedName{Namespace: namespace, Name: resourceName}, &corev1.Service{})
}, timeout).Should(gomega.Succeed())

// Expect that PV with appropriate name is created
g.Eventually(func() error {
return c.Get(context.TODO(), types.NamespacedName{Name: resourceName + "-" + namespace}, &corev1.PersistentVolume{})
}, timeout).Should(gomega.Succeed())

// Expect that PVC with appropriate name is created
g.Eventually(func() error {
return c.Get(context.TODO(), types.NamespacedName{Namespace: namespace, Name: resourceName}, &corev1.PersistentVolumeClaim{})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,13 @@ func (r *ReconcileSuggestion) reconcileVolume(
foundPVC := &corev1.PersistentVolumeClaim{}
foundPV := &corev1.PersistentVolume{}

// Try to find/create PV, if PV has to be created
// Try to find/create PV, if PV has to be created.
if pv != nil {
err := r.Get(context.TODO(), types.NamespacedName{Name: pv.Name}, foundPV)
if err != nil && errors.IsNotFound(err) {
logger.Info("Creating Persistent Volume", "name", pv.Name)
err = r.Create(context.TODO(), pv)
// Return only if Create was failed, otherwise try to find/create PVC
// Return only if Create was failed, otherwise try to find/create PVC.
if err != nil {
return nil, nil, err
}
Expand All @@ -80,7 +80,7 @@ func (r *ReconcileSuggestion) reconcileVolume(
}
}

// Try to find/create PVC
// Try to find/create PVC.
err := r.Get(context.TODO(), types.NamespacedName{Name: pvc.Name, Namespace: pvc.Namespace}, foundPVC)
if err != nil && errors.IsNotFound(err) {
logger.Info("Creating Persistent Volume Claim", "name", pvc.Name)
Expand Down
Loading