Merge lp:~sergiusens/snappy/qualifiedUpdate into lp:~snappy-dev/snappy/15.04-deprecated

Proposed by Sergio Schvezov
Status: Merged
Approved by: Michael Vogt
Approved revision: 460
Merged at revision: 459
Proposed branch: lp:~sergiusens/snappy/qualifiedUpdate
Merge into: lp:~snappy-dev/snappy/15.04-deprecated
Diff against target: 210 lines (+115/-22)
3 files modified
snappy/parts.go (+6/-2)
snappy/snapp.go (+29/-3)
snappy/snapp_test.go (+80/-17)
To merge this branch: bzr merge lp:~sergiusens/snappy/qualifiedUpdate
Reviewer Review Type Date Requested Status
Michael Vogt (community) Approve
Review via email: mp+263987@code.launchpad.net

Commit message

Update using full qualifiers

To post a comment you must log in.
Revision history for this message
Michael Vogt (mvo) wrote :

Nice, this looks good. Just one (silly?) inline question.

Revision history for this message
Michael Vogt (mvo) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'snappy/parts.go'
--- snappy/parts.go 2015-07-06 19:40:55 +0000
+++ snappy/parts.go 2015-07-07 02:36:11 +0000
@@ -248,7 +248,9 @@
248}248}
249249
250// ActiveSnapsByType returns all installed snaps with the given type250// ActiveSnapsByType returns all installed snaps with the given type
251func ActiveSnapsByType(snapTs ...SnapType) (res []Part, err error) {251var ActiveSnapsByType = activeSnapsByTypeImpl
252
253func activeSnapsByTypeImpl(snapTs ...SnapType) (res []Part, err error) {
252 m := NewMetaRepository()254 m := NewMetaRepository()
253 installed, err := m.Installed()255 installed, err := m.Installed()
254 if err != nil {256 if err != nil {
@@ -282,7 +284,9 @@
282}284}
283285
284// ActiveSnapByName returns all active snaps with the given name286// ActiveSnapByName returns all active snaps with the given name
285func ActiveSnapByName(needle string) Part {287var ActiveSnapByName = activeSnapByNameImpl
288
289func activeSnapByNameImpl(needle string) Part {
286 m := NewMetaRepository()290 m := NewMetaRepository()
287 installed, err := m.Installed()291 installed, err := m.Installed()
288 if err != nil {292 if err != nil {
289293
=== modified file 'snappy/snapp.go'
--- snappy/snapp.go 2015-07-06 19:52:32 +0000
+++ snappy/snapp.go 2015-07-07 02:36:11 +0000
@@ -225,6 +225,15 @@
225 Version string `json:"version"`225 Version string `json:"version"`
226}226}
227227
228func (s remoteSnap) qualifiedName() string {
229 switch s.Type {
230 case SnapTypeApp:
231 return fmt.Sprintf("%s.%s", s.Name, s.Namespace)
232 default:
233 return s.Name
234 }
235}
236
228type searchResults struct {237type searchResults struct {
229 Payload struct {238 Payload struct {
230 Packages []remoteSnap `json:"clickindex:package"`239 Packages []remoteSnap `json:"clickindex:package"`
@@ -1253,11 +1262,22 @@
1253func (s *SnapUbuntuStoreRepository) Updates() (parts []Part, err error) {1262func (s *SnapUbuntuStoreRepository) Updates() (parts []Part, err error) {
1254 // the store only supports apps, oem and frameworks currently, so no1263 // the store only supports apps, oem and frameworks currently, so no
1255 // sense in sending it our ubuntu-core snap1264 // sense in sending it our ubuntu-core snap
1256 installed, err := ActiveSnapNamesByType(SnapTypeApp, SnapTypeFramework, SnapTypeOem)1265 installed, err := ActiveSnapsByType(SnapTypeApp, SnapTypeFramework, SnapTypeOem)
1257 if err != nil || len(installed) == 0 {1266 if err != nil || len(installed) == 0 {
1258 return nil, err1267 return nil, err
1259 }1268 }
1260 jsonData, err := json.Marshal(map[string][]string{"name": installed})1269
1270 snapNames := make([]string, 0, len(installed))
1271 for _, snap := range installed {
1272 // this can be dropped once package origins are correctly recorded for everything
1273 if snap.Namespace() != "" {
1274 snapNames = append(snapNames, fmt.Sprintf("%s.%s", snap.Name(), snap.Namespace()))
1275 } else {
1276 snapNames = append(snapNames, snap.Name())
1277 }
1278 }
1279
1280 jsonData, err := json.Marshal(map[string][]string{"name": snapNames})
1261 if err != nil {1281 if err != nil {
1262 return nil, err1282 return nil, err
1263 }1283 }
@@ -1286,7 +1306,13 @@
1286 }1306 }
12871307
1288 for _, pkg := range updateData {1308 for _, pkg := range updateData {
1289 current := ActiveSnapByName(pkg.Name)1309 current := ActiveSnapByName(pkg.qualifiedName())
1310
1311 // this check is for non apps
1312 if current != nil && current.Namespace() != "" && current.Namespace() != pkg.Namespace {
1313 continue
1314 }
1315
1290 if current == nil || current.Version() != pkg.Version {1316 if current == nil || current.Version() != pkg.Version {
1291 snap := NewRemoteSnapPart(pkg)1317 snap := NewRemoteSnapPart(pkg)
1292 parts = append(parts, snap)1318 parts = append(parts, snap)
12931319
=== modified file 'snappy/snapp_test.go'
--- snappy/snapp_test.go 2015-07-06 19:08:24 +0000
+++ snappy/snapp_test.go 2015-07-07 02:36:11 +0000
@@ -105,6 +105,8 @@
105 policy.SecBase = s.secbase105 policy.SecBase = s.secbase
106 regenerateAppArmorRules = regenerateAppArmorRulesImpl106 regenerateAppArmorRules = regenerateAppArmorRulesImpl
107 ActiveSnapNamesByType = activeSnapNamesByTypeImpl107 ActiveSnapNamesByType = activeSnapNamesByTypeImpl
108 ActiveSnapsByType = activeSnapsByTypeImpl
109 ActiveSnapByName = activeSnapByNameImpl
108 duCmd = "du"110 duCmd = "du"
109 stripGlobalRootDir = stripGlobalRootDirImpl111 stripGlobalRootDir = stripGlobalRootDirImpl
110 runScFilterGen = runScFilterGenImpl112 runScFilterGen = runScFilterGenImpl
@@ -511,33 +513,94 @@
511 }513 }
512}514}
513515
516func mockActiveSnapsByType(mockParts []Part) {
517 ActiveSnapsByType = func(snapTs ...SnapType) (res []Part, err error) {
518 return mockParts, nil
519 }
520}
521
522func mockActiveSnapByName(mockPart Part) {
523 ActiveSnapByName = func(string) Part {
524 return mockPart
525 }
526}
527
514func (s *SnapTestSuite) TestUbuntuStoreRepositoryUpdates(c *C) {528func (s *SnapTestSuite) TestUbuntuStoreRepositoryUpdates(c *C) {
515 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {529 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
516 jsonReq, err := ioutil.ReadAll(r.Body)530 jsonReq, err := ioutil.ReadAll(r.Body)
517 c.Assert(err, IsNil)531 c.Assert(err, IsNil)
518 c.Assert(string(jsonReq), Equals, `{"name":["`+funkyAppName+`"]}`)532 c.Assert(string(jsonReq), Equals, `{"name":["`+funkyAppName+`.`+funkyAppOrigin+`"]}`)
519 io.WriteString(w, MockUpdatesJSON)533 io.WriteString(w, MockUpdatesJSON)
520 }))534 }))
521535
522 c.Assert(mockServer, NotNil)536 c.Assert(mockServer, NotNil)
523 defer mockServer.Close()537 defer mockServer.Close()
524538
525 var err error539 var err error
526 storeBulkURI, err = url.Parse(mockServer.URL + "/updates/")540 storeBulkURI, err = url.Parse(mockServer.URL + "/updates/")
527 c.Assert(err, IsNil)541 c.Assert(err, IsNil)
528 snap := NewUbuntuStoreSnapRepository()542 snap := NewUbuntuStoreSnapRepository()
529 c.Assert(snap, NotNil)543 c.Assert(snap, NotNil)
544
545 part := SnapPart{
546 m: &packageYaml{
547 Name: funkyAppName,
548 Type: SnapTypeApp,
549 Version: "41",
550 },
551 namespace: funkyAppOrigin,
552 }
553
554 // override the real ActiveSnapsByType to return our
555 // mock data
556 mockActiveSnapsByType([]Part{&part})
557
558 // the actual test
559 results, err := snap.Updates()
560 c.Assert(err, IsNil)
561 c.Assert(results, HasLen, 1)
562 c.Check(results[0].Name(), Equals, funkyAppName)
563 c.Check(results[0].Version(), Equals, "42")
564}
565
566func (s *SnapTestSuite) TestUbuntuStoreRepositoryUpdatesDifferentNamespace(c *C) {
567 mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
568 jsonReq, err := ioutil.ReadAll(r.Body)
569 c.Assert(err, IsNil)
570 c.Assert(string(jsonReq), Equals, `{"name":["`+funkyAppName+`.yadayada"]}`)
571 io.WriteString(w, MockUpdatesJSON)
572 }))
573
574 c.Assert(mockServer, NotNil)
575 defer mockServer.Close()
576
577 var err error
578 storeBulkURI, err = url.Parse(mockServer.URL + "/updates/")
579 c.Assert(err, IsNil)
580 snap := NewUbuntuStoreSnapRepository()
581 c.Assert(snap, NotNil)
582
583 part := SnapPart{
584 m: &packageYaml{
585 Name: funkyAppName,
586 Type: SnapTypeApp,
587 Version: "41",
588 },
589 namespace: "yadayada",
590 }
591
592 // override the real ActiveSnapsByType to return our
593 // mock data
594 mockActiveSnapsByType([]Part{&part})
530595
531 // override the real ActiveSnapNamesByType to return our596 // override the real ActiveSnapNamesByType to return our
532 // mock data597 // mock data
533 mockActiveSnapNamesByType([]string{funkyAppName})598 mockActiveSnapByName(&part)
534599
535 // the actual test600 // the actual test
536 results, err := snap.Updates()601 results, err := snap.Updates()
537 c.Assert(err, IsNil)602 c.Check(err, IsNil)
538 c.Assert(results, HasLen, 1)603 c.Check(results, HasLen, 0)
539 c.Assert(results[0].Name(), Equals, funkyAppName)
540 c.Assert(results[0].Version(), Equals, "42")
541}604}
542605
543func (s *SnapTestSuite) TestUbuntuStoreRepositoryUpdatesNoSnaps(c *C) {606func (s *SnapTestSuite) TestUbuntuStoreRepositoryUpdatesNoSnaps(c *C) {

Subscribers

People subscribed via source and target branches