2019-10-02 03:25:01 -04:00
/ *
Copyright 2019 The Kubernetes Authors .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package csimigration
import (
"fmt"
"testing"
2021-01-20 17:51:16 -05:00
v1 "k8s.io/api/core/v1"
2019-10-02 03:25:01 -04:00
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/component-base/featuregate"
featuregatetesting "k8s.io/component-base/featuregate/testing"
csitrans "k8s.io/csi-translation-lib"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/volume"
)
func TestIsMigratable ( t * testing . T ) {
testCases := [ ] struct {
name string
pluginFeature featuregate . Feature
pluginFeatureEnabled bool
csiMigrationEnabled bool
isMigratable bool
spec * volume . Spec
} {
{
2022-07-20 20:53:29 -04:00
name : "RBD PV source with CSIMigrationGCE enabled" ,
pluginFeature : features . CSIMigrationRBD ,
2019-10-02 03:25:01 -04:00
pluginFeatureEnabled : true ,
isMigratable : true ,
csiMigrationEnabled : true ,
spec : & volume . Spec {
PersistentVolume : & v1 . PersistentVolume {
Spec : v1 . PersistentVolumeSpec {
PersistentVolumeSource : v1 . PersistentVolumeSource {
2022-07-20 20:53:29 -04:00
RBD : & v1 . RBDPersistentVolumeSource {
RBDImage : "test-disk" ,
2019-10-02 03:25:01 -04:00
} ,
} ,
} ,
} ,
} ,
} ,
{
2022-07-20 20:53:29 -04:00
name : "RBD PD PV Source with CSIMigrationGCE disabled" ,
pluginFeature : features . CSIMigrationRBD ,
2019-10-02 03:25:01 -04:00
pluginFeatureEnabled : false ,
isMigratable : false ,
csiMigrationEnabled : true ,
spec : & volume . Spec {
PersistentVolume : & v1 . PersistentVolume {
Spec : v1 . PersistentVolumeSpec {
PersistentVolumeSource : v1 . PersistentVolumeSource {
2022-07-20 20:53:29 -04:00
RBD : & v1 . RBDPersistentVolumeSource {
RBDImage : "test-disk" ,
2019-10-02 03:25:01 -04:00
} ,
} ,
} ,
} ,
} ,
} ,
}
csiTranslator := csitrans . New ( )
for _ , test := range testCases {
2021-03-08 07:49:57 -05:00
pm := NewPluginManager ( csiTranslator , utilfeature . DefaultFeatureGate )
2019-10-02 03:25:01 -04:00
t . Run ( fmt . Sprintf ( "Testing %v" , test . name ) , func ( t * testing . T ) {
defer featuregatetesting . SetFeatureGateDuringTest ( t , utilfeature . DefaultFeatureGate , test . pluginFeature , test . pluginFeatureEnabled ) ( )
migratable , err := pm . IsMigratable ( test . spec )
if migratable != test . isMigratable {
t . Errorf ( "Expected migratability of spec: %v does not match obtained migratability: %v" , test . isMigratable , migratable )
}
if err != nil {
t . Errorf ( "Unexpected error: %v" , err )
}
} )
}
}
func TestMigrationFeatureFlagStatus ( t * testing . T ) {
testCases := [ ] struct {
2021-01-20 17:51:16 -05:00
name string
pluginName string
csiMigrationEnabled bool
pluginFeature featuregate . Feature
pluginFeatureEnabled bool
inTreePluginUnregister featuregate . Feature
inTreePluginUnregisterEnabled bool
csiMigrationResult bool
csiMigrationCompleteResult bool
2019-10-02 03:25:01 -04:00
} {
{
2023-04-02 22:55:24 -04:00
name : "gce-pd migration flag enabled and migration-complete flag disabled with CSI migration flag" ,
2021-01-20 17:51:16 -05:00
pluginName : "kubernetes.io/gce-pd" ,
pluginFeatureEnabled : true ,
csiMigrationEnabled : true ,
inTreePluginUnregister : features . InTreePluginGCEUnregister ,
inTreePluginUnregisterEnabled : false ,
csiMigrationResult : true ,
csiMigrationCompleteResult : false ,
2019-10-02 03:25:01 -04:00
} ,
{
2023-04-02 22:55:24 -04:00
name : "gce-pd migration flag enabled and migration-complete flag enabled with CSI migration flag" ,
2021-01-20 17:51:16 -05:00
pluginName : "kubernetes.io/gce-pd" ,
pluginFeatureEnabled : true ,
csiMigrationEnabled : true ,
inTreePluginUnregister : features . InTreePluginGCEUnregister ,
inTreePluginUnregisterEnabled : true ,
csiMigrationResult : true ,
csiMigrationCompleteResult : true ,
2019-10-02 03:25:01 -04:00
} ,
}
csiTranslator := csitrans . New ( )
for _ , test := range testCases {
2021-03-08 07:49:57 -05:00
pm := NewPluginManager ( csiTranslator , utilfeature . DefaultFeatureGate )
2019-10-02 03:25:01 -04:00
t . Run ( fmt . Sprintf ( "Testing %v" , test . name ) , func ( t * testing . T ) {
2022-07-20 20:53:29 -04:00
// CSIMigrationGCE is locked to on, so it cannot be enabled or disabled. There are a couple
// of test cases that check correct behavior when CSIMigrationGCE is enabled, but there are
// no longer any tests cases for CSIMigrationGCE being disabled as that is not possible.
2023-04-02 22:55:24 -04:00
if len ( test . pluginFeature ) > 0 {
2022-07-20 20:53:29 -04:00
defer featuregatetesting . SetFeatureGateDuringTest ( t , utilfeature . DefaultFeatureGate , test . pluginFeature , test . pluginFeatureEnabled ) ( )
}
2021-01-20 17:51:16 -05:00
defer featuregatetesting . SetFeatureGateDuringTest ( t , utilfeature . DefaultFeatureGate , test . inTreePluginUnregister , test . inTreePluginUnregisterEnabled ) ( )
2019-10-02 03:25:01 -04:00
csiMigrationResult := pm . IsMigrationEnabledForPlugin ( test . pluginName )
if csiMigrationResult != test . csiMigrationResult {
t . Errorf ( "Expected migratability of plugin %v: %v does not match obtained migratability: %v" , test . pluginName , test . csiMigrationResult , csiMigrationResult )
}
csiMigrationCompleteResult := pm . IsMigrationCompleteForPlugin ( test . pluginName )
if csiMigrationCompleteResult != test . csiMigrationCompleteResult {
t . Errorf ( "Expected migration complete status of plugin: %v: %v does not match obtained migratability: %v" , test . pluginName , test . csiMigrationCompleteResult , csiMigrationResult )
}
} )
}
}