github.com/ali-iotechsys/cli@v20.10.0+incompatible/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 }