Merge branch 'master' into cicd-will-it-never-end

This commit is contained in:
pokeeffe-molecula 2022-01-21 18:07:19 -06:00 committed by GitHub
commit 5241bd4ce4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
264 changed files with 1598 additions and 965 deletions

View file

@ -3,14 +3,6 @@ include:
- template: Security/License-Scanning.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
.go-cache:
variables:
GOPATH: $CI_PROJECT_DIR/.go
cache:
- key: $CI_COMMIT_REF_SLUG
paths:
- .go/pkg/mod/
variables:
GOVERSION: "1.16.13"
@ -24,7 +16,6 @@ stages:
golangci-lint:
image: golangci/golangci-lint:v1.39.0
stage: lint
extends: .go-cache
allow_failure: false
rules:
- if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"'
@ -71,32 +62,35 @@ run jest tests:
run go tests:
stage: test
image: golang:$GOVERSION
extends: .go-cache
rules:
- if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"'
script:
- echo "Running featurebase unit tests..."
- go test ./...
- go test -timeout=30m ./...
tags:
- aws
run go tests race:
stage: test
image: golang:$GOVERSION
extends: .go-cache
rules:
- if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"'
script:
- echo "Running featurebase race tests..."
- go test -race -timeout=30m ./...
- go test -race -timeout=90m ./...
tags:
- aws
run go tests shardwidth22:
stage: test
image: golang:$GOVERSION
extends: .go-cache
rules:
- if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"'
script:
- echo "Running featurebase race tests..."
- go test -tags=shardwidth22 ./...
- go test -timeout=30m -tags=shardwidth22 ./...
tags:
- aws
# we do coverage reporting from the future tests because the json
# output is very difficult to human-read. The alternative would be to
@ -104,17 +98,18 @@ run go tests shardwidth22:
run go tests future:
stage: test
image: golang:1.17.6
extends: .go-cache
rules:
- if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"'
script:
- echo "Running featurebase unit tests..."
- PKG_LIST=$(go list ./... | grep -v internal/clustertests | paste -s -d, -)
- go test -json -coverprofile=coverage.out -covermode=atomic -coverpkg=${PKG_LIST} ./... | tee test-report.out
- go test -timeout=30m -json -coverprofile=coverage.out -covermode=atomic -coverpkg=${PKG_LIST} ./... | tee test-report.out
artifacts:
paths:
- coverage.out
- test-report.out
tags:
- aws
upload to sonarcloud:
stage: test

View file

@ -1,7 +1,6 @@
.PHONY: build check-clean clean build-lattice cover cover-viz default docker docker-build docker-test docker-tag-push generate generate-protoc generate-pql generate-statik gometalinter install install-build-deps install-golangci-lint install-gometalinter install-protoc install-protoc-gen-gofast install-peg install-statik release release-build test testv testv-race testvsub testvsub-race test-txstore-rbf
CLONE_URL=github.com/pilosa/pilosa
MOD_VERSION=v2
VERSION := $(shell git describe --tags 2> /dev/null || echo unknown)
VARIANT = Molecula
GO=go
@ -13,12 +12,14 @@ BRANCH_ID := $(BRANCH)-$(GOOS)-$(GOARCH)
BUILD_TIME := $(shell date -u +%FT%T%z)
SHARD_WIDTH = 20
COMMIT := $(shell git describe --exact-match >/dev/null 2>&1 || git rev-parse --short HEAD)
LDFLAGS="-X github.com/molecula/featurebase/v2.Version=$(VERSION) -X github.com/molecula/featurebase/v2.BuildTime=$(BUILD_TIME) -X github.com/molecula/featurebase/v2.Variant=$(VARIANT) -X github.com/molecula/featurebase/v2.Commit=$(COMMIT) -X github.com/molecula/featurebase/v2.TrialDeadline=$(TRIAL_DEADLINE)"
LDFLAGS="-X github.com/molecula/featurebase/v3.Version=$(VERSION) -X github.com/molecula/featurebase/v3.BuildTime=$(BUILD_TIME) -X github.com/molecula/featurebase/v3.Variant=$(VARIANT) -X github.com/molecula/featurebase/v3.Commit=$(COMMIT) -X github.com/molecula/featurebase/v3.TrialDeadline=$(TRIAL_DEADLINE)"
GO_VERSION=1.16.10
DOCKER_BUILD= # set to 1 to use `docker-build` instead of `build` when creating a release
BUILD_TAGS += shardwidth$(SHARD_WIDTH)
TEST_TAGS = roaringparanoia
UNAME := $(shell uname -s)
TEST_TIMEOUT=30m
RACE_TEST_TIMEOUT=90m
ifeq ($(UNAME), Darwin)
IS_MACOS:=1
else
@ -45,11 +46,11 @@ version:
# Run test suite
test:
$(GO) test ./... -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v
$(GO) test ./... -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v -timeout $(TEST_TIMEOUT)
# Run test suite with race flag
test-race:
CGO_ENABLED=1 $(GO) test ./... -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -race -timeout 60m -v
CGO_ENABLED=1 $(GO) test ./... -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -race -timeout $(RACE_TEST_TIMEOUT) -v
testv: topt testvsub
@ -64,7 +65,7 @@ testvsub:
set -e; for i in boltdb client ctl http pg pql rbf roaring server sql txkey; do \
echo; echo "___ testing subpkg $$i"; \
cd $$i; pwd; \
$(GO) test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v -timeout 60m || break; \
$(GO) test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v -timeout $(RACE_TEST_TIMEOUT) || break; \
echo; echo "999 done testing subpkg $$i"; \
cd ..; \
done
@ -73,7 +74,7 @@ testvsub-race:
set -e; for i in boltdb client ctl http pg pql rbf roaring server sql txkey; do \
echo; echo "___ testing subpkg $$i -race"; \
cd $$i; pwd; \
CGO_ENABLED=1 $(GO) test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v -race -timeout 60m || break; \
CGO_ENABLED=1 $(GO) test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -v -race -timeout $(RACE_TEST_TIMEOUT) || break; \
echo; echo "999 done testing subpkg $$i -race"; \
cd ..; \
done
@ -168,11 +169,11 @@ build-lattice:
# `go generate` protocol buffers
generate-protoc: require-protoc require-protoc-gen-gofast
$(GO) generate github.com/molecula/featurebase/v2/pb
$(GO) generate github.com/molecula/featurebase/v3/pb
# `go generate` statik assets (lattice UI)
generate-statik: build-lattice require-statik
$(GO) generate github.com/molecula/featurebase/v2/statik
$(GO) generate github.com/molecula/featurebase/v3/statik
# `go generate` statik assets (lattice UI) in Docker
generate-statik-docker: build-lattice
@ -180,7 +181,7 @@ generate-statik-docker: build-lattice
# `go generate` stringers
generate-stringer:
$(GO) generate github.com/molecula/featurebase/v2
$(GO) generate github.com/molecula/featurebase/v3
generate-pql: require-peg
cd pql && peg -inline pql.peg && cd ..
@ -191,7 +192,7 @@ generate-proto-grpc: require-protoc require-protoc-gen-go
# TODO: Modify above commands and remove the below mv if possible.
# See https://go-review.googlesource.com/c/protobuf/+/219298/ for info on --go-opt
# I couldn't get it to work during development - Cody
cp -r proto/github.com/molecula/featurebase/v2/proto/ proto/
cp -r proto/github.com/molecula/featurebase/v3/proto/ proto/
rm -rf proto/github.com
# `go generate` all needed packages
@ -248,20 +249,20 @@ pilosa-fsck:
# Run Pilosa tests inside Docker container
docker-test:
docker run --rm -v $(PWD):/go/src/$(CLONE_URL) -w /go/src/$(CLONE_URL) golang:$(GO_VERSION) go test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) ./...
docker run --rm -v $(PWD):/go/src/$(CLONE_URL) -w /go/src/$(CLONE_URL) golang:$(GO_VERSION) go test -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) -timeout $(TEST_TIMEOUT) ./...
# Must use bash in order to -o pipefail; otherwise the tee will hide red tests.
# run top tests, not subdirs. print summary red/green after.
# The \-\-\- FAIL avoids counting the extra two FAIL strings at then bottom of log.topt.
topt:
mv log.topt.roar log.topt.roar.prev || true
$(eval SHELL:=/bin/bash) set -o pipefail; $(GO) test -v -timeout 60m -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) 2>&1 | tee log.topt.roar
$(eval SHELL:=/bin/bash) set -o pipefail; $(GO) test -v -timeout $(RACE_TEST_TIMEOUT) -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) 2>&1 | tee log.topt.roar
@echo " log.topt.roar green: \c"; cat log.topt.roar | grep PASS |wc -l
@echo " log.topt.roar red: \c"; cat log.topt.roar | grep '\-\-\- FAIL' | wc -l
topt-race:
mv log.topt.race log.topt.race.prev || true
$(eval SHELL:=/bin/bash) set -o pipefail; CGO_ENABLED=1 $(GO) test -race -timeout 60m -v -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) 2>&1 | tee log.topt.race
$(eval SHELL:=/bin/bash) set -o pipefail; CGO_ENABLED=1 $(GO) test -race -timeout $(RACE_TEST_TIMEOUT) -v -tags='$(BUILD_TAGS) $(TEST_TAGS)' $(TESTFLAGS) 2>&1 | tee log.topt.race
@echo " log.topt.race green: \c"; cat log.topt.race | grep PASS |wc -l
@echo " log.topt.race red: \c"; cat log.topt.race | grep '\-\-\- FAIL' | wc -l

18
api.go
View file

@ -21,16 +21,16 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/disco"
"github.com/molecula/featurebase/v2/ingest"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v3/disco"
"github.com/molecula/featurebase/v3/ingest"
"github.com/molecula/featurebase/v3/rbf"
//"github.com/molecula/featurebase/v2/pg"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v2/stats"
"github.com/molecula/featurebase/v2/topology"
"github.com/molecula/featurebase/v2/tracing"
//"github.com/molecula/featurebase/v3/pg"
"github.com/molecula/featurebase/v3/pql"
"github.com/molecula/featurebase/v3/roaring"
"github.com/molecula/featurebase/v3/stats"
"github.com/molecula/featurebase/v3/topology"
"github.com/molecula/featurebase/v3/tracing"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
)

View file

@ -6,8 +6,8 @@ import (
"crypto/tls"
"sync"
"github.com/molecula/featurebase/v2/logger"
pb "github.com/molecula/featurebase/v2/proto"
"github.com/molecula/featurebase/v3/logger"
pb "github.com/molecula/featurebase/v3/proto"
"github.com/pkg/errors"
"google.golang.org/grpc"
"google.golang.org/grpc/connectivity"

View file

@ -19,14 +19,14 @@ import (
"time"
"github.com/golang-jwt/jwt"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/authn"
"github.com/molecula/featurebase/v2/boltdb"
"github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/shardwidth"
"github.com/molecula/featurebase/v2/test"
. "github.com/molecula/featurebase/v2/vprint" // nolint:staticcheck
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/authn"
"github.com/molecula/featurebase/v3/boltdb"
"github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/shardwidth"
"github.com/molecula/featurebase/v3/test"
. "github.com/molecula/featurebase/v3/vprint" // nolint:staticcheck
)
func TestAPI_Import(t *testing.T) {
@ -1491,6 +1491,7 @@ admin: "ac97c9e2-346b-42a2-b6da-18bcb61a32fe"`
AuthorizeURL: "https://login.microsoftonline.com/4a137d66-d161-4ae4-b1e6-07e9920874b8/oauth2/v2.0/authorize",
TokenURL: "https://login.microsoftonline.com/4a137d66-d161-4ae4-b1e6-07e9920874b8/oauth2/v2.0/token",
GroupEndpointURL: "https://graph.microsoft.com/v1.0/me/transitiveMemberOf/microsoft.graph.group?$count=true",
RedirectBaseURL: "https://localhost:10101",
LogoutURL: "https://login.microsoftonline.com/common/oauth2/v2.0/logout",
Scopes: []string{"https://graph.microsoft.com/.default", "offline_access"},
SecretKey: "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",

View file

@ -2,7 +2,7 @@
package pilosa
import (
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/testhook"
)
var NewAuditor func() testhook.Auditor = NewNopAuditor

View file

@ -5,7 +5,7 @@ import (
"fmt"
"reflect"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/testhook"
)
// These audit hooks are desireable during testing, but not in

View file

@ -6,8 +6,8 @@ import (
"os"
"reflect"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/testhook"
)
// AuditLeaksOn is a global switch to turn on resource

View file

@ -15,7 +15,7 @@ import (
"time"
"github.com/golang-jwt/jwt"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
"github.com/pkg/errors"
"golang.org/x/oauth2"
)
@ -117,6 +117,7 @@ type Groups struct {
// Authenticate takes in a bearer token `bearer` and returns UserInfo from that token
func (a *Auth) Authenticate(bearer string) (*UserInfo, error) {
// parse the bearer token into a jwt.Token
// this also validates the token, and checks that it's not expired
token, err := jwt.Parse(bearer, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
@ -124,39 +125,21 @@ func (a *Auth) Authenticate(bearer string) (*UserInfo, error) {
return a.secretKey, nil
})
if token == nil || token.Claims == nil || err != nil || !token.Valid {
return nil, errors.Wrap(err, fmt.Sprintf("%#v parsing jwt claims from access tokens", token))
return nil, fmt.Errorf("parsing bearer token: %v", err)
}
userInfo := UserInfo{}
// check that token does not expire now
switch claimType := token.Claims.(type) {
case jwt.MapClaims:
if exp, ok := claimType["exp"]; ok {
var e int64
switch expType := exp.(type) {
case float64:
e = int64(expType)
case json.Number:
e, _ = expType.Int64()
}
if e <= time.Now().Unix() {
return nil, fmt.Errorf("token expired")
}
}
userInfo.UserID = claimType["oid"].(string)
userInfo.UserName = claimType["name"].(string)
userInfo.Token = bearer
claims := token.Claims.(jwt.MapClaims)
userInfo.UserID = claims["oid"].(string)
userInfo.UserName = claims["name"].(string)
userInfo.Token = bearer
g := claimType["molecula-idp-groups"].(string)
groups, err := FromGob64(g)
if err != nil {
return nil, errors.Wrap(err, "decoding groups")
}
userInfo.Groups = groups
default:
return nil, fmt.Errorf("could not parse jwt claims of type %T, expected jwt.MapClaims", claimType)
g := claims["molecula-idp-groups"].(string)
groups, err := FromGob64(g)
if err != nil {
return nil, errors.Wrap(err, "decoding groups")
}
userInfo.Groups = groups
return &userInfo, nil
}
@ -194,8 +177,16 @@ func (a *Auth) Redirect(w http.ResponseWriter, r *http.Request) {
return
}
// with vitamin A!
enrichedTkn, err := a.addGroupMembership(token.AccessToken)
// enrich token with groups!
g, err := a.getGroups(token.AccessToken)
if err != nil {
a.logger.Warnf("getting groups from IdP: %+v", err)
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
// with vitamin G! (for groups)
enrichedTkn, err := a.addGroupMembership(token.AccessToken, g)
if err != nil {
a.logger.Warnf("enriching token with group membership: %+v", err)
http.Error(w, "Bad Request", http.StatusBadRequest)
@ -217,40 +208,28 @@ func (a *Auth) getToken(r *http.Request, code string) (*oauth2.Token, error) {
// addGroupMembership is only called in `a.Redirect`. It adds groups to a jwt's
// claims, and signs it using `a.secretKey`.
func (a *Auth) addGroupMembership(token string) (string, error) {
g, err := a.getGroups(token)
if err != nil {
return "", err
}
func (a *Auth) addGroupMembership(token string, g []Group) (string, error) {
// parse token into jwt
unenriched, _, err := new(jwt.Parser).ParseUnverified(token, jwt.MapClaims{})
if unenriched == nil || unenriched.Claims == nil || err != nil {
return "", errors.Wrap(err, fmt.Sprintf("%v parsing jwt claims from access tokens", token))
return "", fmt.Errorf("parsing bearer token: %v", err)
}
enriched := jwt.New(jwt.SigningMethodHS256)
enriched.Claims = unenriched.Claims
var tokenStr string
// parse groups into string format
switch claims := enriched.Claims.(type) {
case jwt.MapClaims:
groupString, err := ToGob64(g)
if err != nil {
return "", errors.Wrap(err, "failed to serialize groups")
}
claims := enriched.Claims.(jwt.MapClaims)
groupString, err := ToGob64(g)
if err != nil {
return "", errors.Wrap(err, "failed to serialize groups")
}
// stick it into jwt claims
claims["molecula-idp-groups"] = groupString
// stick it into jwt claims
claims["molecula-idp-groups"] = groupString
// get stringified and signed jwt
tokenStr, err = enriched.SignedString(a.secretKey)
if err != nil {
return "", errors.Wrap(err, "signing jwt")
}
default:
return "", fmt.Errorf("could not parse jwt claims of type %T, expected jwt.MapClaims", claims)
// get stringified and signed jwt
tokenStr, err := enriched.SignedString(a.secretKey)
if err != nil {
return "", errors.Wrap(err, "signing jwt")
}
return tokenStr, nil
@ -303,7 +282,7 @@ func decodeHex(hexstr string) ([]byte, error) {
return nil, errors.Wrap(err, "decoding hex string to byte slice")
}
if len(data) != 32 {
return nil, errors.Wrap(err, "invalid key length")
return nil, fmt.Errorf("invalid key length")
}
return data, nil
}

View file

@ -1,16 +1,24 @@
package authn
import (
"bytes"
"encoding/hex"
"fmt"
"net/http"
"net/http/httptest"
"os"
"reflect"
"strings"
"testing"
"time"
"github.com/molecula/featurebase/v2/logger"
"github.com/golang-jwt/jwt"
"github.com/molecula/featurebase/v3/logger"
"github.com/pkg/errors"
)
func TestAuth(t *testing.T) {
func NewTestAuth(t *testing.T) *Auth {
t.Helper()
var (
ClientID = "e9088663-eb08-41d7-8f65-efb5f54bbb71"
ClientSecret = "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF"
@ -20,7 +28,6 @@ func TestAuth(t *testing.T) {
LogoutURL = "https://login.microsoftonline.com/common/oauth2/v2.0/logout"
Scopes = []string{"https://graph.microsoft.com/.default", "offline_access"}
Key = "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF"
ShortKey = "DEADBEEFD"
)
a, err := NewAuth(
@ -36,9 +43,13 @@ func TestAuth(t *testing.T) {
Key,
)
if err != nil {
t.Errorf("building auth object%s", err)
t.Fatalf("building auth object%s", err)
}
return a
}
func TestAuth(t *testing.T) {
a := NewTestAuth(t)
t.Run("SetCookie", func(t *testing.T) {
w := httptest.NewRecorder()
err := a.setCookie(w, "a cookie value", time.Now().Add(time.Hour))
@ -53,23 +64,267 @@ func TestAuth(t *testing.T) {
if got, want := w.Result().Cookies()[0].Path, "/"; got != want {
t.Fatalf("path=%s, want %s", got, want)
}
})
t.Run("KeyLength", func(t *testing.T) {
_, err := NewAuth(
logger.NewStandardLogger(os.Stdout),
"http://localhost:10101/",
Scopes,
AuthorizeURL,
TokenURL,
GroupEndpointURL,
LogoutURL,
ClientID,
ClientSecret,
ShortKey,
[]string{"https://graph.microsoft.com/.default", "offline_access"},
"https://login.microsoftonline.com/4a137d66-d161-4ae4-b1e6-07e9920874b8/oauth2/v2.0/authorize",
"https://login.microsoftonline.com/4a137d66-d161-4ae4-b1e6-07e9920874b8/oauth2/v2.0/token",
"https://graph.microsoft.com/v1.0/me/transitiveMemberOf/microsoft.graph.group?$count=true",
"https://login.microsoftonline.com/common/oauth2/v2.0/logout",
"e9088663-eb08-41d7-8f65-efb5f54bbb71",
"DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
"DEADBEEFD",
)
if err == nil || !strings.Contains(err.Error(), "decoding secret key") {
t.Fatalf("expected error decoding secret key got: %v", err)
}
})
t.Run("GetSecretKey", func(t *testing.T) {
want, _ := hex.DecodeString("DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF")
if got := a.SecretKey(); !bytes.Equal(got, want) {
t.Fatalf("expected %v, got %v", got, want)
}
})
cases := []struct {
name string
uid string
uname string
exp interface{}
groups []Group
err error
}{
{
name: "GoodToken",
uid: "42",
uname: "A. Token",
groups: []Group{
{
GroupID: "ac97c9e2-346b-42a2-b6da-18bcb61a32fe",
GroupName: "adminGroup",
},
},
},
{
name: "ExpiredToken",
uid: "42",
uname: "A. Token",
groups: []Group{
{
GroupID: "ac97c9e2-346b-42a2-b6da-18bcb61a32fe",
GroupName: "adminGroup",
},
},
exp: "-17764800",
err: errors.Wrap(fmt.Errorf("Token is expired"), "parsing bearer token"),
},
}
for _, test := range cases {
t.Run(test.name, func(t *testing.T) {
tkn := jwt.New(jwt.SigningMethodHS256)
claims := tkn.Claims.(jwt.MapClaims)
groupString, err := ToGob64(test.groups)
if err != nil {
t.Fatalf("unexpected error when gobbing groups %v", err)
}
claims["molecula-idp-groups"] = groupString
claims["oid"] = test.uid
claims["name"] = test.uname
if test.exp != nil {
claims["exp"] = test.exp
}
token, err := tkn.SignedString(a.SecretKey())
if err != nil {
t.Fatalf("unexpected error when signing token %v", err)
}
uinfo, err := a.Authenticate(token)
// okay this part kind of sucks bc we need to check errors and i
// dont want to write a whole new test for things that should have
// errors just to avoid this mess. errors.Is doesn't work either
if (test.err == nil && err != nil) || (test.err != nil && err == nil) {
t.Fatalf("expected %v, but got %v", test.err, err)
} else if test.err != nil && err != nil {
if test.err.Error() != err.Error() {
t.Fatalf("expected %v, but got %v", test.err, err)
} else {
return
}
}
if !reflect.DeepEqual(uinfo.Groups, test.groups) {
t.Fatalf("expected %v, got %v", test.groups, uinfo.Groups)
}
if !reflect.DeepEqual(uinfo.UserID, test.uid) {
t.Fatalf("expected %v, got %v", test.uid, uinfo.UserID)
}
if !reflect.DeepEqual(uinfo.UserName, test.uname) {
t.Fatalf("expected %v, got %v", test.uname, uinfo.UserName)
}
})
}
}
func TestGobs(t *testing.T) {
t.Run("goodGob!", func(t *testing.T) {
g := []Group{
{
GroupID: "groupA",
GroupName: "groupA-Name",
},
{
GroupID: "groupB",
GroupName: "groupB-Name",
},
{
GroupID: "groupC",
GroupName: "groupC-Name",
},
}
gobbed, err := ToGob64(g)
if err != nil {
t.Fatalf("could not gob %+v", g)
}
ungobbed, err := FromGob64(gobbed)
if err != nil {
t.Fatalf("could not ungob %+v", gobbed)
}
if !reflect.DeepEqual(ungobbed, g) {
t.Fatalf("expected %v, got %v", g, ungobbed)
}
})
}
func TestDecodeHex(t *testing.T) {
t.Run("cantDecode", func(t *testing.T) {
_, err := decodeHex("gggg")
if err == nil {
t.Fatalf("expected err cannot decode slice, got nil")
}
})
t.Run("tooSmall", func(t *testing.T) {
_, err := decodeHex("DEADBEEF")
if err == nil {
t.Fatalf("expected err wrong length, got nil")
}
})
t.Run("tooBig", func(t *testing.T) {
_, err := decodeHex("DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF")
if err == nil {
t.Fatalf("expected err wrong length, got nil")
}
})
t.Run("justRight", func(t *testing.T) {
_, err := decodeHex("DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF")
if err != nil {
t.Fatalf("expected nil, got %v", err)
}
})
}
func TestAddGroupMembership(t *testing.T) {
cases := []struct {
name string
groups []Group
err error
}{
{
name: "emptyGroups",
groups: []Group{},
err: nil,
},
{
name: "happyPath",
groups: []Group{
{
GroupID: "ac97c9e2-346b-42a2-b6da-18bcb61a32fe",
GroupName: "adminGroup",
},
},
err: nil,
},
}
a := NewTestAuth(t)
for _, test := range cases {
t.Run(test.name, func(t *testing.T) {
tkn := jwt.New(jwt.SigningMethodHS256)
token, err := tkn.SignedString(a.SecretKey())
if err != nil {
t.Fatalf("unexpected error when signing token %v", err)
}
tokenWithGroups, err := a.addGroupMembership(token, test.groups)
// okay this part kind of sucks bc we need to check errors and i
// dont want to write a whole new test for things that should have
// errors just to avoid this mess. errors.Is doesn't work either
if (test.err == nil && err != nil) || (test.err != nil && err == nil) {
t.Fatalf("expected %v but got %v", test.err, err)
} else if test.err != nil && err != nil {
if test.err.Error() != err.Error() {
t.Fatalf("expected %v, but got %v", test.err, err)
} else {
return
}
}
parsed, _, err := new(jwt.Parser).ParseUnverified(tokenWithGroups, jwt.MapClaims{})
if err != nil {
t.Fatalf("unexpected error parsing token %v", err)
}
claims := parsed.Claims.(jwt.MapClaims)
groups, err := FromGob64(claims["molecula-idp-groups"].(string))
if err != nil {
t.Fatalf("unexpected error parsing groupString %v", err)
}
if !reflect.DeepEqual(groups, test.groups) {
t.Fatalf("expected %v, got %v", test.groups, groups)
}
})
}
}
func TestHandlers(t *testing.T) {
a := NewTestAuth(t)
t.Run("login", func(t *testing.T) {
req := httptest.NewRequest("GET", "/login", nil)
w := httptest.NewRecorder()
a.Login(w, req)
resp := w.Result()
if resp.StatusCode != http.StatusTemporaryRedirect {
t.Fatalf("expected redirect, got %v", resp.StatusCode)
}
redirect := a.oAuthConfig.AuthCodeURL(a.oAuthConfig.Endpoint.AuthURL)
if got, err := resp.Location(); err != nil || got.String() != redirect {
t.Fatalf("expected %v, got %v", redirect, got.Path)
}
})
t.Run("logout", func(t *testing.T) {
req := httptest.NewRequest("GET", "/logout", nil)
w := httptest.NewRecorder()
a.Logout(w, req)
resp := w.Result()
if resp.StatusCode != http.StatusTemporaryRedirect {
t.Fatalf("expected redirect, got %v", resp.StatusCode)
}
redirect := fmt.Sprintf("%s?post_logout_redirect_uri=%s/", a.logoutEndpoint, a.fbURL)
if got, err := resp.Location(); err != nil || got.String() != redirect {
t.Fatalf("expected %v, got %v", redirect, got.Path)
}
for _, c := range resp.Cookies() {
if c.Name == "molecula-chip" {
if c.Value != "" {
t.Fatalf("cookie not set to empty value!")
}
want := time.Unix(0, 0).Unix()
got := c.Expires.Unix()
if want != got {
t.Fatalf("expected %v, got %v", want, got)
}
break
}
}
})
}

View file

@ -19,7 +19,7 @@ import (
"io"
"io/ioutil"
"github.com/molecula/featurebase/v2/authn"
"github.com/molecula/featurebase/v3/authn"
"gopkg.in/yaml.v2"
)
@ -120,7 +120,7 @@ func (p *GroupPermissions) IsAdmin(groups []authn.Group) bool {
func (p *GroupPermissions) GetAuthorizedIndexList(groups []authn.Group, desiredPermission Permission) (indexList []string) {
// if user is admin, find all indexes in permissions file and return them
if admin := p.IsAdmin(groups); admin {
if p.IsAdmin(groups) {
for groupId := range p.Permissions {
for index := range p.Permissions[groupId] {
indexList = append(indexList, index)
@ -132,7 +132,7 @@ func (p *GroupPermissions) GetAuthorizedIndexList(groups []authn.Group, desiredP
for _, group := range groups {
if _, ok := p.Permissions[group.GroupID]; ok {
for index, permission := range p.Permissions[group.GroupID] {
if permission >= desiredPermission {
if permission.Satisfies(desiredPermission) {
indexList = append(indexList, index)
}
}

View file

@ -20,8 +20,8 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/authn"
"github.com/molecula/featurebase/v2/authz"
"github.com/molecula/featurebase/v3/authn"
"github.com/molecula/featurebase/v3/authz"
)
func TestAuth_ReadPermissionsFile(t *testing.T) {

View file

@ -12,7 +12,7 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v3"
"github.com/pkg/errors"
bolt "go.etcd.io/bbolt"

View file

@ -10,10 +10,10 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/boltdb"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v2/topology"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/boltdb"
"github.com/molecula/featurebase/v3/testhook"
"github.com/molecula/featurebase/v3/topology"
)
//var vv = pilosa.VV

View file

@ -4,7 +4,7 @@ package pilosa
import (
"fmt"
"github.com/molecula/featurebase/v2/topology"
"github.com/molecula/featurebase/v3/topology"
"github.com/pkg/errors"
)

2
bsi.go
View file

@ -4,7 +4,7 @@ package pilosa
import (
"math/bits"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v3/roaring"
)
// bsiData contains BSI-structured data.

View file

@ -10,9 +10,9 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/lru"
pb "github.com/molecula/featurebase/v2/proto"
"github.com/molecula/featurebase/v2/stats"
"github.com/molecula/featurebase/v3/lru"
pb "github.com/molecula/featurebase/v3/proto"
"github.com/molecula/featurebase/v3/stats"
"github.com/pkg/errors"
)

View file

@ -5,7 +5,7 @@ import (
"reflect"
"testing"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v3"
)
// Ensure cache stays constrained to its configured size.

View file

@ -2,9 +2,9 @@
package pilosa
import (
"github.com/molecula/featurebase/v2/roaring"
txkey "github.com/molecula/featurebase/v2/short_txkey"
"github.com/molecula/featurebase/v2/vprint"
"github.com/molecula/featurebase/v3/roaring"
txkey "github.com/molecula/featurebase/v3/short_txkey"
"github.com/molecula/featurebase/v3/vprint"
)
// catcher is useful to report error locations with a

View file

@ -6,9 +6,9 @@ import (
"io"
"time"
"github.com/molecula/featurebase/v2/ingest"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/topology"
"github.com/molecula/featurebase/v3/ingest"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/topology"
)
// Bit represents the intersection of a row and a column. It can be specified by
@ -36,7 +36,7 @@ type FieldValue struct {
// While I understand that putting the entire Client behind an interface might require this many methods,
// I don't want to let it go unquestioned.
// Another note from Travis: I think we eventually want to unify `InternalClient` with
// the `github.com/molecula/featurebase/v2/client` client.
// the `github.com/molecula/featurebase/v3/client` client.
// Doing that may obviate the need to refactor this.
type InternalClient interface {
InternalQueryClient

View file

@ -6,9 +6,9 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/client/egpool"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v3/client/egpool"
"github.com/molecula/featurebase/v3/logger"
"github.com/molecula/featurebase/v3/roaring"
"github.com/pkg/errors"
)

View file

@ -10,7 +10,7 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v3/test"
"github.com/pkg/errors"
)

View file

@ -20,13 +20,13 @@ import (
"time"
"github.com/golang/protobuf/proto" //nolint:staticcheck
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/logger"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v2/stats"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/logger"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/pb"
"github.com/molecula/featurebase/v3/pql"
"github.com/molecula/featurebase/v3/roaring"
"github.com/molecula/featurebase/v3/stats"
"github.com/opentracing/opentracing-go"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"

View file

@ -7,10 +7,10 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2/disco"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/shardwidth"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v3/disco"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/shardwidth"
"github.com/molecula/featurebase/v3/test"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
)

View file

@ -10,7 +10,7 @@ import (
"reflect"
"testing"
pnet "github.com/molecula/featurebase/v2/net"
pnet "github.com/molecula/featurebase/v3/net"
)
func TestQueryWithError(t *testing.T) {

View file

@ -7,7 +7,7 @@ package client
import (
"sync"
pnet "github.com/molecula/featurebase/v2/net"
pnet "github.com/molecula/featurebase/v3/net"
)
// Cluster contains hosts in a Pilosa cluster.

View file

@ -7,7 +7,7 @@ package client
import (
"testing"
pnet "github.com/molecula/featurebase/v2/net"
pnet "github.com/molecula/featurebase/v3/net"
)
func TestNewClusterWithHost(t *testing.T) {

View file

@ -10,7 +10,7 @@ import (
"strings"
"time"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v3/client"
)
// Format is the format of the data in the CSV file.

View file

@ -10,8 +10,8 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v2/client/csv"
"github.com/molecula/featurebase/v3/client"
"github.com/molecula/featurebase/v3/client/csv"
)
func TestCSVIterate(t *testing.T) {

View file

@ -8,9 +8,9 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v2/client/csv"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/client"
"github.com/molecula/featurebase/v3/client/csv"
)
func TestCSVColumnIterator(t *testing.T) {

View file

@ -11,7 +11,7 @@ Usage:
import (
"fmt"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v3/client"
)
// Create a Client instance

View file

@ -5,7 +5,7 @@ import (
"errors"
"testing"
"github.com/molecula/featurebase/v2/client/egpool"
"github.com/molecula/featurebase/v3/client/egpool"
)
func TestEGPool(t *testing.T) {

View file

@ -3,7 +3,7 @@ package client
import (
"time"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
"github.com/pkg/errors"
)

View file

@ -5,8 +5,8 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v3/logger"
"github.com/molecula/featurebase/v3/test"
)
func TestIngestAPIBatchAdd(t *testing.T) {

View file

@ -13,7 +13,7 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v3/pql"
"github.com/pkg/errors"
)

View file

@ -13,8 +13,8 @@ import (
"testing"
"time"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/pql"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/pql"
"github.com/pkg/errors"
)

View file

@ -7,7 +7,7 @@ package client_test
import (
"testing"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v3/client"
)
func TestColumnShard(t *testing.T) {

View file

@ -8,7 +8,7 @@ import (
"encoding/json"
"fmt"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v3/pb"
)
// QueryResponse types.

View file

@ -11,7 +11,7 @@ import (
"reflect"
"testing"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v3/pb"
)
func TestNewRowResultFromInternal(t *testing.T) {

View file

@ -7,7 +7,7 @@ package client
import (
"sync"
pnet "github.com/molecula/featurebase/v2/net"
pnet "github.com/molecula/featurebase/v3/net"
)
type shardNodes struct {

View file

@ -10,12 +10,12 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/disco"
"github.com/molecula/featurebase/v2/ingest"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v2/topology"
"github.com/molecula/featurebase/v2/tracing"
"github.com/molecula/featurebase/v3/disco"
"github.com/molecula/featurebase/v3/ingest"
"github.com/molecula/featurebase/v3/logger"
"github.com/molecula/featurebase/v3/roaring"
"github.com/molecula/featurebase/v3/topology"
"github.com/molecula/featurebase/v3/tracing"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
)

View file

@ -12,11 +12,11 @@ import (
"time"
"github.com/davecgh/go-spew/spew"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v2/topology"
. "github.com/molecula/featurebase/v2/vprint" // nolint:staticcheck
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/roaring"
"github.com/molecula/featurebase/v3/testhook"
"github.com/molecula/featurebase/v3/topology"
. "github.com/molecula/featurebase/v3/vprint" // nolint:staticcheck
)
// Ensure that fragCombos creates the correct fragment mapping.

2
cmd.go
View file

@ -4,7 +4,7 @@ package pilosa
import (
"io"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
)
// CmdIO holds standard unix inputs and outputs.

View file

@ -5,7 +5,7 @@ import (
"context"
"io"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)

View file

@ -12,10 +12,10 @@ import (
"io/ioutil"
gohttp "net/http"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/http"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/vprint"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/http"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/vprint"
"os"
"strconv"

View file

@ -8,7 +8,7 @@ import (
"github.com/spf13/cobra"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
)
var checker *ctl.CheckCommand

View file

@ -5,7 +5,7 @@ import (
"context"
"io"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)

View file

@ -7,8 +7,8 @@ import (
"github.com/spf13/cobra"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3/ctl"
"github.com/molecula/featurebase/v3/server"
)
var conf *ctl.ConfigCommand

View file

@ -8,7 +8,7 @@ import (
"github.com/spf13/cobra"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
)
var inspector *ctl.InspectCommand

View file

@ -7,7 +7,7 @@ import (
"github.com/spf13/cobra"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
)
var Exporter *ctl.ExportCommand

View file

@ -5,7 +5,7 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/cmd"
"github.com/molecula/featurebase/v3/cmd"
)
func TestExportHelp(t *testing.T) {

View file

@ -9,7 +9,7 @@ import (
"os"
"strings"
"github.com/molecula/featurebase/v2/sql2"
"github.com/molecula/featurebase/v3/sql2"
)
func main() {

View file

@ -8,7 +8,7 @@ import (
"fmt"
"os"
"github.com/molecula/featurebase/v2/cmd"
"github.com/molecula/featurebase/v3/cmd"
)
func main() {

View file

@ -7,7 +7,7 @@ import (
"github.com/spf13/cobra"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
)
var generateConf *ctl.GenerateConfigCommand

View file

@ -5,8 +5,8 @@ import (
"context"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)

View file

@ -5,10 +5,10 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v2/cmd"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v3/cmd"
"github.com/molecula/featurebase/v3/pql"
)
func TestImportHelp(t *testing.T) {

View file

@ -5,7 +5,7 @@ import (
"context"
"io"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)
@ -13,9 +13,9 @@ func newKeygenCommand(stdin io.Reader, stdout io.Writer, stderr io.Writer) *cobr
cmd := ctl.NewKeygenCommand(stdin, stdout, stderr)
ccmd := &cobra.Command{
Use: "keygen",
Short: "Generate keys for authentication.",
Short: "Generate secret key for authentication.",
Long: `
Generate hash and block keys to configure FeatureBase for Authentication.
Generate secret key to configure FeatureBase for Authentication.
`,
RunE: func(c *cobra.Command, args []string) error {
return cmd.Run(context.Background())
@ -23,6 +23,6 @@ Generate hash and block keys to configure FeatureBase for Authentication.
}
flags := ccmd.Flags()
flags.IntVarP(&cmd.KeyLength, "length", "l", 32, "length of keys to produce")
flags.IntVarP(&cmd.KeyLength, "length", "l", 32, "length of the key to produce")
return ccmd
}

View file

@ -16,8 +16,8 @@ import (
"strings"
"time"
"github.com/molecula/featurebase/v2"
phttp "github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v3"
phttp "github.com/molecula/featurebase/v3/http"
"golang.org/x/sync/errgroup"
)

View file

@ -16,12 +16,12 @@ import (
"time"
"github.com/gogo/protobuf/proto"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/client"
"github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v2/vprint"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/client"
"github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/pb"
"github.com/molecula/featurebase/v3/pql"
"github.com/molecula/featurebase/v3/vprint"
"github.com/pkg/errors"
vegeta "github.com/tsenart/vegeta/v12/lib"
)

View file

@ -7,12 +7,12 @@ import (
"strconv"
"testing"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/boltdb"
"github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/test"
. "github.com/molecula/featurebase/v2/vprint" // nolint:staticcheck
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/boltdb"
"github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/test"
. "github.com/molecula/featurebase/v3/vprint" // nolint:staticcheck
)
func Test_RandomQuery(t *testing.T) {

View file

@ -8,7 +8,7 @@ import (
"io"
"strconv"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)

View file

@ -5,7 +5,7 @@ import (
"context"
"io"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v3/ctl"
"github.com/spf13/cobra"
)

View file

@ -12,11 +12,11 @@ import (
"strings"
"syscall"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v2/rbf/cfg"
"github.com/molecula/featurebase/v2/roaring"
txkey "github.com/molecula/featurebase/v2/short_txkey"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/rbf"
"github.com/molecula/featurebase/v3/rbf/cfg"
"github.com/molecula/featurebase/v3/roaring"
txkey "github.com/molecula/featurebase/v3/short_txkey"
"github.com/spf13/cobra"
)

View file

@ -6,7 +6,7 @@ import (
"io"
"strings"
pilosa "github.com/molecula/featurebase/v2"
pilosa "github.com/molecula/featurebase/v3"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"

View file

@ -12,8 +12,8 @@ import (
"time"
"github.com/molecula/featurebase/v2/cmd"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/cmd"
"github.com/molecula/featurebase/v3/testhook"
"github.com/spf13/cobra"
)

View file

@ -4,10 +4,10 @@ package cmd
import (
"io"
"github.com/molecula/featurebase/v2/ctl"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/tracing"
"github.com/molecula/featurebase/v2/tracing/opentracing"
"github.com/molecula/featurebase/v3/ctl"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/tracing"
"github.com/molecula/featurebase/v3/tracing/opentracing"
"github.com/pkg/errors"
"github.com/spf13/cobra"
jaegercfg "github.com/uber/jaeger-client-go/config"

View file

@ -7,10 +7,10 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2/cmd"
_ "github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v2/toml"
"github.com/molecula/featurebase/v3/cmd"
_ "github.com/molecula/featurebase/v3/test"
"github.com/molecula/featurebase/v3/testhook"
"github.com/molecula/featurebase/v3/toml"
"github.com/pkg/errors"
)

View file

@ -17,10 +17,10 @@ import (
"strings"
"time"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/http"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/vprint"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/http"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/vprint"
)
// slurp: slurp is a load-tester for importing bulk data.

View file

@ -12,10 +12,10 @@ import (
"path/filepath"
"time"
pilosa "github.com/molecula/featurebase/v2"
fb_http "github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/topology"
pilosa "github.com/molecula/featurebase/v3"
fb_http "github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/topology"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
)
@ -60,7 +60,7 @@ func NewBackupCommand(stdin io.Reader, stdout, stderr io.Writer) *BackupCommand
CmdIO: pilosa.NewCmdIO(stdin, stdout, stderr),
Concurrency: 1,
RetryPeriod: time.Minute,
Pprof: "localhost:43809",
Pprof: "localhost:0",
}
}

View file

@ -9,8 +9,8 @@ import (
"path/filepath"
"syscall"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/roaring"
"github.com/pkg/errors"
)

View file

@ -10,7 +10,7 @@ import (
"context"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/testhook"
)
func TestCheckCommand_RunCacheFile(t *testing.T) {

View file

@ -8,8 +8,8 @@ import (
"io"
"github.com/cespare/xxhash"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/server"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/server"
)
// ChkSumCommand represents a command for backing up a Pilosa node.

View file

@ -7,9 +7,9 @@ import (
gohttp "net/http"
"github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/logger"
"github.com/molecula/featurebase/v3/server"
"github.com/pkg/errors"
"github.com/spf13/pflag"
)

View file

@ -6,8 +6,8 @@ import (
"fmt"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/server"
toml "github.com/pelletier/go-toml"
)

View file

@ -9,7 +9,7 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3/server"
)
func TestConfigCommand_Run(t *testing.T) {

View file

@ -6,8 +6,8 @@ import (
"io"
"os"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/server"
"github.com/pkg/errors"
)

View file

@ -8,8 +8,8 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/test"
)
func TestExportCommand_Validation(t *testing.T) {

View file

@ -6,8 +6,8 @@ import (
"fmt"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/server"
"github.com/pelletier/go-toml"
"github.com/pkg/errors"
)

View file

@ -11,9 +11,9 @@ import (
"strconv"
"time"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/pql"
"github.com/molecula/featurebase/v3/server"
"github.com/pkg/errors"
)

View file

@ -14,9 +14,9 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/test"
"github.com/molecula/featurebase/v3/testhook"
)
func TestImportCommand_Validation(t *testing.T) {

View file

@ -19,9 +19,9 @@ import (
"unsafe"
"github.com/gogo/protobuf/proto"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/pb"
"github.com/molecula/featurebase/v3/roaring"
"github.com/pkg/errors"
)

View file

@ -9,7 +9,7 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/testhook"
)
func TestInspectCommand_Run(t *testing.T) {

View file

@ -7,10 +7,10 @@ import (
"io"
"github.com/gorilla/securecookie"
pilosa "github.com/molecula/featurebase/v2"
pilosa "github.com/molecula/featurebase/v3"
)
// Keygen represents a command for generating crytographic keys.
// Keygen represents a command for generating a cryptographic key.
type KeygenCommand struct {
CmdIO *pilosa.CmdIO
KeyLength int
@ -23,9 +23,8 @@ func NewKeygenCommand(stdin io.Reader, stdout, stderr io.Writer) *KeygenCommand
}
}
// Run keys to use for authentication .
// Run keygen to obtain key to use for authentication .
func (kg *KeygenCommand) Run(_ context.Context) error {
fmt.Printf("hash-key = \"%+x\"\n", securecookie.GenerateRandomKey(kg.KeyLength))
fmt.Printf("block-key = \"%+x\"\n", securecookie.GenerateRandomKey(kg.KeyLength))
fmt.Printf("secret-key = \"%+x\"\n", securecookie.GenerateRandomKey(kg.KeyLength))
return nil
}

View file

@ -9,7 +9,7 @@ import (
_ "net/http/pprof"
"github.com/molecula/featurebase/v2/testhook"
"github.com/molecula/featurebase/v3/testhook"
)
func TestMain(m *testing.M) {

View file

@ -6,8 +6,8 @@ import (
"fmt"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/rbf"
)
// RBFCheckCommand represents a command for running a consistency check on RBF.

View file

@ -8,8 +8,8 @@ import (
"io"
"strings"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/rbf"
)
// RBFDumpCommand represents a command for dumping raw data for an RBF page.

View file

@ -6,8 +6,8 @@ import (
"fmt"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/rbf"
)
// RBFPageCommand represents a command for printing data for a single RBF page.

View file

@ -6,9 +6,9 @@ import (
"fmt"
"io"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v2/txkey"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/rbf"
"github.com/molecula/featurebase/v3/txkey"
)
// RBFPagesCommand represents a command for printing a list of RBF page metadata.

View file

@ -17,11 +17,11 @@ import (
"github.com/hashicorp/go-retryablehttp"
pilosa "github.com/molecula/featurebase/v2"
fb_http "github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/topology"
pilosa "github.com/molecula/featurebase/v3"
fb_http "github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/logger"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/topology"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
)
@ -56,7 +56,7 @@ func NewRestoreCommand(stdin io.Reader, stdout, stderr io.Writer) *RestoreComman
CmdIO: pilosa.NewCmdIO(stdin, stdout, stderr),
RetryPeriod: time.Second * 30,
Concurrency: 1,
Pprof: "localhost:43809",
Pprof: "localhost:0",
}
}

View file

@ -5,8 +5,8 @@ import (
"fmt"
"time"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/storage"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/storage"
"github.com/spf13/cobra"
)
@ -111,6 +111,7 @@ func BuildServerFlags(cmd *cobra.Command, srv *server.Command) {
flags.StringVar(&srv.Config.Auth.ClientId, "auth.client-id", srv.Config.Auth.ClientId, "Identity Provider's Application/Client ID.")
flags.StringVar(&srv.Config.Auth.ClientSecret, "auth.client-secret", srv.Config.Auth.ClientSecret, "Identity Provider's Client Secret.")
flags.StringVar(&srv.Config.Auth.AuthorizeURL, "auth.authorize-url", srv.Config.Auth.AuthorizeURL, "Identity Provider's Authorize URL.")
flags.StringVar(&srv.Config.Auth.RedirectBaseURL, "auth.redirect-base-url", srv.Config.Auth.RedirectBaseURL, "Base URL of the featurebase instance used to redirect IDP.")
flags.StringVar(&srv.Config.Auth.TokenURL, "auth.token-url", srv.Config.Auth.TokenURL, "Identity Provider's Token URL.")
flags.StringVar(&srv.Config.Auth.GroupEndpointURL, "auth.group-endpoint-url", srv.Config.Auth.GroupEndpointURL, "Identity Provider's Group endpoint URL.")
flags.StringVar(&srv.Config.Auth.LogoutURL, "auth.logout-url", srv.Config.Auth.LogoutURL, "Identity Provider's Logout URL.")

View file

@ -5,7 +5,7 @@ import (
"bytes"
"testing"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v3/server"
"github.com/spf13/cobra"
)

View file

@ -9,7 +9,7 @@ import (
"time"
"github.com/felixge/fgprof"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
"github.com/pkg/errors"
)
@ -40,7 +40,7 @@ func startProfilingServer(addr string, logger logger.Logger) (close func() error
return nil, err
}
go func() {
logger.Printf("Listening for /debug/pprof/ and /debug/fgprof on '%s'", addr)
logger.Printf("Listening for /debug/pprof/ and /debug/fgprof on '%s'", ln.Addr().String())
logger.Printf("%v", s.Serve(ln))
}()

View file

@ -10,12 +10,12 @@ import (
"strings"
"sync"
rbfcfg "github.com/molecula/featurebase/v2/rbf/cfg"
txkey "github.com/molecula/featurebase/v2/short_txkey"
"github.com/molecula/featurebase/v2/storage"
rbfcfg "github.com/molecula/featurebase/v3/rbf/cfg"
txkey "github.com/molecula/featurebase/v3/short_txkey"
"github.com/molecula/featurebase/v3/storage"
"github.com/pkg/errors"
"github.com/molecula/featurebase/v2/vprint"
"github.com/molecula/featurebase/v3/vprint"
)
var _ = sort.Sort

View file

@ -8,11 +8,11 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/rbf"
"github.com/molecula/featurebase/v2/shardwidth"
txkey "github.com/molecula/featurebase/v2/short_txkey"
"github.com/molecula/featurebase/v2/testhook"
. "github.com/molecula/featurebase/v2/vprint" // nolint:staticcheck
"github.com/molecula/featurebase/v3/rbf"
"github.com/molecula/featurebase/v3/shardwidth"
txkey "github.com/molecula/featurebase/v3/short_txkey"
"github.com/molecula/featurebase/v3/testhook"
. "github.com/molecula/featurebase/v3/vprint" // nolint:staticcheck
)
// Shard per db evaluation

View file

@ -7,12 +7,12 @@ import (
"reflect"
"testing"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/boltdb"
"github.com/molecula/featurebase/v2/http"
"github.com/molecula/featurebase/v2/server"
"github.com/molecula/featurebase/v2/test"
. "github.com/molecula/featurebase/v2/vprint" // nolint:staticcheck
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/boltdb"
"github.com/molecula/featurebase/v3/http"
"github.com/molecula/featurebase/v3/server"
"github.com/molecula/featurebase/v3/test"
. "github.com/molecula/featurebase/v3/vprint" // nolint:staticcheck
)
func TestAPI_SimplerOneNode_ImportColumnKey(t *testing.T) {

View file

@ -8,8 +8,8 @@ import (
"testing"
"time"
"github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/test"
"github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/test"
"github.com/stretchr/testify/require"
)

View file

@ -11,7 +11,7 @@ import (
"sync"
"time"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
"github.com/pkg/errors"
)

View file

@ -10,7 +10,7 @@ import (
"strings"
"testing"
"github.com/molecula/featurebase/v2/logger"
"github.com/molecula/featurebase/v3/logger"
)
func TestDiagnosticsClient(t *testing.T) {

View file

@ -6,14 +6,14 @@ import (
"time"
"github.com/gogo/protobuf/proto"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/disco"
"github.com/molecula/featurebase/v2/ingest"
pnet "github.com/molecula/featurebase/v2/net"
"github.com/molecula/featurebase/v2/pb"
"github.com/molecula/featurebase/v2/pql"
"github.com/molecula/featurebase/v2/roaring"
"github.com/molecula/featurebase/v2/topology"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/disco"
"github.com/molecula/featurebase/v3/ingest"
pnet "github.com/molecula/featurebase/v3/net"
"github.com/molecula/featurebase/v3/pb"
"github.com/molecula/featurebase/v3/pql"
"github.com/molecula/featurebase/v3/roaring"
"github.com/molecula/featurebase/v3/topology"
"github.com/pkg/errors"
)

View file

@ -6,9 +6,9 @@ import (
"reflect"
"testing"
pilosa "github.com/molecula/featurebase/v2"
"github.com/molecula/featurebase/v2/ingest"
"github.com/molecula/featurebase/v2/pb"
pilosa "github.com/molecula/featurebase/v3"
"github.com/molecula/featurebase/v3/ingest"
"github.com/molecula/featurebase/v3/pb"
)
func testOneRoundTrip(t *testing.T, s pilosa.Serializer, obj pilosa.Message, expectedMarshalErr error, expectedUnmarshalErr error, expectedMismatchErr error) {

Some files were not shown because too many files have changed in this diff Show more