github.com/justincormack/cli@v0.0.0-20201215022714-831ebeae9675/cli/command/defaultcontextstore_test.go (about)

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