diff --git a/controller/controllers/common.go b/controller/controllers/common.go new file mode 100644 index 000000000..2d54e305f --- /dev/null +++ b/controller/controllers/common.go @@ -0,0 +1,25 @@ +package controllers + +import ( + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "go.etcd.io/bbolt" +) + +func DeleteEntityById(store boltz.CrudStore, db boltz.Db, id string) error { + return db.Update(func(tx *bbolt.Tx) error { + ctx := boltz.NewMutateContext(tx) + if !store.IsEntityPresent(tx, id) { + return boltz.NewNotFoundError(store.GetSingularEntityType(), "id", id) + } + + if err := store.DeleteById(ctx, id); err != nil { + pfxlog.Logger(). + WithField("id", id). + WithField("type", store.GetSingularEntityType()). + WithError(err).Error("could not delete by id") + return err + } + return nil + }) +} diff --git a/controller/db/base_store.go b/controller/db/base_store.go index beeaf7763..cff012ecf 100644 --- a/controller/db/base_store.go +++ b/controller/db/base_store.go @@ -1,3 +1,19 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package db import ( diff --git a/controller/db/db.go b/controller/db/db.go index c26c62abf..fc7a938bf 100644 --- a/controller/db/db.go +++ b/controller/db/db.go @@ -19,7 +19,10 @@ package db import ( "errors" "fmt" + "github.com/michaelquigley/pfxlog" "go.etcd.io/bbolt" + "os" + "time" ) type Db struct { @@ -57,6 +60,32 @@ func (db *Db) RootBucket(tx *bbolt.Tx) (*bbolt.Bucket, error) { return ziti, nil } +func (db *Db) Snapshot(tx *bbolt.Tx) error { + path := db.db.Path() + path += "-" + time.Now().Format("20060102-150405") + + _, err := os.Stat(path) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else { + pfxlog.Logger().Infof("bolt db backup already made: %v", path) + } + + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + return err + } + defer file.Close() + + _, err = tx.WriteTo(file) + if err != nil { + pfxlog.Logger().Infof("created bolt db backup: %v", path) + } + return err +} + func createRoots(tx *bbolt.Tx) error { if ziti, err := tx.CreateBucketIfNotExists([]byte("ziti")); err == nil { if _, err := ziti.CreateBucketIfNotExists([]byte("services")); err != nil { diff --git a/controller/db/migration.go b/controller/db/migration.go new file mode 100644 index 000000000..82b7ffc84 --- /dev/null +++ b/controller/db/migration.go @@ -0,0 +1,44 @@ +package db + +import ( + "github.com/netfoundry/ziti-foundation/storage/boltz" + "github.com/pkg/errors" + "time" +) + +const CurrentDbVersion = 1 + +func (stores *stores) migrate(step *boltz.MigrationStep) int { + if step.CurrentVersion == 0 { + stores.migrateToV1(step) + return 1 + } + if step.CurrentVersion == 1 { + return 1 + } + step.SetError(errors.Errorf("Unsupported fabric datastore version: %v", step.CurrentVersion)) + return 0 +} + +func (stores *stores) migrateToV1(step *boltz.MigrationStep) { + now := time.Now() + stores.initCreatedAtUpdatedAt(step, now, stores.service) + stores.initCreatedAtUpdatedAt(step, now, stores.router) +} + +func (stores *stores) initCreatedAtUpdatedAt(step *boltz.MigrationStep, now time.Time, store boltz.CrudStore) { + ids, _, err := store.QueryIds(step.Ctx.Tx(), "true") + step.SetError(err) + for _, id := range ids { + entityBucket := store.GetEntityBucket(step.Ctx.Tx(), []byte(id)) + if entityBucket == nil { + step.SetError(errors.Errorf("could not get entity bucket for %v with id %v", store.GetSingularEntityType(), id)) + return + } + entityBucket.SetTime(boltz.FieldCreatedAt, now, nil) + entityBucket.SetTime(boltz.FieldUpdatedAt, now, nil) + if step.SetError(entityBucket.GetError()) { + return + } + } +} diff --git a/controller/db/router_store.go b/controller/db/router_store.go index 183674590..b4407258a 100644 --- a/controller/db/router_store.go +++ b/controller/db/router_store.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,27 +32,21 @@ const ( ) type Router struct { - Id string + boltz.BaseExtEntity Fingerprint string } -func (router *Router) GetId() string { - return router.Id +func (entity *Router) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { + entity.LoadBaseValues(bucket) + entity.Fingerprint = bucket.GetStringOrError(FieldRouterFingerprint) } -func (router *Router) SetId(id string) { - router.Id = id +func (entity *Router) SetValues(ctx *boltz.PersistContext) { + entity.SetBaseValues(ctx) + ctx.SetString(FieldRouterFingerprint, entity.Fingerprint) } -func (router *Router) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { - router.Fingerprint = bucket.GetStringOrError(FieldRouterFingerprint) -} - -func (router *Router) SetValues(ctx *boltz.PersistContext) { - ctx.SetString(FieldRouterFingerprint, router.Fingerprint) -} - -func (router *Router) GetEntityType() string { +func (entity *Router) GetEntityType() string { return EntityTypeRouters } @@ -74,14 +68,19 @@ func newRouterStore(stores *stores) *routerStoreImpl { } store.InitImpl(store) store.AddSymbol(FieldRouterFingerprint, ast.NodeTypeString) + store.terminatorsSymbol = store.AddFkSetSymbol(EntityTypeTerminators, stores.terminator) return store } type routerStoreImpl struct { baseStore + terminatorsSymbol boltz.EntitySetSymbol } -func (store *routerStoreImpl) NewStoreEntity() boltz.BaseEntity { +func (store *routerStoreImpl) initializeLinked() { +} + +func (store *routerStoreImpl) NewStoreEntity() boltz.Entity { return &Router{} } @@ -92,3 +91,13 @@ func (store *routerStoreImpl) LoadOneById(tx *bbolt.Tx, id string) (*Router, err } return entity, nil } + +func (store *routerStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { + terminatorIds := store.GetRelatedEntitiesIdList(ctx.Tx(), id, EntityTypeTerminators) + for _, terminatorId := range terminatorIds { + if err := store.stores.terminator.DeleteById(ctx, terminatorId); err != nil { + return err + } + } + return store.BaseStore.DeleteById(ctx, id) +} diff --git a/controller/db/service_store.go b/controller/db/service_store.go index ffd9a0b6a..b7bb49e66 100644 --- a/controller/db/service_store.go +++ b/controller/db/service_store.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package db import ( - "encoding/binary" "fmt" "github.com/netfoundry/ziti-foundation/storage/ast" "github.com/netfoundry/ziti-foundation/storage/boltz" @@ -25,61 +24,26 @@ import ( ) const ( - EntityTypeServices = "services" - FieldServiceBinding = "binding" - FieldServiceEndpoint = "endpoint" - FieldServiceEgress = "egress" - FieldServerPeerData = "peerdata" + EntityTypeServices = "services" + FieldServiceTerminatorStrategy = "terminatorStrategy" ) type Service struct { - Id string - Binding string - EndpointAddress string - Egress string - PeerData map[uint32][]byte + boltz.BaseExtEntity + TerminatorStrategy string } -func (service *Service) GetId() string { - return service.Id +func (entity *Service) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { + entity.LoadBaseValues(bucket) + entity.TerminatorStrategy = bucket.GetStringWithDefault(FieldServiceTerminatorStrategy, "") } -func (service *Service) SetId(id string) { - service.Id = id +func (entity *Service) SetValues(ctx *boltz.PersistContext) { + entity.SetBaseValues(ctx) + ctx.SetString(FieldServiceTerminatorStrategy, entity.TerminatorStrategy) } -func (service *Service) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { - service.Binding = bucket.GetStringWithDefault(FieldServiceBinding, "") - service.EndpointAddress = bucket.GetStringWithDefault(FieldServiceEndpoint, "") - service.Egress = bucket.GetStringWithDefault(FieldServiceEgress, "") - - data := bucket.GetBucket(FieldServerPeerData) - if data != nil { - service.PeerData = make(map[uint32][]byte) - iter := data.Cursor() - for k, v := iter.First(); k != nil; k, v = iter.Next() { - service.PeerData[binary.LittleEndian.Uint32(k)] = v - } - } -} - -func (service *Service) SetValues(ctx *boltz.PersistContext) { - ctx.SetString(FieldServiceBinding, service.Binding) - ctx.SetString(FieldServiceEndpoint, service.EndpointAddress) - ctx.SetString(FieldServiceEgress, service.Egress) - - _ = ctx.Bucket.DeleteBucket([]byte(FieldServerPeerData)) - if service.PeerData != nil { - hostDataBucket := ctx.Bucket.GetOrCreateBucket(FieldServerPeerData) - for k, v := range service.PeerData { - key := make([]byte, 4) - binary.LittleEndian.PutUint32(key, k) - hostDataBucket.PutValue(key, v) - } - } -} - -func (service *Service) GetEntityType() string { +func (entity *Service) GetEntityType() string { return EntityTypeServices } @@ -100,17 +64,20 @@ func newServiceStore(stores *stores) *serviceStoreImpl { }, } store.InitImpl(store) - store.AddSymbol(FieldServiceBinding, ast.NodeTypeString) - store.AddSymbol(FieldServiceEndpoint, ast.NodeTypeString) - store.AddSymbol(FieldServiceEgress, ast.NodeTypeString) + store.AddSymbol(FieldServiceTerminatorStrategy, ast.NodeTypeString) + store.terminatorsSymbol = store.AddFkSetSymbol(EntityTypeTerminators, stores.terminator) return store } type serviceStoreImpl struct { baseStore + terminatorsSymbol boltz.EntitySetSymbol } -func (store *serviceStoreImpl) NewStoreEntity() boltz.BaseEntity { +func (store *serviceStoreImpl) initializeLinked() { +} + +func (store *serviceStoreImpl) NewStoreEntity() boltz.Entity { return &Service{} } @@ -121,3 +88,13 @@ func (store *serviceStoreImpl) LoadOneById(tx *bbolt.Tx, id string) (*Service, e } return entity, nil } + +func (store *serviceStoreImpl) DeleteById(ctx boltz.MutateContext, id string) error { + terminatorIds := store.GetRelatedEntitiesIdList(ctx.Tx(), id, EntityTypeTerminators) + for _, terminatorId := range terminatorIds { + if err := store.stores.terminator.DeleteById(ctx, terminatorId); err != nil { + return err + } + } + return store.BaseStore.DeleteById(ctx, id) +} diff --git a/controller/db/stores.go b/controller/db/stores.go index b6036b1d3..3c672d75a 100644 --- a/controller/db/stores.go +++ b/controller/db/stores.go @@ -1,24 +1,87 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + package db +import ( + "github.com/netfoundry/ziti-foundation/storage/boltz" + "reflect" +) + type Stores struct { - Router RouterStore - Service ServiceStore + Terminator TerminatorStore + Router RouterStore + Service ServiceStore + storeMap map[string]boltz.CrudStore +} + +func (stores *Stores) buildStoreMap() { + stores.storeMap = map[string]boltz.CrudStore{} + val := reflect.ValueOf(stores).Elem() + for i := 0; i < val.NumField(); i++ { + f := val.Field(i) + if f.CanInterface() { + if store, ok := f.Interface().(boltz.CrudStore); ok { + stores.storeMap[store.GetEntityType()] = store + } + } + } +} + +func (stores *Stores) GetStoreList() []boltz.CrudStore { + var result []boltz.CrudStore + for _, store := range stores.storeMap { + result = append(result, store) + } + return result +} + +func (stores *Stores) GetStoreForEntity(entity boltz.Entity) boltz.CrudStore { + return stores.storeMap[entity.GetEntityType()] } type stores struct { - router *routerStoreImpl - service *serviceStoreImpl + terminator *terminatorStoreImpl + router *routerStoreImpl + service *serviceStoreImpl } -func InitStores() *Stores { +func InitStores(db boltz.Db) (*Stores, error) { internalStores := &stores{} + + internalStores.terminator = newTerminatorStore(internalStores) internalStores.router = newRouterStore(internalStores) internalStores.service = newServiceStore(internalStores) stores := &Stores{ - Router: internalStores.router, - Service: internalStores.service, + Terminator: internalStores.terminator, + Router: internalStores.router, + Service: internalStores.service, } - return stores + stores.buildStoreMap() + + internalStores.terminator.initializeLinked() + internalStores.router.initializeLinked() + internalStores.service.initializeLinked() + + mm := boltz.NewMigratorManager(db) + if err := mm.Migrate("fabric", CurrentDbVersion, internalStores.migrate); err != nil { + return nil, err + } + + return stores, nil } diff --git a/controller/db/terminator_store.go b/controller/db/terminator_store.go new file mode 100644 index 000000000..6f2fc3a23 --- /dev/null +++ b/controller/db/terminator_store.go @@ -0,0 +1,133 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package db + +import ( + "encoding/binary" + "fmt" + "github.com/netfoundry/ziti-foundation/storage/ast" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "go.etcd.io/bbolt" +) + +const ( + EntityTypeTerminators = "terminators" + FieldTerminatorService = "service" + FieldTerminatorRouter = "router" + FieldTerminatorBinding = "binding" + FieldTerminatorAddress = "address" + FieldServerPeerData = "peerData" +) + +type Terminator struct { + boltz.BaseExtEntity + Service string + Router string + Binding string + Address string + PeerData map[uint32][]byte +} + +func (entity *Terminator) LoadValues(_ boltz.CrudStore, bucket *boltz.TypedBucket) { + entity.LoadBaseValues(bucket) + entity.Service = bucket.GetStringOrError(FieldTerminatorService) + entity.Router = bucket.GetStringOrError(FieldTerminatorRouter) + entity.Binding = bucket.GetStringOrError(FieldTerminatorBinding) + entity.Address = bucket.GetStringWithDefault(FieldTerminatorAddress, "") + + data := bucket.GetBucket(FieldServerPeerData) + if data != nil { + entity.PeerData = make(map[uint32][]byte) + iter := data.Cursor() + for k, v := iter.First(); k != nil; k, v = iter.Next() { + entity.PeerData[binary.LittleEndian.Uint32(k)] = v + } + } +} + +func (entity *Terminator) SetValues(ctx *boltz.PersistContext) { + entity.SetBaseValues(ctx) + ctx.SetString(FieldTerminatorService, entity.Service) + ctx.SetString(FieldTerminatorRouter, entity.Router) + ctx.SetString(FieldTerminatorBinding, entity.Binding) + ctx.SetString(FieldTerminatorAddress, entity.Address) + + _ = ctx.Bucket.DeleteBucket([]byte(FieldServerPeerData)) + if entity.PeerData != nil { + hostDataBucket := ctx.Bucket.GetOrCreateBucket(FieldServerPeerData) + for k, v := range entity.PeerData { + key := make([]byte, 4) + binary.LittleEndian.PutUint32(key, k) + hostDataBucket.PutValue(key, v) + } + } +} + +func (entity *Terminator) GetEntityType() string { + return EntityTypeTerminators +} + +type TerminatorStore interface { + boltz.CrudStore + LoadOneById(tx *bbolt.Tx, id string) (*Terminator, error) +} + +func newTerminatorStore(stores *stores) *terminatorStoreImpl { + notFoundErrorFactory := func(id string) error { + return fmt.Errorf("missing terminator '%s'", id) + } + + store := &terminatorStoreImpl{ + baseStore: baseStore{ + stores: stores, + BaseStore: boltz.NewBaseStore(nil, EntityTypeTerminators, notFoundErrorFactory, boltz.RootBucket), + }, + } + store.InitImpl(store) + store.AddExtEntitySymbols() + store.AddSymbol(FieldTerminatorBinding, ast.NodeTypeString) + store.AddSymbol(FieldTerminatorAddress, ast.NodeTypeString) + + store.serviceSymbol = store.AddFkSymbol(FieldTerminatorService, store.stores.service) + store.routerSymbol = store.AddFkSymbol(FieldTerminatorRouter, store.stores.router) + + return store +} + +type terminatorStoreImpl struct { + baseStore + + serviceSymbol boltz.EntitySymbol + routerSymbol boltz.EntitySymbol +} + +func (store *terminatorStoreImpl) NewStoreEntity() boltz.Entity { + return &Terminator{} +} + +func (store *terminatorStoreImpl) initializeLinked() { + store.AddFkIndex(store.serviceSymbol, store.stores.service.terminatorsSymbol) + store.AddFkIndex(store.routerSymbol, store.stores.router.terminatorsSymbol) +} + +func (store *terminatorStoreImpl) LoadOneById(tx *bbolt.Tx, id string) (*Terminator, error) { + entity := &Terminator{} + if found, err := store.BaseLoadOneById(tx, id, entity); !found || err != nil { + return nil, err + } + return entity, nil +} diff --git a/controller/db/terminator_store_test.go b/controller/db/terminator_store_test.go new file mode 100644 index 000000000..6f332603f --- /dev/null +++ b/controller/db/terminator_store_test.go @@ -0,0 +1,215 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package db + +import ( + "fmt" + "github.com/google/uuid" + "github.com/netfoundry/ziti-foundation/util/stringz" + "go.etcd.io/bbolt" + "testing" + "time" +) + +func Test_TerminatorStore(t *testing.T) { + ctx := NewTestContext(t) + defer ctx.Cleanup() + + t.Run("test create invalid terminators", ctx.testCreateInvalidTerminators) + t.Run("test create/delete terminators", ctx.testCreateTerminators) + t.Run("test create/delete terminators", ctx.testLoadQueryTerminators) + t.Run("test update Services", ctx.testUpdateTerminators) + t.Run("test delete Services", ctx.testDeleteTerminators) +} + +func (ctx *TestContext) testCreateInvalidTerminators(t *testing.T) { + ctx.NextTest(t) + defer ctx.cleanupAll() + + terminator := &Terminator{} + err := ctx.Create(terminator) + ctx.EqualError(err, "cannot create terminator with blank id") + + service := ctx.requireNewService() + router := ctx.requireNewRouter() + + terminator.Id = uuid.New().String() + terminator.Service = uuid.New().String() + terminator.Router = router.Id + err = ctx.Create(terminator) + ctx.EqualError(err, fmt.Sprintf("no entity of type services with id %v", terminator.Service)) + + terminator.Id = uuid.New().String() + terminator.Service = service.Id + terminator.Router = uuid.New().String() + err = ctx.Create(terminator) + ctx.EqualError(err, fmt.Sprintf("no entity of type routers with id %v", terminator.Router)) +} + +type terminatorTestEntities struct { + service *Service + service2 *Service + + router *Router + router2 *Router + + terminator *Terminator + terminator2 *Terminator + terminator3 *Terminator +} + +func (ctx *TestContext) createTestTerminators() *terminatorTestEntities { + e := &terminatorTestEntities{} + + e.service = ctx.requireNewService() + e.router = ctx.requireNewRouter() + + e.terminator = &Terminator{} + e.terminator.Id = uuid.New().String() + e.terminator.Service = e.service.Id + e.terminator.Router = e.router.Id + e.terminator.Binding = uuid.New().String() + e.terminator.Address = uuid.New().String() + ctx.RequireCreate(e.terminator) + + e.router2 = ctx.requireNewRouter() + + e.terminator2 = &Terminator{} + e.terminator2.Id = uuid.New().String() + e.terminator2.Service = e.service.Id + e.terminator2.Router = e.router2.Id + ctx.RequireCreate(e.terminator2) + + e.service2 = ctx.requireNewService() + + e.terminator3 = &Terminator{} + e.terminator3.Id = uuid.New().String() + e.terminator3.Service = e.service2.Id + e.terminator3.Router = e.router2.Id + ctx.RequireCreate(e.terminator3) + + return e +} + +func (ctx *TestContext) testCreateTerminators(t *testing.T) { + ctx.NextTest(t) + defer ctx.cleanupAll() + + e := ctx.createTestTerminators() + + ctx.ValidateBaseline(e.terminator) + ctx.ValidateBaseline(e.terminator2) + ctx.ValidateBaseline(e.terminator3) + + terminatorIds := ctx.GetRelatedIds(e.service, EntityTypeTerminators) + ctx.EqualValues(2, len(terminatorIds)) + ctx.True(stringz.Contains(terminatorIds, e.terminator.Id)) + ctx.True(stringz.Contains(terminatorIds, e.terminator2.Id)) + + terminatorIds = ctx.GetRelatedIds(e.router, EntityTypeTerminators) + ctx.EqualValues(1, len(terminatorIds)) + ctx.EqualValues(e.terminator.Id, terminatorIds[0]) + + terminatorIds = ctx.GetRelatedIds(e.router2, EntityTypeTerminators) + ctx.EqualValues(2, len(terminatorIds)) + ctx.True(stringz.Contains(terminatorIds, e.terminator2.Id)) + ctx.True(stringz.Contains(terminatorIds, e.terminator3.Id)) + + terminatorIds = ctx.GetRelatedIds(e.service2, EntityTypeTerminators) + ctx.EqualValues(1, len(terminatorIds)) + ctx.EqualValues(e.terminator3.Id, terminatorIds[0]) + +} + +func (ctx *TestContext) testLoadQueryTerminators(t *testing.T) { + ctx.NextTest(t) + defer ctx.cleanupAll() + + e := ctx.createTestTerminators() + + err := ctx.GetDb().View(func(tx *bbolt.Tx) error { + loadedTerminator, err := ctx.stores.Terminator.LoadOneById(tx, e.terminator.Id) + ctx.NoError(err) + ctx.NotNil(loadedTerminator) + ctx.EqualValues(e.terminator.Id, loadedTerminator.Id) + ctx.EqualValues(e.terminator.Service, loadedTerminator.Service) + ctx.EqualValues(e.terminator.Router, loadedTerminator.Router) + ctx.EqualValues(e.terminator.Binding, loadedTerminator.Binding) + ctx.EqualValues(e.terminator.Address, loadedTerminator.Address) + + ids, _, err := ctx.stores.Terminator.QueryIdsf(tx, `service = "%v"`, e.service.Id) + ctx.NoError(err) + ctx.EqualValues(2, len(ids)) + ctx.True(stringz.Contains(ids, e.terminator.Id)) + ctx.True(stringz.Contains(ids, e.terminator2.Id)) + + ids, _, err = ctx.stores.Terminator.QueryIdsf(tx, `router = "%v"`, e.router2.Id) + ctx.NoError(err) + ctx.EqualValues(2, len(ids)) + ctx.True(stringz.Contains(ids, e.terminator2.Id)) + ctx.True(stringz.Contains(ids, e.terminator3.Id)) + + ids, _, err = ctx.stores.Service.QueryIdsf(tx, `anyOf(terminators) = "%v"`, e.terminator.Id) + ctx.NoError(err) + ctx.EqualValues(1, len(ids)) + ctx.True(stringz.Contains(ids, e.service.Id)) + + ids, _, err = ctx.stores.Router.QueryIdsf(tx, `anyOf(terminators) = "%v"`, e.terminator.Id) + ctx.NoError(err) + ctx.EqualValues(1, len(ids)) + ctx.True(stringz.Contains(ids, e.router.Id)) + + return nil + }) + ctx.NoError(err) +} + +func (ctx *TestContext) testUpdateTerminators(t *testing.T) { + ctx.NextTest(t) + defer ctx.cleanupAll() + + e := ctx.createTestTerminators() + + terminator := e.terminator + ctx.RequireReload(terminator) + + time.Sleep(time.Millisecond * 10) // ensure updatedAt is after createdAt + + terminator.Service = e.service2.Id + terminator.Router = e.router2.Id + terminator.Binding = uuid.New().String() + terminator.Address = uuid.New().String() + terminator.Tags = ctx.CreateTags() + ctx.RequireUpdate(terminator) + ctx.ValidateUpdated(terminator) +} + +func (ctx *TestContext) testDeleteTerminators(t *testing.T) { + ctx.NextTest(t) + defer ctx.cleanupAll() + + e := ctx.createTestTerminators() + + ctx.RequireDelete(e.terminator3) + ctx.RequireDelete(e.router2) + + ctx.ValidateDeleted(e.terminator2.Id) + ctx.ValidateDeleted(e.terminator3.Id) + + ctx.RequireDelete(e.service) + ctx.ValidateDeleted(e.terminator.Id) +} diff --git a/controller/db/testing.go b/controller/db/testing.go new file mode 100644 index 000000000..8744caf65 --- /dev/null +++ b/controller/db/testing.go @@ -0,0 +1,72 @@ +package db + +import ( + "github.com/google/uuid" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "go.etcd.io/bbolt" + "testing" +) + +func NewTestContext(t *testing.T) *TestContext { + context := &TestContext{ + BaseTestContext: *boltz.NewTestContext(t), + } + context.Impl = context + context.Init() + return context +} + +type TestContext struct { + db boltz.Db + stores *Stores + boltz.BaseTestContext +} + +func (ctx *TestContext) GetStoreForEntity(entity boltz.Entity) boltz.CrudStore { + return ctx.stores.GetStoreForEntity(entity) +} + +func (ctx *TestContext) GetDb() boltz.Db { + return ctx.db +} + +func (ctx *TestContext) Init() { + ctx.InitDbFile() + + var err error + ctx.db, err = Open(ctx.GetDbFile().Name()) + ctx.NoError(err) + + ctx.stores, err = InitStores(ctx.GetDb()) + ctx.NoError(err) +} + +func (ctx *TestContext) requireNewService() *Service { + entity := &Service{ + BaseExtEntity: boltz.BaseExtEntity{Id: uuid.New().String()}, + } + ctx.RequireCreate(entity) + return entity +} + +func (ctx *TestContext) requireNewRouter() *Router { + entity := &Router{ + BaseExtEntity: boltz.BaseExtEntity{Id: uuid.New().String()}, + } + ctx.RequireCreate(entity) + return entity +} + +func (ctx *TestContext) cleanupAll() { + _ = ctx.GetDb().Update(func(tx *bbolt.Tx) error { + mutateContext := boltz.NewMutateContext(tx) + for _, store := range ctx.stores.storeMap { + if err := store.DeleteWhere(mutateContext, `true limit none`); err != nil { + pfxlog.Logger().WithError(err).Errorf("failure while cleaning up %v", store.GetEntityType()) + return err + } + } + return nil + }) +} diff --git a/controller/handler_common/common.go b/controller/handler_common/common.go new file mode 100644 index 000000000..c58118320 --- /dev/null +++ b/controller/handler_common/common.go @@ -0,0 +1,26 @@ +package handler_common + +import ( + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-foundation/channel2" +) + +func SendSuccess(request *channel2.Message, ch channel2.Channel, message string) { + SendResult(request, ch, message, true) +} + +func SendFailure(request *channel2.Message, ch channel2.Channel, message string) { + SendResult(request, ch, message, false) +} + +func SendResult(request *channel2.Message, ch channel2.Channel, message string, success bool) { + log := pfxlog.ContextLogger(ch.Label()) + if !success { + log.Errorf("%v error (%s)", ch.LogicalName(), message) + } + + response := channel2.NewResult(success, message) + response.ReplyTo(request) + _ = ch.Send(response) + log.Debug("success") +} diff --git a/controller/handler_ctrl/accept.go b/controller/handler_ctrl/accept.go index f7202eed9..e08c263ac 100644 --- a/controller/handler_ctrl/accept.go +++ b/controller/handler_ctrl/accept.go @@ -51,7 +51,7 @@ func (ctrlAccepter *CtrlAccepter) Run() { for { ch, err := channel2.NewChannel("ctrl", ctrlAccepter.listener, ctrlAccepter.options) if err == nil { - if r, err := ctrlAccepter.network.KnownRouter(ch.Id().Token); err == nil { + if r, err := ctrlAccepter.network.GetRouter(ch.Id().Token); err == nil { if ch.Underlay().Headers() != nil { if listenerValue, found := ch.Underlay().Headers()[channel2.HelloListenerHeader]; found { listenerString := string(listenerValue) diff --git a/controller/handler_ctrl/bind.go b/controller/handler_ctrl/bind.go index be4db8eed..24133bb75 100644 --- a/controller/handler_ctrl/bind.go +++ b/controller/handler_ctrl/bind.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -36,7 +36,8 @@ func newBindHandler(router *network.Router, network *network.Network, xctrls []x func (bindHandler *bindHandler) BindChannel(ch channel2.Channel) error { ch.SetLogicalName(bindHandler.router.Id) ch.AddReceiveHandler(newSessionRequestHandler(bindHandler.router, bindHandler.network)) - ch.AddReceiveHandler(newHostRequestHandler(bindHandler.router, bindHandler.network)) + ch.AddReceiveHandler(newCreateTerminatorHandler(bindHandler.network, bindHandler.router)) + ch.AddReceiveHandler(newRemoveTerminatorHandler(bindHandler.network)) ch.AddReceiveHandler(newLinkHandler(bindHandler.router, bindHandler.network)) ch.AddReceiveHandler(newFaultHandler(bindHandler.router, bindHandler.network)) ch.AddReceiveHandler(newMetricsHandler(bindHandler.network)) diff --git a/controller/handler_ctrl/bind_service_request.go b/controller/handler_ctrl/bind_service_request.go deleted file mode 100644 index 6c897296c..000000000 --- a/controller/handler_ctrl/bind_service_request.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - Copyright 2019 NetFoundry, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package handler_ctrl - -import ( - "github.com/golang/protobuf/proto" - "github.com/michaelquigley/pfxlog" - "github.com/netfoundry/ziti-fabric/controller/network" - "github.com/netfoundry/ziti-fabric/pb/ctrl_pb" - "github.com/netfoundry/ziti-foundation/channel2" -) - -type hostRequestHandler struct { - r *network.Router - network *network.Network -} - -var successResponse = &ctrl_pb.BindResponse{Success: true} - -func newHostRequestHandler(r *network.Router, network *network.Network) *hostRequestHandler { - return &hostRequestHandler{r: r, network: network} -} - -func (h *hostRequestHandler) ContentType() int32 { - return int32(ctrl_pb.ContentType_BindRequestType) -} - -func (h *hostRequestHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { - log := pfxlog.ContextLogger(ch.Label()) - - request := &ctrl_pb.BindRequest{} - if err := proto.Unmarshal(msg.Body, request); err != nil { - log.Errorf("unexpected error (%s)", err) - return - } - - response := successResponse - - var err error - if request.BindType == ctrl_pb.BindType_Bind { - err = h.network.BindService(h.r, request.Token, request.ServiceId, request.PeerData) - } else if request.BindType == ctrl_pb.BindType_Unbind { - err = h.network.UnbindService(h.r, request.Token, request.ServiceId) - } - - if err != nil { - log.Errorf("unexpected error (%s)", err) - response = &ctrl_pb.BindResponse{Success: false, Message: err.Error()} - } - - if body, err := proto.Marshal(response); err == nil { - responseMsg := channel2.NewMessage(int32(ctrl_pb.ContentType_BindResponseType), body) - responseMsg.ReplyTo(msg) - if err := h.r.Control.Send(responseMsg); err != nil { - log.Errorf("unable to respond (%s)", err) - } - } else { - log.Errorf("unexpected error (%s)", err) - } -} diff --git a/controller/handler_ctrl/connect.go b/controller/handler_ctrl/connect.go index 23fe2755c..8e98f5743 100644 --- a/controller/handler_ctrl/connect.go +++ b/controller/handler_ctrl/connect.go @@ -62,7 +62,7 @@ func (h *ConnectHandler) HandleConnection(hello *channel2.Hello, certificates [] return errors.New("router already connected") } - if r, err := h.network.KnownRouter(id); err == nil { + if r, err := h.network.GetRouter(id); err == nil { if r.Fingerprint != fingerprint { return errors.New("unenrolled router") } diff --git a/controller/handler_ctrl/create_terminator.go b/controller/handler_ctrl/create_terminator.go new file mode 100644 index 000000000..5b971e275 --- /dev/null +++ b/controller/handler_ctrl/create_terminator.go @@ -0,0 +1,66 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_ctrl + +import ( + "github.com/golang/protobuf/proto" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/models" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/ctrl_pb" + "github.com/netfoundry/ziti-foundation/channel2" +) + +type createTerminatorHandler struct { + router *network.Router + network *network.Network +} + +func newCreateTerminatorHandler(network *network.Network, router *network.Router) *createTerminatorHandler { + return &createTerminatorHandler{ + network: network, + router: router, + } +} + +func (h *createTerminatorHandler) ContentType() int32 { + return int32(ctrl_pb.ContentType_CreateTerminatorRequestType) +} + +func (h *createTerminatorHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + request := &ctrl_pb.CreateTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, request); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + terminator := &network.Terminator{ + BaseEntity: models.BaseEntity{ + Id: request.Id, + }, + Service: request.ServiceId, + Router: h.router.Id, + Binding: request.Binding, + Address: request.Address, + PeerData: request.PeerData, + } + + if id, err := h.network.Terminators.Create(terminator); err == nil { + handler_common.SendSuccess(msg, ch, id) + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } +} diff --git a/controller/handler_ctrl/remove_terminator.go b/controller/handler_ctrl/remove_terminator.go new file mode 100644 index 000000000..6037ed839 --- /dev/null +++ b/controller/handler_ctrl/remove_terminator.go @@ -0,0 +1,61 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_ctrl + +import ( + "github.com/golang/protobuf/proto" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/ctrl_pb" + "github.com/netfoundry/ziti-foundation/channel2" +) + +type removeTerminatorHandler struct { + network *network.Network +} + +func newRemoveTerminatorHandler(network *network.Network) *removeTerminatorHandler { + return &removeTerminatorHandler{network: network} +} + +func (h *removeTerminatorHandler) ContentType() int32 { + return int32(ctrl_pb.ContentType_RemoveTerminatorRequestType) +} + +func (h *removeTerminatorHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + log := pfxlog.ContextLogger(ch.Label()) + + request := &ctrl_pb.RemoveTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, request); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + _, err := h.network.Terminators.Read(request.TerminatorId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + if err := h.network.Terminators.Delete(request.TerminatorId); err == nil { + log.Infof("removed terminator [e/%s]", request.TerminatorId) + handler_common.SendSuccess(msg, ch, "") + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } +} diff --git a/controller/handler_ctrl/session_request.go b/controller/handler_ctrl/session_request.go index 96a8b5390..459f66272 100644 --- a/controller/handler_ctrl/session_request.go +++ b/controller/handler_ctrl/session_request.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -54,7 +54,7 @@ func (h *sessionRequestHandler) HandleReceive(msg *channel2.Message, ch channel2 if session, err := h.network.CreateSession(h.r, id, request.ServiceId); err == nil { responseMsg := ctrl_msg.NewSessionSuccessMsg(session.Id.Token, session.Circuit.IngressId) responseMsg.ReplyTo(msg) - for k, v := range session.Service.PeerData { + for k, v := range session.Terminator.PeerData { responseMsg.Headers[int32(k)] = v } if startXgressSession, err := h.r.Control.SendAndWaitWithTimeout(responseMsg, time.Second*10); err != nil { diff --git a/controller/handler_mgmt/bind.go b/controller/handler_mgmt/bind.go index ba6652099..a396b92b9 100644 --- a/controller/handler_mgmt/bind.go +++ b/controller/handler_mgmt/bind.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -48,6 +48,11 @@ func (bindHandler *BindHandler) BindChannel(ch channel2.Channel) error { ch.AddReceiveHandler(newSetLinkCostHandler(network)) ch.AddReceiveHandler(newSetLinkDownHandler(network)) + ch.AddReceiveHandler(newCreateTerminatorHandler(network)) + ch.AddReceiveHandler(newRemoveTerminatorHandler(network)) + ch.AddReceiveHandler(newGetTerminatorHandler(network)) + ch.AddReceiveHandler(newListTerminatorsHandler(network)) + streamMetricHandler := newStreamMetricsHandler(network) ch.AddReceiveHandler(streamMetricHandler) ch.AddCloseHandler(streamMetricHandler) diff --git a/controller/handler_mgmt/connect.go b/controller/handler_mgmt/connect.go index 09a3fc81b..5ce089067 100644 --- a/controller/handler_mgmt/connect.go +++ b/controller/handler_mgmt/connect.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package handler_mgmt import ( "crypto/x509" - "github.com/michaelquigley/pfxlog" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-foundation/channel2" ) @@ -36,23 +35,3 @@ func NewConnectHandler(network *network.Network) *ConnectHandler { func (h *ConnectHandler) HandleConnection(hello *channel2.Hello, certificates []*x509.Certificate) error { return nil } - -func sendSuccess(request *channel2.Message, ch channel2.Channel, message string) { - sendResult(request, ch, message, true) -} - -func sendFailure(request *channel2.Message, ch channel2.Channel, message string) { - sendResult(request, ch, message, false) -} - -func sendResult(request *channel2.Message, ch channel2.Channel, message string, success bool) { - log := pfxlog.ContextLogger(ch.Label()) - if !success { - log.Errorf("mgmt error (%s)", message) - } - - response := channel2.NewResult(success, message) - response.ReplyTo(request) - _ = ch.Send(response) - log.Debug("success") -} diff --git a/controller/handler_mgmt/create_router.go b/controller/handler_mgmt/create_router.go index 5b79c7d54..32ca5bb8f 100644 --- a/controller/handler_mgmt/create_router.go +++ b/controller/handler_mgmt/create_router.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -44,11 +45,11 @@ func (h *createRouterHandler) HandleReceive(msg *channel2.Message, ch channel2.C r := network.NewRouter(create.Router.Id, create.Router.Fingerprint) if err := h.network.CreateRouter(r); err == nil { log.Infof("created router [r/%s] with fingerprint [%s]", r.Id, r.Fingerprint) - sendSuccess(msg, ch, "") + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/create_service.go b/controller/handler_mgmt/create_service.go index 4e779715a..b859b0c64 100644 --- a/controller/handler_mgmt/create_service.go +++ b/controller/handler_mgmt/create_service.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/models" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -39,21 +41,24 @@ func (h *createServiceHandler) HandleReceive(msg *channel2.Message, ch channel2. cs := &mgmt_pb.CreateServiceRequest{} err := proto.Unmarshal(msg.Body, cs) if err == nil { - binding := "transport" - if cs.Service.Binding != "" { - binding = cs.Service.Binding + service := &network.Service{ + BaseEntity: models.BaseEntity{Id: cs.Service.Id}, + TerminatorStrategy: cs.Service.TerminatorStrategy, } - if err = h.network.CreateService(&network.Service{ - Id: cs.Service.Id, - Binding: binding, - EndpointAddress: cs.Service.EndpointAddress, - Egress: cs.Service.Egress, - }); err == nil { - sendSuccess(msg, ch, "") + for _, terminator := range cs.Service.Terminators { + modelTerminator, err := toModelTerminator(h.network, terminator) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + service.Terminators = append(service.Terminators, modelTerminator) + } + if err = h.network.Services.Create(service); err == nil { + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/create_terminator.go b/controller/handler_mgmt/create_terminator.go new file mode 100644 index 000000000..bfafea33b --- /dev/null +++ b/controller/handler_mgmt/create_terminator.go @@ -0,0 +1,81 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_mgmt + +import ( + "github.com/golang/protobuf/proto" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/models" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" + "github.com/netfoundry/ziti-foundation/channel2" + "github.com/pkg/errors" +) + +type createTerminatorHandler struct { + network *network.Network +} + +func newCreateTerminatorHandler(network *network.Network) *createTerminatorHandler { + return &createTerminatorHandler{network: network} +} + +func (h *createTerminatorHandler) ContentType() int32 { + return int32(mgmt_pb.ContentType_CreateTerminatorRequestType) +} + +func (h *createTerminatorHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + cs := &mgmt_pb.CreateTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, cs); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + terminator, err := toModelTerminator(h.network, cs.Terminator) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + if id, err := h.network.Terminators.Create(terminator); err == nil { + handler_common.SendSuccess(msg, ch, id) + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } +} + +func toModelTerminator(n *network.Network, e *mgmt_pb.Terminator) (*network.Terminator, error) { + router, _ := n.GetRouter(e.RouterId) + if router == nil { + return nil, errors.Errorf("invalid router id %v", e.RouterId) + } + + binding := "transport" + if e.Binding != "" { + binding = e.Binding + } + + return &network.Terminator{ + BaseEntity: models.BaseEntity{ + Id: e.Id, + Tags: nil, + }, + Service: e.ServiceId, + Router: router.Id, + Binding: binding, + Address: e.Address, + PeerData: e.PeerData, + }, nil +} diff --git a/controller/handler_mgmt/get_service.go b/controller/handler_mgmt/get_service.go index 9925465c6..762ae89e9 100644 --- a/controller/handler_mgmt/get_service.go +++ b/controller/handler_mgmt/get_service.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -39,30 +40,39 @@ func (h *getServiceHandler) ContentType() int32 { func (h *getServiceHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { rs := &mgmt_pb.GetServiceRequest{} err := proto.Unmarshal(msg.Body, rs) + + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + response := &mgmt_pb.GetServiceResponse{} + svc, err := h.network.Services.Read(rs.ServiceId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + response.Service = toApiService(svc) + body, err := proto.Marshal(response) if err == nil { - response := &mgmt_pb.GetServiceResponse{} - if svc, found := h.network.GetService(rs.ServiceId); found { - response.Service = &mgmt_pb.Service{ - Id: svc.Id, - Binding: svc.Binding, - EndpointAddress: svc.EndpointAddress, - Egress: svc.Egress, - } - - body, err := proto.Marshal(response) - if err == nil { - responseMsg := channel2.NewMessage(int32(mgmt_pb.ContentType_GetServiceResponseType), body) - responseMsg.ReplyTo(msg) - ch.Send(responseMsg) - - } else { - pfxlog.ContextLogger(ch.Label()).Errorf("unexpected error (%s)", err) - } - - } else { - sendFailure(msg, ch, "no such service") - } + responseMsg := channel2.NewMessage(int32(mgmt_pb.ContentType_GetServiceResponseType), body) + responseMsg.ReplyTo(msg) + ch.Send(responseMsg) } else { - sendFailure(msg, ch, err.Error()) + pfxlog.ContextLogger(ch.Label()).Errorf("unexpected error (%s)", err) + } +} + +func toApiService(s *network.Service) *mgmt_pb.Service { + var terminators []*mgmt_pb.Terminator + for _, terminator := range s.Terminators { + terminators = append(terminators, toApiTerminator(terminator)) + } + + return &mgmt_pb.Service{ + Id: s.Id, + TerminatorStrategy: s.TerminatorStrategy, + Terminators: terminators, } } diff --git a/controller/handler_mgmt/get_terminator.go b/controller/handler_mgmt/get_terminator.go new file mode 100644 index 000000000..cdd0f0471 --- /dev/null +++ b/controller/handler_mgmt/get_terminator.go @@ -0,0 +1,79 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_mgmt + +import ( + "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" + "github.com/netfoundry/ziti-foundation/channel2" +) + +type getTerminatorHandler struct { + network *network.Network +} + +func newGetTerminatorHandler(network *network.Network) *getTerminatorHandler { + return &getTerminatorHandler{network: network} +} + +func (h *getTerminatorHandler) ContentType() int32 { + return int32(mgmt_pb.ContentType_GetTerminatorRequestType) +} + +func (h *getTerminatorHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + rs := &mgmt_pb.GetTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, rs); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + response := &mgmt_pb.GetTerminatorResponse{} + terminator, err := h.network.Terminators.Read(rs.TerminatorId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + response.Terminator = toApiTerminator(terminator) + body, err := proto.Marshal(response) + if err == nil { + responseMsg := channel2.NewMessage(int32(mgmt_pb.ContentType_GetTerminatorResponseType), body) + responseMsg.ReplyTo(msg) + ch.Send(responseMsg) + + } else { + pfxlog.ContextLogger(ch.Label()).Errorf("unexpected error (%s)", err) + } +} + +func toApiTerminator(s *network.Terminator) *mgmt_pb.Terminator { + ts, err := ptypes.TimestampProto(s.CreatedAt) + if err != nil { + pfxlog.Logger().Warnf("unexpected bad timestamp conversion: %v", err) + } + return &mgmt_pb.Terminator{ + Id: s.Id, + ServiceId: s.Service, + RouterId: s.Router, + Binding: s.Binding, + Address: s.Address, + CreatedAt: ts, + } +} diff --git a/controller/handler_mgmt/list_links.go b/controller/handler_mgmt/list_links.go index 8d64b900c..228ad7998 100644 --- a/controller/handler_mgmt/list_links.go +++ b/controller/handler_mgmt/list_links.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -39,7 +40,7 @@ func (h *listLinksHandler) ContentType() int32 { func (h *listLinksHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { list := &mgmt_pb.ListLinksRequest{} if err := proto.Unmarshal(msg.Body, list); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } @@ -63,7 +64,7 @@ func (h *listLinksHandler) HandleReceive(msg *channel2.Message, ch channel2.Chan body, err := proto.Marshal(response) if err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } diff --git a/controller/handler_mgmt/list_routers.go b/controller/handler_mgmt/list_routers.go index 69d362fb3..f2b5ee65b 100644 --- a/controller/handler_mgmt/list_routers.go +++ b/controller/handler_mgmt/list_routers.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,11 +17,14 @@ package handler_mgmt import ( + "fmt" "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" + "reflect" ) type listRoutersHandler struct { @@ -42,22 +45,26 @@ func (h *listRoutersHandler) HandleReceive(msg *channel2.Message, ch channel2.Ch list := &mgmt_pb.ListRoutersRequest{} if err := proto.Unmarshal(msg.Body, list); err == nil { response := &mgmt_pb.ListRoutersResponse{Routers: make([]*mgmt_pb.Router, 0)} - if routers, err := h.network.AllRouters(); err == nil { - log.Infof("got [%d] routers", len(routers)) - for _, r := range routers { - connected := false - if connR, found := h.network.GetConnectedRouter(r.Id); found { - connected = true - r.AdvertisedListener = connR.AdvertisedListener + if result, err := h.network.Routers.BaseList(list.Query); err == nil { + log.Infof("got [%d] routers", len(result.Entities)) + for _, entity := range result.Entities { + router, ok := entity.(*network.Router) + if !ok { + errorMsg := fmt.Sprintf("unexpected result in router list of type: %v", reflect.TypeOf(entity)) + handler_common.SendFailure(msg, ch, errorMsg) + return } + responseR := &mgmt_pb.Router{ - Id: r.Id, - Fingerprint: r.Fingerprint, - Connected: connected, + Id: router.Id, + Fingerprint: router.Fingerprint, } - if r.AdvertisedListener != nil { - responseR.ListenerAddress = r.AdvertisedListener.String() + + if connR := h.network.GetConnectedRouter(router.Id); connR != nil { + responseR.Connected = true + responseR.ListenerAddress = connR.AdvertisedListener.String() } + response.Routers = append(response.Routers, responseR) } @@ -69,11 +76,11 @@ func (h *listRoutersHandler) HandleReceive(msg *channel2.Message, ch channel2.Ch } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } } diff --git a/controller/handler_mgmt/list_services.go b/controller/handler_mgmt/list_services.go index 090e675f2..c61cee174 100644 --- a/controller/handler_mgmt/list_services.go +++ b/controller/handler_mgmt/list_services.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,11 +17,14 @@ package handler_mgmt import ( + "fmt" "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" + "reflect" ) type listServicesHandler struct { @@ -41,15 +44,16 @@ func (h *listServicesHandler) HandleReceive(msg *channel2.Message, ch channel2.C err := proto.Unmarshal(msg.Body, ls) if err == nil { response := &mgmt_pb.ListServicesResponse{Services: make([]*mgmt_pb.Service, 0)} - svcs, err := h.network.AllServices() + result, err := h.network.Services.BaseList(ls.Query) if err == nil { - for _, s := range svcs { - response.Services = append(response.Services, &mgmt_pb.Service{ - Id: s.Id, - Binding: s.Binding, - EndpointAddress: s.EndpointAddress, - Egress: s.Egress, - }) + for _, entity := range result.Entities { + service, ok := entity.(*network.Service) + if !ok { + errorMsg := fmt.Sprintf("unexpected result in service list of type: %v", reflect.TypeOf(entity)) + handler_common.SendFailure(msg, ch, errorMsg) + return + } + response.Services = append(response.Services, toApiService(service)) } body, err := proto.Marshal(response) @@ -61,12 +65,12 @@ func (h *listServicesHandler) HandleReceive(msg *channel2.Message, ch channel2.C } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/list_sessions.go b/controller/handler_mgmt/list_sessions.go index c475f4730..d2844e200 100644 --- a/controller/handler_mgmt/list_sessions.go +++ b/controller/handler_mgmt/list_sessions.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -39,7 +40,7 @@ func (h *listSessionsHandler) ContentType() int32 { func (h *listSessionsHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { list := &mgmt_pb.ListSessionsRequest{} if err := proto.Unmarshal(msg.Body, list); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } @@ -58,7 +59,7 @@ func (h *listSessionsHandler) HandleReceive(msg *channel2.Message, ch channel2.C } body, err := proto.Marshal(response) if err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } diff --git a/controller/handler_mgmt/list_terminators.go b/controller/handler_mgmt/list_terminators.go new file mode 100644 index 000000000..61825bc92 --- /dev/null +++ b/controller/handler_mgmt/list_terminators.go @@ -0,0 +1,75 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_mgmt + +import ( + "fmt" + "github.com/golang/protobuf/proto" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" + "github.com/netfoundry/ziti-foundation/channel2" + "reflect" +) + +type listTerminatorsHandler struct { + network *network.Network +} + +func newListTerminatorsHandler(network *network.Network) *listTerminatorsHandler { + return &listTerminatorsHandler{network: network} +} + +func (h *listTerminatorsHandler) ContentType() int32 { + return int32(mgmt_pb.ContentType_ListTerminatorsRequestType) +} + +func (h *listTerminatorsHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + ls := &mgmt_pb.ListTerminatorsRequest{} + if err := proto.Unmarshal(msg.Body, ls); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + response := &mgmt_pb.ListTerminatorsResponse{Terminators: make([]*mgmt_pb.Terminator, 0)} + + result, err := h.network.Terminators.BaseList(ls.Query) + if err == nil { + for _, entity := range result.Entities { + terminator, ok := entity.(*network.Terminator) + if !ok { + errorMsg := fmt.Sprintf("unexpected result in terminator list of type: %v", reflect.TypeOf(entity)) + handler_common.SendFailure(msg, ch, errorMsg) + return + } + response.Terminators = append(response.Terminators, toApiTerminator(terminator)) + } + + body, err := proto.Marshal(response) + if err == nil { + responseMsg := channel2.NewMessage(int32(mgmt_pb.ContentType_ListTerminatorsResponseType), body) + responseMsg.ReplyTo(msg) + if err := ch.Send(responseMsg); err != nil { + pfxlog.ContextLogger(ch.Label()).Errorf("unexpected error sending response (%s)", err) + } + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } +} diff --git a/controller/handler_mgmt/remove_router.go b/controller/handler_mgmt/remove_router.go index ea0a1e02a..1af7e5733 100644 --- a/controller/handler_mgmt/remove_router.go +++ b/controller/handler_mgmt/remove_router.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -39,20 +40,22 @@ func (h *removeRouterHandler) ContentType() int32 { func (h *removeRouterHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { log := pfxlog.ContextLogger(ch.Label()) - remove := &mgmt_pb.RemoveRouterRequest{} - if err := proto.Unmarshal(msg.Body, remove); err == nil { - router, err := h.network.GetRouter(remove.RouterId) - if err == nil { - if err := h.network.RemoveRouter(router); err == nil { - log.Infof("removed router [r/%s]", remove.RouterId) - sendSuccess(msg, ch, "") - } else { - sendFailure(msg, ch, err.Error()) - } - } else { - sendFailure(msg, ch, err.Error()) - } + request := &mgmt_pb.RemoveRouterRequest{} + if err := proto.Unmarshal(msg.Body, request); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + _, err := h.network.Routers.Read(request.RouterId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + if err := h.network.Routers.Delete(request.RouterId); err == nil { + log.Infof("removed router [r/%v]", request.RouterId) + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/remove_service.go b/controller/handler_mgmt/remove_service.go index 7c285338a..0aea3d08b 100644 --- a/controller/handler_mgmt/remove_service.go +++ b/controller/handler_mgmt/remove_service.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -36,19 +38,24 @@ func (h *removeServiceHandler) ContentType() int32 { } func (h *removeServiceHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { - rs := &mgmt_pb.RemoveServiceRequest{} - err := proto.Unmarshal(msg.Body, rs) - if err == nil { - if svc, found := h.network.GetService(rs.ServiceId); found { - if err := h.network.RemoveService(svc.Id); err != nil { - sendFailure(msg, ch, err.Error()) - } else { - sendSuccess(msg, ch, "") - } - } else { - sendFailure(msg, ch, "no such service") - } + log := pfxlog.ContextLogger(ch.Label()) + + request := &mgmt_pb.RemoveServiceRequest{} + if err := proto.Unmarshal(msg.Body, request); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + _, err := h.network.Services.Read(request.ServiceId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + if err := h.network.Services.Delete(request.ServiceId); err == nil { + log.Infof("removed service [s/%v]", request.ServiceId) + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/remove_session.go b/controller/handler_mgmt/remove_session.go index f8a52e99c..7d4c16dd9 100644 --- a/controller/handler_mgmt/remove_session.go +++ b/controller/handler_mgmt/remove_session.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -42,12 +43,12 @@ func (handler *removeSessionHandler) HandleReceive(msg *channel2.Message, ch cha if err := proto.Unmarshal(msg.Body, request); err == nil { sessionId := &identity.TokenId{Token: request.SessionId} if err := handler.network.RemoveSession(sessionId, request.Now); err == nil { - sendSuccess(msg, ch, "") + handler_common.SendSuccess(msg, ch, "") } else { pfxlog.Logger().Errorf("unexpected error removing session s/[%s] (%s)", sessionId.Token, err) - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/remove_terminator.go b/controller/handler_mgmt/remove_terminator.go new file mode 100644 index 000000000..8a16deb30 --- /dev/null +++ b/controller/handler_mgmt/remove_terminator.go @@ -0,0 +1,61 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package handler_mgmt + +import ( + "github.com/golang/protobuf/proto" + "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" + "github.com/netfoundry/ziti-fabric/controller/network" + "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" + "github.com/netfoundry/ziti-foundation/channel2" +) + +type removeTerminatorHandler struct { + network *network.Network +} + +func newRemoveTerminatorHandler(network *network.Network) *removeTerminatorHandler { + return &removeTerminatorHandler{network: network} +} + +func (h *removeTerminatorHandler) ContentType() int32 { + return int32(mgmt_pb.ContentType_RemoveTerminatorRequestType) +} + +func (h *removeTerminatorHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { + log := pfxlog.ContextLogger(ch.Label()) + + request := &mgmt_pb.RemoveTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, request); err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + _, err := h.network.Terminators.Read(request.TerminatorId) + if err != nil { + handler_common.SendFailure(msg, ch, err.Error()) + return + } + + if err := h.network.Terminators.Delete(request.TerminatorId); err == nil { + log.Infof("removed terminator [e/%s]", request.TerminatorId) + handler_common.SendSuccess(msg, ch, "") + } else { + handler_common.SendFailure(msg, ch, err.Error()) + } +} diff --git a/controller/handler_mgmt/set_link_cost.go b/controller/handler_mgmt/set_link_cost.go index 7e6d27990..6580383cc 100644 --- a/controller/handler_mgmt/set_link_cost.go +++ b/controller/handler_mgmt/set_link_cost.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import ( "fmt" "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -47,11 +48,11 @@ func (h *setLinkCostHandler) HandleReceive(msg *channel2.Message, ch channel2.Ch l.Cost = int(set.Cost) h.network.LinkChanged(l) log.Infof("set cost of link [l/%s] to [%d]", set.LinkId, set.Cost) - sendSuccess(msg, ch, "") + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, fmt.Sprintf("unknown link [l/%s]", set.LinkId)) + handler_common.SendFailure(msg, ch, fmt.Sprintf("unknown link [l/%s]", set.LinkId)) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/set_link_down.go b/controller/handler_mgmt/set_link_down.go index 1fc461917..fcf652f6d 100644 --- a/controller/handler_mgmt/set_link_down.go +++ b/controller/handler_mgmt/set_link_down.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import ( "fmt" "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -47,11 +48,11 @@ func (h *setLinkDownHandler) HandleReceive(msg *channel2.Message, ch channel2.Ch l.Down = set.Down h.network.LinkChanged(l) log.Infof("set down state of link [l/%s] to [%t]", set.LinkId, set.Down) - sendSuccess(msg, ch, "") + handler_common.SendSuccess(msg, ch, "") } else { - sendFailure(msg, ch, fmt.Sprintf("unknown link [l/%s]", set.LinkId)) + handler_common.SendFailure(msg, ch, fmt.Sprintf("unknown link [l/%s]", set.LinkId)) } } else { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) } } diff --git a/controller/handler_mgmt/stream_metrics.go b/controller/handler_mgmt/stream_metrics.go index c49d9b73d..bd719596d 100644 --- a/controller/handler_mgmt/stream_metrics.go +++ b/controller/handler_mgmt/stream_metrics.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes/timestamp" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/metrics" "github.com/netfoundry/ziti-fabric/pb/ctrl_pb" @@ -44,13 +45,13 @@ func (*streamMetricsHandler) ContentType() int32 { func (handler *streamMetricsHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { request := &mgmt_pb.StreamMetricsRequest{} if err := proto.Unmarshal(msg.Body, request); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } filters, err := parseFilters(request) if err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } diff --git a/controller/handler_mgmt/stream_sessions.go b/controller/handler_mgmt/stream_sessions.go index 2f1a3b5d6..ad77467ef 100644 --- a/controller/handler_mgmt/stream_sessions.go +++ b/controller/handler_mgmt/stream_sessions.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-foundation/channel2" @@ -41,7 +42,7 @@ func (*streamSessionsHandler) ContentType() int32 { func (handler *streamSessionsHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { request := &mgmt_pb.StreamSessionsRequest{} if err := proto.Unmarshal(msg.Body, request); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } diff --git a/controller/handler_mgmt/stream_toggle_pipe_traces.go b/controller/handler_mgmt/stream_toggle_pipe_traces.go index 46e6bdb6f..95de1d960 100644 --- a/controller/handler_mgmt/stream_toggle_pipe_traces.go +++ b/controller/handler_mgmt/stream_toggle_pipe_traces.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "fmt" "github.com/golang/protobuf/proto" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/ctrl_pb" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" @@ -45,7 +46,7 @@ func (handler *traceTogglePipeHandler) HandleReceive(msg *channel2.Message, ch c request := &trace_pb.TogglePipeTracesRequest{} if err := proto.Unmarshal(msg.Body, request); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } @@ -109,9 +110,9 @@ func (handler *traceTogglePipeHandler) HandleReceive(msg *channel2.Message, ch c func (handler *traceTogglePipeHandler) complete(msg *channel2.Message, ch channel2.Channel, result *trace.ToggleResult) { if result.Success { - sendSuccess(msg, ch, result.Message.String()) + handler_common.SendSuccess(msg, ch, result.Message.String()) } else { - sendFailure(msg, ch, result.Message.String()) + handler_common.SendFailure(msg, ch, result.Message.String()) } } diff --git a/controller/handler_mgmt/stream_traces.go b/controller/handler_mgmt/stream_traces.go index 1e862e49e..f745fbbe6 100644 --- a/controller/handler_mgmt/stream_traces.go +++ b/controller/handler_mgmt/stream_traces.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package handler_mgmt import ( "github.com/golang/protobuf/proto" "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/handler_common" "github.com/netfoundry/ziti-fabric/controller/network" "github.com/netfoundry/ziti-fabric/pb/mgmt_pb" "github.com/netfoundry/ziti-fabric/trace" @@ -42,7 +43,7 @@ func (*streamTracesHandler) ContentType() int32 { func (handler *streamTracesHandler) HandleReceive(msg *channel2.Message, ch channel2.Channel) { request := &mgmt_pb.StreamTracesRequest{} if err := proto.Unmarshal(msg.Body, request); err != nil { - sendFailure(msg, ch, err.Error()) + handler_common.SendFailure(msg, ch, err.Error()) return } diff --git a/controller/models/base_model.go b/controller/models/base_model.go new file mode 100644 index 000000000..6cab5a08e --- /dev/null +++ b/controller/models/base_model.go @@ -0,0 +1,211 @@ +/* + Copyright 2019 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package models + +import ( + "github.com/netfoundry/ziti-foundation/storage/ast" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "github.com/pkg/errors" + "go.etcd.io/bbolt" + "time" +) + +const ( + ListLimitMax = 500 + ListOffsetMax = 100000 + ListLimitDefault = 10 + ListOffsetDefault = 0 +) + +type EntityRetriever interface { + BaseLoad(id string) (Entity, error) + BaseLoadInTx(tx *bbolt.Tx, id string) (Entity, error) + + BaseList(query string) (*EntityListResult, error) + BasePreparedList(query ast.Query) (*EntityListResult, error) + BasePreparedListAssociated(id string, typeLoader EntityRetriever, query ast.Query) (*EntityListResult, error) + + GetStore() boltz.CrudStore +} + +type Entity interface { + GetId() string + SetId(string) + GetCreatedAt() time.Time + GetUpdatedAt() time.Time + GetTags() map[string]interface{} +} + +type BaseEntity struct { + Id string + CreatedAt time.Time + UpdatedAt time.Time + Tags map[string]interface{} +} + +func (entity *BaseEntity) GetId() string { + return entity.Id +} + +func (entity *BaseEntity) SetId(id string) { + entity.Id = id +} + +func (entity *BaseEntity) GetCreatedAt() time.Time { + return entity.CreatedAt +} + +func (entity *BaseEntity) GetUpdatedAt() time.Time { + return entity.UpdatedAt +} + +func (entity *BaseEntity) GetTags() map[string]interface{} { + return entity.Tags +} + +func (entity *BaseEntity) FillCommon(boltEntity boltz.ExtEntity) { + entity.Id = boltEntity.GetId() + entity.CreatedAt = boltEntity.GetCreatedAt() + entity.UpdatedAt = boltEntity.GetUpdatedAt() + entity.Tags = boltEntity.GetTags() +} + +type EntityListResult struct { + Loader EntityRetriever + Entities []Entity + QueryMetaData +} + +func (result *EntityListResult) GetEntities() []Entity { + return result.Entities +} + +func (result *EntityListResult) GetMetaData() *QueryMetaData { + return &result.QueryMetaData +} + +func (result *EntityListResult) Collect(tx *bbolt.Tx, ids []string, queryMetaData *QueryMetaData) error { + result.QueryMetaData = *queryMetaData + for _, key := range ids { + entity, err := result.Loader.BaseLoadInTx(tx, key) + if err != nil { + return err + } + result.Entities = append(result.Entities, entity) + } + return nil +} + +type QueryMetaData struct { + Count int64 + Limit int64 + Offset int64 + FilterableFields []string +} + +type BaseController struct { + Store boltz.CrudStore +} + +func (ctrl *BaseController) GetStore() boltz.CrudStore { + return ctrl.Store +} + +type ListResultHandler func(tx *bbolt.Tx, ids []string, qmd *QueryMetaData) error + +func (ctrl *BaseController) checkLimits(query ast.Query) { + if query.GetLimit() == nil || *query.GetLimit() < -1 || *query.GetLimit() == 0 { + query.SetLimit(ListLimitDefault) + } else if *query.GetLimit() > ListLimitMax { + query.SetLimit(ListLimitMax) + } + + if query.GetSkip() == nil || *query.GetSkip() < 0 { + query.SetSkip(ListOffsetDefault) + } else if *query.GetSkip() > ListOffsetMax { + query.SetSkip(ListOffsetMax) + } +} + +func (ctrl *BaseController) ListWithTx(tx *bbolt.Tx, queryString string, resultHandler ListResultHandler) error { + query, err := ast.Parse(ctrl.Store, queryString) + if err != nil { + return err + } + + ctrl.checkLimits(query) + + keys, count, err := ctrl.Store.QueryIdsC(tx, query) + if err != nil { + return err + } + qmd := &QueryMetaData{ + Count: count, + Limit: *query.GetLimit(), + Offset: *query.GetSkip(), + FilterableFields: ctrl.Store.GetPublicSymbols(), + } + return resultHandler(tx, keys, qmd) +} + +func (ctrl *BaseController) PreparedListWithTx(tx *bbolt.Tx, query ast.Query, resultHandler ListResultHandler) error { + ctrl.checkLimits(query) + + keys, count, err := ctrl.Store.QueryIdsC(tx, query) + if err != nil { + return err + } + qmd := &QueryMetaData{ + Count: count, + Limit: *query.GetLimit(), + Offset: *query.GetSkip(), + FilterableFields: ctrl.Store.GetPublicSymbols(), + } + return resultHandler(tx, keys, qmd) +} + +func (ctrl *BaseController) PreparedListAssociatedWithTx(tx *bbolt.Tx, id, association string, query ast.Query, resultHandler ListResultHandler) error { + ctrl.checkLimits(query) + + var count int64 + var keys []string + var err error + + symbol := ctrl.GetStore().GetSymbol(association) + if symbol == nil { + return errors.Errorf("invalid association: '%v'", association) + } + + linkedType := symbol.GetLinkedType() + if linkedType == nil { + return errors.Errorf("invalid association: '%v'", association) + } + + if cursor := symbol.GetStore().GetRelatedEntitiesCursor(tx, id, association); cursor != nil { + if keys, count, err = linkedType.QueryWithCursorC(tx, cursor, query); err != nil { + return err + } + } + + qmd := &QueryMetaData{ + Count: count, + Limit: *query.GetLimit(), + Offset: *query.GetSkip(), + FilterableFields: linkedType.GetPublicSymbols(), + } + return resultHandler(tx, keys, qmd) +} diff --git a/controller/models/validation.go b/controller/models/validation.go new file mode 100644 index 000000000..358cdafbb --- /dev/null +++ b/controller/models/validation.go @@ -0,0 +1,31 @@ +package models + +import "fmt" + +const ( + maxFieldErrorValueLength = 20 +) + +type FieldError struct { + Reason string + FieldName string + FieldValue interface{} +} + +func (fe FieldError) Error() string { + v := fe.FieldValue + if s, ok := fe.FieldValue.(string); ok { + if len(s) > maxFieldErrorValueLength { + v = s[0:maxFieldErrorValueLength] + "..." + } + } + return fmt.Sprintf("the value '%v' for '%s' is invalid: %s", v, fe.FieldName, fe.Reason) +} + +func NewFieldError(reason, name string, value interface{}) *FieldError { + return &FieldError{ + Reason: reason, + FieldName: name, + FieldValue: value, + } +} diff --git a/controller/network/assembly.go b/controller/network/assembly.go index 08c449015..3297e37b0 100644 --- a/controller/network/assembly.go +++ b/controller/network/assembly.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -27,10 +27,10 @@ import ( func (network *Network) assemble() { log := pfxlog.Logger() - if network.routerController.connectedCount() > 1 { - log.Debugf("assembling with [%d] routers", network.routerController.connectedCount()) + if network.Routers.connectedCount() > 1 { + log.Debugf("assembling with [%d] routers", network.Routers.connectedCount()) - missingLinks, err := network.linkController.missingLinks(network.routerController.allConnected()) + missingLinks, err := network.linkController.missingLinks(network.Routers.allConnected()) if err == nil { for _, missingLink := range missingLinks { network.linkController.add(missingLink) diff --git a/controller/network/circuit_test.go b/controller/network/circuit_test.go index 93eefe0d4..8860141a0 100644 --- a/controller/network/circuit_test.go +++ b/controller/network/circuit_test.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package network import ( + "github.com/netfoundry/ziti-fabric/controller/db" "github.com/netfoundry/ziti-foundation/identity/identity" "github.com/netfoundry/ziti-foundation/transport/tcp" "github.com/stretchr/testify/assert" @@ -24,7 +25,10 @@ import ( ) func TestSimpleCircuit2(t *testing.T) { - network, err := NewNetwork(nil, nil, nil, nil) + ctx := db.NewTestContext(t) + defer ctx.Cleanup() + + network, err := NewNetwork(nil, nil, ctx.GetDb(), nil) assert.Nil(t, err) addr := "tcp:0.0.0.0:0" @@ -32,10 +36,10 @@ func TestSimpleCircuit2(t *testing.T) { assert.Nil(t, err) r0 := newRouter("r0", "", transportAddr, nil) - network.routerController.markConnected(r0) + network.Routers.markConnected(r0) r1 := newRouter("r1", "", transportAddr, nil) - network.routerController.markConnected(r1) + network.Routers.markConnected(r1) l0 := newLink(&identity.TokenId{Token: "l0"}) l0.Src = r0 @@ -82,7 +86,10 @@ func TestSimpleCircuit2(t *testing.T) { } func TestTransitCircuit2(t *testing.T) { - network, err := NewNetwork(nil, nil, nil, nil) + ctx := db.NewTestContext(t) + defer ctx.Cleanup() + + network, err := NewNetwork(nil, nil, ctx.GetDb(), nil) assert.Nil(t, err) addr := "tcp:0.0.0.0:0" @@ -90,13 +97,13 @@ func TestTransitCircuit2(t *testing.T) { assert.Nil(t, err) r0 := newRouter("r0", "", transportAddr, nil) - network.routerController.markConnected(r0) + network.Routers.markConnected(r0) r1 := newRouter("r1", "", transportAddr, nil) - network.routerController.markConnected(r1) + network.Routers.markConnected(r1) r2 := newRouter("r2", "", transportAddr, nil) - network.routerController.markConnected(r2) + network.Routers.markConnected(r2) l0 := newLink(&identity.TokenId{Token: "l0"}) l0.Src = r0 diff --git a/controller/network/controllers.go b/controller/network/controllers.go new file mode 100644 index 000000000..e9dad9c55 --- /dev/null +++ b/controller/network/controllers.go @@ -0,0 +1,157 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package network + +import ( + "github.com/netfoundry/ziti-fabric/controller/db" + "github.com/netfoundry/ziti-fabric/controller/models" + "github.com/netfoundry/ziti-foundation/storage/ast" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "go.etcd.io/bbolt" +) + +type Controllers struct { + db boltz.Db + stores *db.Stores + Terminators *TerminatorController + Routers *RouterController + Services *ServiceController +} + +func (e *Controllers) getDb() boltz.Db { + return e.db +} + +func NewControllers(db boltz.Db, stores *db.Stores) *Controllers { + result := &Controllers{ + db: db, + stores: stores, + } + result.Terminators = newTerminatorController(result) + result.Routers = newRouterController(result) + result.Services = newServiceController(result) + return result +} + +type Controller interface { + models.EntityRetriever + getControllers() *Controllers + + newModelEntity() boltEntitySink + readEntityInTx(tx *bbolt.Tx, id string, modelEntity boltEntitySink) error +} + +type boltEntitySink interface { + models.Entity + fillFrom(controller Controller, tx *bbolt.Tx, boltEntity boltz.Entity) error +} + +func newController(controllers *Controllers, store boltz.CrudStore) baseController { + return baseController{ + BaseController: models.BaseController{ + Store: store, + }, + Controllers: controllers, + } +} + +type baseController struct { + models.BaseController + *Controllers + impl Controller +} + +func (ctrl *baseController) BaseLoad(id string) (models.Entity, error) { + entity := ctrl.impl.newModelEntity() + if err := ctrl.readEntity(id, entity); err != nil { + return nil, err + } + return entity, nil +} + +func (ctrl *baseController) BaseLoadInTx(tx *bbolt.Tx, id string) (models.Entity, error) { + entity := ctrl.impl.newModelEntity() + if err := ctrl.readEntityInTx(tx, id, entity); err != nil { + return nil, err + } + return entity, nil +} + +func (ctrl *baseController) getControllers() *Controllers { + return ctrl.Controllers +} + +func (ctrl *baseController) readEntity(id string, modelEntity boltEntitySink) error { + return ctrl.db.View(func(tx *bbolt.Tx) error { + return ctrl.readEntityInTx(tx, id, modelEntity) + }) +} + +func (ctrl *baseController) readEntityInTx(tx *bbolt.Tx, id string, modelEntity boltEntitySink) error { + boltEntity := ctrl.impl.GetStore().NewStoreEntity() + found, err := ctrl.impl.GetStore().BaseLoadOneById(tx, id, boltEntity) + if err != nil { + return err + } + if !found { + return boltz.NewNotFoundError(ctrl.impl.GetStore().GetSingularEntityType(), "id", id) + } + + return modelEntity.fillFrom(ctrl.impl, tx, boltEntity) +} + +func (ctrl *baseController) BaseList(query string) (*models.EntityListResult, error) { + result := &models.EntityListResult{Loader: ctrl} + err := ctrl.list(query, result.Collect) + if err != nil { + return nil, err + } + return result, nil +} + +func (ctrl *baseController) list(queryString string, resultHandler models.ListResultHandler) error { + return ctrl.db.View(func(tx *bbolt.Tx) error { + return ctrl.ListWithTx(tx, queryString, resultHandler) + }) +} + +func (ctrl *baseController) BasePreparedList(query ast.Query) (*models.EntityListResult, error) { + result := &models.EntityListResult{Loader: ctrl} + err := ctrl.preparedList(query, result.Collect) + if err != nil { + return nil, err + } + return result, nil +} + +func (ctrl *baseController) preparedList(query ast.Query, resultHandler models.ListResultHandler) error { + return ctrl.db.View(func(tx *bbolt.Tx) error { + return ctrl.PreparedListWithTx(tx, query, resultHandler) + }) +} + +func (ctrl *baseController) BasePreparedListAssociated(id string, typeLoader models.EntityRetriever, query ast.Query) (*models.EntityListResult, error) { + result := &models.EntityListResult{Loader: ctrl} + err := ctrl.db.View(func(tx *bbolt.Tx) error { + return ctrl.PreparedListAssociatedWithTx(tx, id, typeLoader.GetStore().GetEntityType(), query, result.Collect) + }) + + if err != nil { + return nil, err + } + return result, nil +} diff --git a/controller/network/network.go b/controller/network/network.go index f5db046f0..c44ca5e89 100644 --- a/controller/network/network.go +++ b/controller/network/network.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -31,21 +31,19 @@ import ( "github.com/netfoundry/ziti-foundation/storage/boltz" "github.com/netfoundry/ziti-foundation/util/concurrenz" "github.com/netfoundry/ziti-foundation/util/sequence" + errors2 "github.com/pkg/errors" "strings" "sync" "time" ) type Network struct { + *Controllers nodeId *identity.TokenId - db *db.Db options *Options - stores *db.Stores - routerController *routerController routerChanged chan *Router linkController *linkController linkChanged chan *Link - serviceController *serviceController sessionController *sessionController sequence *sequence.Sequence metricsEventController metrics.EventController @@ -59,21 +57,20 @@ type Network struct { lock sync.Mutex } -func NewNetwork(nodeId *identity.TokenId, options *Options, database *db.Db, metricsCfg *metrics.Config) (*Network, error) { - stores := db.InitStores() - serviceController := newServiceController(database, stores) - routerController := newRouterController(database, stores) +func NewNetwork(nodeId *identity.TokenId, options *Options, database boltz.Db, metricsCfg *metrics.Config) (*Network, error) { + stores, err := db.InitStores(database) + if err != nil { + return nil, err + } + controllers := NewControllers(database, stores) network := &Network{ + Controllers: controllers, nodeId: nodeId, - db: database, options: options, - stores: stores, - routerController: routerController, routerChanged: make(chan *Router), linkController: newLinkController(), linkChanged: make(chan *Link), - serviceController: serviceController, sessionController: newSessionController(), sequence: sequence.NewSequence(), metricsEventController: metrics.NewEventController(metricsCfg), @@ -96,52 +93,28 @@ func (network *Network) GetDb() boltz.Db { return network.db } -func (network *Network) GetFabricStores() *db.Stores { +func (network *Network) GetStores() *db.Stores { return network.stores } -func (network *Network) CreateRouter(router *Router) error { - return network.routerController.create(router) +func (network *Network) GetControllers() *Controllers { + return network.Controllers } -func (network *Network) GetConnectedRouter(routerId string) (*Router, bool) { - return network.routerController.getConnected(routerId) +func (network *Network) CreateRouter(router *Router) error { + return network.Routers.Create(router) +} + +func (network *Network) GetConnectedRouter(routerId string) *Router { + return network.Routers.getConnected(routerId) } func (network *Network) GetRouter(routerId string) (*Router, error) { - return network.routerController.loadOneById(routerId) -} - -func (network *Network) AllRouters() ([]*Router, error) { - return network.routerController.all() + return network.Routers.Read(routerId) } func (network *Network) AllConnectedRouters() []*Router { - return network.routerController.allConnected() -} - -func (network *Network) RemoveRouter(router *Router) error { - return network.routerController.remove(router.Id) -} - -func (network *Network) GetServiceStore() db.ServiceStore { - return network.serviceController.store -} - -func (network *Network) CreateService(service *Service) error { - return network.serviceController.create(service) -} - -func (network *Network) GetService(serviceId string) (*Service, bool) { - return network.serviceController.get(serviceId) -} - -func (network *Network) AllServices() ([]*Service, error) { - return network.serviceController.all() -} - -func (network *Network) RemoveService(id string) error { - return network.serviceController.remove(id) + return network.Routers.allConnected() } func (network *Network) GetLink(linkId *identity.TokenId) (*Link, bool) { @@ -185,19 +158,11 @@ func (network *Network) RouterChanged(r *Router) { } func (network *Network) ConnectedRouter(id string) bool { - return network.routerController.isConnected(id) -} - -func (network *Network) KnownRouter(id string) (*Router, error) { - r, err := network.routerController.loadOneById(id) - if err != nil { - return nil, err - } - return r, nil + return network.Routers.isConnected(id) } func (network *Network) ConnectRouter(r *Router) { - network.routerController.markConnected(r) + network.Routers.markConnected(r) network.routerChanged <- r for _, h := range network.routerPresenceHandlers { @@ -212,7 +177,7 @@ func (network *Network) DisconnectRouter(r *Router) { network.LinkChanged(l) } // 2: remove Router - network.routerController.markDisconnected(r) + network.Routers.markDisconnected(r) network.routerChanged <- r for _, h := range network.routerPresenceHandlers { @@ -243,100 +208,84 @@ func (network *Network) LinkChanged(l *Link) { }() } -func (network *Network) BindService(srcR *Router, token string, serviceId string, peerData map[uint32][]byte) error { - log := pfxlog.Logger() - - // 1: Find Service - if svc, found := network.serviceController.get(serviceId); found { - svc.Egress = srcR.Id - svc.EndpointAddress = "hosted:" + token - svc.PeerData = peerData - - log.Debugf("binding service[%s] to session[%s] with hostdata[%v]", serviceId, token, svc.PeerData) - return network.serviceController.update(svc) - } - return errors.New("invalid service") -} - -func (network *Network) UnbindService(srcR *Router, token string, serviceId string) error { - // 1: Find Service - if svc, found := network.serviceController.get(serviceId); found { - svc.Egress = network.nodeId.Token // TODO: can't set this to null, so setting it to the controller ID - svc.EndpointAddress = "hosted:unbound" - svc.PeerData = nil - - return network.serviceController.update(svc) - } - return errors.New("invalid service") -} - func (network *Network) CreateSession(srcR *Router, clientId *identity.TokenId, serviceId string) (*session, error) { log := pfxlog.Logger() // 1: Find Service - if svc, found := network.serviceController.get(serviceId); found { - // 2: Allocate Session Identifier - sessionIdHash, err := network.sequence.NextHash() + svc, err := network.Services.Read(serviceId) + if err != nil { + return nil, err + } + + // 2: Allocate Session Identifier + sessionIdHash, err := network.sequence.NextHash() + if err != nil { + return nil, err + } + sessionId := &identity.TokenId{Token: sessionIdHash} + + if len(svc.Terminators) == 0 { + return nil, errors2.Errorf("service %v has no Terminators", serviceId) + } + + // 3: select terminator + terminator := svc.Terminators[0] + + // 4: Get Egress Router + er := network.Routers.getConnected(terminator.Router) + if er == nil { + return nil, errors2.Errorf("invalid terminating router %v for service %v", terminator.Router, svc.Id) + } + + // 5: Create Circuit + circuit, err := network.CreateCircuit(srcR, er) + if err != nil { + return nil, err + } + circuit.Binding = "transport" + if terminator.Binding != "" { + circuit.Binding = terminator.Binding + } else if strings.HasPrefix(terminator.Address, "hosted") { + circuit.Binding = "edge" + } else if strings.HasPrefix(terminator.Address, "udp") { + circuit.Binding = "udp" + } + + // 5a: Create Route Messages + rms, err := circuit.CreateRouteMessages(sessionId, terminator.Address) + if err != nil { + return nil, err + } + + // 6: Route Egress + rms[len(rms)-1].Egress.PeerData = clientId.Data + err = sendRoute(circuit.Path[len(circuit.Path)-1], rms[len(rms)-1]) + if err != nil { + return nil, err + } + + // 7: Create Intermediate Routes + for i := 0; i < len(circuit.Path)-1; i++ { + err = sendRoute(circuit.Path[i], rms[i]) if err != nil { return nil, err } - sessionId := &identity.TokenId{Token: sessionIdHash} - - // 3: Get Egress Router - if er, found := network.routerController.getConnected(svc.Egress); found { - // 4: Create Circuit - circuit, err := network.CreateCircuit(srcR, er) - if err != nil { - return nil, err - } - circuit.Binding = "transport" - if svc.Binding != "" { - circuit.Binding = svc.Binding - } else if strings.HasPrefix(svc.EndpointAddress, "hosted") { - circuit.Binding = "edge" - } else if strings.HasPrefix(svc.EndpointAddress, "udp") { - circuit.Binding = "udp" - } - - // 4a: Create Route Messages - rms, err := circuit.CreateRouteMessages(sessionId, svc.EndpointAddress) - if err != nil { - return nil, err - } - - // 5: Route Egress - rms[len(rms)-1].Egress.PeerData = clientId.Data - err = sendRoute(circuit.Path[len(circuit.Path)-1], rms[len(rms)-1]) - if err != nil { - return nil, err - } - - // 6: Create Intermediate Routes - for i := 0; i < len(circuit.Path)-1; i++ { - err = sendRoute(circuit.Path[i], rms[i]) - if err != nil { - return nil, err - } - } - - // 7: Create Session Object - ss := &session{ - Id: sessionId, - ClientId: clientId, - Service: svc, - Circuit: circuit, - } - network.sessionController.add(ss) - network.sessionLifeCycleController.SessionCreated(ss.Id, ss.ClientId, ss.Service.Id, ss.Circuit) - - log.Infof("created session [s/%s] ==> %s", sessionId.Token, ss.Circuit) - - return ss, nil - - } - return nil, errors.New("missing egress") } - return nil, errors.New("invalid service") + + // 8: Create Session Object + ss := &session{ + Id: sessionId, + ClientId: clientId, + Service: svc, + Circuit: circuit, + Terminator: terminator, + } + network.sessionController.add(ss) + network.sessionLifeCycleController.SessionCreated(ss.Id, ss.ClientId, ss.Service.Id, ss.Circuit) + + log.Infof("created session [s/%s] ==> %s", sessionId.Token, ss.Circuit) + + return ss, nil } func (network *Network) RemoveSession(sessionId *identity.TokenId, now bool) error { @@ -502,7 +451,7 @@ func (network *Network) rerouteSession(s *session) error { if cq, err := network.UpdateCircuit(s.Circuit); err == nil { s.Circuit = cq - rms, err := cq.CreateRouteMessages(s.Id, s.Service.EndpointAddress) + rms, err := cq.CreateRouteMessages(s.Id, s.Terminator.Address) if err != nil { log.Errorf("error creating route messages (%s)", err) return err @@ -529,7 +478,7 @@ func (network *Network) smartReroute(s *session, cq *Circuit) error { s.Circuit = cq - rms, err := cq.CreateRouteMessages(s.Id, s.Service.EndpointAddress) + rms, err := cq.CreateRouteMessages(s.Id, s.Terminator.Address) if err != nil { log.Errorf("error creating route messages (%s)", err) return err @@ -551,7 +500,7 @@ func (network *Network) smartReroute(s *session, cq *Circuit) error { func (network *Network) AcceptMetrics(metrics *ctrl_pb.MetricsMessage) { log := pfxlog.Logger() - router, err := network.routerController.loadOneById(metrics.SourceId) + router, err := network.Routers.Read(metrics.SourceId) if err != nil { log.Warnf("could not find router [r/%s] while processing metrics", metrics.SourceId) return @@ -572,7 +521,7 @@ func (network *Network) AcceptMetrics(metrics *ctrl_pb.MetricsMessage) { } func sendRoute(r *Router, createMsg *ctrl_pb.Route) error { - pfxlog.Logger().Debugf("sending create route message to [r/%s] for [s/%s]", r.Id, createMsg.SessionId) + pfxlog.Logger().Debugf("sending Create route message to [r/%s] for [s/%s]", r.Id, createMsg.SessionId) body, err := proto.Marshal(createMsg) if err != nil { @@ -635,7 +584,7 @@ func (network *Network) showOptions() { } func (network *Network) GetServiceCache() Cache { - return network.serviceController + return network.Services } type Cache interface { diff --git a/controller/network/path.go b/controller/network/path.go index 018898791..6beded53b 100644 --- a/controller/network/path.go +++ b/controller/network/path.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -34,7 +34,7 @@ func (network *Network) shortestPath(srcR *Router, dstR *Router) ([]*Router, err prev := make(map[*Router]*Router) unvisited := make(map[*Router]bool) - for _, r := range network.routerController.allConnected() { + for _, r := range network.Routers.allConnected() { dist[r] = math.MaxInt32 unvisited[r] = true } diff --git a/controller/network/router.go b/controller/network/router.go index 24ca94c02..f17bd4681 100644 --- a/controller/network/router.go +++ b/controller/network/router.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,40 +17,55 @@ package network import ( - "fmt" + "github.com/netfoundry/ziti-fabric/controller/controllers" "github.com/netfoundry/ziti-fabric/controller/db" + "github.com/netfoundry/ziti-fabric/controller/models" "github.com/netfoundry/ziti-foundation/channel2" "github.com/netfoundry/ziti-foundation/storage/boltz" "github.com/netfoundry/ziti-foundation/transport" + "github.com/netfoundry/ziti-foundation/util/concurrenz" "github.com/orcaman/concurrent-map" + "github.com/pkg/errors" "go.etcd.io/bbolt" + "reflect" ) type Router struct { - Id string + models.BaseEntity Fingerprint string AdvertisedListener transport.Address Control channel2.Channel CostFactor int + Connected concurrenz.AtomicBoolean +} + +func (entity *Router) fillFrom(_ Controller, _ *bbolt.Tx, boltEntity boltz.Entity) error { + boltRouter, ok := boltEntity.(*db.Router) + if !ok { + return errors.Errorf("unexpected type %v when filling model router", reflect.TypeOf(boltEntity)) + } + entity.Fingerprint = boltRouter.Fingerprint + entity.FillCommon(boltRouter) + return nil } func (entity *Router) toBolt() *db.Router { return &db.Router{ - Id: entity.Id, - Fingerprint: entity.Fingerprint, + BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags), + Fingerprint: entity.Fingerprint, } } func NewRouter(id, fingerprint string) *Router { return &Router{ - Id: id, + BaseEntity: models.BaseEntity{Id: id}, Fingerprint: fingerprint, } } func newRouter(id string, fingerprint string, advLstnr transport.Address, ctrl channel2.Channel) *Router { return &Router{ - Id: id, + BaseEntity: models.BaseEntity{Id: id}, Fingerprint: fingerprint, AdvertisedListener: advLstnr, Control: ctrl, @@ -58,115 +73,98 @@ func newRouter(id string, fingerprint string, advLstnr transport.Address, ctrl c } } -type routerController struct { - connected cmap.ConcurrentMap // map[string]*Router - db *db.Db - stores *db.Stores +type RouterController struct { + baseController + cache cmap.ConcurrentMap + connected cmap.ConcurrentMap store db.RouterStore } -func newRouterController(db *db.Db, stores *db.Stores) *routerController { - return &routerController{ - connected: cmap.New(), - db: db, - stores: stores, - store: stores.Router, +func (ctrl *RouterController) newModelEntity() boltEntitySink { + return &Router{} +} + +func newRouterController(controllers *Controllers) *RouterController { + result := &RouterController{ + baseController: newController(controllers, controllers.stores.Router), + cache: cmap.New(), + connected: cmap.New(), + store: controllers.stores.Router, } + result.impl = result + return result } -func (c *routerController) markConnected(r *Router) { - c.connected.Set(r.Id, r) +func (ctrl *RouterController) markConnected(r *Router) { + r.Connected.Set(true) + ctrl.connected.Set(r.Id, r) } -func (c *routerController) markDisconnected(r *Router) { - c.connected.Remove(r.Id) +func (ctrl *RouterController) markDisconnected(r *Router) { + r.Connected.Set(false) + ctrl.connected.Remove(r.Id) } -func (c *routerController) isConnected(id string) bool { - return c.connected.Has(id) +func (ctrl *RouterController) isConnected(id string) bool { + return ctrl.connected.Has(id) } -func (c *routerController) getConnected(id string) (*Router, bool) { - if t, found := c.connected.Get(id); found { - return t.(*Router), true +func (ctrl *RouterController) getConnected(id string) *Router { + if t, found := ctrl.connected.Get(id); found { + return t.(*Router) } - return nil, false + return nil } -func (c *routerController) allConnected() []*Router { - routers := make([]*Router, 0) - for i := range c.connected.IterBuffered() { +func (ctrl *RouterController) allConnected() []*Router { + var routers []*Router + for i := range ctrl.connected.IterBuffered() { routers = append(routers, i.Val.(*Router)) } return routers } -func (c *routerController) connectedCount() int { - return c.connected.Count() +func (ctrl *RouterController) connectedCount() int { + return ctrl.connected.Count() } -func (c *routerController) create(router *Router) error { - return c.db.Update(func(tx *bbolt.Tx) error { - return c.store.Create(boltz.NewMutateContext(tx), router.toBolt()) +func (ctrl *RouterController) Create(router *Router) error { + err := ctrl.db.Update(func(tx *bbolt.Tx) error { + return ctrl.store.Create(boltz.NewMutateContext(tx), router.toBolt()) }) + if err != nil { + ctrl.cache.Set(router.Id, router) + } + return err } -func (c *routerController) update(router *Router) error { - return c.db.Update(func(tx *bbolt.Tx) error { - return c.store.Update(boltz.NewMutateContext(tx), router.toBolt(), nil) - }) +func (ctrl *RouterController) Delete(id string) error { + err := controllers.DeleteEntityById(ctrl.store, ctrl.db, id) + ctrl.cache.Remove(id) + return err } -func (c *routerController) remove(id string) error { - return c.db.Update(func(tx *bbolt.Tx) error { - return c.store.DeleteById(boltz.NewMutateContext(tx), id) - }) -} - -func (c *routerController) loadOneById(id string) (*Router, error) { - var router *Router - err := c.db.View(func(tx *bbolt.Tx) error { - boltRouter, err := c.store.LoadOneById(tx, id) - if err != nil { - return err - } - if boltRouter == nil { - return fmt.Errorf("missing router '%s'", id) - } - router = c.fromBolt(boltRouter) - return nil +func (ctrl *RouterController) Read(id string) (entity *Router, err error) { + err = ctrl.db.View(func(tx *bbolt.Tx) error { + entity, err = ctrl.readInTx(tx, id) + return err }) if err != nil { return nil, err } - return router, err + return entity, err } -func (c *routerController) all() ([]*Router, error) { - var routers []*Router - err := c.db.View(func(tx *bbolt.Tx) error { - ids, _, err := c.store.QueryIds(tx, "true") - if err != nil { - return err - } - for _, id := range ids { - router, err := c.store.LoadOneById(tx, id) - if err != nil { - return err - } - routers = append(routers, c.fromBolt(router)) - } - return nil - }) - if err != nil { +func (ctrl *RouterController) readInTx(tx *bbolt.Tx, id string) (*Router, error) { + if t, found := ctrl.cache.Get(id); found { + return t.(*Router), nil + } + + entity := &Router{} + if err := ctrl.readEntityInTx(tx, id, entity); err != nil { return nil, err } - return routers, nil -} -func (c *routerController) fromBolt(entity *db.Router) *Router { - return &Router{ - Id: entity.Id, - Fingerprint: entity.Fingerprint, - } + ctrl.cache.Set(id, entity) + return entity, nil } diff --git a/controller/network/service.go b/controller/network/service.go index ec3a8eb99..487655ea9 100644 --- a/controller/network/service.go +++ b/controller/network/service.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,137 +17,143 @@ package network import ( - "fmt" - "github.com/michaelquigley/pfxlog" + "github.com/netfoundry/ziti-fabric/controller/controllers" "github.com/netfoundry/ziti-fabric/controller/db" + "github.com/netfoundry/ziti-fabric/controller/models" "github.com/netfoundry/ziti-foundation/storage/boltz" "github.com/orcaman/concurrent-map" + "github.com/pkg/errors" "go.etcd.io/bbolt" + "reflect" ) type Service struct { - Id string - Binding string - EndpointAddress string - Egress string - PeerData map[uint32][]byte + models.BaseEntity + TerminatorStrategy string + Terminators []*Terminator +} + +func (entity *Service) fillFrom(ctrl Controller, tx *bbolt.Tx, boltEntity boltz.Entity) error { + boltService, ok := boltEntity.(*db.Service) + if !ok { + return errors.Errorf("unexpected type %v when filling model service", reflect.TypeOf(boltEntity)) + } + entity.TerminatorStrategy = boltService.TerminatorStrategy + entity.FillCommon(boltService) + + terminatorIds := ctrl.getControllers().stores.Service.GetRelatedEntitiesIdList(tx, entity.Id, db.EntityTypeTerminators) + for _, terminatorId := range terminatorIds { + if terminator, _ := ctrl.getControllers().Terminators.readInTx(tx, terminatorId); terminator != nil { + entity.Terminators = append(entity.Terminators, terminator) + } + } + + return nil } func (entity *Service) toBolt() *db.Service { return &db.Service{ - Id: entity.Id, - Binding: entity.Binding, - EndpointAddress: entity.EndpointAddress, - Egress: entity.Egress, - PeerData: entity.PeerData, + BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags), + TerminatorStrategy: entity.TerminatorStrategy, } } -type serviceController struct { - cache cmap.ConcurrentMap - db *db.Db - stores *db.Stores - store db.ServiceStore +func newServiceController(controllers *Controllers) *ServiceController { + result := &ServiceController{ + baseController: newController(controllers, controllers.stores.Service), + cache: cmap.New(), + store: controllers.stores.Service, + } + result.impl = result + + controllers.stores.Terminator.On(boltz.EventCreate, result.terminatorChanged) + controllers.stores.Terminator.On(boltz.EventUpdate, result.terminatorChanged) + controllers.stores.Terminator.On(boltz.EventDelete, result.terminatorChanged) + + return result } -func newServiceController(db *db.Db, stores *db.Stores) *serviceController { - return &serviceController{ - cache: cmap.New(), - db: db, - stores: stores, - store: stores.Service, +type ServiceController struct { + baseController + cache cmap.ConcurrentMap + store db.ServiceStore +} + +func (ctrl *ServiceController) newModelEntity() boltEntitySink { + return &Service{} +} + +func (ctrl *ServiceController) terminatorChanged(params ...interface{}) { + if len(params) > 0 { + if entity, ok := params[0].(*db.Terminator); ok { + ctrl.RemoveFromCache(entity.Service) + } } } -func (c *serviceController) create(s *Service) error { - err := c.db.Update(func(tx *bbolt.Tx) error { - return c.store.Create(boltz.NewMutateContext(tx), s.toBolt()) - }) - if err != nil { - return err - } - c.cache.Set(s.Id, s) - return nil -} - -func (c *serviceController) update(s *Service) error { - err := c.db.Update(func(tx *bbolt.Tx) error { - return c.store.Update(boltz.NewMutateContext(tx), s.toBolt(), nil) - }) - if err != nil { - return err - } - c.cache.Set(s.Id, s) - return nil -} - -func (c *serviceController) get(id string) (*Service, bool) { - if t, found := c.cache.Get(id); found { - return t.(*Service), true - - } - var svc *Service - err := c.db.View(func(tx *bbolt.Tx) error { - boltSvc, err := c.store.LoadOneById(tx, id) - if err != nil { +func (ctrl *ServiceController) Create(s *Service) error { + err := ctrl.db.Update(func(tx *bbolt.Tx) error { + ctx := boltz.NewMutateContext(tx) + if err := ctrl.store.Create(ctx, s.toBolt()); err != nil { return err } - if boltSvc == nil { - return fmt.Errorf("missing service '%s'", id) - } - svc = c.fromBolt(boltSvc) - return nil - }) - if err != nil { - pfxlog.Logger().Errorf("failed loading service (%s)", err) - return nil, false - } - if svc != nil { - c.cache.Set(svc.Id, svc) - return svc, true - } - return nil, false -} - -func (c *serviceController) all() ([]*Service, error) { - var services []*Service - err := c.db.View(func(tx *bbolt.Tx) error { - ids, _, err := c.store.QueryIds(tx, "true") - if err != nil { - return err - } - for _, id := range ids { - service, err := c.store.LoadOneById(tx, id) - if err != nil { + for _, terminator := range s.Terminators { + terminator.Service = s.Id + if _, err := ctrl.Terminators.createInTx(ctx, terminator); err != nil { return err } - services = append(services, c.fromBolt(service)) } return nil }) + if err != nil { + return err + } + ctrl.cache.Set(s.Id, s) + return nil +} + +func (ctrl *ServiceController) Update(s *Service) error { + err := ctrl.db.Update(func(tx *bbolt.Tx) error { + return ctrl.store.Update(boltz.NewMutateContext(tx), s.toBolt(), nil) + }) + if err != nil { + return err + } + ctrl.cache.Set(s.Id, s) + return nil +} + +func (ctrl *ServiceController) Read(id string) (entity *Service, err error) { + err = ctrl.db.View(func(tx *bbolt.Tx) error { + entity, err = ctrl.readInTx(tx, id) + return err + }) if err != nil { return nil, err } - return services, nil + return entity, err } -func (c *serviceController) remove(id string) error { - c.cache.Remove(id) - return c.db.Update(func(tx *bbolt.Tx) error { - return c.store.DeleteById(boltz.NewMutateContext(tx), id) - }) -} - -func (c *serviceController) RemoveFromCache(id string) { - c.cache.Remove(id) -} - -func (c *serviceController) fromBolt(entity *db.Service) *Service { - return &Service{ - Id: entity.Id, - Binding: entity.Binding, - EndpointAddress: entity.EndpointAddress, - Egress: entity.Egress, - PeerData: entity.PeerData, +func (ctrl *ServiceController) readInTx(tx *bbolt.Tx, id string) (*Service, error) { + if t, found := ctrl.cache.Get(id); found { + return t.(*Service), nil } + + entity := &Service{} + if err := ctrl.readEntityInTx(tx, id, entity); err != nil { + return nil, err + } + + ctrl.cache.Set(id, entity) + return entity, nil +} + +func (ctrl *ServiceController) Delete(id string) error { + err := controllers.DeleteEntityById(ctrl.store, ctrl.db, id) + ctrl.cache.Remove(id) + return err +} + +func (ctrl *ServiceController) RemoveFromCache(id string) { + ctrl.cache.Remove(id) } diff --git a/controller/network/session.go b/controller/network/session.go index e5b8ac730..4466163c5 100644 --- a/controller/network/session.go +++ b/controller/network/session.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,10 +22,11 @@ import ( ) type session struct { - Id *identity.TokenId - ClientId *identity.TokenId - Service *Service - Circuit *Circuit + Id *identity.TokenId + ClientId *identity.TokenId + Service *Service + Terminator *Terminator + Circuit *Circuit } func (s *session) latency() int64 { diff --git a/controller/network/terminator.go b/controller/network/terminator.go new file mode 100644 index 000000000..0af963678 --- /dev/null +++ b/controller/network/terminator.go @@ -0,0 +1,158 @@ +/* + Copyright 2020 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package network + +import ( + "github.com/google/uuid" + "github.com/netfoundry/ziti-fabric/controller/controllers" + "github.com/netfoundry/ziti-fabric/controller/db" + "github.com/netfoundry/ziti-fabric/controller/models" + "github.com/netfoundry/ziti-foundation/storage/boltz" + "github.com/pkg/errors" + "go.etcd.io/bbolt" + "reflect" + "strings" + "time" +) + +type Terminator struct { + models.BaseEntity + Service string + Router string + Binding string + Address string + PeerData map[uint32][]byte +} + +func (entity *Terminator) fillFrom(_ Controller, _ *bbolt.Tx, boltEntity boltz.Entity) error { + boltTerminator, ok := boltEntity.(*db.Terminator) + if !ok { + return errors.Errorf("unexpected type %v when filling model terminator", reflect.TypeOf(boltEntity)) + } + entity.Service = boltTerminator.Service + entity.Router = boltTerminator.Router + entity.Binding = boltTerminator.Binding + entity.Address = boltTerminator.Address + entity.PeerData = boltTerminator.PeerData + entity.FillCommon(boltTerminator) + return nil +} + +func (entity *Terminator) toBolt() *db.Terminator { + return &db.Terminator{ + BaseExtEntity: *boltz.NewExtEntity(entity.Id, entity.Tags), + Service: entity.Service, + Router: entity.Router, + Binding: entity.Binding, + Address: entity.Address, + PeerData: entity.PeerData, + } +} + +func newTerminatorController(controllers *Controllers) *TerminatorController { + result := &TerminatorController{ + baseController: newController(controllers, controllers.stores.Terminator), + store: controllers.stores.Terminator, + } + result.impl = result + return result +} + +type TerminatorController struct { + baseController + store db.TerminatorStore +} + +func (ctrl *TerminatorController) newModelEntity() boltEntitySink { + return &Terminator{} +} + +func (ctrl *TerminatorController) Create(s *Terminator) (string, error) { + var id string + var err error + err = ctrl.db.Update(func(tx *bbolt.Tx) error { + id, err = ctrl.createInTx(boltz.NewMutateContext(tx), s) + return err + }) + return id, err +} + +func (ctrl *TerminatorController) createInTx(ctx boltz.MutateContext, e *Terminator) (string, error) { + if e.Id == "" { + e.Id = uuid.New().String() + } + if e.Binding == "" { + if strings.HasPrefix(e.Address, "udp:") { + e.Binding = "udp" + } else { + e.Binding = "transport" + } + } + if e.Address == "" { + return "", models.NewFieldError("required value is missing", "address", e.Binding) + } + if !ctrl.stores.Service.IsEntityPresent(ctx.Tx(), e.Service) { + return "", boltz.NewNotFoundError("service", "service", e.Service) + } + if e.Router == "" { + return "", errors.Errorf("router is required when creating terminator. id: %v, service: %v", e.Id, e.Service) + } + if !ctrl.stores.Router.IsEntityPresent(ctx.Tx(), e.Router) { + return "", boltz.NewNotFoundError("router", "router", e.Router) + } + e.CreatedAt = time.Now() + if err := ctrl.GetStore().Create(ctx, e.toBolt()); err != nil { + return "", err + } + return e.Id, nil +} + +func (ctrl *TerminatorController) Update(s *Terminator) error { + return ctrl.db.Update(func(tx *bbolt.Tx) error { + return ctrl.GetStore().Update(boltz.NewMutateContext(tx), s.toBolt(), nil) + }) +} + +func (ctrl *TerminatorController) Patch(s *Terminator, checker boltz.FieldChecker) error { + return ctrl.db.Update(func(tx *bbolt.Tx) error { + return ctrl.GetStore().Update(boltz.NewMutateContext(tx), s.toBolt(), checker) + }) +} + +func (ctrl *TerminatorController) Read(id string) (entity *Terminator, err error) { + err = ctrl.db.View(func(tx *bbolt.Tx) error { + entity, err = ctrl.readInTx(tx, id) + return err + }) + if err != nil { + return nil, err + } + return entity, err +} + +func (ctrl *TerminatorController) readInTx(tx *bbolt.Tx, id string) (*Terminator, error) { + entity := &Terminator{} + err := ctrl.readEntityInTx(tx, id, entity) + if err != nil { + return nil, err + } + return entity, nil +} + +func (ctrl *TerminatorController) Delete(id string) error { + return controllers.DeleteEntityById(ctrl.GetStore(), ctrl.db, id) +} diff --git a/pb/ctrl_pb/ctrl.pb.go b/pb/ctrl_pb/ctrl.pb.go index 178d1ba22..df01db900 100644 --- a/pb/ctrl_pb/ctrl.pb.go +++ b/pb/ctrl_pb/ctrl.pb.go @@ -35,8 +35,8 @@ const ( ContentType_MetricsType ContentType = 1007 ContentType_TogglePipeTracesRequestType ContentType = 1008 ContentType_TraceEventType ContentType = 1010 - ContentType_BindRequestType ContentType = 1011 - ContentType_BindResponseType ContentType = 1012 + ContentType_CreateTerminatorRequestType ContentType = 1011 + ContentType_RemoveTerminatorRequestType ContentType = 1012 ContentType_InspectRequestType ContentType = 1013 ContentType_InspectResponseType ContentType = 1014 ContentType_StartXgressType ContentType = 1015 @@ -55,8 +55,8 @@ var ContentType_name = map[int32]string{ 1007: "MetricsType", 1008: "TogglePipeTracesRequestType", 1010: "TraceEventType", - 1011: "BindRequestType", - 1012: "BindResponseType", + 1011: "CreateTerminatorRequestType", + 1012: "RemoveTerminatorRequestType", 1013: "InspectRequestType", 1014: "InspectResponseType", 1015: "StartXgressType", @@ -75,8 +75,8 @@ var ContentType_value = map[string]int32{ "MetricsType": 1007, "TogglePipeTracesRequestType": 1008, "TraceEventType": 1010, - "BindRequestType": 1011, - "BindResponseType": 1012, + "CreateTerminatorRequestType": 1011, + "RemoveTerminatorRequestType": 1012, "InspectRequestType": 1013, "InspectResponseType": 1014, "StartXgressType": 1015, @@ -91,31 +91,6 @@ func (ContentType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_a0572e205f89e843, []int{0} } -type BindType int32 - -const ( - BindType_Bind BindType = 0 - BindType_Unbind BindType = 1 -) - -var BindType_name = map[int32]string{ - 0: "Bind", - 1: "Unbind", -} - -var BindType_value = map[string]int32{ - "Bind": 0, - "Unbind": 1, -} - -func (x BindType) String() string { - return proto.EnumName(BindType_name, int32(x)) -} - -func (BindType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a0572e205f89e843, []int{1} -} - type FaultSubject int32 const ( @@ -141,7 +116,7 @@ func (x FaultSubject) String() string { } func (FaultSubject) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a0572e205f89e843, []int{2} + return fileDescriptor_a0572e205f89e843, []int{1} } type MetricsSourceType int32 @@ -169,7 +144,7 @@ func (x MetricsSourceType) String() string { } func (MetricsSourceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a0572e205f89e843, []int{3} + return fileDescriptor_a0572e205f89e843, []int{2} } type SessionRequest struct { @@ -227,112 +202,112 @@ func (m *SessionRequest) GetPeerData() map[uint32][]byte { return nil } -type BindRequest struct { - BindType BindType `protobuf:"varint,1,opt,name=bindType,proto3,enum=ctrl.pb.BindType" json:"bindType,omitempty"` - Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` - ServiceId string `protobuf:"bytes,3,opt,name=serviceId,proto3" json:"serviceId,omitempty"` - PeerData map[uint32][]byte `protobuf:"bytes,4,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type CreateTerminatorRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ServiceId string `protobuf:"bytes,2,opt,name=serviceId,proto3" json:"serviceId,omitempty"` + Binding string `protobuf:"bytes,3,opt,name=binding,proto3" json:"binding,omitempty"` + Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,5,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *BindRequest) Reset() { *m = BindRequest{} } -func (m *BindRequest) String() string { return proto.CompactTextString(m) } -func (*BindRequest) ProtoMessage() {} -func (*BindRequest) Descriptor() ([]byte, []int) { +func (m *CreateTerminatorRequest) Reset() { *m = CreateTerminatorRequest{} } +func (m *CreateTerminatorRequest) String() string { return proto.CompactTextString(m) } +func (*CreateTerminatorRequest) ProtoMessage() {} +func (*CreateTerminatorRequest) Descriptor() ([]byte, []int) { return fileDescriptor_a0572e205f89e843, []int{1} } -func (m *BindRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BindRequest.Unmarshal(m, b) +func (m *CreateTerminatorRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateTerminatorRequest.Unmarshal(m, b) } -func (m *BindRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BindRequest.Marshal(b, m, deterministic) +func (m *CreateTerminatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateTerminatorRequest.Marshal(b, m, deterministic) } -func (m *BindRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BindRequest.Merge(m, src) +func (m *CreateTerminatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateTerminatorRequest.Merge(m, src) } -func (m *BindRequest) XXX_Size() int { - return xxx_messageInfo_BindRequest.Size(m) +func (m *CreateTerminatorRequest) XXX_Size() int { + return xxx_messageInfo_CreateTerminatorRequest.Size(m) } -func (m *BindRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BindRequest.DiscardUnknown(m) +func (m *CreateTerminatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CreateTerminatorRequest.DiscardUnknown(m) } -var xxx_messageInfo_BindRequest proto.InternalMessageInfo +var xxx_messageInfo_CreateTerminatorRequest proto.InternalMessageInfo -func (m *BindRequest) GetBindType() BindType { +func (m *CreateTerminatorRequest) GetId() string { if m != nil { - return m.BindType - } - return BindType_Bind -} - -func (m *BindRequest) GetToken() string { - if m != nil { - return m.Token + return m.Id } return "" } -func (m *BindRequest) GetServiceId() string { +func (m *CreateTerminatorRequest) GetServiceId() string { if m != nil { return m.ServiceId } return "" } -func (m *BindRequest) GetPeerData() map[uint32][]byte { +func (m *CreateTerminatorRequest) GetBinding() string { + if m != nil { + return m.Binding + } + return "" +} + +func (m *CreateTerminatorRequest) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *CreateTerminatorRequest) GetPeerData() map[uint32][]byte { if m != nil { return m.PeerData } return nil } -type BindResponse struct { - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +type RemoveTerminatorRequest struct { + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *BindResponse) Reset() { *m = BindResponse{} } -func (m *BindResponse) String() string { return proto.CompactTextString(m) } -func (*BindResponse) ProtoMessage() {} -func (*BindResponse) Descriptor() ([]byte, []int) { +func (m *RemoveTerminatorRequest) Reset() { *m = RemoveTerminatorRequest{} } +func (m *RemoveTerminatorRequest) String() string { return proto.CompactTextString(m) } +func (*RemoveTerminatorRequest) ProtoMessage() {} +func (*RemoveTerminatorRequest) Descriptor() ([]byte, []int) { return fileDescriptor_a0572e205f89e843, []int{2} } -func (m *BindResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BindResponse.Unmarshal(m, b) +func (m *RemoveTerminatorRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RemoveTerminatorRequest.Unmarshal(m, b) } -func (m *BindResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BindResponse.Marshal(b, m, deterministic) +func (m *RemoveTerminatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RemoveTerminatorRequest.Marshal(b, m, deterministic) } -func (m *BindResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_BindResponse.Merge(m, src) +func (m *RemoveTerminatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveTerminatorRequest.Merge(m, src) } -func (m *BindResponse) XXX_Size() int { - return xxx_messageInfo_BindResponse.Size(m) +func (m *RemoveTerminatorRequest) XXX_Size() int { + return xxx_messageInfo_RemoveTerminatorRequest.Size(m) } -func (m *BindResponse) XXX_DiscardUnknown() { - xxx_messageInfo_BindResponse.DiscardUnknown(m) +func (m *RemoveTerminatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveTerminatorRequest.DiscardUnknown(m) } -var xxx_messageInfo_BindResponse proto.InternalMessageInfo +var xxx_messageInfo_RemoveTerminatorRequest proto.InternalMessageInfo -func (m *BindResponse) GetSuccess() bool { +func (m *RemoveTerminatorRequest) GetTerminatorId() string { if m != nil { - return m.Success - } - return false -} - -func (m *BindResponse) GetMessage() string { - if m != nil { - return m.Message + return m.TerminatorId } return "" } @@ -1220,14 +1195,13 @@ func (m *InspectResponse_InspectValue) GetValue() string { func init() { proto.RegisterEnum("ctrl.pb.ContentType", ContentType_name, ContentType_value) - proto.RegisterEnum("ctrl.pb.BindType", BindType_name, BindType_value) proto.RegisterEnum("ctrl.pb.FaultSubject", FaultSubject_name, FaultSubject_value) proto.RegisterEnum("ctrl.pb.MetricsSourceType", MetricsSourceType_name, MetricsSourceType_value) proto.RegisterType((*SessionRequest)(nil), "ctrl.pb.SessionRequest") proto.RegisterMapType((map[uint32][]byte)(nil), "ctrl.pb.SessionRequest.PeerDataEntry") - proto.RegisterType((*BindRequest)(nil), "ctrl.pb.BindRequest") - proto.RegisterMapType((map[uint32][]byte)(nil), "ctrl.pb.BindRequest.PeerDataEntry") - proto.RegisterType((*BindResponse)(nil), "ctrl.pb.BindResponse") + proto.RegisterType((*CreateTerminatorRequest)(nil), "ctrl.pb.CreateTerminatorRequest") + proto.RegisterMapType((map[uint32][]byte)(nil), "ctrl.pb.CreateTerminatorRequest.PeerDataEntry") + proto.RegisterType((*RemoveTerminatorRequest)(nil), "ctrl.pb.RemoveTerminatorRequest") proto.RegisterType((*Dial)(nil), "ctrl.pb.Dial") proto.RegisterType((*Link)(nil), "ctrl.pb.Link") proto.RegisterType((*Fault)(nil), "ctrl.pb.Fault") @@ -1256,92 +1230,91 @@ func init() { func init() { proto.RegisterFile("ctrl.proto", fileDescriptor_a0572e205f89e843) } var fileDescriptor_a0572e205f89e843 = []byte{ - // 1390 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x4b, 0x73, 0x13, 0xc7, - 0x13, 0x67, 0x25, 0x59, 0xab, 0xed, 0xb5, 0xe5, 0x65, 0x00, 0xff, 0xb7, 0xf4, 0xcf, 0xc3, 0x28, - 0x15, 0x70, 0xb9, 0x0a, 0x01, 0xa6, 0x5c, 0x46, 0x26, 0x10, 0x30, 0xb6, 0x83, 0x29, 0xa8, 0xa2, - 0xd6, 0x26, 0x45, 0x72, 0xca, 0x4a, 0x1a, 0xc4, 0xc6, 0xd2, 0xac, 0xb2, 0x33, 0x12, 0xa1, 0x72, - 0xcc, 0x37, 0xca, 0x39, 0xb7, 0x5c, 0xf3, 0x11, 0xf2, 0x01, 0xf2, 0x22, 0xa1, 0xf2, 0xe4, 0x96, - 0xd4, 0xf4, 0xcc, 0xae, 0x46, 0x6b, 0x19, 0x3b, 0x07, 0x4e, 0x9a, 0xfe, 0x75, 0xf7, 0x6f, 0xfa, - 0x31, 0x33, 0xea, 0x05, 0x68, 0x8b, 0xa4, 0xd7, 0x18, 0x24, 0xb1, 0x88, 0x89, 0xad, 0xd6, 0xad, - 0xda, 0xdb, 0xdd, 0x38, 0xee, 0xf6, 0xe8, 0x45, 0x84, 0x5b, 0xc3, 0xc7, 0x17, 0x45, 0xd4, 0xa7, - 0x5c, 0x84, 0xfd, 0x81, 0xb2, 0xac, 0x7f, 0x6b, 0x41, 0x75, 0x97, 0x72, 0x1e, 0xc5, 0x2c, 0xa0, - 0x9f, 0x0d, 0x29, 0x17, 0xe4, 0x0d, 0x70, 0x22, 0xd6, 0x4d, 0x28, 0xe7, 0x3b, 0x1d, 0xdf, 0x5a, - 0xb4, 0x96, 0x9c, 0x60, 0x0c, 0x48, 0x2d, 0xa7, 0xc9, 0x28, 0x6a, 0xd3, 0x9d, 0x8e, 0x5f, 0x50, - 0xda, 0x0c, 0x20, 0xb7, 0xa0, 0x32, 0xa0, 0x34, 0xd9, 0x0c, 0x45, 0xe8, 0x17, 0x17, 0x8b, 0x4b, - 0xee, 0xca, 0xbb, 0x0d, 0x1d, 0x4b, 0x63, 0x72, 0x9b, 0xc6, 0x03, 0x6d, 0xb7, 0xc5, 0x44, 0xf2, - 0x2c, 0xc8, 0xdc, 0x6a, 0xd7, 0x60, 0x6e, 0x42, 0x45, 0x3c, 0x28, 0xee, 0xd3, 0x67, 0x18, 0xc9, - 0x5c, 0x20, 0x97, 0xe4, 0x34, 0xcc, 0x8c, 0xc2, 0xde, 0x90, 0xe2, 0xfe, 0xb3, 0x81, 0x12, 0xd6, - 0x0b, 0x57, 0xad, 0xfa, 0x73, 0x0b, 0xdc, 0x8d, 0x88, 0x75, 0xd2, 0x5c, 0x2e, 0x40, 0xa5, 0x15, - 0xb1, 0xce, 0xde, 0xb3, 0x01, 0x45, 0x82, 0xea, 0xca, 0xc9, 0x2c, 0x9e, 0x0d, 0xad, 0x08, 0x32, - 0x13, 0x49, 0x2c, 0xe2, 0x7d, 0xca, 0x74, 0x62, 0x4a, 0x98, 0x4c, 0xb9, 0x98, 0x4f, 0xf9, 0x86, - 0x91, 0x72, 0x09, 0x53, 0xae, 0x4f, 0x6c, 0xf1, 0x5a, 0xf3, 0xdd, 0x80, 0x59, 0xb5, 0x07, 0x1f, - 0xc4, 0x8c, 0x53, 0xe2, 0x83, 0xcd, 0x87, 0xed, 0x36, 0xe5, 0x1c, 0xfd, 0x2b, 0x41, 0x2a, 0x4a, - 0x4d, 0x9f, 0x72, 0x1e, 0x76, 0xa9, 0x4e, 0x2e, 0x15, 0xeb, 0x97, 0xa0, 0xb4, 0x19, 0x85, 0x3d, - 0x52, 0x85, 0x42, 0x94, 0x36, 0xbc, 0x10, 0x75, 0xa4, 0x47, 0xd8, 0xe9, 0xc8, 0xb6, 0xa7, 0x1e, - 0x5a, 0xac, 0x2f, 0x40, 0xe9, 0x5e, 0xc4, 0xf6, 0xf3, 0x1e, 0xf5, 0x3b, 0x30, 0xb3, 0x1d, 0x0e, - 0x7b, 0x82, 0x5c, 0x94, 0x61, 0xb4, 0x3e, 0xa5, 0x6d, 0xa1, 0xab, 0x7e, 0x26, 0x2b, 0x09, 0x1a, - 0xec, 0x2a, 0x65, 0x90, 0x5a, 0x69, 0xa6, 0x42, 0xc6, 0xf4, 0x55, 0x11, 0x66, 0x82, 0x78, 0x28, - 0xa8, 0x2a, 0x3e, 0x1e, 0x9c, 0xf1, 0x69, 0xcc, 0x00, 0x72, 0x01, 0xca, 0xb4, 0x9b, 0x85, 0xe8, - 0x1a, 0xfb, 0xa0, 0x77, 0x63, 0x0b, 0x95, 0x81, 0x36, 0x22, 0x2b, 0x50, 0x79, 0x1c, 0x27, 0x4f, - 0xc3, 0xa4, 0xc3, 0xf5, 0xf1, 0x5c, 0xc8, 0x39, 0x6c, 0x2b, 0x75, 0x90, 0xd9, 0xd5, 0xbe, 0xb3, - 0xa0, 0xac, 0x68, 0x64, 0x45, 0xe4, 0x51, 0x89, 0x58, 0x57, 0x47, 0x92, 0x8a, 0x87, 0xd7, 0x8a, - 0x2c, 0x82, 0xdb, 0xa1, 0x5c, 0x44, 0x2c, 0x14, 0x51, 0xcc, 0xf4, 0xf1, 0x31, 0x21, 0xf2, 0xfe, - 0x81, 0x03, 0xf4, 0xce, 0xd4, 0x2c, 0x5e, 0xcb, 0x09, 0xaa, 0xed, 0x80, 0xad, 0x73, 0x26, 0x6f, - 0x01, 0xf0, 0xa4, 0x7d, 0x4b, 0xe7, 0xa1, 0x32, 0x34, 0x10, 0xa9, 0xef, 0x70, 0x71, 0x6b, 0x22, - 0x4f, 0x03, 0xa9, 0x37, 0xc1, 0x7e, 0xc8, 0x92, 0x63, 0x74, 0xcd, 0x83, 0x22, 0x8b, 0x9f, 0x22, - 0x43, 0x25, 0x90, 0xcb, 0xfa, 0xcb, 0x39, 0xa8, 0xde, 0xa7, 0x22, 0x89, 0xda, 0xfc, 0xbe, 0x3a, - 0x96, 0x64, 0x1d, 0x80, 0xc7, 0xc3, 0xa4, 0x4d, 0x8d, 0xcb, 0x5b, 0xcb, 0x0a, 0xa3, 0x8d, 0x77, - 0x33, 0x8b, 0xc0, 0xb0, 0x26, 0x35, 0xa8, 0x28, 0x29, 0x7b, 0xa3, 0x32, 0x99, 0x5c, 0x05, 0x27, - 0x7b, 0x04, 0xb1, 0x1d, 0xee, 0x4a, 0xad, 0xa1, 0x9e, 0xc9, 0x46, 0xfa, 0x4c, 0x36, 0xf6, 0x52, - 0x8b, 0x60, 0x6c, 0x4c, 0x56, 0xa1, 0x24, 0xc2, 0x2e, 0xd7, 0x4d, 0x3a, 0x9b, 0x8f, 0x45, 0x07, - 0xde, 0xd8, 0x0b, 0xbb, 0x5c, 0xb5, 0x08, 0xcd, 0xc9, 0xa6, 0x7c, 0x4f, 0xc5, 0x87, 0xb2, 0xe2, - 0xdc, 0x9f, 0x41, 0xdf, 0x73, 0x87, 0xf9, 0xee, 0xa4, 0x86, 0x8a, 0x60, 0xec, 0x48, 0xee, 0x82, - 0xfb, 0xb8, 0x17, 0x87, 0x29, 0x4f, 0x19, 0x79, 0x96, 0x0e, 0xe3, 0xd9, 0x1e, 0x9b, 0x2a, 0x26, - 0xd3, 0x99, 0x5c, 0x83, 0x72, 0x9f, 0x0a, 0x9a, 0x70, 0xdf, 0xce, 0x9d, 0xb7, 0x1c, 0xcd, 0x7d, - 0xb4, 0x52, 0x0c, 0xda, 0x85, 0x7c, 0x00, 0xf0, 0x24, 0xe2, 0x22, 0xee, 0x26, 0x61, 0x9f, 0xfb, - 0x15, 0x24, 0x38, 0x7f, 0x18, 0xc1, 0x9d, 0xcc, 0x52, 0x91, 0x18, 0xae, 0xe4, 0x23, 0xf0, 0x22, - 0x26, 0x68, 0x32, 0x0a, 0x7b, 0xb7, 0xe3, 0x21, 0xc3, 0x78, 0x1c, 0xa4, 0xbb, 0xf0, 0x8a, 0xf2, - 0x4c, 0xd8, 0x2b, 0xd2, 0x03, 0x34, 0xb5, 0x35, 0x70, 0xb2, 0x2e, 0x98, 0xb7, 0xc1, 0x99, 0x72, - 0x1b, 0x1c, 0xf3, 0x36, 0xbc, 0x07, 0xd5, 0xc9, 0x16, 0x1c, 0xe5, 0x5d, 0x34, 0xbd, 0x6f, 0x80, - 0x97, 0x2f, 0xfc, 0x51, 0xfe, 0x96, 0xe9, 0xff, 0x08, 0x5c, 0xa3, 0xe2, 0x53, 0x5c, 0xaf, 0x98, - 0xae, 0xee, 0xca, 0x9b, 0xaf, 0xec, 0x9b, 0xc9, 0xfc, 0x09, 0xcc, 0xe7, 0x5a, 0x31, 0x85, 0x7d, - 0x6d, 0x92, 0xfd, 0xec, 0x91, 0x4d, 0x35, 0x77, 0xe8, 0xc1, 0x99, 0xa9, 0xdd, 0x99, 0xb2, 0xcf, - 0xf5, 0xc9, 0x7d, 0xce, 0x1f, 0xb3, 0xdb, 0xe6, 0x6e, 0x5f, 0x5a, 0x30, 0x83, 0x49, 0xca, 0x6a, - 0xb6, 0xa5, 0x1e, 0x37, 0x28, 0x06, 0x4a, 0x20, 0x0b, 0x50, 0xee, 0x5f, 0x0e, 0x42, 0x91, 0x16, - 0x59, 0x4b, 0x88, 0xaf, 0x22, 0x5e, 0xd4, 0x38, 0x4a, 0xf8, 0xef, 0x78, 0x59, 0x29, 0x4a, 0xa8, - 0x48, 0x45, 0xf9, 0x94, 0xf4, 0x69, 0xc8, 0x50, 0x35, 0x83, 0xaa, 0x4c, 0xae, 0xfd, 0x63, 0x81, - 0x93, 0x15, 0xe3, 0x90, 0x48, 0x3c, 0x28, 0xf6, 0xc3, 0xcf, 0xf5, 0x59, 0x91, 0x4b, 0x42, 0xa0, - 0x24, 0x19, 0x74, 0x04, 0xb8, 0x46, 0xab, 0x88, 0xe1, 0xde, 0xd2, 0x2a, 0x62, 0x32, 0x52, 0x2e, - 0x3a, 0x9b, 0x74, 0xa4, 0x77, 0xd5, 0x92, 0x8c, 0x67, 0x14, 0x26, 0x51, 0xc8, 0xda, 0xd4, 0x2f, - 0xab, 0x78, 0x52, 0x59, 0xb2, 0x0c, 0x56, 0x2f, 0xf9, 0x36, 0xc2, 0x72, 0x89, 0xc8, 0xda, 0xaa, - 0x5f, 0xd1, 0xc8, 0xda, 0x2a, 0x22, 0xcd, 0x55, 0xdf, 0xd1, 0x48, 0x53, 0x23, 0x4d, 0x1f, 0x52, - 0xa4, 0x29, 0x23, 0x1c, 0x34, 0x9b, 0x4d, 0xdf, 0x55, 0x11, 0xca, 0xb5, 0xcc, 0x4e, 0xfe, 0x36, - 0xfd, 0x59, 0x75, 0x6a, 0x51, 0xa8, 0x7d, 0x01, 0xf3, 0xb9, 0x2e, 0x91, 0x73, 0x50, 0x4d, 0xef, - 0xe3, 0x3d, 0xca, 0xba, 0xe2, 0x09, 0xd6, 0xa3, 0x14, 0xe4, 0x50, 0x72, 0x13, 0xec, 0xd6, 0xb0, - 0xbd, 0x4f, 0x85, 0xfc, 0x2b, 0x39, 0xea, 0x51, 0x44, 0xc7, 0x0d, 0x34, 0x0f, 0x52, 0xb7, 0xda, - 0x37, 0x16, 0xde, 0x56, 0x43, 0x47, 0x96, 0xc7, 0x6f, 0xca, 0xae, 0x08, 0x13, 0xf1, 0x70, 0xef, - 0xb6, 0x6e, 0xc7, 0x01, 0x9c, 0xdc, 0x85, 0xf2, 0x48, 0x3d, 0xa6, 0x6a, 0x14, 0x58, 0x39, 0xde, - 0xfe, 0x0d, 0xf3, 0x59, 0xd5, 0x0c, 0xb5, 0x26, 0xb8, 0xff, 0xe1, 0xd2, 0x97, 0xcc, 0x11, 0x6e, - 0x5d, 0x26, 0xc1, 0x07, 0x72, 0x1c, 0xd2, 0x43, 0xeb, 0x12, 0xcc, 0x27, 0x6a, 0x49, 0x3b, 0xfa, - 0xb9, 0xb7, 0x16, 0x8b, 0x4b, 0x4e, 0x90, 0x87, 0xeb, 0x5f, 0x5b, 0xb2, 0xfe, 0xda, 0xf9, 0xc8, - 0x11, 0x70, 0x01, 0xca, 0x34, 0x49, 0xe2, 0x44, 0x15, 0xdc, 0x09, 0xb4, 0x44, 0xae, 0xe7, 0x0a, - 0x31, 0x1e, 0xd9, 0x73, 0xdc, 0xa9, 0x8c, 0xbb, 0x67, 0xb9, 0x5f, 0x85, 0x59, 0x13, 0x97, 0xa7, - 0x87, 0x85, 0x7d, 0xaa, 0xb3, 0xc7, 0xf5, 0xf4, 0x17, 0x77, 0xf9, 0x45, 0x01, 0xdc, 0xdb, 0x31, - 0x13, 0x94, 0x09, 0xfc, 0xdb, 0xae, 0x40, 0xe9, 0x63, 0x9a, 0xc4, 0xde, 0x09, 0xf2, 0x3f, 0x20, - 0x93, 0x9f, 0x0b, 0x52, 0xef, 0x7d, 0x6f, 0x1b, 0x8a, 0x5d, 0x95, 0x15, 0x2a, 0x7e, 0xb0, 0xc9, - 0x1c, 0x54, 0xe4, 0x14, 0x8b, 0xe2, 0x8f, 0x28, 0xca, 0x11, 0x15, 0xc5, 0x9f, 0x6c, 0x52, 0x05, - 0x07, 0x07, 0x4f, 0x94, 0x7f, 0x46, 0x19, 0x47, 0x2b, 0x94, 0x9f, 0xdb, 0xc4, 0x03, 0x57, 0x8f, - 0x2e, 0x88, 0xfc, 0x82, 0x88, 0x3e, 0x06, 0x88, 0xfc, 0x6a, 0x93, 0x45, 0xf8, 0xff, 0x5e, 0xdc, - 0xed, 0xf6, 0xe8, 0x83, 0x68, 0x40, 0xf7, 0x92, 0xb0, 0x4d, 0xb9, 0x19, 0xdc, 0x0b, 0x9b, 0x9c, - 0x82, 0x2a, 0xe2, 0x5b, 0x23, 0x9d, 0x91, 0xf7, 0x9b, 0x4d, 0x4e, 0xc3, 0xbc, 0xf1, 0x19, 0x80, - 0xe8, 0xef, 0x36, 0x39, 0x03, 0x9e, 0x39, 0xb8, 0x23, 0xfc, 0x07, 0xa6, 0x37, 0x79, 0x18, 0x50, - 0xf1, 0xa7, 0x4d, 0x7c, 0x38, 0x95, 0x6b, 0x06, 0x6a, 0xfe, 0x42, 0x7e, 0x3c, 0xd2, 0x8f, 0x70, - 0x48, 0x44, 0xf4, 0x6f, 0x9b, 0x2c, 0xc0, 0x49, 0x5d, 0xa7, 0xed, 0x30, 0xea, 0x51, 0xfc, 0xbc, - 0xf1, 0x5e, 0xda, 0xcb, 0x8b, 0x50, 0x49, 0xbf, 0x7b, 0x64, 0xb9, 0xe5, 0xda, 0x3b, 0x41, 0x00, - 0xca, 0x0f, 0x99, 0x9c, 0x65, 0x3d, 0x6b, 0xf9, 0x26, 0xcc, 0x9a, 0x33, 0x3a, 0xf1, 0x64, 0x7b, - 0x91, 0x1b, 0x61, 0xef, 0x04, 0x99, 0x07, 0x77, 0xcb, 0x00, 0x2c, 0x32, 0x07, 0x8e, 0x2c, 0xb6, - 0x12, 0x0b, 0xcb, 0xeb, 0x70, 0xf2, 0xc0, 0x78, 0x46, 0x5c, 0xb0, 0x35, 0x8d, 0xda, 0x4f, 0x31, - 0x78, 0x16, 0x99, 0x85, 0x0a, 0x5e, 0x30, 0x16, 0xf6, 0xbc, 0x42, 0xab, 0x8c, 0x23, 0xd8, 0x95, - 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xde, 0xb8, 0xc7, 0xe2, 0xce, 0x0e, 0x00, 0x00, + // 1371 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x57, 0x5b, 0x93, 0x13, 0xc5, + 0x17, 0xff, 0x4f, 0x92, 0xdd, 0xc9, 0x9c, 0xd9, 0xcd, 0x86, 0xe6, 0x0f, 0xa4, 0xe2, 0x0d, 0x62, + 0x09, 0x5b, 0x5b, 0x45, 0x80, 0xa5, 0x52, 0x4b, 0x16, 0x51, 0x70, 0x2f, 0x82, 0x05, 0x55, 0xd4, + 0x6c, 0xb0, 0xd0, 0x27, 0x7b, 0x93, 0x26, 0x8c, 0x24, 0x33, 0xb1, 0x67, 0x12, 0xa4, 0x7c, 0xd4, + 0x2a, 0xbf, 0x8f, 0xcf, 0xbe, 0xf9, 0xea, 0x47, 0xf0, 0x03, 0x78, 0xd7, 0xf2, 0xca, 0x9b, 0x76, + 0x9f, 0xee, 0x99, 0xf4, 0xcc, 0x26, 0xec, 0xfa, 0xc0, 0x53, 0xfa, 0xfc, 0xce, 0xa5, 0xcf, 0xad, + 0xcf, 0x9c, 0x00, 0x74, 0x63, 0x3e, 0x68, 0x8e, 0x78, 0x18, 0x87, 0xc4, 0x56, 0xe7, 0xfd, 0xfa, + 0x2b, 0xfd, 0x30, 0xec, 0x0f, 0xd8, 0x05, 0x84, 0xf7, 0xc7, 0x0f, 0x2e, 0xc4, 0xfe, 0x90, 0x45, + 0x31, 0x1d, 0x8e, 0x94, 0x64, 0xe3, 0x6b, 0x0b, 0x2a, 0x7b, 0x2c, 0x8a, 0xfc, 0x30, 0xf0, 0xd8, + 0x47, 0x63, 0xc1, 0x23, 0x2f, 0x82, 0xe3, 0x07, 0x7d, 0x2e, 0xc0, 0x5b, 0xbd, 0x9a, 0x75, 0xda, + 0x5a, 0x75, 0xbc, 0x29, 0x20, 0xb9, 0x11, 0xe3, 0x13, 0xbf, 0xcb, 0x04, 0xb7, 0xa0, 0xb8, 0x29, + 0x40, 0x6e, 0x40, 0x79, 0xc4, 0x18, 0xdf, 0xa6, 0x31, 0xad, 0x15, 0x4f, 0x17, 0x57, 0xdd, 0xf5, + 0xd7, 0x9a, 0xda, 0x97, 0x66, 0xf6, 0x9a, 0xe6, 0x5d, 0x2d, 0xb7, 0x13, 0xc4, 0xfc, 0x89, 0x97, + 0xaa, 0xd5, 0xaf, 0xc2, 0x72, 0x86, 0x45, 0xaa, 0x50, 0x7c, 0xc4, 0x9e, 0xa0, 0x27, 0xcb, 0x9e, + 0x3c, 0x92, 0xff, 0xc3, 0xc2, 0x84, 0x0e, 0xc6, 0x0c, 0xef, 0x5f, 0xf2, 0x14, 0xb1, 0x59, 0xb8, + 0x62, 0x35, 0x3e, 0x2b, 0xc0, 0xa9, 0x2d, 0xce, 0x68, 0xcc, 0x3a, 0x8c, 0x0f, 0xfd, 0x80, 0xc6, + 0x21, 0x4f, 0xe2, 0xaa, 0x40, 0xc1, 0x4f, 0x02, 0x12, 0xa7, 0x43, 0x22, 0xa9, 0x81, 0xbd, 0xef, + 0x07, 0x3d, 0x11, 0xb8, 0x08, 0x44, 0xf2, 0x12, 0x52, 0x72, 0x68, 0xaf, 0x27, 0xd3, 0x51, 0x2b, + 0x29, 0x8e, 0x26, 0xc9, 0x3b, 0x46, 0xf4, 0x0b, 0x18, 0x7d, 0x33, 0x8d, 0x7e, 0x8e, 0x57, 0xcf, + 0x27, 0x0d, 0xd7, 0xe0, 0x94, 0xc7, 0x86, 0xe1, 0x64, 0x46, 0x16, 0x1a, 0xb0, 0x14, 0xa7, 0x60, + 0x5a, 0xe0, 0x0c, 0xd6, 0xb8, 0x08, 0xa5, 0x6d, 0x9f, 0x0e, 0x0e, 0x64, 0xcc, 0x88, 0xbc, 0x90, + 0x89, 0xbc, 0x71, 0x12, 0x4a, 0xb7, 0xfd, 0xe0, 0x51, 0x5e, 0xa3, 0x71, 0x13, 0x16, 0x76, 0xe9, + 0x78, 0x10, 0x93, 0x0b, 0x60, 0x47, 0xe3, 0xfd, 0x0f, 0x59, 0x37, 0x46, 0x6e, 0x65, 0xfd, 0x44, + 0x9a, 0x19, 0x14, 0xd8, 0x53, 0x4c, 0x2f, 0x91, 0xd2, 0x96, 0x0a, 0xa9, 0xa5, 0x2f, 0x8a, 0xb0, + 0xe0, 0x85, 0xe3, 0x98, 0xa9, 0xba, 0x61, 0x2b, 0x4d, 0xfb, 0x33, 0x05, 0xc8, 0x79, 0x58, 0x64, + 0xfd, 0xd4, 0x45, 0xd7, 0xb8, 0x07, 0xb5, 0x9b, 0x3b, 0xc8, 0xf4, 0xb4, 0x10, 0x59, 0x87, 0xf2, + 0x83, 0x90, 0x3f, 0xa6, 0xbc, 0x17, 0xe9, 0x86, 0x3d, 0x99, 0x53, 0xd8, 0x55, 0x6c, 0x2f, 0x95, + 0xab, 0x7f, 0x63, 0xc1, 0xa2, 0x32, 0x63, 0x76, 0x89, 0x35, 0xb7, 0x4b, 0xb2, 0xb9, 0x22, 0xa7, + 0xc1, 0xed, 0x89, 0x4a, 0xc8, 0x6c, 0x0b, 0x97, 0x75, 0x77, 0x99, 0x10, 0x79, 0xd3, 0xe8, 0xa3, + 0x12, 0x3a, 0xf5, 0xea, 0xcc, 0x28, 0x9e, 0x4b, 0xf3, 0xd4, 0x6f, 0x81, 0xad, 0x63, 0x26, 0x2f, + 0x03, 0x44, 0xbc, 0x7b, 0x43, 0xc7, 0xa1, 0x22, 0x34, 0x10, 0xc9, 0xef, 0x45, 0xf1, 0x8d, 0x4c, + 0x9c, 0x06, 0xd2, 0x68, 0x83, 0x7d, 0x2f, 0xe0, 0x47, 0xa8, 0x9a, 0xf0, 0x2f, 0x08, 0x1f, 0xa3, + 0x85, 0xb2, 0x27, 0x8f, 0x8d, 0xa7, 0xcb, 0x50, 0xb9, 0xc3, 0x62, 0xee, 0x77, 0xa3, 0x3b, 0x42, + 0x8c, 0xf6, 0x19, 0xd9, 0x14, 0xde, 0x84, 0x63, 0xde, 0x65, 0x9d, 0x27, 0x23, 0xa6, 0xdb, 0xa8, + 0x9e, 0x26, 0x46, 0x0b, 0xef, 0xa5, 0x12, 0x9e, 0x21, 0x4d, 0xea, 0x50, 0x56, 0x54, 0xfa, 0xd6, + 0x53, 0x9a, 0x5c, 0x01, 0x27, 0x1d, 0x8b, 0x58, 0x0e, 0x57, 0x98, 0x55, 0x83, 0xb3, 0x99, 0x0c, + 0xce, 0x66, 0x27, 0x91, 0xf0, 0xa6, 0xc2, 0xa4, 0x05, 0xa5, 0x98, 0xf6, 0x23, 0x5d, 0xa4, 0x33, + 0x79, 0x5f, 0xb4, 0xe3, 0xcd, 0x8e, 0x90, 0x51, 0x25, 0x42, 0x71, 0xb2, 0x2d, 0x27, 0x6c, 0xfc, + 0xae, 0xcc, 0x78, 0xa4, 0x07, 0xc5, 0xd9, 0x79, 0xba, 0xb7, 0x12, 0x41, 0x65, 0x60, 0xaa, 0x28, + 0xa6, 0x8d, 0xfb, 0x60, 0x10, 0xd2, 0xc4, 0xce, 0x22, 0xda, 0x59, 0x9d, 0x67, 0x67, 0x77, 0x2a, + 0xaa, 0x2c, 0x99, 0xca, 0xe4, 0x2a, 0x2c, 0x0e, 0x99, 0x98, 0x01, 0x51, 0xcd, 0xce, 0xf5, 0x5b, + 0xce, 0xcc, 0x1d, 0x94, 0x52, 0x16, 0xb4, 0x0a, 0x79, 0x1b, 0xe0, 0xa1, 0x1f, 0xc5, 0x61, 0x9f, + 0xd3, 0x61, 0x54, 0x2b, 0xa3, 0x81, 0x73, 0xf3, 0x0c, 0xdc, 0x4c, 0x25, 0x95, 0x11, 0x43, 0x95, + 0xbc, 0x07, 0x55, 0x11, 0x9e, 0x18, 0xc1, 0x74, 0xb0, 0x15, 0x8e, 0x03, 0xf4, 0xc7, 0x41, 0x73, + 0xe7, 0x9f, 0x91, 0x9e, 0x8c, 0xbc, 0x32, 0x7a, 0xc0, 0x4c, 0x7d, 0x03, 0x9c, 0xb4, 0x0a, 0xe6, + 0x6b, 0x70, 0x66, 0xbc, 0x06, 0xc7, 0x7c, 0x0d, 0xaf, 0x43, 0x25, 0x5b, 0x82, 0xc3, 0xb4, 0x8b, + 0xa6, 0xf6, 0x1b, 0x50, 0xcd, 0x27, 0xfe, 0x30, 0x7d, 0xcb, 0xd4, 0xbf, 0x0f, 0xae, 0x91, 0xf1, + 0x19, 0xaa, 0x97, 0x4d, 0x55, 0x77, 0xfd, 0xa5, 0x67, 0xd6, 0xcd, 0xb4, 0xfc, 0x01, 0xac, 0xe4, + 0x4a, 0x31, 0xc3, 0xfa, 0x46, 0xd6, 0xfa, 0x99, 0x43, 0x8b, 0x6a, 0xde, 0x30, 0x80, 0x13, 0x33, + 0xab, 0x33, 0xe3, 0x9e, 0x6b, 0xd9, 0x7b, 0xce, 0x1d, 0xb1, 0xda, 0xe6, 0x6d, 0x9f, 0x5a, 0xb0, + 0x80, 0x41, 0xca, 0x6c, 0x76, 0x25, 0x1f, 0x2f, 0x10, 0xd5, 0x40, 0x82, 0x9c, 0x14, 0x1d, 0x7e, + 0xc9, 0x13, 0x9f, 0x60, 0x9d, 0x64, 0x4d, 0x21, 0xde, 0x42, 0xbc, 0xa8, 0x71, 0xa4, 0xe4, 0xfc, + 0x1e, 0x5e, 0x52, 0x8c, 0x12, 0x32, 0x12, 0x52, 0x8e, 0x92, 0x21, 0xa3, 0x01, 0xb2, 0x16, 0x90, + 0x95, 0xd2, 0xf5, 0x7f, 0x2c, 0x70, 0xd2, 0x64, 0xcc, 0xf1, 0x44, 0x84, 0x3f, 0xa4, 0x1f, 0xeb, + 0x5e, 0x91, 0x47, 0x42, 0xa0, 0x24, 0x2d, 0x68, 0x0f, 0xf0, 0x8c, 0x52, 0x7e, 0x80, 0x77, 0x4b, + 0x29, 0x3f, 0x90, 0x9e, 0x46, 0x71, 0x6f, 0x9b, 0x4d, 0xf4, 0xad, 0x9a, 0x92, 0xfe, 0x4c, 0x28, + 0xf7, 0x69, 0xd0, 0x65, 0x62, 0x08, 0xa0, 0x3f, 0x09, 0x2d, 0xad, 0x8c, 0x5a, 0x17, 0xc5, 0xa3, + 0x96, 0xb0, 0x3c, 0x22, 0xb2, 0xd1, 0x12, 0xaf, 0x54, 0x21, 0x1b, 0x2d, 0x44, 0xda, 0x2d, 0xf1, + 0xd0, 0x14, 0xd2, 0xd6, 0x48, 0xbb, 0x06, 0x09, 0xd2, 0x96, 0x1e, 0x8a, 0x9f, 0x76, 0xcd, 0x55, + 0x1e, 0xca, 0xb3, 0x8c, 0x4e, 0xfe, 0xb6, 0x6b, 0x4b, 0xaa, 0x6b, 0x91, 0xa8, 0x7f, 0x02, 0x2b, + 0xb9, 0x2a, 0x91, 0xb3, 0x50, 0x49, 0xde, 0xe3, 0x6d, 0x16, 0xf4, 0xe3, 0x87, 0x98, 0x8f, 0x92, + 0x97, 0x43, 0xc9, 0x75, 0xf1, 0x31, 0x1d, 0x77, 0x1f, 0xb1, 0x58, 0x7e, 0x4a, 0x0e, 0x1b, 0x8a, + 0xa8, 0xf8, 0x16, 0x8a, 0x7b, 0x89, 0x5a, 0xfd, 0x2b, 0x0b, 0x5f, 0xab, 0xc1, 0x23, 0x6b, 0xd3, + 0x99, 0xb2, 0x17, 0x53, 0x1e, 0xdf, 0xeb, 0x6c, 0xe9, 0x72, 0x1c, 0xc0, 0xc5, 0x44, 0x5d, 0x9c, + 0xa8, 0x61, 0xaa, 0x56, 0x81, 0xf5, 0xa3, 0xdd, 0xdf, 0x34, 0xc7, 0xaa, 0xb6, 0x50, 0x6f, 0x83, + 0xfb, 0x1f, 0x1e, 0x7d, 0xc9, 0xdc, 0xde, 0x36, 0x65, 0x10, 0xd1, 0x48, 0xae, 0x43, 0x7a, 0x69, + 0x5b, 0x85, 0x15, 0xae, 0x8e, 0xac, 0xa7, 0xc7, 0xbd, 0x25, 0x3c, 0x74, 0xbc, 0x3c, 0xdc, 0xf8, + 0xd2, 0x92, 0xf9, 0xd7, 0xca, 0xd1, 0x28, 0x0c, 0x22, 0x6c, 0xe5, 0x68, 0xdc, 0xed, 0x26, 0x9f, + 0xf0, 0xb2, 0x97, 0x90, 0xb2, 0xa5, 0x18, 0xe7, 0x21, 0x57, 0x09, 0x77, 0x3c, 0x4d, 0x89, 0xf7, + 0x98, 0x4d, 0xc4, 0x74, 0x89, 0xcf, 0xd9, 0x4e, 0x68, 0xbc, 0x3d, 0x8d, 0xfd, 0x0a, 0x2c, 0x99, + 0xb8, 0xec, 0x9e, 0x80, 0x0e, 0x99, 0x8e, 0x1e, 0xcf, 0xb3, 0x27, 0xee, 0xda, 0xe7, 0x45, 0x70, + 0xb7, 0x42, 0x91, 0xdd, 0x20, 0xc6, 0xcf, 0x76, 0x19, 0x4a, 0xef, 0x33, 0x1e, 0x56, 0xff, 0x47, + 0x4e, 0x01, 0xc9, 0xfe, 0x81, 0x90, 0xfc, 0xea, 0xb7, 0xb6, 0xc1, 0xd8, 0x53, 0x51, 0x21, 0xe3, + 0x3b, 0x9b, 0x2c, 0x43, 0x59, 0x6e, 0xb1, 0x48, 0x7e, 0x8f, 0xa4, 0x5c, 0x51, 0x91, 0xfc, 0xc1, + 0x16, 0xfb, 0xa5, 0x83, 0x8b, 0x27, 0xd2, 0x3f, 0x22, 0x8d, 0xab, 0x15, 0xd2, 0x3f, 0xd9, 0xa2, + 0x60, 0xae, 0x5e, 0x5d, 0x10, 0xf9, 0x19, 0x11, 0xdd, 0x06, 0x88, 0xfc, 0x62, 0x8b, 0x4d, 0xee, + 0x85, 0x4e, 0xd8, 0x17, 0x6b, 0xc2, 0x5d, 0x7f, 0xc4, 0x3a, 0x9c, 0x8a, 0xdb, 0x4d, 0xe7, 0x7e, + 0xb5, 0xc9, 0x71, 0xa8, 0x20, 0xbe, 0x33, 0xd1, 0x11, 0x55, 0x7f, 0x43, 0xb5, 0x39, 0xff, 0x06, + 0x50, 0xe2, 0x77, 0x94, 0x98, 0xb3, 0xbf, 0xa3, 0xc4, 0x1f, 0x18, 0x75, 0xb6, 0x47, 0x90, 0xf1, + 0xa7, 0x2d, 0x8a, 0x7d, 0x3c, 0x57, 0x23, 0xe4, 0xfc, 0x65, 0x8b, 0x8c, 0xaf, 0x60, 0xa7, 0xdf, + 0xc7, 0xdd, 0x11, 0xd1, 0xbf, 0x6d, 0xd1, 0x02, 0xc7, 0x74, 0xfa, 0x76, 0xa9, 0x3f, 0x60, 0x3d, + 0xc4, 0x9f, 0xda, 0x6b, 0xd7, 0x61, 0xc9, 0x5c, 0xcc, 0x45, 0xf4, 0xa2, 0xa6, 0xa8, 0x89, 0xb0, + 0xa8, 0xc8, 0x0a, 0xb8, 0x3b, 0x06, 0x60, 0x89, 0x0c, 0x3b, 0x32, 0xc3, 0x8a, 0x2c, 0xac, 0x6d, + 0xc2, 0xb1, 0x03, 0x3b, 0x19, 0x71, 0xc1, 0xd6, 0x66, 0x84, 0x05, 0x48, 0xf6, 0x68, 0xa1, 0xbc, + 0x04, 0x65, 0x7c, 0x55, 0x01, 0x1d, 0x54, 0x0b, 0xfb, 0x8b, 0xb8, 0x77, 0x5d, 0xfe, 0x37, 0x00, + 0x00, 0xff, 0xff, 0xf2, 0xab, 0x3d, 0x7c, 0xd5, 0x0e, 0x00, 0x00, } diff --git a/pb/ctrl_pb/ctrl.proto b/pb/ctrl_pb/ctrl.proto index ee82437c3..fa30fef00 100644 --- a/pb/ctrl_pb/ctrl.proto +++ b/pb/ctrl_pb/ctrl.proto @@ -7,22 +7,22 @@ import "google/protobuf/timestamp.proto"; enum ContentType { Zero = 0; - SessionRequestType = 1000; - SessionSuccessType = 1001; - DialType = 1002; - LinkType = 1003; - FaultType = 1004; - RouteType = 1005; - UnrouteType = 1006; - MetricsType = 1007; + SessionRequestType = 1000; + SessionSuccessType = 1001; + DialType = 1002; + LinkType = 1003; + FaultType = 1004; + RouteType = 1005; + UnrouteType = 1006; + MetricsType = 1007; TogglePipeTracesRequestType = 1008; - TraceEventType = 1010; - BindRequestType = 1011; - BindResponseType = 1012; - InspectRequestType = 1013; + TraceEventType = 1010; + CreateTerminatorRequestType = 1011; + RemoveTerminatorRequestType = 1012; + InspectRequestType = 1013; InspectResponseType = 1014; - StartXgressType = 1015; - SessionFailedType = 1016; + StartXgressType = 1015; + SessionFailedType = 1016; } message SessionRequest { @@ -31,21 +31,16 @@ message SessionRequest { map peerData = 3; } -enum BindType { - Bind = 0; - Unbind = 1; +message CreateTerminatorRequest { + string id = 1; + string serviceId = 2; + string binding = 3; + string address = 4; + map peerData = 5; } -message BindRequest { - BindType bindType = 1; - string token = 2; - string serviceId = 3; - map peerData = 4; -} - -message BindResponse { - bool success = 1; - string message = 2; +message RemoveTerminatorRequest { + string terminatorId = 1; } message Dial { @@ -110,26 +105,26 @@ message MetricsMessage { map intervalCounters = 9; message Meter { - int64 count = 1; - double m1Rate = 2; - double m5Rate = 3; - double m15Rate = 4; + int64 count = 1; + double m1Rate = 2; + double m5Rate = 3; + double m15Rate = 4; double meanRate = 5; } message Histogram { - int64 count = 1; - int64 max = 2; - double mean = 3; - int64 min = 4; - double stdDev = 5; + int64 count = 1; + int64 max = 2; + double mean = 3; + int64 min = 4; + double stdDev = 5; double variance = 6; - double p50 = 7; - double p75 = 8; - double p95 = 9; - double p99 = 10; - double p999 = 11; - double p9999 = 12; + double p50 = 7; + double p75 = 8; + double p95 = 9; + double p99 = 10; + double p999 = 11; + double p9999 = 12; } message IntervalCounter { diff --git a/pb/ctrl_pb/decoder.go b/pb/ctrl_pb/decoder.go index e34389a40..7ba0a8b85 100644 --- a/pb/ctrl_pb/decoder.go +++ b/pb/ctrl_pb/decoder.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -39,7 +39,7 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { meta["ingressId"] = sessionRequest.IngressId meta["serviceId"] = sessionRequest.ServiceId headers := make([]string, 0) - for k, _ := range sessionRequest.PeerData { + for k := range sessionRequest.PeerData { headers = append(headers, strconv.Itoa(int(k))) } meta["peerData"] = strings.Join(headers, ",") @@ -56,20 +56,15 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { return nil, true } - case int32(ContentType_BindRequestType): - bindRequest := &BindRequest{} - if err := proto.Unmarshal(msg.Body, bindRequest); err == nil { - meta := channel2.NewTraceMessageDecode(DECODER, "Bind Request") - meta["bindType"] = bindRequest.BindType - meta["serviceId"] = bindRequest.ServiceId - dataIds := make([]string, 0) - for k, _ := range bindRequest.PeerData { - dataIds = append(dataIds, strconv.Itoa(int(k))) - } - meta["peerData"] = strings.Join(dataIds, ",") + case int32(ContentType_CreateTerminatorRequestType): + createTerminator := &CreateTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, createTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Create Terminator Request") + meta["terminator"] = terminatorToString(createTerminator) data, err := meta.MarshalTraceMessageDecode() if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) return nil, true } @@ -80,15 +75,15 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { return nil, true } - case int32(ContentType_BindResponseType): - bindResponse := &BindResponse{} - if err := proto.Unmarshal(msg.Body, bindResponse); err == nil { - meta := channel2.NewTraceMessageDecode(DECODER, "Bind Request") - meta["success"] = bindResponse.Success - meta["message"] = bindResponse.Message + case int32(ContentType_RemoveTerminatorRequestType): + removeTerminator := &RemoveTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, removeTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Remove Terminator Request") + meta["terminatorId"] = removeTerminator.TerminatorId data, err := meta.MarshalTraceMessageDecode() if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) return nil, true } @@ -277,3 +272,7 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { return nil, false } + +func terminatorToString(request *CreateTerminatorRequest) string { + return fmt.Sprintf("{id=[%s]}", request.Id) +} diff --git a/pb/mgmt_pb/decoder.go b/pb/mgmt_pb/decoder.go index 19b0019cd..e733398f5 100644 --- a/pb/mgmt_pb/decoder.go +++ b/pb/mgmt_pb/decoder.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -133,6 +133,112 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { return nil, true } + // terminator messages + case int32(ContentType_ListTerminatorsRequestType): + data, err := channel2.NewTraceMessageDecode(DECODER, "List Terminators Request").MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + case int32(ContentType_ListTerminatorsResponseType): + listTerminators := &ListTerminatorsResponse{} + if err := proto.Unmarshal(msg.Body, listTerminators); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "List Terminators Response") + meta["terminators"] = len(listTerminators.Terminators) + + data, err := meta.MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + } else { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + case int32(ContentType_CreateTerminatorRequestType): + createTerminator := &CreateTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, createTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Create Terminator Request") + meta["terminator"] = terminatorToString(createTerminator.Terminator) + + data, err := meta.MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + } else { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + case int32(ContentType_RemoveTerminatorRequestType): + removeTerminator := &RemoveTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, removeTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Remove Terminator Request") + meta["terminatorId"] = removeTerminator.TerminatorId + + data, err := meta.MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + } else { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + case int32(ContentType_GetTerminatorRequestType): + getTerminator := &GetTerminatorRequest{} + if err := proto.Unmarshal(msg.Body, getTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Get Terminator Request") + meta["terminatorId"] = getTerminator.TerminatorId + + data, err := meta.MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + } else { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + case int32(ContentType_GetTerminatorResponseType): + getTerminator := &GetTerminatorResponse{} + if err := proto.Unmarshal(msg.Body, getTerminator); err == nil { + meta := channel2.NewTraceMessageDecode(DECODER, "Get Terminator Response") + meta["terminator"] = terminatorToString(getTerminator.Terminator) + + data, err := meta.MarshalTraceMessageDecode() + if err != nil { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + return data, true + + } else { + pfxlog.Logger().Errorf("unexpected error (%s)", err) + return nil, true + } + + // router messages case int32(ContentType_ListRoutersRequestType): data, err := channel2.NewTraceMessageDecode(DECODER, "List Routers Request").MarshalTraceMessageDecode() if err != nil { @@ -300,7 +406,11 @@ func (d Decoder) Decode(msg *channel2.Message) ([]byte, bool) { } func serviceToString(service *Service) string { - return fmt.Sprintf("{id=[%s] binding=[%s] endpoint=[%s] egress=[%s]}", service.Id, service.Binding, service.EndpointAddress, service.Egress) + return fmt.Sprintf("{id=[%s]}", service.Id) +} + +func terminatorToString(terminator *Terminator) string { + return fmt.Sprintf("{id=[%s]}", terminator.Id) } func routerToString(router *Router) string { diff --git a/pb/mgmt_pb/mgmt.pb.go b/pb/mgmt_pb/mgmt.pb.go index d70f97bd6..ab9f08aef 100644 --- a/pb/mgmt_pb/mgmt.pb.go +++ b/pb/mgmt_pb/mgmt.pb.go @@ -1,28 +1,14 @@ -/* - Copyright 2019 NetFoundry, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - // Code generated by protoc-gen-go. DO NOT EDIT. // source: mgmt.proto package mgmt_pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -33,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type ContentType int32 @@ -47,6 +33,13 @@ const ( ContentType_RemoveServiceRequestType ContentType = 10005 ContentType_GetServiceRequestType ContentType = 10006 ContentType_GetServiceResponseType ContentType = 10007 + // Service Terminators + ContentType_CreateTerminatorRequestType ContentType = 10050 + ContentType_RemoveTerminatorRequestType ContentType = 10051 + ContentType_ListTerminatorsRequestType ContentType = 10052 + ContentType_ListTerminatorsResponseType ContentType = 10053 + ContentType_GetTerminatorRequestType ContentType = 10054 + ContentType_GetTerminatorResponseType ContentType = 10055 // Routers ContentType_ListRoutersRequestType ContentType = 10010 ContentType_ListRoutersResponseType ContentType = 10011 @@ -83,6 +76,12 @@ var ContentType_name = map[int32]string{ 10005: "RemoveServiceRequestType", 10006: "GetServiceRequestType", 10007: "GetServiceResponseType", + 10050: "CreateTerminatorRequestType", + 10051: "RemoveTerminatorRequestType", + 10052: "ListTerminatorsRequestType", + 10053: "ListTerminatorsResponseType", + 10054: "GetTerminatorRequestType", + 10055: "GetTerminatorResponseType", 10010: "ListRoutersRequestType", 10011: "ListRoutersResponseType", 10012: "CreateRouterRequestType", @@ -105,14 +104,21 @@ var ContentType_name = map[int32]string{ 10048: "InspectRequestType", 10049: "InspectResponseType", } + var ContentType_value = map[string]int32{ - "Zero": 0, + "Zero": 0, "ListServicesRequestType": 10001, "ListServicesResponseType": 10002, "CreateServiceRequestType": 10003, "RemoveServiceRequestType": 10005, "GetServiceRequestType": 10006, "GetServiceResponseType": 10007, + "CreateTerminatorRequestType": 10050, + "RemoveTerminatorRequestType": 10051, + "ListTerminatorsRequestType": 10052, + "ListTerminatorsResponseType": 10053, + "GetTerminatorRequestType": 10054, + "GetTerminatorResponseType": 10055, "ListRoutersRequestType": 10010, "ListRoutersResponseType": 10011, "CreateRouterRequestType": 10012, @@ -139,8 +145,9 @@ var ContentType_value = map[string]int32{ func (x ContentType) String() string { return proto.EnumName(ContentType_name, int32(x)) } + func (ContentType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{0} + return fileDescriptor_24cf82780fd24e73, []int{0} } type StreamSessionEventType int32 @@ -158,6 +165,7 @@ var StreamSessionEventType_name = map[int32]string{ 2: "SessionPresent", 3: "CircuitUpdated", } + var StreamSessionEventType_value = map[string]int32{ "SessionCreated": 0, "SessionDeleted": 1, @@ -168,8 +176,9 @@ var StreamSessionEventType_value = map[string]int32{ func (x StreamSessionEventType) String() string { return proto.EnumName(StreamSessionEventType_name, int32(x)) } + func (StreamSessionEventType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{1} + return fileDescriptor_24cf82780fd24e73, []int{1} } type TraceFilterType int32 @@ -183,6 +192,7 @@ var TraceFilterType_name = map[int32]string{ 0: "EXCLUDE", 1: "INCLUDE", } + var TraceFilterType_value = map[string]int32{ "EXCLUDE": 0, "INCLUDE": 1, @@ -191,34 +201,35 @@ var TraceFilterType_value = map[string]int32{ func (x TraceFilterType) String() string { return proto.EnumName(TraceFilterType_name, int32(x)) } + func (TraceFilterType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{2} + return fileDescriptor_24cf82780fd24e73, []int{2} } type Service struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Binding string `protobuf:"bytes,2,opt,name=binding,proto3" json:"binding,omitempty"` - EndpointAddress string `protobuf:"bytes,3,opt,name=endpointAddress,proto3" json:"endpointAddress,omitempty"` - Egress string `protobuf:"bytes,4,opt,name=egress,proto3" json:"egress,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TerminatorStrategy string `protobuf:"bytes,2,opt,name=terminatorStrategy,proto3" json:"terminatorStrategy,omitempty"` + Terminators []*Terminator `protobuf:"bytes,3,rep,name=terminators,proto3" json:"terminators,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Service) Reset() { *m = Service{} } func (m *Service) String() string { return proto.CompactTextString(m) } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{0} + return fileDescriptor_24cf82780fd24e73, []int{0} } + func (m *Service) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Service.Unmarshal(m, b) } func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Service.Marshal(b, m, deterministic) } -func (dst *Service) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service.Merge(dst, src) +func (m *Service) XXX_Merge(src proto.Message) { + xxx_messageInfo_Service.Merge(m, src) } func (m *Service) XXX_Size() int { return xxx_messageInfo_Service.Size(m) @@ -236,28 +247,109 @@ func (m *Service) GetId() string { return "" } -func (m *Service) GetBinding() string { +func (m *Service) GetTerminatorStrategy() string { + if m != nil { + return m.TerminatorStrategy + } + return "" +} + +func (m *Service) GetTerminators() []*Terminator { + if m != nil { + return m.Terminators + } + return nil +} + +type Terminator struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ServiceId string `protobuf:"bytes,2,opt,name=serviceId,proto3" json:"serviceId,omitempty"` + RouterId string `protobuf:"bytes,3,opt,name=routerId,proto3" json:"routerId,omitempty"` + Binding string `protobuf:"bytes,4,opt,name=binding,proto3" json:"binding,omitempty"` + Address string `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"` + CreatedAt *timestamp.Timestamp `protobuf:"bytes,6,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + PeerData map[uint32][]byte `protobuf:"bytes,7,rep,name=peerData,proto3" json:"peerData,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Terminator) Reset() { *m = Terminator{} } +func (m *Terminator) String() string { return proto.CompactTextString(m) } +func (*Terminator) ProtoMessage() {} +func (*Terminator) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{1} +} + +func (m *Terminator) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Terminator.Unmarshal(m, b) +} +func (m *Terminator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Terminator.Marshal(b, m, deterministic) +} +func (m *Terminator) XXX_Merge(src proto.Message) { + xxx_messageInfo_Terminator.Merge(m, src) +} +func (m *Terminator) XXX_Size() int { + return xxx_messageInfo_Terminator.Size(m) +} +func (m *Terminator) XXX_DiscardUnknown() { + xxx_messageInfo_Terminator.DiscardUnknown(m) +} + +var xxx_messageInfo_Terminator proto.InternalMessageInfo + +func (m *Terminator) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *Terminator) GetServiceId() string { + if m != nil { + return m.ServiceId + } + return "" +} + +func (m *Terminator) GetRouterId() string { + if m != nil { + return m.RouterId + } + return "" +} + +func (m *Terminator) GetBinding() string { if m != nil { return m.Binding } return "" } -func (m *Service) GetEndpointAddress() string { +func (m *Terminator) GetAddress() string { if m != nil { - return m.EndpointAddress + return m.Address } return "" } -func (m *Service) GetEgress() string { +func (m *Terminator) GetCreatedAt() *timestamp.Timestamp { if m != nil { - return m.Egress + return m.CreatedAt } - return "" + return nil +} + +func (m *Terminator) GetPeerData() map[uint32][]byte { + if m != nil { + return m.PeerData + } + return nil } type ListServicesRequest struct { + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -267,16 +359,17 @@ func (m *ListServicesRequest) Reset() { *m = ListServicesRequest{} } func (m *ListServicesRequest) String() string { return proto.CompactTextString(m) } func (*ListServicesRequest) ProtoMessage() {} func (*ListServicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{1} + return fileDescriptor_24cf82780fd24e73, []int{2} } + func (m *ListServicesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListServicesRequest.Unmarshal(m, b) } func (m *ListServicesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListServicesRequest.Marshal(b, m, deterministic) } -func (dst *ListServicesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServicesRequest.Merge(dst, src) +func (m *ListServicesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListServicesRequest.Merge(m, src) } func (m *ListServicesRequest) XXX_Size() int { return xxx_messageInfo_ListServicesRequest.Size(m) @@ -287,6 +380,13 @@ func (m *ListServicesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListServicesRequest proto.InternalMessageInfo +func (m *ListServicesRequest) GetQuery() string { + if m != nil { + return m.Query + } + return "" +} + type ListServicesResponse struct { Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -298,16 +398,17 @@ func (m *ListServicesResponse) Reset() { *m = ListServicesResponse{} } func (m *ListServicesResponse) String() string { return proto.CompactTextString(m) } func (*ListServicesResponse) ProtoMessage() {} func (*ListServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{2} + return fileDescriptor_24cf82780fd24e73, []int{3} } + func (m *ListServicesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListServicesResponse.Unmarshal(m, b) } func (m *ListServicesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListServicesResponse.Marshal(b, m, deterministic) } -func (dst *ListServicesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServicesResponse.Merge(dst, src) +func (m *ListServicesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListServicesResponse.Merge(m, src) } func (m *ListServicesResponse) XXX_Size() int { return xxx_messageInfo_ListServicesResponse.Size(m) @@ -336,16 +437,17 @@ func (m *CreateServiceRequest) Reset() { *m = CreateServiceRequest{} } func (m *CreateServiceRequest) String() string { return proto.CompactTextString(m) } func (*CreateServiceRequest) ProtoMessage() {} func (*CreateServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{3} + return fileDescriptor_24cf82780fd24e73, []int{4} } + func (m *CreateServiceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateServiceRequest.Unmarshal(m, b) } func (m *CreateServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateServiceRequest.Marshal(b, m, deterministic) } -func (dst *CreateServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateServiceRequest.Merge(dst, src) +func (m *CreateServiceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateServiceRequest.Merge(m, src) } func (m *CreateServiceRequest) XXX_Size() int { return xxx_messageInfo_CreateServiceRequest.Size(m) @@ -374,16 +476,17 @@ func (m *RemoveServiceRequest) Reset() { *m = RemoveServiceRequest{} } func (m *RemoveServiceRequest) String() string { return proto.CompactTextString(m) } func (*RemoveServiceRequest) ProtoMessage() {} func (*RemoveServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{4} + return fileDescriptor_24cf82780fd24e73, []int{5} } + func (m *RemoveServiceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RemoveServiceRequest.Unmarshal(m, b) } func (m *RemoveServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RemoveServiceRequest.Marshal(b, m, deterministic) } -func (dst *RemoveServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveServiceRequest.Merge(dst, src) +func (m *RemoveServiceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveServiceRequest.Merge(m, src) } func (m *RemoveServiceRequest) XXX_Size() int { return xxx_messageInfo_RemoveServiceRequest.Size(m) @@ -412,16 +515,17 @@ func (m *GetServiceRequest) Reset() { *m = GetServiceRequest{} } func (m *GetServiceRequest) String() string { return proto.CompactTextString(m) } func (*GetServiceRequest) ProtoMessage() {} func (*GetServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{5} + return fileDescriptor_24cf82780fd24e73, []int{6} } + func (m *GetServiceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetServiceRequest.Unmarshal(m, b) } func (m *GetServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetServiceRequest.Marshal(b, m, deterministic) } -func (dst *GetServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceRequest.Merge(dst, src) +func (m *GetServiceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetServiceRequest.Merge(m, src) } func (m *GetServiceRequest) XXX_Size() int { return xxx_messageInfo_GetServiceRequest.Size(m) @@ -450,16 +554,17 @@ func (m *GetServiceResponse) Reset() { *m = GetServiceResponse{} } func (m *GetServiceResponse) String() string { return proto.CompactTextString(m) } func (*GetServiceResponse) ProtoMessage() {} func (*GetServiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{6} + return fileDescriptor_24cf82780fd24e73, []int{7} } + func (m *GetServiceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetServiceResponse.Unmarshal(m, b) } func (m *GetServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_GetServiceResponse.Marshal(b, m, deterministic) } -func (dst *GetServiceResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceResponse.Merge(dst, src) +func (m *GetServiceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetServiceResponse.Merge(m, src) } func (m *GetServiceResponse) XXX_Size() int { return xxx_messageInfo_GetServiceResponse.Size(m) @@ -477,6 +582,241 @@ func (m *GetServiceResponse) GetService() *Service { return nil } +// service terminators +type ListTerminatorsRequest struct { + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListTerminatorsRequest) Reset() { *m = ListTerminatorsRequest{} } +func (m *ListTerminatorsRequest) String() string { return proto.CompactTextString(m) } +func (*ListTerminatorsRequest) ProtoMessage() {} +func (*ListTerminatorsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{8} +} + +func (m *ListTerminatorsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListTerminatorsRequest.Unmarshal(m, b) +} +func (m *ListTerminatorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListTerminatorsRequest.Marshal(b, m, deterministic) +} +func (m *ListTerminatorsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListTerminatorsRequest.Merge(m, src) +} +func (m *ListTerminatorsRequest) XXX_Size() int { + return xxx_messageInfo_ListTerminatorsRequest.Size(m) +} +func (m *ListTerminatorsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListTerminatorsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListTerminatorsRequest proto.InternalMessageInfo + +func (m *ListTerminatorsRequest) GetQuery() string { + if m != nil { + return m.Query + } + return "" +} + +type ListTerminatorsResponse struct { + Terminators []*Terminator `protobuf:"bytes,1,rep,name=terminators,proto3" json:"terminators,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListTerminatorsResponse) Reset() { *m = ListTerminatorsResponse{} } +func (m *ListTerminatorsResponse) String() string { return proto.CompactTextString(m) } +func (*ListTerminatorsResponse) ProtoMessage() {} +func (*ListTerminatorsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{9} +} + +func (m *ListTerminatorsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListTerminatorsResponse.Unmarshal(m, b) +} +func (m *ListTerminatorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListTerminatorsResponse.Marshal(b, m, deterministic) +} +func (m *ListTerminatorsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListTerminatorsResponse.Merge(m, src) +} +func (m *ListTerminatorsResponse) XXX_Size() int { + return xxx_messageInfo_ListTerminatorsResponse.Size(m) +} +func (m *ListTerminatorsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ListTerminatorsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ListTerminatorsResponse proto.InternalMessageInfo + +func (m *ListTerminatorsResponse) GetTerminators() []*Terminator { + if m != nil { + return m.Terminators + } + return nil +} + +type CreateTerminatorRequest struct { + Terminator *Terminator `protobuf:"bytes,1,opt,name=terminator,proto3" json:"terminator,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateTerminatorRequest) Reset() { *m = CreateTerminatorRequest{} } +func (m *CreateTerminatorRequest) String() string { return proto.CompactTextString(m) } +func (*CreateTerminatorRequest) ProtoMessage() {} +func (*CreateTerminatorRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{10} +} + +func (m *CreateTerminatorRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateTerminatorRequest.Unmarshal(m, b) +} +func (m *CreateTerminatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateTerminatorRequest.Marshal(b, m, deterministic) +} +func (m *CreateTerminatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateTerminatorRequest.Merge(m, src) +} +func (m *CreateTerminatorRequest) XXX_Size() int { + return xxx_messageInfo_CreateTerminatorRequest.Size(m) +} +func (m *CreateTerminatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CreateTerminatorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateTerminatorRequest proto.InternalMessageInfo + +func (m *CreateTerminatorRequest) GetTerminator() *Terminator { + if m != nil { + return m.Terminator + } + return nil +} + +type RemoveTerminatorRequest struct { + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RemoveTerminatorRequest) Reset() { *m = RemoveTerminatorRequest{} } +func (m *RemoveTerminatorRequest) String() string { return proto.CompactTextString(m) } +func (*RemoveTerminatorRequest) ProtoMessage() {} +func (*RemoveTerminatorRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{11} +} + +func (m *RemoveTerminatorRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RemoveTerminatorRequest.Unmarshal(m, b) +} +func (m *RemoveTerminatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RemoveTerminatorRequest.Marshal(b, m, deterministic) +} +func (m *RemoveTerminatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveTerminatorRequest.Merge(m, src) +} +func (m *RemoveTerminatorRequest) XXX_Size() int { + return xxx_messageInfo_RemoveTerminatorRequest.Size(m) +} +func (m *RemoveTerminatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveTerminatorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RemoveTerminatorRequest proto.InternalMessageInfo + +func (m *RemoveTerminatorRequest) GetTerminatorId() string { + if m != nil { + return m.TerminatorId + } + return "" +} + +type GetTerminatorRequest struct { + TerminatorId string `protobuf:"bytes,1,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTerminatorRequest) Reset() { *m = GetTerminatorRequest{} } +func (m *GetTerminatorRequest) String() string { return proto.CompactTextString(m) } +func (*GetTerminatorRequest) ProtoMessage() {} +func (*GetTerminatorRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{12} +} + +func (m *GetTerminatorRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetTerminatorRequest.Unmarshal(m, b) +} +func (m *GetTerminatorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetTerminatorRequest.Marshal(b, m, deterministic) +} +func (m *GetTerminatorRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTerminatorRequest.Merge(m, src) +} +func (m *GetTerminatorRequest) XXX_Size() int { + return xxx_messageInfo_GetTerminatorRequest.Size(m) +} +func (m *GetTerminatorRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetTerminatorRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetTerminatorRequest proto.InternalMessageInfo + +func (m *GetTerminatorRequest) GetTerminatorId() string { + if m != nil { + return m.TerminatorId + } + return "" +} + +type GetTerminatorResponse struct { + Terminator *Terminator `protobuf:"bytes,1,opt,name=terminator,proto3" json:"terminator,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTerminatorResponse) Reset() { *m = GetTerminatorResponse{} } +func (m *GetTerminatorResponse) String() string { return proto.CompactTextString(m) } +func (*GetTerminatorResponse) ProtoMessage() {} +func (*GetTerminatorResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_24cf82780fd24e73, []int{13} +} + +func (m *GetTerminatorResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetTerminatorResponse.Unmarshal(m, b) +} +func (m *GetTerminatorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetTerminatorResponse.Marshal(b, m, deterministic) +} +func (m *GetTerminatorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTerminatorResponse.Merge(m, src) +} +func (m *GetTerminatorResponse) XXX_Size() int { + return xxx_messageInfo_GetTerminatorResponse.Size(m) +} +func (m *GetTerminatorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetTerminatorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetTerminatorResponse proto.InternalMessageInfo + +func (m *GetTerminatorResponse) GetTerminator() *Terminator { + if m != nil { + return m.Terminator + } + return nil +} + type Router struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Fingerprint string `protobuf:"bytes,2,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` @@ -491,16 +831,17 @@ func (m *Router) Reset() { *m = Router{} } func (m *Router) String() string { return proto.CompactTextString(m) } func (*Router) ProtoMessage() {} func (*Router) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{7} + return fileDescriptor_24cf82780fd24e73, []int{14} } + func (m *Router) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Router.Unmarshal(m, b) } func (m *Router) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Router.Marshal(b, m, deterministic) } -func (dst *Router) XXX_Merge(src proto.Message) { - xxx_messageInfo_Router.Merge(dst, src) +func (m *Router) XXX_Merge(src proto.Message) { + xxx_messageInfo_Router.Merge(m, src) } func (m *Router) XXX_Size() int { return xxx_messageInfo_Router.Size(m) @@ -540,6 +881,7 @@ func (m *Router) GetConnected() bool { } type ListRoutersRequest struct { + Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -549,16 +891,17 @@ func (m *ListRoutersRequest) Reset() { *m = ListRoutersRequest{} } func (m *ListRoutersRequest) String() string { return proto.CompactTextString(m) } func (*ListRoutersRequest) ProtoMessage() {} func (*ListRoutersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{8} + return fileDescriptor_24cf82780fd24e73, []int{15} } + func (m *ListRoutersRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListRoutersRequest.Unmarshal(m, b) } func (m *ListRoutersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListRoutersRequest.Marshal(b, m, deterministic) } -func (dst *ListRoutersRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListRoutersRequest.Merge(dst, src) +func (m *ListRoutersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListRoutersRequest.Merge(m, src) } func (m *ListRoutersRequest) XXX_Size() int { return xxx_messageInfo_ListRoutersRequest.Size(m) @@ -569,6 +912,13 @@ func (m *ListRoutersRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListRoutersRequest proto.InternalMessageInfo +func (m *ListRoutersRequest) GetQuery() string { + if m != nil { + return m.Query + } + return "" +} + type ListRoutersResponse struct { Routers []*Router `protobuf:"bytes,1,rep,name=routers,proto3" json:"routers,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -580,16 +930,17 @@ func (m *ListRoutersResponse) Reset() { *m = ListRoutersResponse{} } func (m *ListRoutersResponse) String() string { return proto.CompactTextString(m) } func (*ListRoutersResponse) ProtoMessage() {} func (*ListRoutersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{9} + return fileDescriptor_24cf82780fd24e73, []int{16} } + func (m *ListRoutersResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListRoutersResponse.Unmarshal(m, b) } func (m *ListRoutersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListRoutersResponse.Marshal(b, m, deterministic) } -func (dst *ListRoutersResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListRoutersResponse.Merge(dst, src) +func (m *ListRoutersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListRoutersResponse.Merge(m, src) } func (m *ListRoutersResponse) XXX_Size() int { return xxx_messageInfo_ListRoutersResponse.Size(m) @@ -618,16 +969,17 @@ func (m *CreateRouterRequest) Reset() { *m = CreateRouterRequest{} } func (m *CreateRouterRequest) String() string { return proto.CompactTextString(m) } func (*CreateRouterRequest) ProtoMessage() {} func (*CreateRouterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{10} + return fileDescriptor_24cf82780fd24e73, []int{17} } + func (m *CreateRouterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CreateRouterRequest.Unmarshal(m, b) } func (m *CreateRouterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CreateRouterRequest.Marshal(b, m, deterministic) } -func (dst *CreateRouterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateRouterRequest.Merge(dst, src) +func (m *CreateRouterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateRouterRequest.Merge(m, src) } func (m *CreateRouterRequest) XXX_Size() int { return xxx_messageInfo_CreateRouterRequest.Size(m) @@ -656,16 +1008,17 @@ func (m *RemoveRouterRequest) Reset() { *m = RemoveRouterRequest{} } func (m *RemoveRouterRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRouterRequest) ProtoMessage() {} func (*RemoveRouterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{11} + return fileDescriptor_24cf82780fd24e73, []int{18} } + func (m *RemoveRouterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RemoveRouterRequest.Unmarshal(m, b) } func (m *RemoveRouterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RemoveRouterRequest.Marshal(b, m, deterministic) } -func (dst *RemoveRouterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRouterRequest.Merge(dst, src) +func (m *RemoveRouterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRouterRequest.Merge(m, src) } func (m *RemoveRouterRequest) XXX_Size() int { return xxx_messageInfo_RemoveRouterRequest.Size(m) @@ -701,16 +1054,17 @@ func (m *Link) Reset() { *m = Link{} } func (m *Link) String() string { return proto.CompactTextString(m) } func (*Link) ProtoMessage() {} func (*Link) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{12} + return fileDescriptor_24cf82780fd24e73, []int{19} } + func (m *Link) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Link.Unmarshal(m, b) } func (m *Link) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Link.Marshal(b, m, deterministic) } -func (dst *Link) XXX_Merge(src proto.Message) { - xxx_messageInfo_Link.Merge(dst, src) +func (m *Link) XXX_Merge(src proto.Message) { + xxx_messageInfo_Link.Merge(m, src) } func (m *Link) XXX_Size() int { return xxx_messageInfo_Link.Size(m) @@ -787,16 +1141,17 @@ func (m *ListLinksRequest) Reset() { *m = ListLinksRequest{} } func (m *ListLinksRequest) String() string { return proto.CompactTextString(m) } func (*ListLinksRequest) ProtoMessage() {} func (*ListLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{13} + return fileDescriptor_24cf82780fd24e73, []int{20} } + func (m *ListLinksRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListLinksRequest.Unmarshal(m, b) } func (m *ListLinksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListLinksRequest.Marshal(b, m, deterministic) } -func (dst *ListLinksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListLinksRequest.Merge(dst, src) +func (m *ListLinksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListLinksRequest.Merge(m, src) } func (m *ListLinksRequest) XXX_Size() int { return xxx_messageInfo_ListLinksRequest.Size(m) @@ -818,16 +1173,17 @@ func (m *ListLinksResponse) Reset() { *m = ListLinksResponse{} } func (m *ListLinksResponse) String() string { return proto.CompactTextString(m) } func (*ListLinksResponse) ProtoMessage() {} func (*ListLinksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{14} + return fileDescriptor_24cf82780fd24e73, []int{21} } + func (m *ListLinksResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListLinksResponse.Unmarshal(m, b) } func (m *ListLinksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListLinksResponse.Marshal(b, m, deterministic) } -func (dst *ListLinksResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListLinksResponse.Merge(dst, src) +func (m *ListLinksResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListLinksResponse.Merge(m, src) } func (m *ListLinksResponse) XXX_Size() int { return xxx_messageInfo_ListLinksResponse.Size(m) @@ -857,16 +1213,17 @@ func (m *SetLinkCostRequest) Reset() { *m = SetLinkCostRequest{} } func (m *SetLinkCostRequest) String() string { return proto.CompactTextString(m) } func (*SetLinkCostRequest) ProtoMessage() {} func (*SetLinkCostRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{15} + return fileDescriptor_24cf82780fd24e73, []int{22} } + func (m *SetLinkCostRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetLinkCostRequest.Unmarshal(m, b) } func (m *SetLinkCostRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SetLinkCostRequest.Marshal(b, m, deterministic) } -func (dst *SetLinkCostRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLinkCostRequest.Merge(dst, src) +func (m *SetLinkCostRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetLinkCostRequest.Merge(m, src) } func (m *SetLinkCostRequest) XXX_Size() int { return xxx_messageInfo_SetLinkCostRequest.Size(m) @@ -903,16 +1260,17 @@ func (m *SetLinkDownRequest) Reset() { *m = SetLinkDownRequest{} } func (m *SetLinkDownRequest) String() string { return proto.CompactTextString(m) } func (*SetLinkDownRequest) ProtoMessage() {} func (*SetLinkDownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{16} + return fileDescriptor_24cf82780fd24e73, []int{23} } + func (m *SetLinkDownRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetLinkDownRequest.Unmarshal(m, b) } func (m *SetLinkDownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SetLinkDownRequest.Marshal(b, m, deterministic) } -func (dst *SetLinkDownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLinkDownRequest.Merge(dst, src) +func (m *SetLinkDownRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetLinkDownRequest.Merge(m, src) } func (m *SetLinkDownRequest) XXX_Size() int { return xxx_messageInfo_SetLinkDownRequest.Size(m) @@ -949,16 +1307,17 @@ func (m *Circuit) Reset() { *m = Circuit{} } func (m *Circuit) String() string { return proto.CompactTextString(m) } func (*Circuit) ProtoMessage() {} func (*Circuit) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{17} + return fileDescriptor_24cf82780fd24e73, []int{24} } + func (m *Circuit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Circuit.Unmarshal(m, b) } func (m *Circuit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Circuit.Marshal(b, m, deterministic) } -func (dst *Circuit) XXX_Merge(src proto.Message) { - xxx_messageInfo_Circuit.Merge(dst, src) +func (m *Circuit) XXX_Merge(src proto.Message) { + xxx_messageInfo_Circuit.Merge(m, src) } func (m *Circuit) XXX_Size() int { return xxx_messageInfo_Circuit.Size(m) @@ -987,7 +1346,8 @@ type Session struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` ClientId string `protobuf:"bytes,2,opt,name=clientId,proto3" json:"clientId,omitempty"` ServiceId string `protobuf:"bytes,3,opt,name=serviceId,proto3" json:"serviceId,omitempty"` - Circuit *Circuit `protobuf:"bytes,4,opt,name=circuit,proto3" json:"circuit,omitempty"` + TerminatorId string `protobuf:"bytes,4,opt,name=terminatorId,proto3" json:"terminatorId,omitempty"` + Circuit *Circuit `protobuf:"bytes,5,opt,name=circuit,proto3" json:"circuit,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -997,16 +1357,17 @@ func (m *Session) Reset() { *m = Session{} } func (m *Session) String() string { return proto.CompactTextString(m) } func (*Session) ProtoMessage() {} func (*Session) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{18} + return fileDescriptor_24cf82780fd24e73, []int{25} } + func (m *Session) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Session.Unmarshal(m, b) } func (m *Session) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Session.Marshal(b, m, deterministic) } -func (dst *Session) XXX_Merge(src proto.Message) { - xxx_messageInfo_Session.Merge(dst, src) +func (m *Session) XXX_Merge(src proto.Message) { + xxx_messageInfo_Session.Merge(m, src) } func (m *Session) XXX_Size() int { return xxx_messageInfo_Session.Size(m) @@ -1038,6 +1399,13 @@ func (m *Session) GetServiceId() string { return "" } +func (m *Session) GetTerminatorId() string { + if m != nil { + return m.TerminatorId + } + return "" +} + func (m *Session) GetCircuit() *Circuit { if m != nil { return m.Circuit @@ -1055,16 +1423,17 @@ func (m *ListSessionsRequest) Reset() { *m = ListSessionsRequest{} } func (m *ListSessionsRequest) String() string { return proto.CompactTextString(m) } func (*ListSessionsRequest) ProtoMessage() {} func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{19} + return fileDescriptor_24cf82780fd24e73, []int{26} } + func (m *ListSessionsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSessionsRequest.Unmarshal(m, b) } func (m *ListSessionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListSessionsRequest.Marshal(b, m, deterministic) } -func (dst *ListSessionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListSessionsRequest.Merge(dst, src) +func (m *ListSessionsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSessionsRequest.Merge(m, src) } func (m *ListSessionsRequest) XXX_Size() int { return xxx_messageInfo_ListSessionsRequest.Size(m) @@ -1086,16 +1455,17 @@ func (m *ListSessionsResponse) Reset() { *m = ListSessionsResponse{} } func (m *ListSessionsResponse) String() string { return proto.CompactTextString(m) } func (*ListSessionsResponse) ProtoMessage() {} func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{20} + return fileDescriptor_24cf82780fd24e73, []int{27} } + func (m *ListSessionsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSessionsResponse.Unmarshal(m, b) } func (m *ListSessionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ListSessionsResponse.Marshal(b, m, deterministic) } -func (dst *ListSessionsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListSessionsResponse.Merge(dst, src) +func (m *ListSessionsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListSessionsResponse.Merge(m, src) } func (m *ListSessionsResponse) XXX_Size() int { return xxx_messageInfo_ListSessionsResponse.Size(m) @@ -1125,16 +1495,17 @@ func (m *RemoveSessionRequest) Reset() { *m = RemoveSessionRequest{} } func (m *RemoveSessionRequest) String() string { return proto.CompactTextString(m) } func (*RemoveSessionRequest) ProtoMessage() {} func (*RemoveSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{21} + return fileDescriptor_24cf82780fd24e73, []int{28} } + func (m *RemoveSessionRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RemoveSessionRequest.Unmarshal(m, b) } func (m *RemoveSessionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RemoveSessionRequest.Marshal(b, m, deterministic) } -func (dst *RemoveSessionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveSessionRequest.Merge(dst, src) +func (m *RemoveSessionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveSessionRequest.Merge(m, src) } func (m *RemoveSessionRequest) XXX_Size() int { return xxx_messageInfo_RemoveSessionRequest.Size(m) @@ -1170,16 +1541,17 @@ func (m *StreamMetricsRequest) Reset() { *m = StreamMetricsRequest{} } func (m *StreamMetricsRequest) String() string { return proto.CompactTextString(m) } func (*StreamMetricsRequest) ProtoMessage() {} func (*StreamMetricsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{22} + return fileDescriptor_24cf82780fd24e73, []int{29} } + func (m *StreamMetricsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamMetricsRequest.Unmarshal(m, b) } func (m *StreamMetricsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamMetricsRequest.Marshal(b, m, deterministic) } -func (dst *StreamMetricsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamMetricsRequest.Merge(dst, src) +func (m *StreamMetricsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMetricsRequest.Merge(m, src) } func (m *StreamMetricsRequest) XXX_Size() int { return xxx_messageInfo_StreamMetricsRequest.Size(m) @@ -1209,16 +1581,17 @@ func (m *StreamMetricsRequest_MetricMatcher) Reset() { *m = StreamMetric func (m *StreamMetricsRequest_MetricMatcher) String() string { return proto.CompactTextString(m) } func (*StreamMetricsRequest_MetricMatcher) ProtoMessage() {} func (*StreamMetricsRequest_MetricMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{22, 0} + return fileDescriptor_24cf82780fd24e73, []int{29, 0} } + func (m *StreamMetricsRequest_MetricMatcher) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamMetricsRequest_MetricMatcher.Unmarshal(m, b) } func (m *StreamMetricsRequest_MetricMatcher) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamMetricsRequest_MetricMatcher.Marshal(b, m, deterministic) } -func (dst *StreamMetricsRequest_MetricMatcher) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamMetricsRequest_MetricMatcher.Merge(dst, src) +func (m *StreamMetricsRequest_MetricMatcher) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMetricsRequest_MetricMatcher.Merge(m, src) } func (m *StreamMetricsRequest_MetricMatcher) XXX_Size() int { return xxx_messageInfo_StreamMetricsRequest_MetricMatcher.Size(m) @@ -1259,16 +1632,17 @@ func (m *StreamMetricsEvent) Reset() { *m = StreamMetricsEvent{} } func (m *StreamMetricsEvent) String() string { return proto.CompactTextString(m) } func (*StreamMetricsEvent) ProtoMessage() {} func (*StreamMetricsEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{23} + return fileDescriptor_24cf82780fd24e73, []int{30} } + func (m *StreamMetricsEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamMetricsEvent.Unmarshal(m, b) } func (m *StreamMetricsEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamMetricsEvent.Marshal(b, m, deterministic) } -func (dst *StreamMetricsEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamMetricsEvent.Merge(dst, src) +func (m *StreamMetricsEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMetricsEvent.Merge(m, src) } func (m *StreamMetricsEvent) XXX_Size() int { return xxx_messageInfo_StreamMetricsEvent.Size(m) @@ -1335,16 +1709,17 @@ func (m *StreamMetricsEvent_IntervalMetric) Reset() { *m = StreamMetrics func (m *StreamMetricsEvent_IntervalMetric) String() string { return proto.CompactTextString(m) } func (*StreamMetricsEvent_IntervalMetric) ProtoMessage() {} func (*StreamMetricsEvent_IntervalMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{23, 3} + return fileDescriptor_24cf82780fd24e73, []int{30, 3} } + func (m *StreamMetricsEvent_IntervalMetric) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamMetricsEvent_IntervalMetric.Unmarshal(m, b) } func (m *StreamMetricsEvent_IntervalMetric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamMetricsEvent_IntervalMetric.Marshal(b, m, deterministic) } -func (dst *StreamMetricsEvent_IntervalMetric) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamMetricsEvent_IntervalMetric.Merge(dst, src) +func (m *StreamMetricsEvent_IntervalMetric) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamMetricsEvent_IntervalMetric.Merge(m, src) } func (m *StreamMetricsEvent_IntervalMetric) XXX_Size() int { return xxx_messageInfo_StreamMetricsEvent_IntervalMetric.Size(m) @@ -1393,16 +1768,17 @@ func (m *StreamSessionsRequest) Reset() { *m = StreamSessionsRequest{} } func (m *StreamSessionsRequest) String() string { return proto.CompactTextString(m) } func (*StreamSessionsRequest) ProtoMessage() {} func (*StreamSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{24} + return fileDescriptor_24cf82780fd24e73, []int{31} } + func (m *StreamSessionsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamSessionsRequest.Unmarshal(m, b) } func (m *StreamSessionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamSessionsRequest.Marshal(b, m, deterministic) } -func (dst *StreamSessionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamSessionsRequest.Merge(dst, src) +func (m *StreamSessionsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamSessionsRequest.Merge(m, src) } func (m *StreamSessionsRequest) XXX_Size() int { return xxx_messageInfo_StreamSessionsRequest.Size(m) @@ -1428,16 +1804,17 @@ func (m *StreamSessionsEvent) Reset() { *m = StreamSessionsEvent{} } func (m *StreamSessionsEvent) String() string { return proto.CompactTextString(m) } func (*StreamSessionsEvent) ProtoMessage() {} func (*StreamSessionsEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{25} + return fileDescriptor_24cf82780fd24e73, []int{32} } + func (m *StreamSessionsEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamSessionsEvent.Unmarshal(m, b) } func (m *StreamSessionsEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamSessionsEvent.Marshal(b, m, deterministic) } -func (dst *StreamSessionsEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamSessionsEvent.Merge(dst, src) +func (m *StreamSessionsEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamSessionsEvent.Merge(m, src) } func (m *StreamSessionsEvent) XXX_Size() int { return xxx_messageInfo_StreamSessionsEvent.Size(m) @@ -1496,16 +1873,17 @@ func (m *ToggleSessionTracesRequest) Reset() { *m = ToggleSessionTracesR func (m *ToggleSessionTracesRequest) String() string { return proto.CompactTextString(m) } func (*ToggleSessionTracesRequest) ProtoMessage() {} func (*ToggleSessionTracesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{26} + return fileDescriptor_24cf82780fd24e73, []int{33} } + func (m *ToggleSessionTracesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ToggleSessionTracesRequest.Unmarshal(m, b) } func (m *ToggleSessionTracesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ToggleSessionTracesRequest.Marshal(b, m, deterministic) } -func (dst *ToggleSessionTracesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ToggleSessionTracesRequest.Merge(dst, src) +func (m *ToggleSessionTracesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ToggleSessionTracesRequest.Merge(m, src) } func (m *ToggleSessionTracesRequest) XXX_Size() int { return xxx_messageInfo_ToggleSessionTracesRequest.Size(m) @@ -1550,16 +1928,17 @@ func (m *StreamTracesRequest) Reset() { *m = StreamTracesRequest{} } func (m *StreamTracesRequest) String() string { return proto.CompactTextString(m) } func (*StreamTracesRequest) ProtoMessage() {} func (*StreamTracesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{27} + return fileDescriptor_24cf82780fd24e73, []int{34} } + func (m *StreamTracesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamTracesRequest.Unmarshal(m, b) } func (m *StreamTracesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_StreamTracesRequest.Marshal(b, m, deterministic) } -func (dst *StreamTracesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StreamTracesRequest.Merge(dst, src) +func (m *StreamTracesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StreamTracesRequest.Merge(m, src) } func (m *StreamTracesRequest) XXX_Size() int { return xxx_messageInfo_StreamTracesRequest.Size(m) @@ -1603,16 +1982,17 @@ func (m *InspectRequest) Reset() { *m = InspectRequest{} } func (m *InspectRequest) String() string { return proto.CompactTextString(m) } func (*InspectRequest) ProtoMessage() {} func (*InspectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{28} + return fileDescriptor_24cf82780fd24e73, []int{35} } + func (m *InspectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectRequest.Unmarshal(m, b) } func (m *InspectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InspectRequest.Marshal(b, m, deterministic) } -func (dst *InspectRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_InspectRequest.Merge(dst, src) +func (m *InspectRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InspectRequest.Merge(m, src) } func (m *InspectRequest) XXX_Size() int { return xxx_messageInfo_InspectRequest.Size(m) @@ -1650,16 +2030,17 @@ func (m *InspectResponse) Reset() { *m = InspectResponse{} } func (m *InspectResponse) String() string { return proto.CompactTextString(m) } func (*InspectResponse) ProtoMessage() {} func (*InspectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{29} + return fileDescriptor_24cf82780fd24e73, []int{36} } + func (m *InspectResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectResponse.Unmarshal(m, b) } func (m *InspectResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InspectResponse.Marshal(b, m, deterministic) } -func (dst *InspectResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_InspectResponse.Merge(dst, src) +func (m *InspectResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_InspectResponse.Merge(m, src) } func (m *InspectResponse) XXX_Size() int { return xxx_messageInfo_InspectResponse.Size(m) @@ -1704,16 +2085,17 @@ func (m *InspectResponse_InspectValue) Reset() { *m = InspectResponse_In func (m *InspectResponse_InspectValue) String() string { return proto.CompactTextString(m) } func (*InspectResponse_InspectValue) ProtoMessage() {} func (*InspectResponse_InspectValue) Descriptor() ([]byte, []int) { - return fileDescriptor_mgmt_48769249f84eeebf, []int{29, 0} + return fileDescriptor_24cf82780fd24e73, []int{36, 0} } + func (m *InspectResponse_InspectValue) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectResponse_InspectValue.Unmarshal(m, b) } func (m *InspectResponse_InspectValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_InspectResponse_InspectValue.Marshal(b, m, deterministic) } -func (dst *InspectResponse_InspectValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_InspectResponse_InspectValue.Merge(dst, src) +func (m *InspectResponse_InspectValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_InspectResponse_InspectValue.Merge(m, src) } func (m *InspectResponse_InspectValue) XXX_Size() int { return xxx_messageInfo_InspectResponse_InspectValue.Size(m) @@ -1746,13 +2128,24 @@ func (m *InspectResponse_InspectValue) GetValue() string { } func init() { + proto.RegisterEnum("mgmt_pb.ContentType", ContentType_name, ContentType_value) + proto.RegisterEnum("mgmt_pb.StreamSessionEventType", StreamSessionEventType_name, StreamSessionEventType_value) + proto.RegisterEnum("mgmt_pb.TraceFilterType", TraceFilterType_name, TraceFilterType_value) proto.RegisterType((*Service)(nil), "mgmt_pb.Service") + proto.RegisterType((*Terminator)(nil), "mgmt_pb.Terminator") + proto.RegisterMapType((map[uint32][]byte)(nil), "mgmt_pb.Terminator.PeerDataEntry") proto.RegisterType((*ListServicesRequest)(nil), "mgmt_pb.ListServicesRequest") proto.RegisterType((*ListServicesResponse)(nil), "mgmt_pb.ListServicesResponse") proto.RegisterType((*CreateServiceRequest)(nil), "mgmt_pb.CreateServiceRequest") proto.RegisterType((*RemoveServiceRequest)(nil), "mgmt_pb.RemoveServiceRequest") proto.RegisterType((*GetServiceRequest)(nil), "mgmt_pb.GetServiceRequest") proto.RegisterType((*GetServiceResponse)(nil), "mgmt_pb.GetServiceResponse") + proto.RegisterType((*ListTerminatorsRequest)(nil), "mgmt_pb.ListTerminatorsRequest") + proto.RegisterType((*ListTerminatorsResponse)(nil), "mgmt_pb.ListTerminatorsResponse") + proto.RegisterType((*CreateTerminatorRequest)(nil), "mgmt_pb.CreateTerminatorRequest") + proto.RegisterType((*RemoveTerminatorRequest)(nil), "mgmt_pb.RemoveTerminatorRequest") + proto.RegisterType((*GetTerminatorRequest)(nil), "mgmt_pb.GetTerminatorRequest") + proto.RegisterType((*GetTerminatorResponse)(nil), "mgmt_pb.GetTerminatorResponse") proto.RegisterType((*Router)(nil), "mgmt_pb.Router") proto.RegisterType((*ListRoutersRequest)(nil), "mgmt_pb.ListRoutersRequest") proto.RegisterType((*ListRoutersResponse)(nil), "mgmt_pb.ListRoutersResponse") @@ -1783,110 +2176,123 @@ func init() { proto.RegisterType((*InspectRequest)(nil), "mgmt_pb.InspectRequest") proto.RegisterType((*InspectResponse)(nil), "mgmt_pb.InspectResponse") proto.RegisterType((*InspectResponse_InspectValue)(nil), "mgmt_pb.InspectResponse.InspectValue") - proto.RegisterEnum("mgmt_pb.ContentType", ContentType_name, ContentType_value) - proto.RegisterEnum("mgmt_pb.StreamSessionEventType", StreamSessionEventType_name, StreamSessionEventType_value) - proto.RegisterEnum("mgmt_pb.TraceFilterType", TraceFilterType_name, TraceFilterType_value) } -func init() { proto.RegisterFile("mgmt.proto", fileDescriptor_mgmt_48769249f84eeebf) } +func init() { proto.RegisterFile("mgmt.proto", fileDescriptor_24cf82780fd24e73) } -var fileDescriptor_mgmt_48769249f84eeebf = []byte{ - // 1552 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x57, 0x5b, 0x6f, 0xdc, 0x44, - 0x14, 0xae, 0x77, 0x37, 0xbb, 0x9b, 0x93, 0x26, 0xd9, 0x4e, 0xd2, 0x76, 0xbb, 0x2d, 0x6d, 0xe4, - 0x16, 0x11, 0x52, 0xd8, 0xaa, 0x2d, 0x82, 0x14, 0xa9, 0x50, 0x9a, 0x4b, 0x15, 0x91, 0x5a, 0xc5, - 0xd9, 0x56, 0x88, 0x17, 0xe4, 0xd8, 0x93, 0xad, 0xd5, 0x5d, 0xdb, 0xd8, 0xb3, 0x29, 0xe1, 0x05, - 0x89, 0x7f, 0x40, 0x11, 0x20, 0x6e, 0x6f, 0x5c, 0xde, 0x80, 0x07, 0x1e, 0x0a, 0xa5, 0x5c, 0xfe, - 0x02, 0x4f, 0xfc, 0x1c, 0x34, 0x67, 0xc6, 0xe3, 0xb1, 0xbd, 0x24, 0xed, 0xdb, 0xcc, 0xf7, 0x9d, - 0x73, 0x7c, 0xe6, 0x1c, 0xcf, 0xe7, 0x63, 0x80, 0x61, 0x7f, 0xc8, 0xba, 0x51, 0x1c, 0xb2, 0x90, - 0x34, 0xf8, 0xfa, 0xdd, 0x68, 0xbb, 0x73, 0xa6, 0x1f, 0x86, 0xfd, 0x01, 0xbd, 0x80, 0xf0, 0xf6, - 0x68, 0xe7, 0x02, 0xf3, 0x87, 0x34, 0x61, 0xce, 0x30, 0x12, 0x96, 0xe6, 0x08, 0x1a, 0x5b, 0x34, - 0xde, 0xf5, 0x5d, 0x4a, 0x66, 0xa0, 0xe2, 0x7b, 0x6d, 0x63, 0xc1, 0x58, 0x9c, 0xb4, 0x2b, 0xbe, - 0x47, 0xda, 0xd0, 0xd8, 0xf6, 0x03, 0xcf, 0x0f, 0xfa, 0xed, 0x0a, 0x82, 0xe9, 0x96, 0x2c, 0xc2, - 0x2c, 0x0d, 0xbc, 0x28, 0xf4, 0x03, 0xf6, 0x86, 0xe7, 0xc5, 0x34, 0x49, 0xda, 0x55, 0xb4, 0x28, - 0xc2, 0xe4, 0x18, 0xd4, 0x69, 0x1f, 0x0d, 0x6a, 0x68, 0x20, 0x77, 0xe6, 0x51, 0x98, 0xdb, 0xf4, - 0x13, 0x26, 0x1f, 0x9d, 0xd8, 0xf4, 0xbd, 0x11, 0x4d, 0x98, 0xb9, 0x0a, 0xf3, 0x79, 0x38, 0x89, - 0xc2, 0x20, 0xa1, 0xe4, 0x05, 0x68, 0x26, 0x12, 0x6b, 0x1b, 0x0b, 0xd5, 0xc5, 0xa9, 0x4b, 0xad, - 0xae, 0x3c, 0x62, 0x57, 0x1a, 0xdb, 0xca, 0xc2, 0xbc, 0x0e, 0xf3, 0x2b, 0x31, 0x75, 0x18, 0x4d, - 0x29, 0x11, 0x9d, 0x2c, 0x41, 0x43, 0xda, 0xe0, 0x29, 0xc7, 0x05, 0x49, 0x0d, 0xcc, 0x97, 0x60, - 0xde, 0xa6, 0xc3, 0x70, 0xb7, 0x18, 0xe3, 0x14, 0x4c, 0x4a, 0x93, 0x8d, 0xb4, 0x56, 0x19, 0x60, - 0x5e, 0x84, 0x23, 0x37, 0x28, 0x7b, 0x2a, 0x97, 0x6b, 0x40, 0x74, 0x17, 0x79, 0xe0, 0xa7, 0x49, - 0xf5, 0x23, 0x03, 0xea, 0x76, 0x38, 0x62, 0x34, 0x2e, 0xb5, 0x70, 0x01, 0xa6, 0x76, 0xfc, 0xa0, - 0x4f, 0xe3, 0x28, 0xf6, 0x03, 0x26, 0xdb, 0xa8, 0x43, 0xbc, 0x95, 0x03, 0x3f, 0x61, 0x34, 0xa0, - 0x71, 0xa1, 0x95, 0x05, 0x98, 0x1f, 0xc3, 0x0d, 0x83, 0x80, 0xba, 0x8c, 0x7a, 0xd8, 0xcd, 0xa6, - 0x9d, 0x01, 0xe6, 0x3c, 0x10, 0xde, 0x39, 0x91, 0x87, 0xea, 0xe7, 0x35, 0xd1, 0x66, 0x85, 0xca, - 0xd3, 0x3d, 0x0f, 0x8d, 0x58, 0x40, 0xb2, 0x9b, 0xb3, 0xea, 0x74, 0xc2, 0xd4, 0x4e, 0x79, 0xf3, - 0x35, 0x98, 0x13, 0xbd, 0x94, 0x84, 0xac, 0xe9, 0x73, 0x50, 0x17, 0x16, 0xb2, 0x3c, 0xa5, 0x00, - 0x92, 0x36, 0x2f, 0xc2, 0x9c, 0xe8, 0x63, 0xde, 0xbf, 0x03, 0x4d, 0x61, 0xa0, 0x5a, 0xa2, 0xf6, - 0xe6, 0x43, 0x03, 0x6a, 0x9b, 0x7e, 0x70, 0xaf, 0x54, 0xcd, 0x16, 0x54, 0x93, 0xd8, 0x95, 0x55, - 0xe4, 0x4b, 0x8e, 0x78, 0x09, 0x93, 0x15, 0xe3, 0x4b, 0x32, 0x0f, 0x13, 0x09, 0x73, 0x18, 0x95, - 0xef, 0xbb, 0xd8, 0x10, 0x02, 0x35, 0x2f, 0xbc, 0x1f, 0xb4, 0x27, 0xb0, 0x6c, 0xb8, 0xe6, 0x98, - 0x1b, 0x26, 0xac, 0x5d, 0x5f, 0x30, 0x16, 0x27, 0x6c, 0x5c, 0x93, 0xd3, 0x00, 0x49, 0xec, 0x6e, - 0x3a, 0x8c, 0x06, 0xee, 0x5e, 0xbb, 0xb1, 0x60, 0x2c, 0x56, 0x6d, 0x0d, 0xe1, 0xbc, 0x97, 0xb0, - 0x94, 0x6f, 0x0a, 0x3e, 0x43, 0x4c, 0x02, 0x2d, 0x5e, 0x6f, 0x9e, 0xbd, 0xea, 0xc1, 0x32, 0x1c, - 0xd1, 0x30, 0xd9, 0x81, 0xb3, 0x30, 0x31, 0xe0, 0x80, 0xac, 0xff, 0xb4, 0x2a, 0x1f, 0x37, 0xb3, - 0x05, 0xc7, 0x5f, 0xcd, 0x2d, 0x8a, 0x8e, 0x2b, 0x61, 0xc2, 0xd2, 0xd2, 0x1d, 0x83, 0x3a, 0xa7, - 0x55, 0xe1, 0xe4, 0x4e, 0x9d, 0xa7, 0x92, 0x9d, 0x47, 0x8b, 0xb0, 0x1a, 0xde, 0x0f, 0x9e, 0x20, - 0x02, 0x56, 0xa9, 0x92, 0x55, 0xc9, 0xbc, 0x0c, 0x8d, 0x15, 0x3f, 0x76, 0x47, 0x3e, 0xe3, 0x74, - 0xe4, 0xb0, 0xbb, 0x98, 0xf2, 0xa4, 0x8d, 0x6b, 0x5e, 0x6e, 0x71, 0x8e, 0x0a, 0x82, 0x32, 0xf1, - 0x0f, 0xb9, 0xa8, 0x25, 0x89, 0x1f, 0x06, 0xa5, 0x1e, 0x76, 0xa0, 0xe9, 0x0e, 0x7c, 0x1a, 0xb0, - 0x0d, 0x4f, 0x36, 0x52, 0xed, 0xf3, 0x17, 0xb5, 0x5a, 0xb8, 0xa8, 0xfc, 0x4a, 0xba, 0x22, 0x13, - 0xec, 0xad, 0x7e, 0x25, 0x65, 0x86, 0x76, 0x6a, 0x90, 0xc9, 0x1b, 0x26, 0x51, 0x96, 0xb7, 0x14, - 0xd6, 0xe5, 0x4d, 0x60, 0x63, 0xe4, 0x0d, 0x09, 0x5b, 0x59, 0x98, 0xeb, 0x99, 0x34, 0x09, 0x4a, - 0xd7, 0x19, 0x44, 0x74, 0x9d, 0x91, 0x00, 0x7f, 0x55, 0x83, 0xf0, 0xbe, 0xac, 0x2d, 0x5f, 0x9a, - 0xbf, 0x18, 0x30, 0xbf, 0xc5, 0x62, 0xea, 0x0c, 0x6f, 0x52, 0x16, 0xfb, 0x6e, 0x9a, 0x26, 0xb9, - 0x01, 0xcd, 0xa1, 0xc3, 0xdc, 0xbb, 0xd9, 0xfd, 0x3c, 0x9f, 0xa5, 0x33, 0xc6, 0xa1, 0x2b, 0xb6, - 0x37, 0x85, 0x8f, 0xad, 0x9c, 0x3b, 0x5b, 0x30, 0x9d, 0xa3, 0x78, 0x8a, 0x81, 0x33, 0xa4, 0x36, - 0xed, 0xd3, 0xf7, 0xd3, 0x14, 0x15, 0x40, 0xce, 0xc1, 0x74, 0x12, 0x8e, 0x62, 0x97, 0x6e, 0xac, - 0x0a, 0x0b, 0xd1, 0xa0, 0x3c, 0x68, 0x3e, 0x68, 0x00, 0xc9, 0x65, 0xb1, 0xb6, 0x4b, 0x03, 0xbc, - 0xd1, 0xd2, 0x4e, 0xdd, 0xe8, 0x74, 0x4f, 0x96, 0x61, 0x52, 0x7d, 0xf7, 0x30, 0xe8, 0xd4, 0xa5, - 0x4e, 0x57, 0x7c, 0x19, 0xbb, 0xe9, 0x97, 0xb1, 0xdb, 0x4b, 0x2d, 0xec, 0xcc, 0x98, 0x5c, 0x81, - 0x1a, 0x73, 0xfa, 0x5c, 0x13, 0x79, 0x19, 0x9e, 0x1d, 0x5f, 0x06, 0x4c, 0xa0, 0xdb, 0x73, 0xfa, - 0xc9, 0x5a, 0xc0, 0xe2, 0x3d, 0x1b, 0x5d, 0xc8, 0x9b, 0x00, 0x7e, 0xc0, 0xa4, 0x49, 0xbb, 0xb6, - 0x5f, 0x1d, 0x45, 0x80, 0x0d, 0x65, 0x2d, 0xc2, 0x68, 0xee, 0xe4, 0x2d, 0x38, 0xbc, 0x33, 0x08, - 0x1d, 0x15, 0x6e, 0x02, 0xc3, 0xbd, 0xb8, 0x5f, 0xb8, 0x75, 0xcd, 0x5e, 0x04, 0xcc, 0x85, 0x20, - 0x3d, 0x98, 0xf5, 0x03, 0x46, 0xe3, 0x5d, 0x67, 0x90, 0x46, 0xad, 0x63, 0xd4, 0xa5, 0x03, 0x92, - 0xd4, 0x5c, 0xec, 0x62, 0x88, 0xce, 0x2b, 0x30, 0xa9, 0x0a, 0xc1, 0xdf, 0xb9, 0x7b, 0x74, 0x4f, - 0xb6, 0x83, 0x2f, 0xf9, 0x7d, 0xdd, 0x75, 0x06, 0x23, 0x2a, 0x5b, 0x2b, 0x36, 0xaf, 0x56, 0x96, - 0x8d, 0xce, 0x55, 0x98, 0x2d, 0x14, 0xe0, 0x20, 0xf7, 0xaa, 0xee, 0xfe, 0x3a, 0x1c, 0x29, 0x1d, - 0xf8, 0xa0, 0x00, 0x86, 0x1e, 0xe0, 0x51, 0x05, 0x66, 0xf2, 0x87, 0xe3, 0x82, 0xc3, 0x5f, 0x4e, - 0xe9, 0x8f, 0x6b, 0xb2, 0x0e, 0xad, 0xf4, 0xc8, 0x5b, 0xcc, 0x89, 0xd9, 0xed, 0xde, 0xca, 0x13, - 0xbc, 0x51, 0x25, 0x1f, 0x72, 0x1d, 0x66, 0x52, 0x6c, 0x2d, 0xf0, 0x78, 0x94, 0xea, 0x81, 0x51, - 0x0a, 0x1e, 0xc4, 0x82, 0x3a, 0xe6, 0x9f, 0xbe, 0x5d, 0x2f, 0x3f, 0x79, 0xe3, 0xba, 0x77, 0xd0, - 0x51, 0xbc, 0x17, 0x32, 0x4a, 0xe7, 0x0a, 0x4c, 0x69, 0xf0, 0x41, 0xd5, 0xab, 0x69, 0xd5, 0x33, - 0x8f, 0xc3, 0x51, 0xf1, 0xcc, 0xa2, 0xe4, 0xfd, 0x6b, 0xc0, 0x5c, 0x9e, 0x11, 0xd7, 0xf5, 0x2a, - 0x4c, 0x52, 0xbe, 0xe8, 0xed, 0x45, 0xa2, 0xc0, 0x33, 0x97, 0xce, 0x14, 0xd2, 0x97, 0x0e, 0x6b, - 0xa9, 0x99, 0x9d, 0x79, 0xe4, 0xb5, 0xae, 0x52, 0xd4, 0x3a, 0x5d, 0xe4, 0xab, 0xfb, 0x89, 0x7c, - 0x6d, 0x1f, 0x91, 0x9f, 0x38, 0x48, 0xe4, 0x3f, 0x80, 0x4e, 0x2f, 0xec, 0xf7, 0x07, 0xa9, 0x0e, - 0xf7, 0x62, 0x27, 0x1b, 0x65, 0x71, 0xf2, 0x0d, 0x9c, 0xed, 0x81, 0x38, 0x5d, 0xd3, 0x96, 0x3b, - 0x62, 0xc2, 0xe1, 0x24, 0x1d, 0xf6, 0x32, 0x8d, 0xcb, 0x61, 0x7c, 0x6c, 0x13, 0xf9, 0x0a, 0x13, - 0x71, 0x04, 0x1d, 0x32, 0xbf, 0x50, 0x65, 0xcd, 0x3f, 0xf5, 0x1c, 0x4c, 0x8b, 0xe7, 0x78, 0xeb, - 0xfe, 0x20, 0x1d, 0x8f, 0x9a, 0x76, 0x1e, 0x24, 0xcb, 0x00, 0x3b, 0xb8, 0xc2, 0xea, 0x57, 0xb0, - 0xfa, 0x6d, 0x75, 0x50, 0x8c, 0xb8, 0xae, 0x78, 0x5b, 0xb3, 0xe5, 0xd9, 0xbb, 0x61, 0xc0, 0x64, - 0x1b, 0x84, 0x2e, 0x4e, 0xd8, 0x39, 0xcc, 0xbc, 0xc3, 0x2f, 0x52, 0x12, 0x51, 0x97, 0x69, 0xd3, - 0x96, 0x13, 0x45, 0xba, 0xea, 0xab, 0x3d, 0x1f, 0x40, 0x63, 0x61, 0x46, 0x3d, 0xf1, 0xf6, 0xc9, - 0x6f, 0x79, 0x11, 0x36, 0xff, 0x31, 0xb8, 0x44, 0xc8, 0xc0, 0xf2, 0xcb, 0xd9, 0x86, 0x46, 0x32, - 0x72, 0x5d, 0x3e, 0xb6, 0x8a, 0x93, 0xa6, 0x5b, 0xac, 0x7f, 0x1c, 0x87, 0x71, 0x1a, 0x4e, 0xee, - 0xc8, 0x55, 0x75, 0x69, 0x8a, 0x9a, 0x5e, 0x88, 0x9d, 0xee, 0xf1, 0xe9, 0xea, 0x8e, 0x58, 0x70, - 0x58, 0xc7, 0xf9, 0x95, 0x70, 0xa2, 0x48, 0x7d, 0x73, 0xc4, 0x46, 0x29, 0x47, 0x45, 0x53, 0x0e, - 0x75, 0x79, 0xaa, 0x9a, 0xf4, 0x2d, 0x3d, 0xae, 0xc3, 0xd4, 0x4a, 0x56, 0x3d, 0xd2, 0x84, 0xda, - 0x3b, 0x34, 0x0e, 0x5b, 0x87, 0xc8, 0x29, 0x38, 0x3e, 0xe6, 0x17, 0x89, 0x1b, 0xb5, 0x3e, 0xb6, - 0xc8, 0x33, 0xd0, 0x1e, 0xf7, 0xa7, 0x84, 0xf4, 0x03, 0xa4, 0xc7, 0xfd, 0x02, 0x21, 0xfd, 0x09, - 0xd2, 0xe3, 0xfe, 0x6e, 0x90, 0xfe, 0xd4, 0x22, 0x1d, 0x38, 0x5a, 0xfa, 0x8d, 0x41, 0xee, 0x33, - 0x8b, 0x9c, 0x84, 0x63, 0xe5, 0xff, 0x15, 0x24, 0x3f, 0x47, 0xb2, 0xfc, 0x17, 0x80, 0xe4, 0x97, - 0x56, 0x7a, 0xa0, 0xc2, 0xcf, 0x00, 0xb2, 0x5f, 0x21, 0x3b, 0x66, 0xd0, 0x47, 0xf6, 0x6b, 0x64, - 0xc7, 0x8c, 0xf1, 0xc8, 0x7e, 0x63, 0x91, 0x13, 0x62, 0xae, 0xd2, 0xc7, 0x5e, 0xa4, 0xbe, 0xc5, - 0xa3, 0x94, 0xa6, 0x5f, 0xe4, 0xbe, 0xc3, 0x6c, 0xcb, 0xf3, 0x2d, 0x92, 0xdf, 0xeb, 0xa4, 0x36, - 0xba, 0x22, 0xf9, 0x83, 0x95, 0xf5, 0x26, 0x27, 0x76, 0xc8, 0xfe, 0xa8, 0xf5, 0x26, 0x3f, 0xe6, - 0x21, 0xfd, 0x53, 0xae, 0xf8, 0xfa, 0xfc, 0x86, 0xf4, 0xcf, 0x48, 0x8f, 0x1b, 0xb2, 0x90, 0x7e, - 0x28, 0xf2, 0x2a, 0xa9, 0x3b, 0x92, 0xbf, 0x5a, 0xe4, 0x34, 0x9c, 0x18, 0x2b, 0xc3, 0xc8, 0xff, - 0x86, 0x79, 0x8f, 0x11, 0x63, 0x64, 0x1f, 0x59, 0x64, 0x01, 0x4e, 0x0a, 0x41, 0xbb, 0xe5, 0x47, - 0x34, 0xa7, 0x2b, 0x68, 0xf1, 0xbb, 0x45, 0xce, 0xc2, 0xe9, 0xff, 0x97, 0x3c, 0x34, 0x7a, 0xac, - 0x3d, 0xa4, 0xcc, 0xfe, 0x81, 0x0d, 0xd1, 0xd9, 0x2c, 0x81, 0x3f, 0x2d, 0x72, 0x1c, 0x48, 0x5e, - 0x39, 0x90, 0xf8, 0xcb, 0x22, 0x6d, 0x98, 0x2b, 0xdc, 0x4e, 0x64, 0xfe, 0xb6, 0x96, 0xee, 0xa6, - 0xe5, 0x28, 0x7e, 0x2d, 0x08, 0x81, 0x19, 0x89, 0x89, 0xf7, 0xca, 0x6b, 0x1d, 0xd2, 0xb0, 0x55, - 0x3a, 0xa0, 0x1c, 0x33, 0x34, 0xec, 0x56, 0x4c, 0x13, 0x1a, 0xb0, 0x56, 0x85, 0x63, 0x52, 0xee, - 0x6f, 0x47, 0x1e, 0xfa, 0x56, 0x97, 0xce, 0xc3, 0x6c, 0x41, 0x19, 0xc9, 0x14, 0x34, 0xd6, 0xde, - 0x5e, 0xd9, 0xbc, 0xbd, 0xba, 0xd6, 0x3a, 0xc4, 0x37, 0x1b, 0x96, 0xd8, 0x18, 0xdb, 0x75, 0xfc, - 0x7c, 0x5f, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x2f, 0xe3, 0xf6, 0x95, 0x11, 0x00, 0x00, +var fileDescriptor_24cf82780fd24e73 = []byte{ + // 1807 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x57, 0x4b, 0x73, 0x1b, 0xc7, + 0x11, 0xce, 0x02, 0x20, 0x01, 0x34, 0x9f, 0x1a, 0x92, 0x22, 0x04, 0x25, 0x92, 0xb2, 0x49, 0x2a, + 0x0c, 0x95, 0x40, 0x15, 0x29, 0x0f, 0x49, 0x29, 0x26, 0x92, 0xf8, 0x50, 0xa9, 0x42, 0x6d, 0x31, + 0x4b, 0x48, 0x95, 0xca, 0x25, 0xb5, 0x04, 0x86, 0xd0, 0x96, 0x80, 0x5d, 0x64, 0x77, 0x49, 0x85, + 0x3e, 0xb9, 0xec, 0x5f, 0x60, 0xb9, 0x6c, 0x97, 0x5f, 0x27, 0xbf, 0x6e, 0xb6, 0x0f, 0x3e, 0xc8, + 0x96, 0x1f, 0xf2, 0xfb, 0xee, 0x93, 0x7f, 0x8e, 0x67, 0x7a, 0x66, 0x67, 0x67, 0x1f, 0x14, 0x28, + 0xdd, 0x66, 0xfa, 0xeb, 0xee, 0xe9, 0xc7, 0x4c, 0x77, 0x0f, 0xc0, 0xa0, 0x37, 0x88, 0x5a, 0xc3, + 0xc0, 0x8f, 0x7c, 0x52, 0xe5, 0xeb, 0xff, 0x0e, 0x77, 0x9a, 0xa7, 0x7b, 0xbe, 0xdf, 0xeb, 0xd3, + 0x73, 0x48, 0xde, 0xd9, 0xdb, 0x3d, 0x17, 0xb9, 0x03, 0x1a, 0x46, 0xce, 0x60, 0x28, 0x38, 0xcd, + 0x67, 0x0d, 0xa8, 0x6e, 0xd3, 0x60, 0xdf, 0xed, 0x50, 0x32, 0x0d, 0x25, 0xb7, 0xdb, 0x30, 0xce, + 0x18, 0x4b, 0x75, 0x9b, 0xad, 0x48, 0x0b, 0x48, 0x44, 0x83, 0x81, 0xeb, 0x39, 0x91, 0x1f, 0x6c, + 0x47, 0x81, 0x13, 0xd1, 0xde, 0x41, 0xa3, 0x84, 0x78, 0x01, 0x42, 0xfe, 0x0c, 0x13, 0x09, 0x35, + 0x6c, 0x94, 0xcf, 0x94, 0x97, 0x26, 0xce, 0xcf, 0xb5, 0xa4, 0x2d, 0xad, 0xb6, 0xc2, 0x6c, 0x9d, + 0xcf, 0x7c, 0x54, 0x02, 0x48, 0xb0, 0x9c, 0x15, 0x3f, 0x87, 0x7a, 0x28, 0x0c, 0xbc, 0xd1, 0x95, + 0x87, 0x27, 0x04, 0xd2, 0x84, 0x5a, 0xe0, 0xef, 0x31, 0x75, 0x0c, 0x2c, 0x23, 0xa8, 0xf6, 0xa4, + 0x01, 0xd5, 0x1d, 0xd7, 0xeb, 0xba, 0x5e, 0xaf, 0x51, 0x41, 0x28, 0xde, 0x72, 0xc4, 0xe9, 0x76, + 0x03, 0x1a, 0x86, 0x8d, 0x31, 0x81, 0xc8, 0x2d, 0xb9, 0x08, 0xf5, 0x4e, 0x40, 0x99, 0x3f, 0xdd, + 0xab, 0x51, 0x63, 0x9c, 0x61, 0x13, 0xe7, 0x9b, 0x2d, 0x11, 0xc4, 0x56, 0x1c, 0xc4, 0x56, 0x3b, + 0x0e, 0xa2, 0x9d, 0x30, 0x93, 0x15, 0xa8, 0x0d, 0x29, 0x0d, 0xd6, 0x9c, 0xc8, 0x69, 0x54, 0xd1, + 0xf5, 0x5f, 0x16, 0xb8, 0xde, 0xda, 0x92, 0x3c, 0xeb, 0x5e, 0x14, 0x1c, 0xd8, 0x4a, 0xa4, 0xf9, + 0x37, 0x98, 0x4a, 0x41, 0x64, 0x16, 0xca, 0x77, 0xe9, 0x01, 0x06, 0x62, 0xca, 0xe6, 0x4b, 0x32, + 0x0f, 0x63, 0xfb, 0x4e, 0x7f, 0x8f, 0x62, 0x14, 0x26, 0x6d, 0xb1, 0xb9, 0x5c, 0xba, 0x68, 0x98, + 0x67, 0x61, 0x6e, 0xd3, 0x0d, 0x23, 0x99, 0xc8, 0xd0, 0xa6, 0xff, 0xdb, 0x63, 0x06, 0x72, 0x01, + 0xb6, 0x08, 0x0e, 0x64, 0x34, 0xc5, 0xc6, 0x5c, 0x83, 0xf9, 0x34, 0x73, 0x38, 0xf4, 0xbd, 0x90, + 0x92, 0xdf, 0x43, 0x4d, 0xc6, 0x35, 0x64, 0x02, 0xdc, 0x81, 0x59, 0xe5, 0x80, 0x64, 0xb6, 0x15, + 0x87, 0x79, 0x0d, 0xe6, 0x57, 0xd1, 0xf7, 0x18, 0x92, 0x67, 0x2e, 0x43, 0x55, 0xf2, 0xe0, 0xa9, + 0x45, 0x4a, 0x62, 0x06, 0xf3, 0x4f, 0x30, 0x6f, 0xd3, 0x81, 0xbf, 0x9f, 0xd5, 0x91, 0x4a, 0xb9, + 0x91, 0x49, 0xb9, 0xf9, 0x47, 0x38, 0x76, 0x9d, 0x46, 0x4f, 0x24, 0x72, 0x05, 0x88, 0x2e, 0x22, + 0x1d, 0x7e, 0x12, 0x53, 0x5b, 0x70, 0x9c, 0x07, 0x2d, 0x49, 0xe4, 0x88, 0x20, 0x6f, 0xc1, 0x62, + 0x8e, 0x5f, 0x1e, 0x9b, 0x79, 0x26, 0xc6, 0x11, 0x9f, 0x89, 0x05, 0x8b, 0x22, 0xe0, 0x1a, 0x83, + 0x34, 0xe1, 0x02, 0x40, 0xc2, 0x29, 0x7d, 0x29, 0x54, 0xa8, 0xb1, 0x99, 0x2b, 0xb0, 0x28, 0x82, + 0x9f, 0xd7, 0x67, 0xc2, 0x64, 0xc2, 0xa8, 0xe2, 0x99, 0xa2, 0x99, 0x97, 0x61, 0x9e, 0x85, 0xf4, + 0xe9, 0x64, 0x37, 0x61, 0x21, 0x23, 0x2b, 0x43, 0xf3, 0x54, 0x8e, 0x3c, 0x67, 0xc0, 0xb8, 0x8d, + 0x6f, 0x3e, 0x57, 0x3b, 0xce, 0xc0, 0xc4, 0x2e, 0x7b, 0xef, 0x34, 0x18, 0x06, 0xae, 0x17, 0xc9, + 0xea, 0xa1, 0x93, 0xc8, 0x12, 0xcc, 0xf4, 0x59, 0x9e, 0xa8, 0x47, 0x83, 0xab, 0xb2, 0x22, 0x88, + 0x32, 0x92, 0x25, 0xf3, 0x1b, 0xd6, 0xf1, 0x3d, 0x8f, 0x76, 0xd8, 0x73, 0xc7, 0x7a, 0x52, 0xb3, + 0x13, 0x82, 0xb9, 0x0c, 0x84, 0xe7, 0x5b, 0xd8, 0x31, 0xe2, 0x6e, 0x5c, 0x11, 0xaf, 0x55, 0xf1, + 0x4a, 0xe7, 0x7f, 0x07, 0x55, 0x51, 0xba, 0xe2, 0x3b, 0x31, 0xa3, 0x3c, 0x17, 0xac, 0x76, 0x8c, + 0x9b, 0x7f, 0x87, 0x39, 0x71, 0x17, 0x24, 0x20, 0x8f, 0xfb, 0x2d, 0x8c, 0x0b, 0x0e, 0x19, 0xba, + 0x9c, 0x02, 0x09, 0xb3, 0x27, 0x34, 0x27, 0x72, 0x9f, 0x96, 0xd7, 0x8b, 0xa9, 0x91, 0x2e, 0xa6, + 0xe6, 0x03, 0x03, 0x2a, 0x9b, 0xae, 0x77, 0x37, 0x17, 0x63, 0x56, 0xa7, 0xc2, 0xa0, 0x23, 0x63, + 0xcb, 0x97, 0x9c, 0xd2, 0x0d, 0x23, 0x19, 0x47, 0xbe, 0xe4, 0x71, 0x60, 0xf5, 0x32, 0xa2, 0xb2, + 0x0e, 0x8b, 0x0d, 0x21, 0x50, 0xe9, 0xfa, 0xf7, 0x3c, 0x2c, 0xc1, 0x35, 0x1b, 0xd7, 0x9c, 0xd6, + 0xf1, 0x43, 0x51, 0x7a, 0xc7, 0x6c, 0x5c, 0x93, 0x53, 0x00, 0x4c, 0xed, 0x26, 0x13, 0xf1, 0x3a, + 0x07, 0xac, 0xb6, 0x1a, 0x4b, 0x65, 0x5b, 0xa3, 0x70, 0x9c, 0x1d, 0x12, 0xe3, 0x35, 0x81, 0x27, + 0x14, 0x93, 0xc0, 0x2c, 0x8f, 0x37, 0xb7, 0x3e, 0xce, 0x8c, 0x79, 0x11, 0x8e, 0x69, 0x34, 0x99, + 0x81, 0x5f, 0xc1, 0x58, 0x9f, 0x13, 0x64, 0xfc, 0xa7, 0x54, 0xf8, 0x38, 0x9b, 0x2d, 0x30, 0x5e, + 0x4b, 0xb6, 0x29, 0x0a, 0xae, 0x32, 0xe3, 0xe2, 0xd0, 0x1d, 0x87, 0x71, 0x0e, 0xab, 0xc0, 0xc9, + 0x9d, 0xf2, 0xa7, 0x94, 0xf8, 0xa3, 0x69, 0x58, 0x63, 0x2e, 0x1f, 0x41, 0x03, 0x46, 0xa9, 0x94, + 0x44, 0xc9, 0xbc, 0x00, 0xd5, 0x55, 0x37, 0xe8, 0xec, 0xb9, 0x11, 0x87, 0x87, 0x4e, 0x74, 0x07, + 0x4d, 0xae, 0xdb, 0xb8, 0xe6, 0xe1, 0x16, 0x7e, 0x94, 0x90, 0x28, 0x0d, 0x7f, 0x0b, 0x5b, 0x7d, + 0x18, 0xba, 0xbe, 0x97, 0x4b, 0x22, 0xcb, 0x7c, 0xa7, 0xef, 0x52, 0x2f, 0x52, 0x3d, 0x56, 0xed, + 0xd3, 0xa5, 0xb5, 0x9c, 0x6d, 0xc0, 0xd9, 0xf7, 0x5e, 0xc9, 0xbf, 0x77, 0x5e, 0x68, 0x3b, 0xc2, + 0x5c, 0xcc, 0xb5, 0x5e, 0x68, 0xa5, 0x1b, 0x76, 0xcc, 0x60, 0x2e, 0xc4, 0xad, 0x0c, 0x0d, 0x55, + 0xf9, 0x52, 0x4d, 0x2b, 0x26, 0xeb, 0x4d, 0x4b, 0xd0, 0x0a, 0x9a, 0x16, 0x02, 0xb6, 0xe2, 0x30, + 0x37, 0x92, 0x86, 0x23, 0x20, 0xbd, 0x7b, 0x20, 0x45, 0xef, 0x1e, 0x92, 0xc0, 0xef, 0xb3, 0xe7, + 0xdf, 0x93, 0x09, 0xe0, 0x4b, 0xf3, 0x23, 0x03, 0xe6, 0xd9, 0xd8, 0x43, 0x9d, 0xc1, 0x4d, 0x1a, + 0x05, 0x6e, 0x47, 0x3d, 0xf8, 0xeb, 0x50, 0x1b, 0x38, 0x51, 0xe7, 0x4e, 0xf2, 0x88, 0xcf, 0x26, + 0xe6, 0x14, 0x08, 0xb4, 0xc4, 0xf6, 0xa6, 0x90, 0xb1, 0x95, 0x70, 0x73, 0x1b, 0xa6, 0x52, 0x10, + 0x37, 0xd1, 0x73, 0x06, 0xac, 0x79, 0xf5, 0xe8, 0xff, 0x63, 0x13, 0x15, 0x81, 0xfc, 0x1a, 0xa6, + 0x42, 0x7f, 0x2f, 0x60, 0x19, 0x59, 0x13, 0x1c, 0x22, 0x89, 0x69, 0xa2, 0x79, 0xbf, 0xca, 0x6e, + 0x9e, 0x6e, 0xc5, 0xfa, 0x3e, 0x4b, 0x31, 0x4f, 0xbe, 0xe4, 0x53, 0xcf, 0x3e, 0xde, 0xf3, 0x79, + 0x48, 0x8d, 0x8c, 0xa8, 0x74, 0xc4, 0x3c, 0xa4, 0x98, 0xc9, 0x25, 0xa8, 0x44, 0x4e, 0x2f, 0x1e, + 0x03, 0x7f, 0x53, 0x1c, 0x06, 0x34, 0xa0, 0xd5, 0x66, 0x7c, 0x62, 0x1e, 0x42, 0x11, 0xf2, 0x4f, + 0x00, 0x56, 0x9b, 0x25, 0x0b, 0xbb, 0x51, 0x8f, 0x89, 0xa3, 0x50, 0x70, 0x43, 0x71, 0x0b, 0x35, + 0x9a, 0x38, 0xf9, 0x17, 0x4c, 0xee, 0xf6, 0x7d, 0x47, 0xa9, 0x1b, 0x43, 0x75, 0x7f, 0x78, 0x9c, + 0xba, 0x0d, 0x8d, 0x5f, 0x28, 0x4c, 0xa9, 0x20, 0x6d, 0x98, 0x61, 0x07, 0xb0, 0x27, 0xe0, 0xf4, + 0x63, 0xad, 0xe3, 0xa8, 0x75, 0x79, 0x84, 0x91, 0x9a, 0x88, 0x9d, 0x55, 0xd1, 0xfc, 0x2b, 0xd4, + 0x55, 0x20, 0xf4, 0xe9, 0xaf, 0x5e, 0x30, 0xfd, 0xd5, 0xb5, 0xe9, 0xaf, 0xb9, 0x02, 0x33, 0x99, + 0x00, 0x8c, 0x12, 0x2f, 0xeb, 0xe2, 0xff, 0x80, 0x63, 0x39, 0x87, 0x47, 0x29, 0x30, 0x74, 0x05, + 0x0f, 0x4b, 0x30, 0x9d, 0x76, 0x8e, 0x57, 0x25, 0x7e, 0x39, 0xa5, 0x3c, 0xae, 0xc9, 0x06, 0xcc, + 0xc6, 0x2e, 0x6f, 0x47, 0x4e, 0x10, 0xdd, 0x6a, 0xaf, 0x1e, 0xe1, 0x46, 0xe5, 0x64, 0xc8, 0x35, + 0x98, 0x8e, 0x69, 0xeb, 0x5e, 0x97, 0x6b, 0x29, 0x8f, 0xd4, 0x92, 0x91, 0x20, 0x16, 0x8c, 0xa3, + 0xfd, 0xf1, 0xed, 0xfa, 0xcb, 0xd1, 0x13, 0xd7, 0xba, 0x8d, 0x82, 0xe2, 0x5e, 0x48, 0x2d, 0xcd, + 0x4b, 0x30, 0xa1, 0x91, 0x47, 0x45, 0xaf, 0xa2, 0xcf, 0xee, 0x8b, 0xb0, 0x20, 0xce, 0xcc, 0x96, + 0xbc, 0x1f, 0x0d, 0x98, 0x4b, 0x23, 0xe2, 0xb9, 0xae, 0x40, 0x9d, 0xf2, 0x45, 0xfb, 0x60, 0x28, + 0x02, 0x3c, 0x7d, 0xfe, 0x74, 0xc6, 0x7c, 0x29, 0xb0, 0x1e, 0xb3, 0xd9, 0x89, 0x44, 0xba, 0xd6, + 0x95, 0xb2, 0xb5, 0x4e, 0x6f, 0x04, 0xe5, 0xc7, 0x35, 0x82, 0x4a, 0xb6, 0x11, 0x3c, 0x49, 0x91, + 0x7f, 0x06, 0x9a, 0x6d, 0xbf, 0xc7, 0x72, 0x25, 0x0d, 0x6d, 0x07, 0x8e, 0xf6, 0x6d, 0x61, 0x9d, + 0x90, 0x7a, 0xce, 0x4e, 0x5f, 0x78, 0x57, 0xb3, 0xe5, 0x8e, 0xb7, 0x9a, 0x30, 0x1e, 0xe1, 0x93, + 0x1a, 0x97, 0xa2, 0xf1, 0x89, 0x4f, 0xd8, 0x2b, 0x58, 0x84, 0x0b, 0x3a, 0xc9, 0x7c, 0x55, 0x85, + 0x35, 0x7d, 0x2a, 0x2b, 0xa1, 0xe2, 0x9c, 0xee, 0x86, 0xdb, 0x8f, 0x67, 0xa8, 0x9a, 0x9d, 0x26, + 0xb2, 0x7a, 0x08, 0xbb, 0xb8, 0xc2, 0xe8, 0x97, 0x30, 0xfa, 0x8d, 0x64, 0x42, 0xe5, 0x1a, 0x37, + 0x14, 0x6e, 0x6b, 0xbc, 0xdc, 0x7a, 0x36, 0x2e, 0x46, 0x32, 0x0d, 0xa2, 0x2e, 0x8e, 0xd9, 0x29, + 0x9a, 0x79, 0x9b, 0x3f, 0xa4, 0x70, 0xc8, 0x46, 0x4a, 0x6d, 0x24, 0x73, 0x86, 0x43, 0xbd, 0xea, + 0xab, 0x3d, 0x9f, 0x5d, 0x03, 0xc1, 0x46, 0xbb, 0xe2, 0xf6, 0xc9, 0x86, 0x9f, 0x25, 0x9b, 0x3f, + 0x18, 0xbc, 0x44, 0x48, 0xc5, 0xb2, 0x73, 0xb2, 0x3f, 0x70, 0xb8, 0xd7, 0xe9, 0xf0, 0x89, 0x57, + 0x78, 0x1a, 0x6f, 0x31, 0xfe, 0x41, 0xc0, 0xff, 0x26, 0x42, 0x9d, 0xdc, 0xb1, 0x8b, 0x17, 0x3f, + 0x9a, 0x6c, 0x4d, 0xcf, 0xe8, 0x8e, 0xf7, 0x78, 0xba, 0x7a, 0x23, 0x16, 0x4c, 0xea, 0x74, 0xfe, + 0x24, 0x98, 0x2b, 0xaa, 0xe7, 0x88, 0x8d, 0xaa, 0x1c, 0x25, 0xad, 0x72, 0xa8, 0xc7, 0x53, 0xd6, + 0x4a, 0xdf, 0xf2, 0xf3, 0x35, 0x98, 0x58, 0x4d, 0xa2, 0x47, 0x6a, 0x50, 0xf9, 0x0f, 0x0d, 0xfc, + 0xd9, 0x9f, 0xb1, 0x8b, 0xba, 0x58, 0xf0, 0x1d, 0xe6, 0x4c, 0xb3, 0x2f, 0x58, 0xe4, 0x17, 0xd0, + 0x28, 0xfa, 0xff, 0x22, 0x7c, 0x1f, 0xe1, 0xa2, 0x8f, 0x2d, 0xc2, 0x2f, 0x22, 0x5c, 0xf4, 0x67, + 0x45, 0xf8, 0x25, 0x8b, 0xe5, 0x6b, 0x21, 0xf7, 0x39, 0x45, 0xec, 0x65, 0x8b, 0x9c, 0x84, 0xe3, + 0xf9, 0x5f, 0x28, 0x82, 0xaf, 0x58, 0xec, 0xe2, 0x9e, 0x3c, 0xe4, 0x7b, 0x87, 0x1c, 0x5f, 0x21, + 0xc7, 0x21, 0x1f, 0x36, 0xe4, 0xf8, 0xda, 0x22, 0xa7, 0xa1, 0x59, 0xfc, 0x49, 0x45, 0x86, 0x6f, + 0x50, 0xc5, 0x21, 0xbf, 0x52, 0xe4, 0xf8, 0x16, 0xdd, 0x2b, 0xfa, 0xd6, 0x21, 0xfc, 0x9d, 0xc5, + 0x46, 0xed, 0x13, 0x85, 0x3f, 0x37, 0xc4, 0xbf, 0x47, 0x17, 0xf3, 0xdf, 0x20, 0x04, 0x5f, 0xb3, + 0xe2, 0xb4, 0x64, 0xfe, 0x3d, 0x88, 0xbe, 0x8e, 0x68, 0xc1, 0x9f, 0x06, 0xd1, 0x37, 0x10, 0x2d, + 0xf8, 0xb1, 0x20, 0xfa, 0xa6, 0x45, 0x4e, 0x88, 0xe9, 0x50, 0x9f, 0xf0, 0x11, 0x7a, 0x1b, 0x13, + 0x92, 0x1b, 0xf4, 0x11, 0x7b, 0x07, 0xad, 0xcd, 0x8f, 0xf2, 0x08, 0xbe, 0xab, 0x83, 0xda, 0x94, + 0x8e, 0xe0, 0x7b, 0x56, 0x72, 0xc3, 0x52, 0x25, 0x1b, 0xd1, 0xf7, 0xb5, 0x1b, 0x96, 0x1e, 0x56, + 0x11, 0xfe, 0x20, 0x75, 0x85, 0xf4, 0x29, 0x14, 0xe1, 0x0f, 0x11, 0x2e, 0x1a, 0x15, 0x11, 0x7e, + 0x20, 0xec, 0xca, 0xf5, 0x28, 0x04, 0x3f, 0xc6, 0xfc, 0x14, 0x36, 0x13, 0xc4, 0x3f, 0x41, 0xbb, + 0x0b, 0x5a, 0x0a, 0xa2, 0x0f, 0xf1, 0x7a, 0x88, 0xb2, 0xbc, 0xe5, 0x0e, 0x69, 0xaa, 0x3a, 0x22, + 0xc7, 0xa7, 0x16, 0xfb, 0x21, 0x9d, 0x3a, 0xbc, 0x70, 0x23, 0xd3, 0x67, 0xda, 0x21, 0x79, 0xf4, + 0x73, 0x4c, 0x88, 0x8e, 0x26, 0x06, 0x7c, 0x61, 0x91, 0x45, 0x20, 0xe9, 0xfa, 0x87, 0xc0, 0x23, + 0x8b, 0x15, 0xab, 0xb9, 0x4c, 0x8d, 0x41, 0xe4, 0x4b, 0x6b, 0xf9, 0x4e, 0x1c, 0x8e, 0x6c, 0xcf, + 0x63, 0x95, 0x64, 0x5a, 0xd2, 0xc4, 0xbd, 0xea, 0xb2, 0xca, 0x90, 0xd0, 0xd6, 0x68, 0x9f, 0x72, + 0x9a, 0xa1, 0xd1, 0xb6, 0xd8, 0x47, 0x9f, 0x49, 0xcf, 0x96, 0x38, 0x4d, 0x36, 0xad, 0x5b, 0xc3, + 0x2e, 0xca, 0x96, 0x97, 0xcf, 0xc2, 0x4c, 0xa6, 0xbe, 0x93, 0x09, 0xa8, 0xae, 0xff, 0x7b, 0x75, + 0xf3, 0xd6, 0xda, 0x3a, 0xd3, 0xcd, 0x36, 0x37, 0x2c, 0xb1, 0x31, 0x76, 0xc6, 0x71, 0x08, 0xb9, + 0xf0, 0x53, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x7e, 0x3b, 0x78, 0x96, 0x15, 0x00, 0x00, } diff --git a/pb/mgmt_pb/mgmt.proto b/pb/mgmt_pb/mgmt.proto index 2306b17ea..1118a67e3 100644 --- a/pb/mgmt_pb/mgmt.proto +++ b/pb/mgmt_pb/mgmt.proto @@ -6,30 +6,38 @@ import "google/protobuf/timestamp.proto"; enum ContentType { // Protoc says this has to be here - Zero = 0; + Zero = 0; // Services - ListServicesRequestType = 10001; + ListServicesRequestType = 10001; ListServicesResponseType = 10002; CreateServiceRequestType = 10003; RemoveServiceRequestType = 10005; - GetServiceRequestType = 10006; - GetServiceResponseType = 10007; + GetServiceRequestType = 10006; + GetServiceResponseType = 10007; + + // Service Terminators + CreateTerminatorRequestType = 10050; + RemoveTerminatorRequestType = 10051; + ListTerminatorsRequestType = 10052; + ListTerminatorsResponseType = 10053; + GetTerminatorRequestType = 10054; + GetTerminatorResponseType = 10055; // Routers - ListRoutersRequestType = 10010; + ListRoutersRequestType = 10010; ListRoutersResponseType = 10011; CreateRouterRequestType = 10012; RemoveRouterRequestType = 10013; // Links - ListLinksRequestType = 10020; - ListLinksResponseType = 10021; + ListLinksRequestType = 10020; + ListLinksResponseType = 10021; SetLinkCostRequestType = 10022; SetLinkDownRequestType = 10023; // Sessions - ListSessionsRequestType = 10030; + ListSessionsRequestType = 10030; ListSessionsResponseType = 10031; RemoveSessionRequestType = 10032; @@ -55,12 +63,24 @@ enum ContentType { message Service { string id = 1; - string binding = 2; - string endpointAddress = 3; - string egress = 4; + string terminatorStrategy = 2; + repeated Terminator terminators = 3; +} + +message Terminator { + string id = 1; + string serviceId = 2; + string routerId = 3; + string binding = 4; + string address = 5; + google.protobuf.Timestamp createdAt = 6; + map peerData = 7; +} + +message ListServicesRequest { + string query = 1; } -message ListServicesRequest {} message ListServicesResponse { repeated Service services = 1; } @@ -76,10 +96,35 @@ message RemoveServiceRequest { message GetServiceRequest { string serviceId = 1; } + message GetServiceResponse { Service service = 1; } +// service terminators +message ListTerminatorsRequest { + string query = 1; +} + +message ListTerminatorsResponse { + repeated Terminator terminators = 1; +} + +message CreateTerminatorRequest { + Terminator terminator = 1; +} + +message RemoveTerminatorRequest { + string terminatorId = 1; +} + +message GetTerminatorRequest { + string terminatorId = 1; +} + +message GetTerminatorResponse { + Terminator terminator = 1; +} // // --- Router ------------------------------------------------------------------------------------------------------- // @@ -92,7 +137,9 @@ message Router { bool connected = 4; } -message ListRoutersRequest {} +message ListRoutersRequest { + string query = 1; +} message ListRoutersResponse { repeated Router routers = 1; } @@ -120,7 +167,8 @@ message Link { int64 dstLatency = 8; } -message ListLinksRequest{} +message ListLinksRequest { +} message ListLinksResponse { repeated Link links = 1; } @@ -148,10 +196,12 @@ message Session { string id = 1; string clientId = 2; string serviceId = 3; - Circuit circuit = 4; + string terminatorId = 4; + Circuit circuit = 5; } -message ListSessionsRequest{} +message ListSessionsRequest { +} message ListSessionsResponse { repeated Session sessions = 1; } @@ -192,7 +242,8 @@ message StreamMetricsEvent { } } -message StreamSessionsRequest {} +message StreamSessionsRequest { +} enum StreamSessionEventType { SessionCreated = 0; diff --git a/router/handler_ctrl/route.go b/router/handler_ctrl/route.go index 601e62884..73a9125d2 100644 --- a/router/handler_ctrl/route.go +++ b/router/handler_ctrl/route.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/version b/version index 68c123cf1..51176c7c8 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.10 +0.11 diff --git a/xgress/request.go b/xgress/request.go index e3eb2f828..9b80d51c4 100644 --- a/xgress/request.go +++ b/xgress/request.go @@ -1,5 +1,5 @@ /* - Copyright 2019 NetFoundry, Inc. + Copyright 2020 NetFoundry, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -167,7 +167,7 @@ func GetSession(ctrl CtrlChannel, ingressId string, serviceId string, peerData m sessionId := &identity.TokenId{Token: string(reply.Body)} sessionId.Data = make(map[uint32][]byte) - for k,v := range reply.Headers { + for k, v := range reply.Headers { if k == ctrl_msg.SessionSuccessAddressHeader { address = string(v) } else { @@ -208,93 +208,70 @@ func CreateSession(ctrl CtrlChannel, peer Connection, request *Request, bindHand return &Response{Success: true, SessionId: sessionInfo.SessionId.Token} } -func BindService(ctrl CtrlChannel, token string, serviceId string, peerData map[uint32][]byte) error { +func AddTerminator(ctrl CtrlChannel, terminatorId string, serviceId string, binding string, address string, peerData map[uint32][]byte) error { log := pfxlog.Logger() - hostRequest := &ctrl_pb.BindRequest{ - BindType: ctrl_pb.BindType_Bind, - Token: token, + request := &ctrl_pb.CreateTerminatorRequest{ + Id: terminatorId, ServiceId: serviceId, + Binding: binding, + Address: address, PeerData: peerData, } - bytes, err := proto.Marshal(hostRequest) + bytes, err := proto.Marshal(request) if err != nil { - log.Errorf("failed to marshal BindRequest message: (%v)", err) + log.Errorf("failed to marshal CreateTerminatorRequest message: (%v)", err) return authError } - msg := channel2.NewMessage(int32(ctrl_pb.ContentType_BindRequestType), bytes) - waitCh, err := ctrl.Channel().SendAndWait(msg) + msg := channel2.NewMessage(int32(ctrl_pb.ContentType_CreateTerminatorRequestType), bytes) + responseMesg, err := ctrl.Channel().SendAndWaitWithTimeout(msg, 5*time.Second) if err != nil { - log.Errorf("failed to send BindRequest message: (%v)", err) + log.Errorf("failed to send CreateTerminatorRequest message: (%v)", err) return authError } - select { - case msg := <-waitCh: - if msg != nil && msg.ContentType == int32(ctrl_pb.ContentType_BindResponseType) { - bindResponse := &ctrl_pb.BindResponse{} - err := proto.Unmarshal(msg.Body, bindResponse) - if err != nil { - log.Errorf("failed to send un-marshall BindResponse message: (%v)", err) - return authError - } - if bindResponse.Success { - log.Debugf("successfully bound session [s/%s]", token) - return nil - } - log.Errorf("authentication failure: (%v)", bindResponse.Message) - return errors.New(bindResponse.Message) - } else { - log.Errorf("unexpected controller response, ContentType: (%v)", msg.ContentType) - return authError + if responseMesg != nil && responseMesg.ContentType == channel2.ContentTypeResultType { + result := channel2.UnmarshalResult(responseMesg) + if result.Success { + log.Debugf("successfully added service terminator [s/%s] for service [%v]", terminatorId, serviceId) + return nil } - - case <-time.After(5 * time.Second): - return errors.New("timeout while binding") + log.Errorf("authentication failure: (%v)", result.Message) + return errors.New(result.Message) + } else { + log.Errorf("unexpected controller response, ContentType: (%v)", responseMesg.ContentType) + return authError } } -func UnbindService(ctrl CtrlChannel, token string, serviceId string) error { +func RemoveTerminator(ctrl CtrlChannel, terminatorId string) error { log := pfxlog.Logger() - hostRequest := &ctrl_pb.BindRequest{ - BindType: ctrl_pb.BindType_Unbind, - Token: token, - ServiceId: serviceId, + request := &ctrl_pb.RemoveTerminatorRequest{ + TerminatorId: terminatorId, } - bytes, err := proto.Marshal(hostRequest) + bytes, err := proto.Marshal(request) if err != nil { - log.Errorf("failed to marshal BindRequest message: (%v)", err) + log.Errorf("failed to marshal RemoveTerminatorRequest message: (%v)", err) return authError } - msg := channel2.NewMessage(int32(ctrl_pb.ContentType_BindRequestType), bytes) - waitCh, err := ctrl.Channel().SendAndWait(msg) + msg := channel2.NewMessage(int32(ctrl_pb.ContentType_RemoveTerminatorRequestType), bytes) + responseMsg, err := ctrl.Channel().SendAndWaitWithTimeout(msg, 5*time.Second) if err != nil { - log.Errorf("failed to send HostRequest message: (%v)", err) + log.Errorf("failed to send RemoveTerminatorRequest message: (%v)", err) return authError } - select { - case msg := <-waitCh: - if msg != nil && msg.ContentType == int32(ctrl_pb.ContentType_BindResponseType) { - bindResponse := &ctrl_pb.BindResponse{} - err := proto.Unmarshal(msg.Body, bindResponse) - if err != nil { - log.Errorf("failed to send un-marshall BindResponse message: (%v)", err) - return authError - } - if bindResponse.Success { - log.Debugf("successfully unbound session [s/%s]", token) - return nil - } - log.Errorf("authentication failure: (%v)", bindResponse.Message) - return errors.New(bindResponse.Message) - } else { - log.Errorf("unexpected controller response, ContentType: (%v)", msg.ContentType) - return authError + if responseMsg != nil && responseMsg.ContentType == channel2.ContentTypeResultType { + result := channel2.UnmarshalResult(responseMsg) + if result.Success { + log.Debugf("successfully removed service terminator [s/%s]", terminatorId) + return nil } - - case <-time.After(5 * time.Second): - return errors.New("timeout while unbinding") + log.Errorf("failure removing service terminator: (%v)", result.Message) + return errors.New(result.Message) + } else { + log.Errorf("unexpected controller response, ContentType: (%v)", responseMsg.ContentType) + return authError } }