mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
	
	
		
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | /* | ||
|  |  * Minio Cloud Storage, (C) 2016 Minio, Inc. | ||
|  |  * | ||
|  |  * 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 cmd | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"runtime" | ||
|  | 	"testing" | ||
|  | ) | ||
|  | 
 | ||
|  | func (action InitActions) String() string { | ||
|  | 	switch action { | ||
|  | 	case InitObjectLayer: | ||
|  | 		return "InitObjectLayer" | ||
|  | 	case FormatDisks: | ||
|  | 		return "FormatDisks" | ||
|  | 	case WaitForFormatting: | ||
|  | 		return "WaitForFormatting" | ||
|  | 	case WaitForHeal: | ||
|  | 		return "WaitForHeal" | ||
|  | 	case WaitForAll: | ||
|  | 		return "WaitForAll" | ||
|  | 	case WaitForQuorum: | ||
|  | 		return "WaitForQuorum" | ||
|  | 	case Abort: | ||
|  | 		return "Abort" | ||
|  | 	default: | ||
|  | 		return "Unknown" | ||
|  | 	} | ||
|  | } | ||
|  | func TestPrepForInit(t *testing.T) { | ||
|  | 	var disks []string | ||
|  | 	if runtime.GOOS == "windows" { | ||
|  | 		disks = []string{ | ||
|  | 			`c:\mnt\disk1`, | ||
|  | 			`c:\mnt\disk2`, | ||
|  | 			`c:\mnt\disk3`, | ||
|  | 			`c:\mnt\disk4`, | ||
|  | 			`c:\mnt\disk5`, | ||
|  | 			`c:\mnt\disk6`, | ||
|  | 			`c:\mnt\disk7`, | ||
|  | 			`c:\mnt\disk8`, | ||
|  | 		} | ||
|  | 	} else { | ||
|  | 		disks = []string{ | ||
|  | 			"/mnt/disk1", | ||
|  | 			"/mnt/disk2", | ||
|  | 			"/mnt/disk3", | ||
|  | 			"/mnt/disk4", | ||
|  | 			"/mnt/disk5", | ||
|  | 			"/mnt/disk6", | ||
|  | 			"/mnt/disk7", | ||
|  | 			"/mnt/disk8", | ||
|  | 		} | ||
|  | 	} | ||
|  | 	// Building up disks that resolve to localhost and remote w.r.t isLocalStorage().
 | ||
|  | 	var ( | ||
|  | 		disksLocal  []string | ||
|  | 		disksRemote []string | ||
|  | 	) | ||
|  | 	for i := range disks { | ||
|  | 		disksLocal = append(disksLocal, "localhost:"+disks[i]) | ||
|  | 	} | ||
|  | 	// Using 4.4.4.4 as a known non-local address.
 | ||
|  | 	for i := range disks { | ||
|  | 		disksRemote = append(disksRemote, "4.4.4.4:"+disks[i]) | ||
|  | 	} | ||
|  | 	// All disks are unformatted, a fresh setup.
 | ||
|  | 	allUnformatted := []error{ | ||
|  | 		errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, | ||
|  | 		errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, | ||
|  | 	} | ||
|  | 	// All disks are formatted, possible restart of a node in a formatted setup.
 | ||
|  | 	allFormatted := []error{ | ||
|  | 		nil, nil, nil, nil, | ||
|  | 		nil, nil, nil, nil, | ||
|  | 	} | ||
|  | 	// Quorum number of disks are formatted and rest are offline.
 | ||
|  | 	quorumFormatted := []error{ | ||
|  | 		nil, nil, nil, nil, | ||
|  | 		nil, errDiskNotFound, errDiskNotFound, errDiskNotFound, | ||
|  | 	} | ||
|  | 	// Minority disks are corrupted, can be healed.
 | ||
|  | 	minorityCorrupted := []error{ | ||
|  | 		errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, nil, | ||
|  | 		nil, nil, nil, nil, | ||
|  | 	} | ||
|  | 	// Majority disks are corrupted, pretty bad setup.
 | ||
|  | 	majorityCorrupted := []error{ | ||
|  | 		errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, errCorruptedFormat, | ||
|  | 		errCorruptedFormat, nil, nil, nil, | ||
|  | 	} | ||
|  | 	// Quorum disks are unformatted, remaining yet to come online.
 | ||
|  | 	quorumUnformatted := []error{ | ||
|  | 		errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, | ||
|  | 		errUnformattedDisk, errDiskNotFound, errDiskNotFound, errDiskNotFound, | ||
|  | 	} | ||
|  | 	quorumUnformattedSomeCorrupted := []error{ | ||
|  | 		errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, errUnformattedDisk, | ||
|  | 		errUnformattedDisk, errCorruptedFormat, errCorruptedFormat, errDiskNotFound, | ||
|  | 	} | ||
|  | 	// Quorum number of disks not online yet.
 | ||
|  | 	noQuourm := []error{ | ||
|  | 		errDiskNotFound, errDiskNotFound, errDiskNotFound, errDiskNotFound, | ||
|  | 		errDiskNotFound, nil, nil, nil, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	testCases := []struct { | ||
|  | 		// Params for prepForInit().
 | ||
|  | 		disks     []string | ||
|  | 		errs      []error | ||
|  | 		diskCount int | ||
|  | 		action    InitActions | ||
|  | 	}{ | ||
|  | 		// Local disks.
 | ||
|  | 		{disksLocal, allFormatted, 8, InitObjectLayer}, | ||
|  | 		{disksLocal, quorumFormatted, 8, InitObjectLayer}, | ||
|  | 		{disksLocal, allUnformatted, 8, FormatDisks}, | ||
|  | 		{disksLocal, quorumUnformatted, 8, WaitForAll}, | ||
|  | 		{disksLocal, quorumUnformattedSomeCorrupted, 8, WaitForHeal}, | ||
|  | 		{disksLocal, noQuourm, 8, WaitForQuorum}, | ||
|  | 		{disksLocal, minorityCorrupted, 8, WaitForHeal}, | ||
|  | 		{disksLocal, majorityCorrupted, 8, Abort}, | ||
|  | 		// Remote disks.
 | ||
|  | 		{disksRemote, allFormatted, 8, InitObjectLayer}, | ||
|  | 		{disksRemote, quorumFormatted, 8, InitObjectLayer}, | ||
|  | 		{disksRemote, allUnformatted, 8, WaitForFormatting}, | ||
|  | 		{disksRemote, quorumUnformatted, 8, WaitForAll}, | ||
|  | 		{disksRemote, quorumUnformattedSomeCorrupted, 8, WaitForHeal}, | ||
|  | 		{disksRemote, noQuourm, 8, WaitForQuorum}, | ||
|  | 		{disksRemote, minorityCorrupted, 8, WaitForHeal}, | ||
|  | 		{disksRemote, majorityCorrupted, 8, Abort}, | ||
|  | 	} | ||
|  | 	for i, test := range testCases { | ||
|  | 		actual := prepForInit(test.disks, test.errs, test.diskCount) | ||
|  | 		if actual != test.action { | ||
|  | 			t.Errorf("Test %d expected %s but receieved %s\n", i+1, test.action, actual) | ||
|  | 		} | ||
|  | 	} | ||
|  | } |