Merge pull request #204 from openziti/consolidate-routers

move edge routers under fabric routers. Fixes GH-144
This commit is contained in:
Paul Lorenz
2020-06-17 17:02:52 -04:00
committed by GitHub
20 changed files with 183 additions and 133 deletions
+9 -48
View File
@@ -17,7 +17,6 @@
package env
import (
"bytes"
"fmt"
"github.com/golang/protobuf/proto"
"github.com/kataras/go-events"
@@ -29,7 +28,6 @@ import (
"github.com/openziti/fabric/controller/network"
"github.com/openziti/foundation/channel2"
"github.com/openziti/foundation/storage/boltz"
"strings"
"sync"
"time"
)
@@ -584,23 +582,15 @@ func (b *Broker) GetOnlineEdgeRouter(id string) *model.EdgeRouter {
func (b *Broker) RouterConnected(r *network.Router) {
go func() {
if r.Fingerprint == nil {
return
if r.Fingerprint != nil {
if edgeRouter, _ := b.ae.Handlers.EdgeRouter.ReadOneByFingerprint(*r.Fingerprint); edgeRouter != nil {
b.sendHello(r, edgeRouter)
}
}
fp := formatFingerprint(*r.Fingerprint)
edgeRouter, _ := b.ae.Handlers.EdgeRouter.ReadOneByFingerprint(fp)
// not an edge router
if edgeRouter == nil || edgeRouter.Id == "" {
return
}
b.sendHello(r, edgeRouter, fp)
}()
}
func (b *Broker) sendHello(r *network.Router, edgeRouter *model.EdgeRouter, fingerprint string) {
func (b *Broker) sendHello(r *network.Router, edgeRouter *model.EdgeRouter) {
serverVersion := build.GetBuildInfo().GetVersion()
serverHello := &edge_ctrl_pb.ServerHello{
Version: serverVersion,
@@ -665,39 +655,10 @@ func (b *Broker) sendHello(r *network.Router, edgeRouter *model.EdgeRouter, fing
func (b *Broker) RouterDisconnected(r *network.Router) {
go func() {
if r.Fingerprint == nil {
return
}
fp := formatFingerprint(*r.Fingerprint)
edgeRouter, _ := b.ae.Handlers.EdgeRouter.ReadOneByFingerprint(fp)
// not an edge router
if edgeRouter == nil || edgeRouter.Id == "" {
return
}
b.edgeRouterMap.RemoveEntry(edgeRouter.Id)
}()
}
func formatFingerprint(fp string) string {
fp = strings.ToUpper(fp)
return insertNth(fp, 2, ":")
}
func insertNth(s string, n int, i string) string {
rs := []rune(i)
var buffer bytes.Buffer
var nMinus1 = n - 1
var lenMinus1 = len(s) - 1
for i, cr := range s {
buffer.WriteRune(cr)
if i%n == nMinus1 && i != lenMinus1 {
for _, r := range rs {
buffer.WriteRune(r)
if r.Fingerprint != nil {
if edgeRouter, _ := b.ae.Handlers.EdgeRouter.ReadOneByFingerprint(*r.Fingerprint); edgeRouter != nil {
b.edgeRouterMap.RemoveEntry(edgeRouter.Id)
}
}
}
return buffer.String()
}()
}
+6 -5
View File
@@ -18,6 +18,7 @@ package model
import (
"github.com/openziti/edge/controller/persistence"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/fabric/controller/models"
"github.com/openziti/foundation/storage/boltz"
"github.com/pkg/errors"
@@ -37,12 +38,10 @@ type EdgeRouter struct {
}
func (entity *EdgeRouter) toBoltEntityForCreate(_ *bbolt.Tx, handler Handler) (boltz.Entity, error) {
boltEntity := &persistence.EdgeRouter{
BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags),
Router: db.Router{BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags)},
Name: entity.Name,
RoleAttributes: entity.RoleAttributes,
Fingerprint: nil,
IsVerified: false,
}
@@ -51,11 +50,13 @@ func (entity *EdgeRouter) toBoltEntityForCreate(_ *bbolt.Tx, handler Handler) (b
func (entity *EdgeRouter) toBoltEntityForUpdate(_ *bbolt.Tx, _ Handler) (boltz.Entity, error) {
return &persistence.EdgeRouter{
BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags),
Router: db.Router{
BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags),
Fingerprint: entity.Fingerprint,
},
Name: entity.Name,
RoleAttributes: entity.RoleAttributes,
IsVerified: entity.IsVerified,
Fingerprint: entity.Fingerprint,
CertPem: entity.CertPem,
Hostname: entity.Hostname,
EdgeRouterProtocols: entity.EdgeRouterProtocols,
-13
View File
@@ -21,8 +21,6 @@ import (
"github.com/openziti/edge/controller/apierror"
"github.com/openziti/edge/internal/cert"
"github.com/openziti/edge/rest_model"
"github.com/openziti/fabric/controller/network"
"strings"
"time"
)
@@ -143,7 +141,6 @@ func (module *EnrollModuleEr) Process(context EnrollmentContext) (*EnrollmentRes
}
cltFp := module.fingerprintGenerator.FromPem(cltPem)
edgeRouter.IsVerified = true
edgeRouter.Fingerprint = &cltFp
if err := module.env.GetHandlers().EdgeRouter.Update(edgeRouter, false); err != nil {
@@ -154,10 +151,6 @@ func (module *EnrollModuleEr) Process(context EnrollmentContext) (*EnrollmentRes
return nil, fmt.Errorf("could not delete enrollment: %s", err)
}
if err := module.createRouter(cr.Subject.CommonName, cltFp); err != nil {
return nil, err
}
content := &rest_model.EnrollmentCerts{
Ca: string(module.env.GetConfig().CaPems()),
Cert: string(cltPem),
@@ -171,9 +164,3 @@ func (module *EnrollModuleEr) Process(context EnrollmentContext) (*EnrollmentRes
Status: 200,
}, nil
}
func (module *EnrollModuleEr) createRouter(commonName string, fingerprint string) error {
fgp := strings.Replace(strings.ToLower(fingerprint), ":", "", -1)
r := network.NewRouter(commonName, fgp)
return module.env.GetHostController().GetNetwork().CreateRouter(r)
}
-2
View File
@@ -21,7 +21,6 @@ import (
"github.com/openziti/edge/controller/apierror"
"github.com/openziti/edge/internal/cert"
"github.com/openziti/edge/rest_model"
"strings"
"time"
)
@@ -131,7 +130,6 @@ func (module *EnrollModuleRouterOtt) Process(context EnrollmentContext) (*Enroll
cltFp := module.fingerprintGenerator.FromPem(cltPem)
txRouter.IsVerified = true
cltFp = strings.ToLower(strings.Replace(cltFp, ":", "", -1))
txRouter.Fingerprint = &cltFp
if err := module.env.GetHandlers().TransitRouter.Update(txRouter, true); err != nil {
+5 -4
View File
@@ -2,6 +2,7 @@ package model
import (
"github.com/openziti/edge/controller/persistence"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/util/stringz"
"go.etcd.io/bbolt"
)
@@ -122,7 +123,7 @@ func (advisor *PolicyAdvisor) getIdentityEdgeRouters(identityId string) (map[str
return nil
}
return advisor.env.GetHandlers().EdgeRouterPolicy.iterateRelatedEntitiesInTx(tx, edgeRouterPolicyId, persistence.EntityTypeEdgeRouters, edgeRouterIterator)
return advisor.env.GetHandlers().EdgeRouterPolicy.iterateRelatedEntitiesInTx(tx, edgeRouterPolicyId, db.EntityTypeRouters, edgeRouterIterator)
}
if err := advisor.env.GetHandlers().Identity.iterateRelatedEntities(identityId, persistence.EntityTypeEdgeRouterPolicies, edgeRouterPolicyIterator); err != nil {
return nil, err
@@ -139,7 +140,7 @@ func (advisor *PolicyAdvisor) getServiceEdgeRouters(serviceId string) (map[strin
edgeRouters[edgeRouterId] = struct{}{}
return nil
}
return advisor.env.GetHandlers().ServiceEdgeRouterPolicy.iterateRelatedEntitiesInTx(tx, policyId, persistence.EntityTypeEdgeRouters, edgeRouterIterator)
return advisor.env.GetHandlers().ServiceEdgeRouterPolicy.iterateRelatedEntitiesInTx(tx, policyId, db.EntityTypeRouters, edgeRouterIterator)
}
if err := advisor.env.GetHandlers().EdgeService.iterateRelatedEntities(serviceId, persistence.EntityTypeServiceEdgeRouterPolicies, serviceEdgeRouterPolicyIterator); err != nil {
@@ -189,7 +190,7 @@ func (advisor *PolicyAdvisor) getEdgeRouterPolicies(identityId, edgeRouterId str
if err != nil {
return err
}
if policyStore.IsEntityRelated(tx, policyId, persistence.EntityTypeEdgeRouters, edgeRouterId) {
if policyStore.IsEntityRelated(tx, policyId, db.EntityTypeRouters, edgeRouterId) {
result = append(result, policy)
}
return nil
@@ -295,7 +296,7 @@ func (advisor *PolicyAdvisor) getServiceEdgeRouterPolicies(serviceId, edgeRouter
if err != nil {
return err
}
if policyStore.IsEntityRelated(tx, policyId, persistence.EntityTypeEdgeRouters, edgeRouterId) {
if policyStore.IsEntityRelated(tx, policyId, db.EntityTypeRouters, edgeRouterId) {
result = append(result, policy)
}
return nil
-4
View File
@@ -20,13 +20,9 @@ import "strings"
const (
EntityTypeApiSessions = "apiSessions"
EntityTypeAppwans = "appwans"
EntityTypeCas = "cas"
EntityTypeClusters = "clusters"
EntityTypeConfigs = "configs"
EntityTypeConfigTypes = "configTypes"
EntityTypeEdgeRouters = "edgeRouters"
EntityTypeTransitRouters = "transitRouters"
EntityTypeEdgeRouterPolicies = "edgeRouterPolicies"
EntityTypeEventLogs = "eventLogs"
EntityTypeGeoRegions = "geoRegions"
+6 -4
View File
@@ -55,11 +55,13 @@ func newBaseStore(stores *stores, entityType string) *baseStore {
}
func newChildBaseStore(stores *stores, parent boltz.CrudStore) *baseStore {
entityNotFoundF := func(id string) error {
return boltz.NewNotFoundError(parent.GetSingularEntityType(), "id", id)
}
return &baseStore{
stores: stores,
BaseStore: boltz.NewChildBaseStore(parent, func(id string) error {
return boltz.NewNotFoundError(parent.GetSingularEntityType(), "id", id)
}, EdgeBucket),
stores: stores,
BaseStore: boltz.NewChildBaseStore(parent, entityNotFoundF, EdgeBucket),
}
}
@@ -2,6 +2,7 @@ package persistence
import (
"github.com/google/uuid"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/storage/ast"
"github.com/openziti/foundation/storage/boltz"
"github.com/openziti/foundation/util/stringz"
@@ -122,7 +123,7 @@ func (store *edgeRouterPolicyStoreImpl) initializeLocal() {
store.symbolIdentityRoles = store.AddSetSymbol(FieldIdentityRoles, ast.NodeTypeString)
store.symbolEdgeRouterRoles = store.AddSetSymbol(FieldEdgeRouterRoles, ast.NodeTypeString)
store.symbolIdentities = store.AddFkSetSymbol(EntityTypeIdentities, store.stores.identity)
store.symbolEdgeRouters = store.AddFkSetSymbol(EntityTypeEdgeRouters, store.stores.edgeRouter)
store.symbolEdgeRouters = store.AddFkSetSymbol(db.EntityTypeRouters, store.stores.edgeRouter)
}
func (store *edgeRouterPolicyStoreImpl) initializeLinked() {
@@ -3,6 +3,7 @@ package persistence
import (
"fmt"
"github.com/google/uuid"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/storage/boltz"
"github.com/openziti/foundation/util/stringz"
"go.etcd.io/bbolt"
@@ -30,7 +31,7 @@ func (ctx *TestContext) testCreateEdgeRouterPolicy(_ *testing.T) {
ctx.ValidateBaseline(policy)
err := ctx.GetDb().View(func(tx *bbolt.Tx) error {
ctx.Equal(0, len(ctx.stores.EdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeEdgeRouters)))
ctx.Equal(0, len(ctx.stores.EdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, db.EntityTypeRouters)))
ctx.Equal(0, len(ctx.stores.EdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeIdentities)))
testPolicy, err := ctx.stores.EdgeRouterPolicy.LoadOneByName(tx, policy.Name)
@@ -78,7 +79,7 @@ func (ctx *TestContext) testEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.IdentityRoles = nil
policy.EdgeRouterRoles = []string{entityRef(invalidId)}
err = ctx.Create(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
policy.EdgeRouterRoles = []string{AllRole, roleRef("other")}
err = ctx.Create(policy)
@@ -89,7 +90,7 @@ func (ctx *TestContext) testEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.EdgeRouterRoles = []string{entityRef(edgeRouter.Id), entityRef(invalidId)}
err = ctx.Create(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
policy.EdgeRouterRoles = []string{entityRef(edgeRouter.Id)}
ctx.RequireCreate(policy)
@@ -97,7 +98,7 @@ func (ctx *TestContext) testEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.EdgeRouterRoles = append(policy.EdgeRouterRoles, entityRef(invalidId))
err = ctx.Update(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
ctx.RequireDelete(policy)
}
@@ -209,7 +210,7 @@ func (ctx *TestContext) testEdgeRouterPolicyRoleEvaluation(_ *testing.T) {
policies := ctx.createEdgeRouterPolicies(identityRoles, edgeRouterRoles, identities, edgeRouters, true)
for i := 0; i < 9; i++ {
relatedEdgeRouters := ctx.getRelatedIds(policies[i], EntityTypeEdgeRouters)
relatedEdgeRouters := ctx.getRelatedIds(policies[i], db.EntityTypeRouters)
relatedIdentities := ctx.getRelatedIds(policies[i], EntityTypeIdentities)
if i == 3 {
ctx.Equal([]string{edgeRouters[0].Id}, relatedEdgeRouters)
@@ -411,7 +412,7 @@ func (ctx *TestContext) validateEdgeRouterPolicyIdentities(identities []*Identit
func (ctx *TestContext) validateEdgeRouterPolicyEdgeRouters(edgeRouters []*EdgeRouter, policies []*EdgeRouterPolicy) {
for _, policy := range policies {
count := 0
relatedEdgeRouters := ctx.getRelatedIds(policy, EntityTypeEdgeRouters)
relatedEdgeRouters := ctx.getRelatedIds(policy, db.EntityTypeRouters)
for _, edgeRouter := range edgeRouters {
relatedPolicies := ctx.getRelatedIds(edgeRouter, EntityTypeEdgeRouterPolicies)
shouldContain := ctx.policyShouldMatch(policy.Semantic, policy.EdgeRouterRoles, edgeRouter, edgeRouter.RoleAttributes)
+11 -16
View File
@@ -19,6 +19,7 @@ package persistence
import (
"fmt"
"github.com/google/uuid"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/storage/ast"
"github.com/openziti/foundation/storage/boltz"
"github.com/openziti/foundation/util/errorz"
@@ -27,7 +28,6 @@ import (
)
const (
FieldEdgeRouterFingerprint = "fingerprint"
FieldEdgeRouterCertPEM = "certPem"
FieldEdgeRouterIsVerified = "isVerified"
FieldEdgeRouterHostname = "hostname"
@@ -39,17 +39,16 @@ const (
func newEdgeRouter(name string, roleAttributes ...string) *EdgeRouter {
return &EdgeRouter{
BaseExtEntity: boltz.BaseExtEntity{Id: uuid.New().String()},
Router: db.Router{BaseExtEntity: boltz.BaseExtEntity{Id: uuid.New().String()}},
Name: name,
RoleAttributes: roleAttributes,
}
}
type EdgeRouter struct {
boltz.BaseExtEntity
db.Router
Name string
IsVerified bool
Fingerprint *string
CertPem *string
Hostname *string
EdgeRouterProtocols map[string]string
@@ -63,10 +62,11 @@ type EdgeRouter struct {
EnrollmentExpiresAt *time.Time
}
func (entity *EdgeRouter) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) {
entity.LoadBaseValues(bucket)
func (entity *EdgeRouter) LoadValues(store boltz.CrudStore, bucket *boltz.TypedBucket) {
_, err := store.GetParentStore().BaseLoadOneById(bucket.Tx(), entity.Id, &entity.Router)
bucket.SetError(err)
entity.Name = bucket.GetStringOrError(FieldName)
entity.Fingerprint = bucket.GetString(FieldEdgeRouterFingerprint)
entity.CertPem = bucket.GetString(FieldEdgeRouterCertPEM)
entity.IsVerified = bucket.GetBoolWithDefault(FieldEdgeRouterIsVerified, false)
@@ -78,10 +78,10 @@ func (entity *EdgeRouter) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucke
}
func (entity *EdgeRouter) SetValues(ctx *boltz.PersistContext) {
entity.SetBaseValues(ctx)
entity.Router.SetValues(ctx.GetParentContext())
store := ctx.Store.(*edgeRouterStoreImpl)
ctx.SetString(FieldName, entity.Name)
ctx.SetStringP(FieldEdgeRouterFingerprint, entity.Fingerprint)
ctx.SetStringP(FieldEdgeRouterCertPEM, entity.CertPem)
ctx.SetBool(FieldEdgeRouterIsVerified, entity.IsVerified)
ctx.SetStringP(FieldEdgeRouterHostname, entity.Hostname)
@@ -95,10 +95,6 @@ func (entity *EdgeRouter) SetValues(ctx *boltz.PersistContext) {
}
}
func (entity *EdgeRouter) GetEntityType() string {
return EntityTypeEdgeRouters
}
func (entity *EdgeRouter) GetName() string {
return entity.Name
}
@@ -113,7 +109,7 @@ type EdgeRouterStore interface {
func newEdgeRouterStore(stores *stores) *edgeRouterStoreImpl {
store := &edgeRouterStoreImpl{
baseStore: newBaseStore(stores, EntityTypeEdgeRouters),
baseStore: newChildBaseStore(stores, stores.Router),
}
store.InitImpl(store)
return store
@@ -139,12 +135,11 @@ func (store *edgeRouterStoreImpl) GetRoleAttributesIndex() boltz.SetReadIndex {
}
func (store *edgeRouterStoreImpl) initializeLocal() {
store.AddExtEntitySymbols()
store.GetParentStore().GrantSymbols(store)
store.indexName = store.addUniqueNameField()
store.indexRoleAttributes = store.addRoleAttributesField()
store.AddSymbol(FieldEdgeRouterFingerprint, ast.NodeTypeString)
store.AddSymbol(FieldEdgeRouterIsVerified, ast.NodeTypeBool)
store.symbolEnrollments = store.AddFkSetSymbol(FieldEdgeRouterEnrollments, store.stores.enrollment)
store.symbolEdgeRouterPolicies = store.AddFkSetSymbol(EntityTypeEdgeRouterPolicies, store.stores.edgeRouterPolicy)
@@ -48,7 +48,6 @@ func (entity *EdgeService) LoadValues(store boltz.CrudStore, bucket *boltz.Typed
_, err := store.GetParentStore().BaseLoadOneById(bucket.Tx(), entity.Id, &entity.Service)
bucket.SetError(err)
entity.LoadBaseValues(bucket)
entity.Name = bucket.GetStringOrError(FieldName)
entity.RoleAttributes = bucket.GetStringList(FieldRoleAttributes)
entity.Configs = bucket.GetStringList(EntityTypeConfigs)
@@ -57,7 +56,6 @@ func (entity *EdgeService) LoadValues(store boltz.CrudStore, bucket *boltz.Typed
func (entity *EdgeService) SetValues(ctx *boltz.PersistContext) {
entity.Service.SetValues(ctx.GetParentContext())
entity.SetBaseValues(ctx)
store := ctx.Store.(*edgeServiceStoreImpl)
ctx.SetString(FieldName, entity.Name)
ctx.SetStringList(FieldRoleAttributes, entity.RoleAttributes)
@@ -69,10 +67,6 @@ func (entity *EdgeService) SetValues(ctx *boltz.PersistContext) {
}
}
func (entity *EdgeService) GetEntityType() string {
return EntityTypeServices
}
func (entity *EdgeService) GetName() string {
return entity.Name
}
@@ -117,7 +111,6 @@ func (store *edgeServiceStoreImpl) GetRoleAttributesIndex() boltz.SetReadIndex {
}
func (store *edgeServiceStoreImpl) initializeLocal() {
store.AddExtEntitySymbols()
store.GetParentStore().GrantSymbols(store)
store.indexName = store.addUniqueNameField()
+114
View File
@@ -0,0 +1,114 @@
package persistence
import (
"github.com/michaelquigley/pfxlog"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/storage/boltz"
"github.com/openziti/foundation/util/stringz"
"github.com/pkg/errors"
"strings"
)
const (
migrationEntityTypeEdgeRouters = "edgeRouters"
)
func (m *Migrations) moveEdgeRoutersUnderFabricRouters(step *boltz.MigrationStep) {
rootBucket := step.Ctx.Tx().Bucket([]byte(boltz.RootBucket))
if rootBucket == nil {
step.SetError(errors.New("root bucket not found!"))
return
}
log := pfxlog.Logger()
edgeRoutersBucket := rootBucket.Bucket([]byte(migrationEntityTypeEdgeRouters))
if edgeRoutersBucket == nil {
log.Debugf("old edge routers bucket not found. skipping edge router migration")
return
}
cursor := edgeRoutersBucket.Cursor()
for key, _ := cursor.First(); key != nil; key, _ = cursor.Next() {
routerId := string(key)
log.Debugf("converting edge router %v", routerId)
edgeRouterBucket := boltz.Path(step.Ctx.Tx(), boltz.RootBucket, migrationEntityTypeEdgeRouters, routerId)
router, _ := m.stores.Router.LoadOneById(step.Ctx.Tx(), routerId)
if router == nil {
fingerprint := edgeRouterBucket.GetString("fingerprint")
if fingerprint != nil {
cfp := strings.Replace(strings.ToLower(*fingerprint), ":", "", -1)
fingerprint = &cfp
}
createdAt := edgeRouterBucket.GetTimeOrError(boltz.FieldCreatedAt)
updatedAt := edgeRouterBucket.GetTimeOrError(boltz.FieldUpdatedAt)
tags := edgeRouterBucket.GetMap(boltz.FieldTags)
router = &db.Router{
BaseExtEntity: boltz.BaseExtEntity{
Id: routerId,
ExtEntityFields: boltz.ExtEntityFields{
CreatedAt: createdAt,
UpdatedAt: updatedAt,
Tags: tags,
Migrate: true,
},
},
Fingerprint: fingerprint,
}
if step.SetError(m.stores.Router.Create(step.Ctx, router)) {
return
}
}
edgeBucket := boltz.GetOrCreatePath(step.Ctx.Tx(), boltz.RootBucket, db.EntityTypeRouters, routerId, EdgeBucket)
if edgeBucket.HasError() {
step.SetError(edgeBucket.Err)
return
}
err := edgeBucket.Copy(edgeRouterBucket, func(path []string) bool {
return !stringz.Contains([]string{boltz.FieldId, boltz.FieldCreatedAt, boltz.FieldUpdatedAt, boltz.FieldTags, db.FieldRouterFingerprint}, path[0])
})
if step.SetError(err) {
return
}
}
m.fixPolicyEdgeRouterReferences(step, m.stores.EdgeRouterPolicy)
m.fixPolicyEdgeRouterReferences(step, m.stores.ServiceEdgeRouterPolicy)
}
func (m *Migrations) fixPolicyEdgeRouterReferences(step *boltz.MigrationStep, store boltz.CrudStore) {
ids, _, err := store.QueryIds(step.Ctx.Tx(), "true")
if step.SetError(err) {
return
}
log := pfxlog.Logger()
copyAll := func([]string) bool {
return true
}
for _, id := range ids {
log.Debugf("converting %v %v", store.GetSingularEntityType(), id)
policyBucket := store.GetEntityBucket(step.Ctx.Tx(), []byte(id))
edgeRoutersBucket := policyBucket.GetBucket(migrationEntityTypeEdgeRouters)
if edgeRoutersBucket == nil {
continue
}
routersBucket := policyBucket.GetOrCreateBucket(db.EntityTypeRouters)
if step.SetError(routersBucket.GetError()) {
return
}
if step.SetError(routersBucket.Copy(edgeRoutersBucket, copyAll)) {
return
}
}
}
+5 -1
View File
@@ -22,7 +22,7 @@ import (
)
const (
CurrentDbVersion = 6
CurrentDbVersion = 7
FieldVersion = "version"
)
@@ -70,6 +70,10 @@ func (m *Migrations) migrate(step *boltz.MigrationStep) int {
m.fixIdentityBuckets(step)
}
if step.CurrentVersion < 7 {
m.moveEdgeRoutersUnderFabricRouters(step)
}
// current version
if step.CurrentVersion <= CurrentDbVersion {
return CurrentDbVersion
@@ -2,6 +2,7 @@ package persistence
import (
"github.com/google/uuid"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/storage/ast"
"github.com/openziti/foundation/storage/boltz"
"github.com/openziti/foundation/util/stringz"
@@ -122,7 +123,7 @@ func (store *serviceEdgeRouterPolicyStoreImpl) initializeLocal() {
store.symbolServiceRoles = store.AddSetSymbol(FieldServiceRoles, ast.NodeTypeString)
store.symbolEdgeRouterRoles = store.AddSetSymbol(FieldEdgeRouterRoles, ast.NodeTypeString)
store.symbolServices = store.AddFkSetSymbol(EntityTypeServices, store.stores.edgeService)
store.symbolEdgeRouters = store.AddFkSetSymbol(EntityTypeEdgeRouters, store.stores.edgeRouter)
store.symbolEdgeRouters = store.AddFkSetSymbol(db.EntityTypeRouters, store.stores.edgeRouter)
}
func (store *serviceEdgeRouterPolicyStoreImpl) initializeLinked() {
@@ -3,6 +3,7 @@ package persistence
import (
"fmt"
"github.com/google/uuid"
"github.com/openziti/fabric/controller/db"
"github.com/openziti/foundation/util/stringz"
"go.etcd.io/bbolt"
"sort"
@@ -28,7 +29,7 @@ func (ctx *TestContext) testCreateServiceEdgeRouterPolicy(_ *testing.T) {
ctx.ValidateBaseline(policy)
err := ctx.GetDb().View(func(tx *bbolt.Tx) error {
ctx.Equal(0, len(ctx.stores.ServiceEdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeEdgeRouters)))
ctx.Equal(0, len(ctx.stores.ServiceEdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, db.EntityTypeRouters)))
ctx.Equal(0, len(ctx.stores.ServiceEdgeRouterPolicy.GetRelatedEntitiesIdList(tx, policy.Id, EntityTypeServices)))
testPolicy, err := ctx.stores.ServiceEdgeRouterPolicy.LoadOneByName(tx, policy.Name)
@@ -75,7 +76,7 @@ func (ctx *TestContext) testServiceEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.ServiceRoles = nil
policy.EdgeRouterRoles = []string{entityRef(invalidId)}
err = ctx.Create(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
policy.EdgeRouterRoles = []string{AllRole, roleRef("other")}
err = ctx.Create(policy)
@@ -86,7 +87,7 @@ func (ctx *TestContext) testServiceEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.EdgeRouterRoles = []string{entityRef(edgeRouter.Id), entityRef(invalidId)}
err = ctx.Create(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
policy.EdgeRouterRoles = []string{entityRef(edgeRouter.Id)}
ctx.RequireCreate(policy)
@@ -94,7 +95,7 @@ func (ctx *TestContext) testServiceEdgeRouterPolicyInvalidValues(_ *testing.T) {
policy.EdgeRouterRoles = append(policy.EdgeRouterRoles, entityRef(invalidId))
err = ctx.Update(policy)
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no edgeRouters found with the given ids", invalidId))
ctx.EqualError(err, fmt.Sprintf("the value '[%v]' for 'edgeRouterRoles' is invalid: no routers found with the given ids", invalidId))
ctx.RequireDelete(policy)
}
@@ -203,7 +204,7 @@ func (ctx *TestContext) testServiceEdgeRouterPolicyRoleEvaluation(_ *testing.T)
policies := ctx.createServiceEdgeRouterPolicies(serviceRoles, edgeRouterRoles, services, edgeRouters, true)
for i := 0; i < 9; i++ {
relatedEdgeRouters := ctx.getRelatedIds(policies[i], EntityTypeEdgeRouters)
relatedEdgeRouters := ctx.getRelatedIds(policies[i], db.EntityTypeRouters)
relatedServices := ctx.getRelatedIds(policies[i], EntityTypeServices)
if i == 3 {
ctx.Equal([]string{edgeRouters[0].Id}, relatedEdgeRouters)
@@ -405,7 +406,7 @@ func (ctx *TestContext) validateServiceEdgeRouterPolicyServices(services []*Edge
func (ctx *TestContext) validateServiceEdgeRouterPolicyEdgeRouters(edgeRouters []*EdgeRouter, policies []*ServiceEdgeRouterPolicy) {
for _, policy := range policies {
count := 0
relatedEdgeRouters := ctx.getRelatedIds(policy, EntityTypeEdgeRouters)
relatedEdgeRouters := ctx.getRelatedIds(policy, db.EntityTypeRouters)
for _, edgeRouter := range edgeRouters {
relatedPolicies := ctx.getRelatedIds(edgeRouter, EntityTypeServiceEdgeRouterPolicies)
shouldContain := ctx.policyShouldMatch(policy.Semantic, policy.EdgeRouterRoles, edgeRouter, edgeRouter.RoleAttributes)
+5 -4
View File
@@ -53,7 +53,7 @@ type Stores struct {
Enrollment EnrollmentStore
Authenticator AuthenticatorStore
storeMap map[string]boltz.CrudStore
storeMap map[reflect.Type]boltz.CrudStore
}
func (stores *Stores) buildStoreMap() {
@@ -62,7 +62,8 @@ func (stores *Stores) buildStoreMap() {
f := val.Field(i)
if f.CanInterface() {
if store, ok := f.Interface().(boltz.CrudStore); ok {
stores.storeMap[store.GetEntityType()] = store
entityType := reflect.TypeOf(store.NewStoreEntity())
stores.storeMap[entityType] = store
}
}
}
@@ -79,7 +80,7 @@ func (stores *Stores) getStoreList() []Store {
}
func (stores *Stores) GetStoreForEntity(entity boltz.Entity) boltz.CrudStore {
return stores.storeMap[entity.GetEntityType()]
return stores.storeMap[reflect.TypeOf(entity)]
}
type stores struct {
@@ -163,7 +164,7 @@ func NewBoltStores(dbProvider DbProvider) (*Stores, error) {
Authenticator: internalStores.authenticator,
Enrollment: internalStores.enrollment,
storeMap: make(map[string]boltz.CrudStore),
storeMap: make(map[reflect.Type]boltz.CrudStore),
}
// The Index store is used for querying indexes. It's a convenient store with only a single value (id), which
@@ -53,7 +53,6 @@ func (entity *TransitRouter) LoadValues(store boltz.CrudStore, bucket *boltz.Typ
entity.IsBase = true
return
}
entity.LoadBaseValues(bucket)
entity.Name = bucket.GetStringOrError(FieldName)
entity.IsVerified = bucket.GetBoolWithDefault(FieldTransitRouterIsVerified, false)
entity.Enrollments = bucket.GetStringList(FieldTransitRouterEnrollments)
@@ -61,7 +60,6 @@ func (entity *TransitRouter) LoadValues(store boltz.CrudStore, bucket *boltz.Typ
func (entity *TransitRouter) SetValues(ctx *boltz.PersistContext) {
entity.Router.SetValues(ctx.GetParentContext())
entity.SetBaseValues(ctx)
if ctx.Bucket != nil {
ctx.SetString(FieldName, entity.Name)
ctx.SetBool(FieldTransitRouterIsVerified, entity.IsVerified)
+1 -1
View File
@@ -34,7 +34,7 @@ require (
github.com/michaelquigley/pfxlog v0.0.0-20190813191113-2be43bd0dccc
github.com/miekg/dns v1.1.29
github.com/mitchellh/mapstructure v1.3.1
github.com/openziti/fabric v0.11.40
github.com/openziti/fabric v0.11.43
github.com/openziti/foundation v0.11.5
github.com/openziti/sdk-golang v0.13.7
github.com/pkg/errors v0.9.1
+2 -6
View File
@@ -284,10 +284,8 @@ github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/openziti/fabric v0.11.40 h1:IebmkMrAa7R216cBd1ROhON5RgiPFm9TVyqo7a2Aknk=
github.com/openziti/fabric v0.11.40/go.mod h1:LsIAeOvc0ygIPZ2QCuh2l/nWbt2pp2e431KAhNtixws=
github.com/openziti/foundation v0.11.2 h1:h6jsPLDkNzH1WTVPb8MPaECgYqEwzlXFwLRFeO1Aojk=
github.com/openziti/foundation v0.11.2/go.mod h1:E+z3Ne+G1IrApCxg/+kKLFg5hUubElHyylvfCLJg4fk=
github.com/openziti/fabric v0.11.43 h1:+EEo1xYossvXf7LDLcnw3cJxaZwh+k8ez/Ew9qBUd9s=
github.com/openziti/fabric v0.11.43/go.mod h1:va9H0K20ugtCsMj8/1vdRAWsWlFdy1T+OEdXm0e1LW4=
github.com/openziti/foundation v0.11.5 h1:RmhFzKgH9KdztsF1T/70s+ftPpMGu1X3A6RhmPlOFiY=
github.com/openziti/foundation v0.11.5/go.mod h1:jfnQ8WWFJGrDD2COPtQ/yX+gRlaiMdwUuXbvEBOpnLc=
github.com/openziti/sdk-golang v0.13.7 h1:qDI5B2/lUfWhwhgt8QE/XR71CYkTxN4FRdJiSOkFKoE=
@@ -370,8 +368,6 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50 h1:ASw9n1EHMftwnP3Az4XW6e308+gNsrHzmdhd0Olz9Hs=
go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+1 -2
View File
@@ -119,8 +119,7 @@ func (fpg *defaultFingerprintGenerator) FromCerts(certs []*x509.Certificate) Fin
}
func (fpg *defaultFingerprintGenerator) FromRaw(raw []byte) string {
rawFingerprint := sha1.Sum(raw)
return fpg.toHex(rawFingerprint[:])
return fmt.Sprintf("%x", sha1.Sum(raw))
}
func (fpg *defaultFingerprintGenerator) toHex(f []byte) string {