func (s *fetcherSuite) TestFetch(c *C) { s.prereqSnapAssertions(c, 10) db, err := asserts.OpenDatabase(&asserts.DatabaseConfig{ Backstore: asserts.NewMemoryBackstore(), Trusted: s.storeSigning.Trusted, }) c.Assert(err, IsNil) ref := &asserts.Ref{ Type: asserts.SnapRevisionType, PrimaryKey: []string{makeDigest(10)}, } retrieve := func(ref *asserts.Ref) (asserts.Assertion, error) { return ref.Resolve(s.storeSigning.Find) } f := asserts.NewFetcher(db, retrieve, db.Add) err = f.Fetch(ref) c.Assert(err, IsNil) snapRev, err := ref.Resolve(db.Find) c.Assert(err, IsNil) c.Check(snapRev.(*asserts.SnapRevision).SnapRevision(), Equals, 10) snapDecl, err := db.Find(asserts.SnapDeclarationType, map[string]string{ "series": "16", "snap-id": "snap-id-1", }) c.Assert(err, IsNil) c.Check(snapDecl.(*asserts.SnapDeclaration).SnapName(), Equals, "foo") }
func MakeFakeRefreshForSnaps(snaps []string, blobDir string) error { storePrivKey, _ := assertstest.ReadPrivKey(systestkeys.TestStorePrivKey) db, err := asserts.OpenDatabase(&asserts.DatabaseConfig{ KeypairManager: asserts.NewMemoryKeypairManager(), Backstore: asserts.NewMemoryBackstore(), Trusted: sysdb.Trusted(), }) if err != nil { return err } // for signing db.ImportKey(storePrivKey) var cliConfig client.Config cli := client.New(&cliConfig) retrieve := func(ref *asserts.Ref) (asserts.Assertion, error) { headers := make(map[string]string) for i, k := range ref.Type.PrimaryKey { headers[k] = ref.PrimaryKey[i] } as, err := cli.Known(ref.Type.Name, headers) if err != nil { return nil, err } switch len(as) { case 1: return as[0], nil case 0: return nil, asserts.ErrNotFound default: panic(fmt.Sprintf("multiple assertions when retrieving by primary key: %v", ref)) } } save := func(a asserts.Assertion) error { err := db.Add(a) if err != nil { if _, ok := err.(*asserts.RevisionError); !ok { return err } } return writeAssert(a, blobDir) } f := asserts.NewFetcher(db, retrieve, save) for _, snap := range snaps { if err := makeFakeRefreshForSnap(snap, blobDir, db, f); err != nil { return err } } return nil }
// newFetches creates a fetcher used to retrieve assertions and later commit them to the system database in one go. func newFetcher(s *state.State, retrieve func(*asserts.Ref) (asserts.Assertion, error)) *fetcher { db := cachedDB(s) f := &fetcher{db: db} save := func(a asserts.Assertion) error { f.fetched = append(f.fetched, a) return nil } f.Fetcher = asserts.NewFetcher(db, retrieve, save) return f }
// StoreAssertionFetcher creates an asserts.Fetcher for assertions against the given store using dlOpts for authorization, the fetcher will add assertions in the given database and after that also call save for each of them. func StoreAssertionFetcher(sto Store, dlOpts *DownloadOptions, db *asserts.Database, save func(asserts.Assertion) error) asserts.Fetcher { retrieve := func(ref *asserts.Ref) (asserts.Assertion, error) { return sto.Assertion(ref.Type, ref.PrimaryKey, dlOpts.User) } save2 := func(a asserts.Assertion) error { // for checking err := db.Add(a) if err != nil { if _, ok := err.(*asserts.RevisionError); ok { return nil } return fmt.Errorf("cannot add assertion %v: %v", a.Ref(), err) } return save(a) } return asserts.NewFetcher(db, retrieve, save2) }
func MakeFakeRefreshForSnaps(snaps []string, blobDir string) error { storePrivKey, _ := assertstest.ReadPrivKey(systestkeys.TestStorePrivKey) db, err := asserts.OpenDatabase(&asserts.DatabaseConfig{ KeypairManager: asserts.NewMemoryKeypairManager(), Backstore: asserts.NewMemoryBackstore(), Trusted: sysdb.Trusted(), }) if err != nil { return err } // for signing db.ImportKey(storePrivKey) // XXX: ideally for consistency we should talk to the local snapd // but this allows us to go working until snapd itself // start being fully assertion using sto := store.New(nil, nil) retrieve := func(ref *asserts.Ref) (asserts.Assertion, error) { return sto.Assertion(ref.Type, ref.PrimaryKey, nil) } save := func(a asserts.Assertion) error { err := db.Add(a) if err != nil { if _, ok := err.(*asserts.RevisionError); !ok { return err } } return writeAssert(a, blobDir) } f := asserts.NewFetcher(db, retrieve, save) for _, snap := range snaps { if err := makeFakeRefreshForSnap(snap, blobDir, db, f); err != nil { return err } } return nil }