diff options
| author | Michael Vogt <mvo@ubuntu.com> | 2020-01-09 17:40:42 +0100 |
|---|---|---|
| committer | Michael Vogt <mvo@ubuntu.com> | 2020-01-09 17:40:42 +0100 |
| commit | d0ce4c1fa7fcd50e5d951c23262070ae396f2331 (patch) | |
| tree | 14bded0e3b5b68518ccd2377c467d5757ebb4cd1 | |
| parent | 3e6334e315029054a1ef921e224157e0f3fe1a05 (diff) | |
Revert "snap: default to "--direct" in `snap known` for 2.43"release-2.43
This reverts commit 8fbb373f0d42573f630b544d9c5a075354420263.
| -rw-r--r-- | cmd/snap/cmd_known.go | 16 | ||||
| -rw-r--r-- | cmd/snap/cmd_known_test.go | 95 |
2 files changed, 107 insertions, 4 deletions
diff --git a/cmd/snap/cmd_known.go b/cmd/snap/cmd_known.go index dd209b4792..f763134d4a 100644 --- a/cmd/snap/cmd_known.go +++ b/cmd/snap/cmd_known.go @@ -24,8 +24,10 @@ import ( "strings" "github.com/jessevdk/go-flags" + "golang.org/x/xerrors" "github.com/snapcore/snapd/asserts" + "github.com/snapcore/snapd/client" "github.com/snapcore/snapd/i18n" "github.com/snapcore/snapd/overlord/auth" "github.com/snapcore/snapd/store" @@ -40,6 +42,7 @@ type cmdKnown struct { } `positional-args:"true" required:"true"` Remote bool `long:"remote"` + Direct bool `long:"direct"` } var shortKnownHelp = i18n.G("Show known assertions of the provided type") @@ -55,6 +58,8 @@ func init() { }, map[string]string{ // TRANSLATORS: This should not start with a lowercase letter. "remote": i18n.G("Query the store for the assertion, via snapd if possible"), + // TRANSLATORS: This should not start with a lowercase letter. + "direct": i18n.G("Query the store for the assertion, without attempting to go via snapd"), }, []argDesc{ { // TRANSLATORS: This needs to begin with < and end with > @@ -114,7 +119,16 @@ func (x *cmdKnown) Execute(args []string) error { var assertions []asserts.Assertion var err error switch { - case x.Remote: + case x.Remote && !x.Direct: + // --remote will query snapd + assertions, err = x.client.Known(string(x.KnownOptions.AssertTypeName), headers, &client.KnownOptions{Remote: true}) + // if snapd is unavailable automatically fallback + var connErr client.ConnectionError + if xerrors.As(err, &connErr) { + assertions, err = downloadAssertion(string(x.KnownOptions.AssertTypeName), headers) + } + case x.Direct: + // --direct implies remote assertions, err = downloadAssertion(string(x.KnownOptions.AssertTypeName), headers) default: // default is to look only local diff --git a/cmd/snap/cmd_known_test.go b/cmd/snap/cmd_known_test.go index 8953896f00..729591bf2b 100644 --- a/cmd/snap/cmd_known_test.go +++ b/cmd/snap/cmd_known_test.go @@ -28,6 +28,7 @@ import ( "github.com/jessevdk/go-flags" "gopkg.in/check.v1" + "github.com/snapcore/snapd/client" "github.com/snapcore/snapd/store" snap "github.com/snapcore/snapd/cmd/snap" @@ -77,6 +78,45 @@ func (s *SnapSuite) TestKnownViaSnapd(c *check.C) { c.Check(s.Stdout(), check.Equals, mockModelAssertion) c.Check(s.Stderr(), check.Equals, "") c.Check(n, check.Equals, 1) + + // then with "--remote" + n = 0 + s.stdout.Reset() + expectedQuery["remote"] = []string{"true"} + rest, err = snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "model", "series=16", "brand-id=canonical", "model=pi99"}) + c.Assert(err, check.IsNil) + c.Assert(rest, check.DeepEquals, []string{}) + c.Check(s.Stdout(), check.Equals, mockModelAssertion) + c.Check(s.Stderr(), check.Equals, "") + c.Check(n, check.Equals, 1) +} + +func (s *SnapSuite) TestKnownRemoteViaSnapd(c *check.C) { + n := 0 + s.RedirectClientToTestServer(func(w http.ResponseWriter, r *http.Request) { + switch n { + case 0: + c.Check(r.URL.Path, check.Equals, "/v2/assertions/model") + c.Check(r.URL.Query(), check.DeepEquals, url.Values{ + "series": []string{"16"}, + "brand-id": []string{"canonical"}, + "model": []string{"pi99"}, + "remote": []string{"true"}, + }) + w.Header().Set("X-Ubuntu-Assertions-Count", "1") + fmt.Fprintln(w, mockModelAssertion) + default: + c.Fatalf("expected to get 1 requests, now on %d", n+1) + } + n++ + }) + + rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "model", "series=16", "brand-id=canonical", "model=pi99"}) + c.Assert(err, check.IsNil) + c.Assert(rest, check.DeepEquals, []string{}) + c.Check(s.Stdout(), check.Equals, mockModelAssertion) + c.Check(s.Stderr(), check.Equals, "") + c.Check(n, check.Equals, 1) } func (s *SnapSuite) TestKnownRemoteDirect(c *check.C) { @@ -107,8 +147,18 @@ func (s *SnapSuite) TestKnownRemoteDirect(c *check.C) { n++ })) - // first test "--remote - rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "model", "series=16", "brand-id=canonical", "model=pi99"}) + // first test "--remote --direct" + rest, err := snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "--direct", "model", "series=16", "brand-id=canonical", "model=pi99"}) + c.Assert(err, check.IsNil) + c.Assert(rest, check.DeepEquals, []string{}) + c.Check(s.Stdout(), check.Equals, mockModelAssertion) + c.Check(s.Stderr(), check.Equals, "") + c.Check(n, check.Equals, 1) + + // "--direct" behave the same as "--remote --direct" + s.stdout.Reset() + n = 0 + rest, err = snap.Parser(snap.Client()).ParseArgs([]string{"known", "--direct", "model", "series=16", "brand-id=canonical", "model=pi99"}) c.Assert(err, check.IsNil) c.Assert(rest, check.DeepEquals, []string{}) c.Check(s.Stdout(), check.Equals, mockModelAssertion) @@ -116,8 +166,47 @@ func (s *SnapSuite) TestKnownRemoteDirect(c *check.C) { c.Check(n, check.Equals, 1) } +func (s *SnapSuite) TestKnownRemoteAutoFallback(c *check.C) { + var server *httptest.Server + + restorer := snap.MockStoreNew(func(cfg *store.Config, stoCtx store.DeviceAndAuthContext) *store.Store { + if cfg == nil { + cfg = store.DefaultConfig() + } + serverURL, _ := url.Parse(server.URL) + cfg.AssertionsBaseURL = serverURL + return store.New(cfg, stoCtx) + }) + defer restorer() + + n := 0 + server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c.Assert(r.URL.Path, check.Matches, ".*/assertions/.*") // sanity check request + switch n { + case 0: + c.Check(r.Method, check.Equals, "GET") + c.Check(r.URL.Path, check.Equals, "/api/v1/snaps/assertions/model/16/canonical/pi99") + fmt.Fprintln(w, mockModelAssertion) + default: + c.Fatalf("expected to get 1 requests, now on %d", n+1) + } + n++ + })) + + cli := snap.Client() + cli.Hijack(func(*http.Request) (*http.Response, error) { + return nil, client.ConnectionError{Err: fmt.Errorf("no snapd")} + }) + + rest, err := snap.Parser(cli).ParseArgs([]string{"known", "--remote", "model", "series=16", "brand-id=canonical", "model=pi99"}) + c.Assert(err, check.IsNil) + c.Assert(rest, check.DeepEquals, []string{}) + c.Check(s.Stdout(), check.Equals, mockModelAssertion) + c.Check(s.Stderr(), check.Equals, "") +} + func (s *SnapSuite) TestKnownRemoteMissingPrimaryKey(c *check.C) { - _, err := snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "model", "series=16", "brand-id=canonical"}) + _, err := snap.Parser(snap.Client()).ParseArgs([]string{"known", "--remote", "--direct", "model", "series=16", "brand-id=canonical"}) c.Assert(err, check.ErrorMatches, `cannot query remote assertion: must provide primary key: model`) } |
