@@ -25,17 +25,24 @@ import (
2525 "fmt"
2626 "strings"
2727 "testing"
28+ "time"
29+
30+ "github.com/arangodb/arangosync/pkg/retry"
2831
2932 "github.com/dchest/uniuri"
3033 "github.com/stretchr/testify/assert"
3134
3235 api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
3336 kubeArangoClient "github.com/arangodb/kube-arangodb/pkg/client"
37+ "github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
38+ corev1 "k8s.io/api/core/v1"
39+ "k8s.io/apimachinery/pkg/api/resource"
40+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3441 //"github.com/arangodb/kube-arangodb/pkg/util"
3542)
3643
3744// TODO - add description
38- func TestPersistence (t * testing.T ) {
45+ func TestPVCExists (t * testing.T ) {
3946 longOrSkip (t )
4047
4148 k8sNameSpace := getNamespace (t )
@@ -78,3 +85,89 @@ func TestPersistence(t *testing.T) {
7885 // Cleanup
7986 removeDeployment (deploymentClient , deploymentTemplate .GetName (), k8sNameSpace )
8087}
88+
89+ func TestPVCResize (t * testing.T ) {
90+ longOrSkip (t )
91+
92+ k8sNameSpace := getNamespace (t )
93+ k8sClient := mustNewKubeClient (t )
94+
95+ mode := api .DeploymentModeCluster
96+ engine := api .StorageEngineRocksDB
97+
98+ size10GB , _ := resource .ParseQuantity ("10Gi" )
99+ size08GB , _ := resource .ParseQuantity ("8Gi" )
100+
101+ deploymentClient := kubeArangoClient .MustNewInCluster ()
102+ deploymentTemplate := newDeployment (strings .Replace (fmt .Sprintf ("trsz-%s-%s-%s" , mode [:2 ], engine [:2 ], uniuri .NewLen (4 )), "." , "" , - 1 ))
103+ deploymentTemplate .Spec .Mode = api .NewMode (mode )
104+ deploymentTemplate .Spec .StorageEngine = api .NewStorageEngine (engine )
105+ deploymentTemplate .Spec .TLS = api.TLSSpec {}
106+ deploymentTemplate .Spec .DBServers .Resources .Requests = corev1.ResourceList {corev1 .ResourceStorage : size08GB }
107+ deploymentTemplate .Spec .SetDefaults (deploymentTemplate .GetName ()) // this must be last
108+ assert .NoError (t , deploymentTemplate .Spec .Validate ())
109+
110+ // Create deployment
111+ _ , err := deploymentClient .DatabaseV1alpha ().ArangoDeployments (k8sNameSpace ).Create (deploymentTemplate )
112+ defer removeDeployment (deploymentClient , deploymentTemplate .GetName (), k8sNameSpace )
113+ assert .NoError (t , err , "failed to create deplyment: %s" , err )
114+
115+ depl , err := waitUntilDeployment (deploymentClient , deploymentTemplate .GetName (), k8sNameSpace , deploymentIsReady ())
116+ assert .NoError (t , err , fmt .Sprintf ("Deployment not running in time: %s" , err ))
117+
118+ // Get list of all pvcs for dbservers
119+ for _ , m := range depl .Status .Members .DBServers {
120+ pvc , err := k8sClient .CoreV1 ().PersistentVolumeClaims (k8sNameSpace ).Get (m .PersistentVolumeClaimName , metav1.GetOptions {})
121+ assert .NoError (t , err , "failed to get pvc: %s" , err )
122+ volumeSize , ok := pvc .Spec .Resources .Requests [corev1 .ResourceStorage ]
123+ assert .True (t , ok , "pvc does not have storage resource" )
124+ assert .True (t , volumeSize .Cmp (size08GB ) == 0 , "wrong volume size: expected: %s, found: %s" , size08GB .String (), volumeSize .String ())
125+ }
126+
127+ // Update the deployment
128+ // Try to change image version
129+ depl , err = updateDeployment (deploymentClient , deploymentTemplate .GetName (), k8sNameSpace ,
130+ func (depl * api.DeploymentSpec ) {
131+ depl .DBServers .Resources .Requests [corev1 .ResourceStorage ] = size10GB
132+ })
133+ if err != nil {
134+ t .Fatalf ("Failed to update the deployment" )
135+ } else {
136+ t .Log ("Updated deployment" )
137+ }
138+
139+ if err := retry .Retry (func () error {
140+ // Get list of all pvcs for dbservers and check for new size
141+ for _ , m := range depl .Status .Members .DBServers {
142+ pvc , err := k8sClient .CoreV1 ().PersistentVolumeClaims (k8sNameSpace ).Get (m .PersistentVolumeClaimName , metav1.GetOptions {})
143+ if err != nil {
144+ return err
145+ }
146+ volumeSize , ok := pvc .Spec .Resources .Requests [corev1 .ResourceStorage ]
147+ if ! ok {
148+ return fmt .Errorf ("pvc does not have storage resource" )
149+ }
150+ if volumeSize .Cmp (size10GB ) != 0 {
151+ return fmt .Errorf ("wrong pvc size: expected: %s, found: %s" , size10GB .String (), volumeSize .String ())
152+ }
153+ volume , err := k8sClient .CoreV1 ().PersistentVolumes ().Get (pvc .Spec .VolumeName , metav1.GetOptions {})
154+ if err != nil {
155+ return err
156+ }
157+ volumeSize , ok = volume .Spec .Capacity [corev1 .ResourceStorage ]
158+ if ! ok {
159+ return fmt .Errorf ("pv does not have storage resource" )
160+ }
161+ if volumeSize .Cmp (size10GB ) != 0 {
162+ return fmt .Errorf ("wrong volume size: expected: %s, found: %s" , size10GB .String (), volumeSize .String ())
163+ }
164+ if k8sutil .IsPersistentVolumeClaimFileSystemResizePending (pvc ) {
165+ return fmt .Errorf ("persistent volume claim file system resize pending" )
166+ }
167+ }
168+ return nil
169+ }, 5 * time .Minute ); err != nil {
170+ t .Fatalf ("PVCs not resized: %s" , err .Error ())
171+ }
172+
173+ }
0 commit comments