Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,24 @@ require (
github.com/google/go-cmp v0.5.9
github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75
github.com/klauspost/compress v1.16.5
github.com/prometheus/client_golang v1.16.0
golang.org/x/sys v0.8.0
gopkg.in/yaml.v3 v3.0.1
gorm.io/driver/sqlite v1.5.1
gorm.io/gorm v1.25.1
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/mattn/go-sqlite3 v1.14.16 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
google.golang.org/protobuf v1.30.0 // indirect
)
36 changes: 36 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/djherbis/times v1.5.0 h1:79myA211VwPhFTqUk8xehWrsEO+zcIZj0zT8mXPVARU=
github.com/djherbis/times v1.5.0/go.mod h1:5q7FDLvbNg1L/KaBmPcWlVR9NmoKo3+ucqUA3ijQhA0=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75 h1:f0n1xnMSmBLzVfsMMvriDyA75NB/oBgILX2GcHXIQzY=
Expand All @@ -8,14 +21,37 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/sqlite v1.5.1 h1:hYyrLkAWE71bcarJDPdZNTLWtr8XrSjOWyjUYI6xdL4=
Expand Down
211 changes: 211 additions & 0 deletions integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"path"
"testing"
"time"

"github.com/prometheus/client_golang/prometheus/testutil"
)

var (
Expand Down Expand Up @@ -140,6 +142,28 @@ func testRequestExistingRepo(t *testing.T) {
config.Repos["repo1"] = &Repo{}
defer delete(config.Repos, "repo1")

requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo1")
if err != nil {
t.Error(err)
}
servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo1")
if err != nil {
t.Error(err)
}
missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo1")
if err != nil {
t.Error(err)
}
cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo1")
if err != nil {
t.Error(err)
}

expectedRequests := testutil.ToFloat64(requestCounter) + 1
expectedServed := testutil.ToFloat64(servedCounter)
expectedMissed := testutil.ToFloat64(missedCounter)
expectedErrorServed := testutil.ToFloat64(cacheErrorCounter) + 1 // expected since we 404

req := httptest.NewRequest("GET", pacolocoURL+"/repo/repo1/test.db", nil)
w := httptest.NewRecorder()
pacolocoHandler(w, req)
Expand All @@ -148,6 +172,24 @@ func testRequestExistingRepo(t *testing.T) {
t.Error("404 response expected")
}

actualRequests := testutil.ToFloat64(requestCounter)
actualServed := testutil.ToFloat64(servedCounter)
actualMissed := testutil.ToFloat64(missedCounter)
actualErrorServed := testutil.ToFloat64(cacheErrorCounter)

if expectedRequests != actualRequests {
t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests)
}
if expectedServed != actualServed {
t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed)
}
if expectedServed != actualServed {
t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed)
}
if expectedErrorServed != actualErrorServed {
t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed)
}

// check that db is not cached
if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo1", "test.db")); !os.IsNotExist(err) {
t.Error("repo1/test.db should be cached")
Expand Down Expand Up @@ -179,6 +221,28 @@ func testRequestExistingRepoWithDb(t *testing.T) {
t.Fatal(err)
}

requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo2")
if err != nil {
t.Error(err)
}
servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo2")
if err != nil {
t.Error(err)
}
missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo2")
if err != nil {
t.Error(err)
}
cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo2")
if err != nil {
t.Error(err)
}

expectedRequests := testutil.ToFloat64(requestCounter) + 1
expectedServed := testutil.ToFloat64(servedCounter)
expectedMissed := testutil.ToFloat64(missedCounter) + 1
expectedErrorServed := testutil.ToFloat64(cacheErrorCounter)

req := httptest.NewRequest("GET", pacolocoURL+"/repo/repo2/test.db", nil)
w := httptest.NewRecorder()
pacolocoHandler(w, req)
Expand All @@ -203,6 +267,24 @@ func testRequestExistingRepoWithDb(t *testing.T) {
w.Header().Get("Last-Modified"))
}

actualRequests := testutil.ToFloat64(requestCounter)
actualServed := testutil.ToFloat64(servedCounter)
actualMissed := testutil.ToFloat64(missedCounter)
actualErrorServed := testutil.ToFloat64(cacheErrorCounter)

if expectedRequests != actualRequests {
t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests)
}
if expectedServed != actualServed {
t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed)
}
if expectedMissed != actualMissed {
t.Errorf("cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed)
}
if expectedErrorServed != actualErrorServed {
t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed)
}

// check that repo is cached
if _, err = os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")); os.IsNotExist(err) {
t.Error("repo2 repo should be cached")
Expand All @@ -226,6 +308,11 @@ func testRequestExistingRepoWithDb(t *testing.T) {
t.Fatal(err)
}

expectedRequests = testutil.ToFloat64(requestCounter) + 1
expectedServed = testutil.ToFloat64(servedCounter)
expectedMissed = testutil.ToFloat64(missedCounter) + 1
expectedErrorServed = testutil.ToFloat64(cacheErrorCounter)

req = httptest.NewRequest("GET", pacolocoURL+"/repo/repo2/test.db", nil)
w = httptest.NewRecorder()
pacolocoHandler(w, req)
Expand All @@ -241,6 +328,23 @@ func testRequestExistingRepoWithDb(t *testing.T) {
t.Errorf("Pacoloco cached incorrect db content: %v", string(content))
}

actualRequests = testutil.ToFloat64(requestCounter)
actualServed = testutil.ToFloat64(servedCounter)
actualMissed = testutil.ToFloat64(missedCounter)
actualErrorServed = testutil.ToFloat64(cacheErrorCounter)

if expectedRequests != actualRequests {
t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests)
}
if expectedServed != actualServed {
t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed)
}
if expectedMissed != actualMissed {
t.Errorf("cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed)
}
if expectedErrorServed != actualErrorServed {
t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed)
}
// check that repo is cached
if _, err := os.Stat(path.Join(testPacolocoDir, "pkgs", "repo2")); os.IsNotExist(err) {
t.Error("repo2 repo should be cached")
Expand Down Expand Up @@ -287,6 +391,42 @@ func testRequestPackageFile(t *testing.T) {
t.Fatal(err)
}

info, err := os.Stat(pkgAtMirror)
if err != nil {
t.Error(err)
}
requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}
servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}
missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}
cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}
cachePackageCounter, err := cachePackageGauge.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}
cachePackageSize, err := cacheSizeGauge.GetMetricWithLabelValues("repo3")
if err != nil {
t.Error(err)
}

expectedRequests := testutil.ToFloat64(requestCounter) + 1
expectedServed := testutil.ToFloat64(servedCounter)
expectedMissed := testutil.ToFloat64(missedCounter) + 1
expectedErrorServed := testutil.ToFloat64(cacheErrorCounter)
expectedPackageNum := testutil.ToFloat64(cachePackageCounter) + 1
expectedSize := testutil.ToFloat64(cachePackageSize) + float64(info.Size())

req := httptest.NewRequest("GET", pacolocoURL+"/repo/repo3/test-1-any.pkg.tar.zst", nil)
w := httptest.NewRecorder()
pacolocoHandler(w, req)
Expand Down Expand Up @@ -314,6 +454,32 @@ func testRequestPackageFile(t *testing.T) {
w.Header().Get("Last-Modified"))
}

actualRequests := testutil.ToFloat64(requestCounter)
actualServed := testutil.ToFloat64(servedCounter)
actualMissed := testutil.ToFloat64(missedCounter)
actualErrorServed := testutil.ToFloat64(cacheErrorCounter)
actualPackageNum := testutil.ToFloat64(cachePackageCounter)
actualSize := testutil.ToFloat64(cachePackageSize)

if expectedRequests != actualRequests {
t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests)
}
if expectedServed != actualServed {
t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed)
}
if expectedServed != actualServed {
t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed)
}
if expectedErrorServed != actualErrorServed {
t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed)
}
if expectedPackageNum != actualPackageNum {
t.Errorf("Cache package number metric check failed: expected %v, got %v", expectedPackageNum, actualPackageNum)
}
if expectedSize != actualSize {
t.Errorf("Cache size metric check failed: expected %v, got %v", expectedSize, actualSize)
}

// check that pkg is cached
content, err = os.ReadFile(path.Join(testPacolocoDir, "pkgs", "repo3", "test-1-any.pkg.tar.zst"))
if err != nil {
Expand All @@ -332,6 +498,11 @@ func testRequestPackageFile(t *testing.T) {
t.Fatal(err)
}

expectedRequests = testutil.ToFloat64(requestCounter) + 1
expectedServed = testutil.ToFloat64(servedCounter) + 1
expectedMissed = testutil.ToFloat64(missedCounter)
expectedErrorServed = testutil.ToFloat64(cacheErrorCounter)

req = httptest.NewRequest("GET", pacolocoURL+"/repo/repo3/test-1-any.pkg.tar.zst", nil)
w = httptest.NewRecorder()
pacolocoHandler(w, req)
Expand Down Expand Up @@ -386,6 +557,28 @@ func testFailover(t *testing.T) {
t.Fatal(err)
}

requestCounter, err := cacheRequestsCounter.GetMetricWithLabelValues("failover")
if err != nil {
t.Error(err)
}
servedCounter, err := cacheServedCounter.GetMetricWithLabelValues("failover")
if err != nil {
t.Error(err)
}
missedCounter, err := cacheMissedCounter.GetMetricWithLabelValues("failover")
if err != nil {
t.Error(err)
}
cacheErrorCounter, err := cacheServingFailedCounter.GetMetricWithLabelValues("failover")
if err != nil {
t.Error(err)
}

expectedRequests := testutil.ToFloat64(requestCounter) + 1
expectedServed := testutil.ToFloat64(servedCounter)
expectedMissed := testutil.ToFloat64(missedCounter) + 1
expectedErrorServed := testutil.ToFloat64(cacheErrorCounter)

req := httptest.NewRequest("GET", pacolocoURL+"/repo/failover/test-1-any.pkg.tar.zst", nil)
w := httptest.NewRecorder()
pacolocoHandler(w, req)
Expand All @@ -406,4 +599,22 @@ func testFailover(t *testing.T) {
if resp.ContentLength != int64(len(pkgFileContent)) {
t.Errorf("Pacoloco returns incorrect length %v", resp.ContentLength)
}

actualRequests := testutil.ToFloat64(requestCounter)
actualServed := testutil.ToFloat64(servedCounter)
actualMissed := testutil.ToFloat64(missedCounter)
actualErrorServed := testutil.ToFloat64(cacheErrorCounter)

if expectedRequests != actualRequests {
t.Errorf("Request metric check failed: expected %v, got %v", expectedRequests, actualRequests)
}
if expectedServed != actualServed {
t.Errorf("Served from cache metric check failed: expected %v, got %v", expectedServed, actualServed)
}
if expectedServed != actualServed {
t.Errorf("Cache miss metric check failed: expected %v, got %v", expectedMissed, actualMissed)
}
if expectedErrorServed != actualErrorServed {
t.Errorf("Cache error metric check failed: expected %v, got %v", expectedErrorServed, actualErrorServed)
}
}
Loading