Skip to content

Commit 9cd6bd1

Browse files
authored
Merge pull request #59 from arangodb/feature/add-tests-for-immutable-cluster-parameters
Feature/add tests for immutable cluster parameters
2 parents 531ce8a + e2488ef commit 9cd6bd1

File tree

2 files changed

+141
-2
lines changed

2 files changed

+141
-2
lines changed

tests/immutable_test.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
//
2+
// DISCLAIMER
3+
//
4+
// Copyright 2018 ArangoDB GmbH, Cologne, Germany
5+
//
6+
// Licensed under the Apache License, Version 2.0 (the "License");
7+
// you may not use this file except in compliance with the License.
8+
// You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing, software
13+
// distributed under the License is distributed on an "AS IS" BASIS,
14+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
// See the License for the specific language governing permissions and
16+
// limitations under the License.
17+
//
18+
// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
//
20+
// Author Kaveh Vahedipour
21+
// Author Ewout Prangsma
22+
//
23+
24+
package tests
25+
26+
import (
27+
"context"
28+
"fmt"
29+
"testing"
30+
"time"
31+
32+
"github.com/dchest/uniuri"
33+
34+
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
35+
"github.com/arangodb/kube-arangodb/pkg/client"
36+
)
37+
38+
// TestImmutableFields tests that several immutable fields in the deployment
39+
// spec are reverted to their original value.
40+
func TestImmutableFields(t *testing.T) {
41+
longOrSkip(t)
42+
c := client.MustNewInCluster()
43+
kubecli := mustNewKubeClient(t)
44+
ns := getNamespace(t)
45+
revertTimeout := time.Second * 30
46+
47+
// Prepare deployment config
48+
depl := newDeployment("test-ise-" + uniuri.NewLen(4))
49+
depl.Spec.Mode = api.NewMode(api.DeploymentModeSingle)
50+
depl.Spec.SetDefaults(depl.GetName())
51+
52+
// Create deployment
53+
apiObject, err := c.DatabaseV1alpha().ArangoDeployments(ns).Create(depl)
54+
if err != nil {
55+
t.Fatalf("Create deployment failed: %v", err)
56+
}
57+
58+
// Wait for deployment to be ready
59+
if _, err := waitUntilDeployment(c, depl.GetName(), ns, deploymentHasState(api.DeploymentStateRunning)); err != nil {
60+
t.Fatalf("Deployment not running in time: %v", err)
61+
}
62+
63+
// Create a database client
64+
ctx := context.Background()
65+
client := mustNewArangodDatabaseClient(ctx, kubecli, apiObject, t)
66+
67+
// Wait for single server to be completely ready
68+
if err := waitUntilVersionUp(client); err != nil {
69+
t.Fatalf("Single server not up in time: %v", err)
70+
}
71+
72+
// Try to reset storageEngine ===============================================
73+
if _, err := updateDeployment(c, depl.GetName(), ns,
74+
func(spec *api.DeploymentSpec) {
75+
spec.StorageEngine = api.NewStorageEngine(api.StorageEngineMMFiles)
76+
}); err != nil {
77+
t.Fatalf("Failed to update the StorageEngine setting: %v", err)
78+
}
79+
80+
// Wait for StorageEngine parameter to be back to RocksDB
81+
if _, err := waitUntilDeployment(c, depl.GetName(), ns,
82+
func(depl *api.ArangoDeployment) error {
83+
if api.StorageEngineOrDefault(depl.Spec.StorageEngine) == api.StorageEngineRocksDB {
84+
return nil
85+
}
86+
return fmt.Errorf("StorageEngine not back to %s", api.StorageEngineRocksDB)
87+
}, revertTimeout); err != nil {
88+
t.Errorf("StorageEngine parameter is immutable: %v", err)
89+
}
90+
91+
/*
92+
Secrets are a special case that we'll deal with later
93+
// Try to reset the RocksDB encryption key ==================================
94+
if _, err := updateDeployment(c, depl.GetName(), ns,
95+
func(spec *api.DeploymentSpec) {
96+
spec.RocksDB.Encryption.KeySecretName = util.NewString("foobarbaz")
97+
}); err != nil {
98+
t.Fatalf("Failed to update the RocksDB encryption key: %v", err)
99+
}
100+
101+
// Wait for deployment mode to be set back to cluster
102+
if _, err := waitUntilDeployment(c, depl.GetName(), ns,
103+
func(depl *api.ArangoDeployment) error {
104+
if util.StringOrDefault(depl.Spec.RocksDB.Encryption.KeySecretName) == "test.encryption.keySecretName" {
105+
return nil
106+
}
107+
return fmt.Errorf("RocksDB encryption key not back to %s", "test.encryption.keySecretName")
108+
}, revertTimeout); err != nil {
109+
t.Errorf("RocksDB encryption key is mutable: %v", err)
110+
}
111+
*/
112+
113+
// Try to reset the deployment type ==========================================
114+
if _, err := updateDeployment(c, depl.GetName(), ns,
115+
func(spec *api.DeploymentSpec) {
116+
spec.Mode = api.NewMode(api.DeploymentModeCluster)
117+
}); err != nil {
118+
t.Fatalf("Failed to update the deployment mode: %v", err)
119+
}
120+
121+
// Wait for deployment mode to be set back to cluster
122+
if _, err := waitUntilDeployment(c, depl.GetName(), ns,
123+
func(depl *api.ArangoDeployment) error {
124+
expected := api.DeploymentModeSingle
125+
if api.ModeOrDefault(depl.Spec.Mode) == expected {
126+
return nil
127+
}
128+
return fmt.Errorf("Deployment mode not back to %s", expected)
129+
}, revertTimeout); err != nil {
130+
t.Errorf("Deployment mode is mutable: %v", err)
131+
}
132+
133+
// Cleanup
134+
removeDeployment(c, depl.GetName(), ns)
135+
}

tests/test_util.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func newDeployment(name string) *api.ArangoDeployment {
116116

117117
// waitUntilDeployment waits until a deployment with given name in given namespace
118118
// reached a state where the given predicate returns true.
119-
func waitUntilDeployment(cli versioned.Interface, deploymentName, ns string, predicate func(*api.ArangoDeployment) error) (*api.ArangoDeployment, error) {
119+
func waitUntilDeployment(cli versioned.Interface, deploymentName, ns string, predicate func(*api.ArangoDeployment) error, timeout ...time.Duration) (*api.ArangoDeployment, error) {
120120
var result *api.ArangoDeployment
121121
op := func() error {
122122
obj, err := cli.DatabaseV1alpha().ArangoDeployments(ns).Get(deploymentName, metav1.GetOptions{})
@@ -132,7 +132,11 @@ func waitUntilDeployment(cli versioned.Interface, deploymentName, ns string, pre
132132
}
133133
return nil
134134
}
135-
if err := retry.Retry(op, deploymentReadyTimeout); err != nil {
135+
actualTimeout := deploymentReadyTimeout
136+
if len(timeout) > 0 {
137+
actualTimeout = timeout[0]
138+
}
139+
if err := retry.Retry(op, actualTimeout); err != nil {
136140
return nil, maskAny(err)
137141
}
138142
return result, nil

0 commit comments

Comments
 (0)