k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cluster/images/etcd/migrate/data_dir_test.go (about) 1 /* 2 Copyright 2018 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "os" 21 "path/filepath" 22 "testing" 23 24 "github.com/blang/semver/v4" 25 ) 26 27 var ( 28 latestVersion = semver.MustParse("3.1.12") 29 ) 30 31 func TestExistingDataDirWithVersionFile(t *testing.T) { 32 d, err := OpenOrCreateDataDirectory("testdata/datadir_with_version") 33 if err != nil { 34 t.Fatalf("Failed to open data dir: %v", err) 35 } 36 isEmpty, err := d.IsEmpty() 37 if err != nil { 38 t.Fatalf("Failed to check if data dir is empty: %v", err) 39 } 40 if isEmpty { 41 t.Errorf("Expected non-empty data directory to exist") 42 } 43 exists, err := d.versionFile.Exists() 44 if err != nil { 45 t.Fatal(err) 46 } 47 if !exists { 48 t.Fatalf("Expected version file %s to exist", d.versionFile.path) 49 } 50 vp, err := d.versionFile.Read() 51 if err != nil { 52 t.Fatalf("Failed to read version file %s: %v", d.versionFile.path, err) 53 } 54 expectedVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3} 55 if !vp.Equals(expectedVersion) { 56 t.Errorf("Expected version file to contain %s, but got %s", expectedVersion, vp) 57 } 58 } 59 60 func TestExistingDataDirWithoutVersionFile(t *testing.T) { 61 targetVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3} 62 63 d, err := OpenOrCreateDataDirectory("testdata/datadir_without_version") 64 if err != nil { 65 t.Fatalf("Failed to open data dir: %v", err) 66 } 67 exists, err := d.versionFile.Exists() 68 if err != nil { 69 t.Fatal(err) 70 } 71 if exists { 72 t.Errorf("Expected version file %s not to exist", d.versionFile.path) 73 } 74 err = d.Initialize(targetVersion) 75 if err != nil { 76 t.Fatalf("Failed initialize data directory %s: %v", d.path, err) 77 } 78 exists, err = d.versionFile.Exists() 79 if err != nil { 80 t.Fatal(err) 81 } 82 if exists { 83 t.Fatalf("Expected version file %s not to exist after initializing non-empty data-dir", d.versionFile.path) 84 } 85 } 86 87 func TestNonexistingDataDir(t *testing.T) { 88 targetVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3} 89 path := newTestPath(t) 90 defer os.RemoveAll(path) 91 d, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir")) 92 if err != nil { 93 t.Fatalf("Failed to open data dir: %v", err) 94 } 95 isEmpty, err := d.IsEmpty() 96 if err != nil { 97 t.Fatalf("Failed to check if data dir is empty: %v", err) 98 } 99 if !isEmpty { 100 t.Errorf("Expected empty data directory to exist") 101 } 102 err = d.Initialize(targetVersion) 103 if err != nil { 104 t.Fatalf("Failed initialize data directory %s: %v", d.path, err) 105 } 106 exists, err := d.versionFile.Exists() 107 if err != nil { 108 t.Fatal(err) 109 } 110 if !exists { 111 t.Fatalf("Expected version file %s to exist", d.versionFile.path) 112 } 113 isEmpty, err = d.IsEmpty() 114 if err != nil { 115 t.Fatalf("Failed to check if data dir is empty: %v", err) 116 } 117 if isEmpty { 118 t.Errorf("Expected non-empty data directory to exist after Initialize()") 119 } 120 vp, err := d.versionFile.Read() 121 if err != nil { 122 t.Fatalf("Failed to read version file %s: %v", d.versionFile.path, err) 123 } 124 if !vp.Equals(targetVersion) { 125 t.Errorf("Expected version file to contain %s, but got %s", targetVersion, vp) 126 } 127 } 128 129 func TestBackup(t *testing.T) { 130 path := newTestPath(t) 131 defer os.RemoveAll(path) 132 d, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir")) 133 if err != nil { 134 t.Fatalf("Failed to open data dir: %v", err) 135 } 136 _, err = os.Create(filepath.Join(path, "data-dir", "empty.txt")) 137 if err != nil { 138 t.Fatal(err) 139 } 140 err = d.Backup() 141 if err != nil { 142 t.Fatalf("Failed to backup data directory %s: %v", d.path, err) 143 } 144 bak, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir.bak")) 145 if err != nil { 146 t.Fatalf("Failed to open backup data dir: %v", err) 147 } 148 isEmpty, err := bak.IsEmpty() 149 if err != nil { 150 t.Fatal(err) 151 } 152 if isEmpty { 153 t.Errorf("Expected non-empty backup directory to exist after Backup()") 154 } 155 } 156 157 func newTestPath(t *testing.T) string { 158 path, err := os.MkdirTemp("", "etcd-migrate-test-") 159 if err != nil { 160 t.Fatalf("Failed to create tmp dir for test: %v", err) 161 } 162 err = os.Chmod(path, 0777) 163 if err != nil { 164 t.Fatalf("Failed to granting permission to tmp dir for test: %v", err) 165 } 166 return path 167 }