func (s *SnapTestSuite) TestLocalSnapSimple(c *C) { snapYaml, err := s.makeInstalledMockSnap() c.Assert(err, IsNil) snap, err := NewInstalledSnapPart(snapYaml, testOrigin) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Check(snap.Name(), Equals, "hello-app") c.Check(snap.Version(), Equals, "1.10") c.Check(snap.IsActive(), Equals, false) c.Check(snap.Description(), Equals, "Hello") c.Check(snap.IsInstalled(), Equals, true) services := snap.ServiceYamls() c.Assert(services, HasLen, 1) c.Assert(services[0].Name, Equals, "svc1") // ensure we get valid Date() st, err := os.Stat(snap.basedir) c.Assert(err, IsNil) c.Assert(snap.Date(), Equals, st.ModTime()) c.Assert(snap.basedir, Equals, filepath.Join(s.tempdir, "snaps", helloAppComposedName, "1.10")) c.Assert(snap.InstalledSize(), Not(Equals), -1) }
func (s *SnapTestSuite) TestServicesWithPorts(c *C) { const packageHello = `name: hello-app version: 1.10 icon: meta/hello.svg binaries: - name: bin/hello services: - name: svc1 description: "Service #1" ports: external: ui: port: 8080/tcp nothing: port: 8081/tcp negotiable: yes - name: svc2 description: "Service #2" ` yamlFile, err := makeInstalledMockSnap(s.tempdir, packageHello) c.Assert(err, IsNil) snap, err := NewInstalledSnapPart(yamlFile, testOrigin) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Assert(snap.Name(), Equals, "hello-app") c.Assert(snap.Origin(), Equals, testOrigin) c.Assert(snap.Version(), Equals, "1.10") c.Assert(snap.IsActive(), Equals, false) services := snap.ServiceYamls() c.Assert(services, HasLen, 2) c.Assert(services[0].Name, Equals, "svc1") c.Assert(services[0].Description, Equals, "Service #1") external1Ui, ok := services[0].Ports.External["ui"] c.Assert(ok, Equals, true) c.Assert(external1Ui.Port, Equals, "8080/tcp") c.Assert(external1Ui.Negotiable, Equals, false) external1Nothing, ok := services[0].Ports.External["nothing"] c.Assert(ok, Equals, true) c.Assert(external1Nothing.Port, Equals, "8081/tcp") c.Assert(external1Nothing.Negotiable, Equals, true) c.Assert(services[1].Name, Equals, "svc2") c.Assert(services[1].Description, Equals, "Service #2") // ensure we get valid Date() st, err := os.Stat(snap.basedir) c.Assert(err, IsNil) c.Assert(snap.Date(), Equals, st.ModTime()) c.Assert(snap.basedir, Equals, filepath.Join(s.tempdir, "snaps", helloAppComposedName, "1.10")) c.Assert(snap.InstalledSize(), Not(Equals), -1) }
func (s *SnapTestSuite) TestLocalSnapActive(c *C) { snapYaml, err := s.makeInstalledMockSnap() c.Assert(err, IsNil) makeSnapActive(snapYaml) snap, err := NewInstalledSnapPart(snapYaml, testOrigin) c.Assert(err, IsNil) c.Assert(snap.IsActive(), Equals, true) }
// ActiveSnapByName returns all active snaps with the given name func ActiveSnapByName(needle string) *Snap { installed, err := (&Overlord{}).Installed() if err != nil { return nil } for _, snap := range installed { if !snap.IsActive() { continue } if snap.Name() == needle { return snap } } return nil }
// GarbageCollect removes all versions two older than the current active // version, as long as NeedsReboot() is false on all the versions found, and // DoInstallGC is set. func GarbageCollect(name string, flags InstallFlags, pb progress.Meter) error { var snaps BySnapVersion if (flags & DoInstallGC) == 0 { return nil } installed, err := (&Overlord{}).Installed() if err != nil { return err } snaps = FindSnapsByName(name, installed) if len(snaps) < 3 { // not enough things installed to do gc return nil } // FIXME: sort by revision sequence sort.Sort(snaps) active := -1 // active is the index of the active snap in snaps (-1 if no active snap) for i, snap := range snaps { if snap.IsActive() { if active > -1 { return ErrGarbageCollectImpossible("more than one active (should not happen).") } active = i } if snap.NeedsReboot() { return nil // don't do gc on snaps that need reboot. } } if active < 1 { // how was this an install? return nil } for _, snap := range snaps[:active-1] { if err := (&Overlord{}).Uninstall(snap, pb); err != nil { return ErrGarbageCollectImpossible(err.Error()) } } return nil }
// ActiveSnapsByType returns all installed snaps with the given type func ActiveSnapsByType(snapTs ...snap.Type) (res []*Snap, err error) { installed, err := (&Overlord{}).Installed() if err != nil { return nil, err } for _, snap := range installed { if !snap.IsActive() { continue } for i := range snapTs { if snap.Type() == snapTs[i] { res = append(res, snap) } } } return res, nil }
func (s *SnapTestSuite) TestServicesWithPorts(c *C) { const packageHello = `name: hello-snap version: 1.10 apps: hello: command: bin/hello svc1: command: svc1 type: forking description: "Service #1" ports: external: ui: port: 8080/tcp nothing: port: 8081/tcp negotiable: yes svc2: command: svc2 type: forking description: "Service #2" ` yamlFile, err := makeInstalledMockSnap(packageHello, 11) c.Assert(err, IsNil) snap, err := NewInstalledSnap(yamlFile) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Assert(snap.Name(), Equals, "hello-snap") c.Assert(snap.Developer(), Equals, testDeveloper) c.Assert(snap.Version(), Equals, "1.10") c.Assert(snap.IsActive(), Equals, false) apps := snap.Info().Apps c.Assert(apps, HasLen, 3) c.Assert(apps["svc1"].Name, Equals, "svc1") c.Assert(apps["svc2"].Name, Equals, "svc2") }
func (s *SnapTestSuite) TestLocalSnapSimple(c *C) { snapYaml, err := makeInstalledMockSnap("", 15) c.Assert(err, IsNil) snap, err := NewInstalledSnap(snapYaml) c.Assert(err, IsNil) c.Assert(snap, NotNil) c.Check(snap.Name(), Equals, "hello-snap") c.Check(snap.Version(), Equals, "1.10") c.Check(snap.IsActive(), Equals, false) c.Check(snap.Info().Summary(), Equals, "hello in summary") c.Check(snap.Info().Description(), Equals, "Hello...") c.Check(snap.Info().Revision, Equals, 15) mountDir := snap.Info().MountDir() _, err = os.Stat(mountDir) c.Assert(err, IsNil) c.Assert(mountDir, Equals, filepath.Join(dirs.SnapSnapsDir, helloSnapComposedName, "15")) }