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