summaryrefslogtreecommitdiff
path: root/integration/plugin
diff options
context:
space:
mode:
authorBrian Goff <cpuguy83@gmail.com>2020-02-10 16:31:04 -0800
committerBrian Goff <cpuguy83@gmail.com>2020-04-02 15:03:06 -0700
commitd7ba1f85ef8f23096f2fd92d0444820543ab9675 (patch)
treeb6389c9cb7e95397aaf34785629e0d77dde778ed /integration/plugin
parentaf0415257efa288d9444de46ba2b45868c7c1a54 (diff)
downloaddocker-d7ba1f85ef8f23096f2fd92d0444820543ab9675.tar.gz
Use containerd dist libs for plugin pull/pull
This removes the use of the old distribution code in the plugin packages and replaces it with containerd libraries for plugin pushes and pulls. Additionally it uses a content store from containerd which seems like it's compatible with the old "basicBlobStore" in the plugin package. This is being used locally isntead of through the containerd client for now. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Diffstat (limited to 'integration/plugin')
-rw-r--r--integration/plugin/common/main_test.go4
-rw-r--r--integration/plugin/common/plugin_test.go121
2 files changed, 125 insertions, 0 deletions
diff --git a/integration/plugin/common/main_test.go b/integration/plugin/common/main_test.go
index 5bcbac2a83..cd42c8f761 100644
--- a/integration/plugin/common/main_test.go
+++ b/integration/plugin/common/main_test.go
@@ -5,12 +5,16 @@ import (
"os"
"testing"
+ "github.com/docker/docker/pkg/reexec"
"github.com/docker/docker/testutil/environment"
)
var testEnv *environment.Execution
func TestMain(m *testing.M) {
+ if reexec.Init() {
+ return
+ }
var err error
testEnv, err = environment.New()
if err != nil {
diff --git a/integration/plugin/common/plugin_test.go b/integration/plugin/common/plugin_test.go
index 35dc7fb980..b2c824e8c4 100644
--- a/integration/plugin/common/plugin_test.go
+++ b/integration/plugin/common/plugin_test.go
@@ -1,12 +1,25 @@
package common // import "github.com/docker/docker/integration/plugin/common"
import (
+ "context"
+ "encoding/base64"
+ "encoding/json"
+ "io"
+ "io/ioutil"
+ "net"
"net/http"
+ "path"
+ "strings"
"testing"
+ "github.com/docker/docker/api/types"
+ "github.com/docker/docker/testutil/daemon"
+ "github.com/docker/docker/testutil/fixtures/plugin"
+ "github.com/docker/docker/testutil/registry"
"github.com/docker/docker/testutil/request"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
+ "gotest.tools/v3/skip"
)
func TestPluginInvalidJSON(t *testing.T) {
@@ -36,3 +49,111 @@ func TestPluginInvalidJSON(t *testing.T) {
})
}
}
+
+func TestPluginInstall(t *testing.T) {
+ skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
+ skip.If(t, testEnv.OSType == "windows")
+ skip.If(t, testEnv.IsRootless, "rootless mode has different view of localhost")
+
+ ctx := context.Background()
+ client := testEnv.APIClient()
+
+ t.Run("no auth", func(t *testing.T) {
+ defer setupTest(t)()
+
+ reg := registry.NewV2(t)
+ defer reg.Close()
+
+ name := "test-" + strings.ToLower(t.Name())
+ repo := path.Join(registry.DefaultURL, name+":latest")
+ assert.NilError(t, plugin.CreateInRegistry(ctx, repo, nil))
+
+ rdr, err := client.PluginInstall(ctx, repo, types.PluginInstallOptions{Disabled: true, RemoteRef: repo})
+ assert.NilError(t, err)
+ defer rdr.Close()
+
+ _, err = io.Copy(ioutil.Discard, rdr)
+ assert.NilError(t, err)
+
+ _, _, err = client.PluginInspectWithRaw(ctx, repo)
+ assert.NilError(t, err)
+ })
+
+ t.Run("with htpasswd", func(t *testing.T) {
+ defer setupTest(t)()
+
+ reg := registry.NewV2(t, registry.Htpasswd)
+ defer reg.Close()
+
+ name := "test-" + strings.ToLower(t.Name())
+ repo := path.Join(registry.DefaultURL, name+":latest")
+ auth := &types.AuthConfig{ServerAddress: registry.DefaultURL, Username: "testuser", Password: "testpassword"}
+ assert.NilError(t, plugin.CreateInRegistry(ctx, repo, auth))
+
+ authEncoded, err := json.Marshal(auth)
+ assert.NilError(t, err)
+
+ rdr, err := client.PluginInstall(ctx, repo, types.PluginInstallOptions{
+ RegistryAuth: base64.URLEncoding.EncodeToString(authEncoded),
+ Disabled: true,
+ RemoteRef: repo,
+ })
+ assert.NilError(t, err)
+ defer rdr.Close()
+
+ _, err = io.Copy(ioutil.Discard, rdr)
+ assert.NilError(t, err)
+
+ _, _, err = client.PluginInspectWithRaw(ctx, repo)
+ assert.NilError(t, err)
+ })
+ t.Run("with insecure", func(t *testing.T) {
+ skip.If(t, !testEnv.IsLocalDaemon())
+
+ addrs, err := net.InterfaceAddrs()
+ assert.NilError(t, err)
+
+ var bindTo string
+ for _, addr := range addrs {
+ ip, ok := addr.(*net.IPNet)
+ if !ok {
+ continue
+ }
+ if ip.IP.IsLoopback() || ip.IP.To4() == nil {
+ continue
+ }
+ bindTo = ip.IP.String()
+ }
+
+ if bindTo == "" {
+ t.Skip("No suitable interface to bind registry to")
+ }
+
+ regURL := bindTo + ":5000"
+
+ d := daemon.New(t)
+ defer d.Stop(t)
+
+ d.Start(t, "--insecure-registry="+regURL)
+ defer d.Stop(t)
+
+ reg := registry.NewV2(t, registry.URL(regURL))
+ defer reg.Close()
+
+ name := "test-" + strings.ToLower(t.Name())
+ repo := path.Join(regURL, name+":latest")
+ assert.NilError(t, plugin.CreateInRegistry(ctx, repo, nil, plugin.WithInsecureRegistry(regURL)))
+
+ client := d.NewClientT(t)
+ rdr, err := client.PluginInstall(ctx, repo, types.PluginInstallOptions{Disabled: true, RemoteRef: repo})
+ assert.NilError(t, err)
+ defer rdr.Close()
+
+ _, err = io.Copy(ioutil.Discard, rdr)
+ assert.NilError(t, err)
+
+ _, _, err = client.PluginInspectWithRaw(ctx, repo)
+ assert.NilError(t, err)
+ })
+ // TODO: test insecure registry with https
+}