github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/command/defaultcontextstore_test.go (about)

     1  package command
     2  
     3  import (
     4  	"crypto/rand"
     5  	"testing"
     6  
     7  	"github.com/docker/cli/cli/config/configfile"
     8  	"github.com/docker/cli/cli/context/docker"
     9  	"github.com/docker/cli/cli/context/store"
    10  	cliflags "github.com/docker/cli/cli/flags"
    11  	"github.com/docker/docker/errdefs"
    12  	"github.com/docker/go-connections/tlsconfig"
    13  	"gotest.tools/v3/assert"
    14  	is "gotest.tools/v3/assert/cmp"
    15  	"gotest.tools/v3/golden"
    16  )
    17  
    18  type endpoint struct {
    19  	Foo string `json:"a_very_recognizable_field_name"`
    20  }
    21  
    22  type testContext struct {
    23  	Bar string `json:"another_very_recognizable_field_name"`
    24  }
    25  
    26  var testCfg = store.NewConfig(func() interface{} { return &testContext{} },
    27  	store.EndpointTypeGetter("ep1", func() interface{} { return &endpoint{} }),
    28  	store.EndpointTypeGetter("ep2", func() interface{} { return &endpoint{} }),
    29  )
    30  
    31  func testDefaultMetadata() store.Metadata {
    32  	return store.Metadata{
    33  		Endpoints: map[string]interface{}{
    34  			"ep1": endpoint{Foo: "bar"},
    35  		},
    36  		Metadata: testContext{Bar: "baz"},
    37  		Name:     DefaultContextName,
    38  	}
    39  }
    40  
    41  func testStore(t *testing.T, meta store.Metadata, tls store.ContextTLSData) store.Store {
    42  	t.Helper()
    43  	return &ContextStoreWithDefault{
    44  		Store: store.New(t.TempDir(), testCfg),
    45  		Resolver: func() (*DefaultContext, error) {
    46  			return &DefaultContext{
    47  				Meta: meta,
    48  				TLS:  tls,
    49  			}, nil
    50  		},
    51  	}
    52  }
    53  
    54  func TestDefaultContextInitializer(t *testing.T) {
    55  	cli, err := NewDockerCli()
    56  	assert.NilError(t, err)
    57  	t.Setenv("DOCKER_HOST", "ssh://someswarmserver")
    58  	cli.configFile = &configfile.ConfigFile{}
    59  	ctx, err := ResolveDefaultContext(&cliflags.ClientOptions{
    60  		TLS: true,
    61  		TLSOptions: &tlsconfig.Options{
    62  			CAFile: "./testdata/ca.pem",
    63  		},
    64  	}, DefaultContextStoreConfig())
    65  	assert.NilError(t, err)
    66  	assert.Equal(t, "default", ctx.Meta.Name)
    67  	assert.DeepEqual(t, "ssh://someswarmserver", ctx.Meta.Endpoints[docker.DockerEndpoint].(docker.EndpointMeta).Host)
    68  	golden.Assert(t, string(ctx.TLS.Endpoints[docker.DockerEndpoint].Files["ca.pem"]), "ca.pem")
    69  }
    70  
    71  func TestExportDefaultImport(t *testing.T) {
    72  	file1 := make([]byte, 1500)
    73  	rand.Read(file1)
    74  	file2 := make([]byte, 3700)
    75  	rand.Read(file2)
    76  	s := testStore(t, testDefaultMetadata(), store.ContextTLSData{
    77  		Endpoints: map[string]store.EndpointTLSData{
    78  			"ep2": {
    79  				Files: map[string][]byte{
    80  					"file1": file1,
    81  					"file2": file2,
    82  				},
    83  			},
    84  		},
    85  	})
    86  	r := store.Export("default", s)
    87  	defer r.Close()
    88  	err := store.Import("dest", s, r)
    89  	assert.NilError(t, err)
    90  
    91  	srcMeta, err := s.GetMetadata("default")
    92  	assert.NilError(t, err)
    93  	destMeta, err := s.GetMetadata("dest")
    94  	assert.NilError(t, err)
    95  	assert.DeepEqual(t, destMeta.Metadata, srcMeta.Metadata)
    96  	assert.DeepEqual(t, destMeta.Endpoints, srcMeta.Endpoints)
    97  
    98  	srcFileList, err := s.ListTLSFiles("default")
    99  	assert.NilError(t, err)
   100  	destFileList, err := s.ListTLSFiles("dest")
   101  	assert.NilError(t, err)
   102  	assert.Equal(t, 1, len(destFileList))
   103  	assert.Equal(t, 1, len(srcFileList))
   104  	assert.Equal(t, 2, len(destFileList["ep2"]))
   105  	assert.Equal(t, 2, len(srcFileList["ep2"]))
   106  
   107  	srcData1, err := s.GetTLSData("default", "ep2", "file1")
   108  	assert.NilError(t, err)
   109  	assert.DeepEqual(t, file1, srcData1)
   110  	srcData2, err := s.GetTLSData("default", "ep2", "file2")
   111  	assert.NilError(t, err)
   112  	assert.DeepEqual(t, file2, srcData2)
   113  
   114  	destData1, err := s.GetTLSData("dest", "ep2", "file1")
   115  	assert.NilError(t, err)
   116  	assert.DeepEqual(t, file1, destData1)
   117  	destData2, err := s.GetTLSData("dest", "ep2", "file2")
   118  	assert.NilError(t, err)
   119  	assert.DeepEqual(t, file2, destData2)
   120  }
   121  
   122  func TestListDefaultContext(t *testing.T) {
   123  	meta := testDefaultMetadata()
   124  	s := testStore(t, meta, store.ContextTLSData{})
   125  	result, err := s.List()
   126  	assert.NilError(t, err)
   127  	assert.Equal(t, 1, len(result))
   128  	assert.DeepEqual(t, meta, result[0])
   129  }
   130  
   131  func TestGetDefaultContextStorageInfo(t *testing.T) {
   132  	s := testStore(t, testDefaultMetadata(), store.ContextTLSData{})
   133  	result := s.GetStorageInfo(DefaultContextName)
   134  	assert.Equal(t, "<IN MEMORY>", result.MetadataPath)
   135  	assert.Equal(t, "<IN MEMORY>", result.TLSPath)
   136  }
   137  
   138  func TestGetDefaultContextMetadata(t *testing.T) {
   139  	meta := testDefaultMetadata()
   140  	s := testStore(t, meta, store.ContextTLSData{})
   141  	result, err := s.GetMetadata(DefaultContextName)
   142  	assert.NilError(t, err)
   143  	assert.Equal(t, DefaultContextName, result.Name)
   144  	assert.DeepEqual(t, meta.Metadata, result.Metadata)
   145  	assert.DeepEqual(t, meta.Endpoints, result.Endpoints)
   146  }
   147  
   148  func TestErrCreateDefault(t *testing.T) {
   149  	meta := testDefaultMetadata()
   150  	s := testStore(t, meta, store.ContextTLSData{})
   151  	err := s.CreateOrUpdate(store.Metadata{
   152  		Endpoints: map[string]interface{}{
   153  			"ep1": endpoint{Foo: "bar"},
   154  		},
   155  		Metadata: testContext{Bar: "baz"},
   156  		Name:     "default",
   157  	})
   158  	assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
   159  	assert.Error(t, err, "default context cannot be created nor updated")
   160  }
   161  
   162  func TestErrRemoveDefault(t *testing.T) {
   163  	meta := testDefaultMetadata()
   164  	s := testStore(t, meta, store.ContextTLSData{})
   165  	err := s.Remove("default")
   166  	assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
   167  	assert.Error(t, err, "default context cannot be removed")
   168  }
   169  
   170  func TestErrTLSDataError(t *testing.T) {
   171  	meta := testDefaultMetadata()
   172  	s := testStore(t, meta, store.ContextTLSData{})
   173  	_, err := s.GetTLSData("default", "noop", "noop")
   174  	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
   175  }