summaryrefslogtreecommitdiff
diff options
authorMichael Vogt <mvo@ubuntu.com>2020-01-09 17:40:42 +0100
committerMichael Vogt <mvo@ubuntu.com>2020-01-09 17:40:42 +0100
commitd0ce4c1fa7fcd50e5d951c23262070ae396f2331 (patch)
tree14bded0e3b5b68518ccd2377c467d5757ebb4cd1
parent3e6334e315029054a1ef921e224157e0f3fe1a05 (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.go16
-rw-r--r--cmd/snap/cmd_known_test.go95
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`)
}