github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/ccl/backupccl/partitioned_backup_test.go (about)

     1  // Copyright 2019 The Cockroach Authors.
     2  //
     3  // Licensed as a CockroachDB Enterprise file under the Cockroach Community
     4  // License (the "License"); you may not use this file except in compliance with
     5  // the License. You may obtain a copy of the License at
     6  //
     7  //     https://github.com/cockroachdb/cockroach/blob/master/licenses/CCL.txt
     8  
     9  package backupccl
    10  
    11  import (
    12  	"testing"
    13  
    14  	"github.com/cockroachdb/cockroach/pkg/testutils"
    15  	"github.com/cockroachdb/cockroach/pkg/util/leaktest"
    16  )
    17  
    18  func TestGetURIsByLocalityKV(t *testing.T) {
    19  	defer leaktest.AfterTest(t)()
    20  
    21  	type TestCase struct {
    22  		name           string
    23  		input          []string
    24  		defaultURI     string
    25  		urisByLocality map[string]string
    26  		error          string
    27  	}
    28  
    29  	testCases := []TestCase{
    30  		{
    31  			name: "singleURINoDefault",
    32  			input: []string{
    33  				"s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    34  			},
    35  			defaultURI:     "s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    36  			urisByLocality: map[string]string{},
    37  		},
    38  		{
    39  			name: "singleURIDefault",
    40  			input: []string{
    41  				"s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=default",
    42  			},
    43  			defaultURI:     "s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    44  			urisByLocality: map[string]string{},
    45  		},
    46  		{
    47  			name: "multipleURIs",
    48  			input: []string{
    49  				"s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=default",
    50  				"s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    51  			},
    52  			defaultURI: "s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    53  			urisByLocality: map[string]string{
    54  				"dc=dc1": "s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    55  			},
    56  		},
    57  		{
    58  			name: "multipleURISameStore",
    59  			input: []string{
    60  				"s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=default",
    61  				"s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    62  				"s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc2",
    63  			},
    64  			defaultURI: "s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    65  			urisByLocality: map[string]string{
    66  				"dc=dc1": "s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    67  				"dc=dc2": "s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456",
    68  			},
    69  		},
    70  		{
    71  			name: "singleURILocality",
    72  			input: []string{
    73  				"s3://foo?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    74  			},
    75  			error: "COCKROACH_LOCALITY dc=dc1 is invalid for a single BACKUP location",
    76  		},
    77  		{
    78  			name: "noDefault",
    79  			input: []string{
    80  				"s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    81  				"s3://baz?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc2",
    82  			},
    83  			error: "no default URL provided for partitioned backup",
    84  		},
    85  		{
    86  			name: "duplicateLocality",
    87  			input: []string{
    88  				"s3://bar?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    89  				"s3://baz?AWS_ACCESS_KEY_ID=123&AWS_SECRET_ACCESS_KEY=456&COCKROACH_LOCALITY=dc%3Ddc1",
    90  			},
    91  			error: "duplicate URIs for locality dc=dc1",
    92  		},
    93  	}
    94  	for _, tc := range testCases {
    95  		t.Run(tc.name, func(t *testing.T) {
    96  			defaultURI, urisByLocality, err := getURIsByLocalityKV(tc.input, "" /* appendPath */)
    97  			if tc.error != "" {
    98  				if !testutils.IsError(err, tc.error) {
    99  					t.Fatalf("expected error matching %q, got %q", tc.error, err)
   100  				}
   101  			} else {
   102  				if err != nil {
   103  					t.Fatal(err)
   104  				}
   105  				if defaultURI != tc.defaultURI {
   106  					t.Fatalf("expected default URI %s, got %s", tc.defaultURI, defaultURI)
   107  				}
   108  				for k, v := range urisByLocality {
   109  					if ev, ok := tc.urisByLocality[k]; !ok {
   110  						t.Fatalf("expected key %s not found", k)
   111  					} else if ev != v {
   112  						t.Fatalf("expected value %s for key %s, found %s", v, k, ev)
   113  					}
   114  				}
   115  				for k := range tc.urisByLocality {
   116  					if _, ok := tc.urisByLocality[k]; !ok {
   117  						t.Fatalf("unexpected key %s", k)
   118  					}
   119  				}
   120  			}
   121  		})
   122  	}
   123  }