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)
 | |
| 		}
 | |
| 	}
 | |
| }
 |