controller, store infrastructure; services -> shares (#144)

This commit is contained in:
Michael Quigley 2023-01-04 13:13:50 -05:00
parent fcb0873784
commit 9572ed3c73
No known key found for this signature in database
GPG Key ID: 9B60314A9DD20A62
14 changed files with 212 additions and 212 deletions

View File

@ -45,12 +45,12 @@ func (h *accessHandler) Handle(params service.AccessParams, principal *rest_mode
} }
svcToken := params.Body.SvcToken svcToken := params.Body.SvcToken
ssvc, err := str.FindServiceWithToken(svcToken, tx) sshr, err := str.FindShareWithToken(svcToken, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding service") logrus.Errorf("error finding service")
return service.NewAccessNotFound() return service.NewAccessNotFound()
} }
if ssvc == nil { if sshr == nil {
logrus.Errorf("unable to find service '%v' for user '%v'", svcToken, principal.Email) logrus.Errorf("unable to find service '%v' for user '%v'", svcToken, principal.Email)
return service.NewAccessNotFound() return service.NewAccessNotFound()
} }
@ -76,7 +76,7 @@ func (h *accessHandler) Handle(params service.AccessParams, principal *rest_mode
"zrokFrontendToken": feToken, "zrokFrontendToken": feToken,
"zrokServiceToken": svcToken, "zrokServiceToken": svcToken,
} }
if err := zrokEdgeSdk.CreateServicePolicyDial(envZId+"-"+ssvc.ZId+"-dial", ssvc.ZId, []string{envZId}, addlTags, edge); err != nil { if err := zrokEdgeSdk.CreateServicePolicyDial(envZId+"-"+sshr.ZId+"-dial", sshr.ZId, []string{envZId}, addlTags, edge); err != nil {
logrus.Errorf("unable to create dial policy: %v", err) logrus.Errorf("unable to create dial policy: %v", err)
return service.NewAccessInternalServerError() return service.NewAccessInternalServerError()
} }

View File

@ -80,12 +80,12 @@ func (h *disableHandler) removeServicesForEnvironment(envId int, tx *sqlx.Tx, ed
if err != nil { if err != nil {
return err return err
} }
svcs, err := str.FindServicesForEnvironment(envId, tx) shrs, err := str.FindSharesForEnvironment(envId, tx)
if err != nil { if err != nil {
return err return err
} }
for _, svc := range svcs { for _, shr := range shrs {
svcToken := svc.Token svcToken := shr.Token
logrus.Infof("garbage collecting service '%v' for environment '%v'", svcToken, env.ZId) logrus.Infof("garbage collecting service '%v' for environment '%v'", svcToken, env.ZId)
if err := zrokEdgeSdk.DeleteServiceEdgeRouterPolicy(env.ZId, svcToken, edge); err != nil { if err := zrokEdgeSdk.DeleteServiceEdgeRouterPolicy(env.ZId, svcToken, edge); err != nil {
logrus.Error(err) logrus.Error(err)
@ -99,22 +99,22 @@ func (h *disableHandler) removeServicesForEnvironment(envId int, tx *sqlx.Tx, ed
if err := zrokEdgeSdk.DeleteConfig(env.ZId, svcToken, edge); err != nil { if err := zrokEdgeSdk.DeleteConfig(env.ZId, svcToken, edge); err != nil {
logrus.Error(err) logrus.Error(err)
} }
if err := zrokEdgeSdk.DeleteService(env.ZId, svc.ZId, edge); err != nil { if err := zrokEdgeSdk.DeleteService(env.ZId, shr.ZId, edge); err != nil {
logrus.Error(err) logrus.Error(err)
} }
logrus.Infof("removed service '%v' for environment '%v'", svc.Token, env.ZId) logrus.Infof("removed service '%v' for environment '%v'", shr.Token, env.ZId)
} }
return nil return nil
} }
func (h *disableHandler) removeEnvironment(envId int, tx *sqlx.Tx) error { func (h *disableHandler) removeEnvironment(envId int, tx *sqlx.Tx) error {
svcs, err := str.FindServicesForEnvironment(envId, tx) shrs, err := str.FindSharesForEnvironment(envId, tx)
if err != nil { if err != nil {
return errors.Wrapf(err, "error finding services for environment '%d'", envId) return errors.Wrapf(err, "error finding services for environment '%d'", envId)
} }
for _, svc := range svcs { for _, shr := range shrs {
if err := str.DeleteService(svc.Id, tx); err != nil { if err := str.DeleteShare(shr.Id, tx); err != nil {
return errors.Wrapf(err, "error deleting service '%d' for environment '%d'", svc.Id, envId) return errors.Wrapf(err, "error deleting service '%d' for environment '%d'", shr.Id, envId)
} }
} }
if err := str.DeleteEnvironment(envId, tx); err != nil { if err := str.DeleteEnvironment(envId, tx); err != nil {

View File

@ -35,44 +35,44 @@ func (h *environmentDetailHandler) Handle(params metadata.GetEnvironmentDetailPa
ZID: senv.ZId, ZID: senv.ZId,
}, },
} }
svcs, err := str.FindServicesForEnvironment(senv.Id, tx) shrs, err := str.FindSharesForEnvironment(senv.Id, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding services for environment '%v': %v", senv.ZId, err) logrus.Errorf("error finding services for environment '%v': %v", senv.ZId, err)
return metadata.NewGetEnvironmentDetailInternalServerError() return metadata.NewGetEnvironmentDetailInternalServerError()
} }
var sparkData map[string][]int64 var sparkData map[string][]int64
if cfg.Influx != nil { if cfg.Influx != nil {
sparkData, err = sparkDataForServices(svcs) sparkData, err = sparkDataForServices(shrs)
if err != nil { if err != nil {
logrus.Errorf("error querying spark data for services: %v", err) logrus.Errorf("error querying spark data for services: %v", err)
return metadata.NewGetEnvironmentDetailInternalServerError() return metadata.NewGetEnvironmentDetailInternalServerError()
} }
} }
for _, svc := range svcs { for _, shr := range shrs {
feEndpoint := "" feEndpoint := ""
if svc.FrontendEndpoint != nil { if shr.FrontendEndpoint != nil {
feEndpoint = *svc.FrontendEndpoint feEndpoint = *shr.FrontendEndpoint
} }
feSelection := "" feSelection := ""
if svc.FrontendSelection != nil { if shr.FrontendSelection != nil {
feSelection = *svc.FrontendSelection feSelection = *shr.FrontendSelection
} }
beProxyEndpoint := "" beProxyEndpoint := ""
if svc.BackendProxyEndpoint != nil { if shr.BackendProxyEndpoint != nil {
beProxyEndpoint = *svc.BackendProxyEndpoint beProxyEndpoint = *shr.BackendProxyEndpoint
} }
es.Services = append(es.Services, &rest_model_zrok.Service{ es.Services = append(es.Services, &rest_model_zrok.Service{
Token: svc.Token, Token: shr.Token,
ZID: svc.ZId, ZID: shr.ZId,
ShareMode: svc.ShareMode, ShareMode: shr.ShareMode,
BackendMode: svc.BackendMode, BackendMode: shr.BackendMode,
FrontendSelection: feSelection, FrontendSelection: feSelection,
FrontendEndpoint: feEndpoint, FrontendEndpoint: feEndpoint,
BackendProxyEndpoint: beProxyEndpoint, BackendProxyEndpoint: beProxyEndpoint,
Reserved: svc.Reserved, Reserved: shr.Reserved,
Metrics: sparkData[svc.Token], Metrics: sparkData[shr.Token],
CreatedAt: svc.CreatedAt.UnixMilli(), CreatedAt: shr.CreatedAt.UnixMilli(),
UpdatedAt: svc.UpdatedAt.UnixMilli(), UpdatedAt: shr.UpdatedAt.UnixMilli(),
}) })
} }
return metadata.NewGetEnvironmentDetailOK().WithPayload(es) return metadata.NewGetEnvironmentDetailOK().WithPayload(es)

View File

@ -37,13 +37,13 @@ func GC(inCfg *Config) error {
return err return err
} }
defer func() { _ = tx.Rollback() }() defer func() { _ = tx.Rollback() }()
dbSvcs, err := str.GetAllServices(tx) sshrs, err := str.GetAllShares(tx)
if err != nil { if err != nil {
return err return err
} }
liveMap := make(map[string]struct{}) liveMap := make(map[string]struct{})
for _, dbSvc := range dbSvcs { for _, sshr := range sshrs {
liveMap[dbSvc.Token] = struct{}{} liveMap[sshr.Token] = struct{}{}
} }
if err := gcServices(edge, liveMap); err != nil { if err := gcServices(edge, liveMap); err != nil {
return errors.Wrap(err, "error garbage collecting services") return errors.Wrap(err, "error garbage collecting services")

View File

@ -18,7 +18,7 @@ func getServiceHandler(params service.GetServiceParams, principal *rest_model_zr
} }
defer func() { _ = tx.Rollback() }() defer func() { _ = tx.Rollback() }()
ssvc, err := str.FindServiceWithToken(svcToken, tx) sshr, err := str.FindShareWithToken(svcToken, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding service with token '%v': %v", svcToken, err) logrus.Errorf("error finding service with token '%v': %v", svcToken, err)
return service.NewGetServiceNotFound() return service.NewGetServiceNotFound()
@ -30,7 +30,7 @@ func getServiceHandler(params service.GetServiceParams, principal *rest_model_zr
} }
envFound := false envFound := false
for _, senv := range senvs { for _, senv := range senvs {
if senv.Id == ssvc.EnvironmentId && senv.ZId == envZId { if senv.Id == sshr.EnvironmentId && senv.ZId == envZId {
envFound = true envFound = true
break break
} }
@ -40,24 +40,24 @@ func getServiceHandler(params service.GetServiceParams, principal *rest_model_zr
return service.NewGetServiceNotFound() return service.NewGetServiceNotFound()
} }
svc := &rest_model_zrok.Service{ shr := &rest_model_zrok.Service{
Token: ssvc.Token, Token: sshr.Token,
ZID: ssvc.ZId, ZID: sshr.ZId,
ShareMode: ssvc.ShareMode, ShareMode: sshr.ShareMode,
BackendMode: ssvc.BackendMode, BackendMode: sshr.BackendMode,
Reserved: ssvc.Reserved, Reserved: sshr.Reserved,
CreatedAt: ssvc.CreatedAt.UnixMilli(), CreatedAt: sshr.CreatedAt.UnixMilli(),
UpdatedAt: ssvc.UpdatedAt.UnixMilli(), UpdatedAt: sshr.UpdatedAt.UnixMilli(),
} }
if ssvc.FrontendSelection != nil { if sshr.FrontendSelection != nil {
svc.FrontendSelection = *ssvc.FrontendSelection shr.FrontendSelection = *sshr.FrontendSelection
} }
if ssvc.FrontendEndpoint != nil { if sshr.FrontendEndpoint != nil {
svc.FrontendEndpoint = *ssvc.FrontendEndpoint shr.FrontendEndpoint = *sshr.FrontendEndpoint
} }
if ssvc.BackendProxyEndpoint != nil { if sshr.BackendProxyEndpoint != nil {
svc.BackendProxyEndpoint = *ssvc.BackendProxyEndpoint shr.BackendProxyEndpoint = *sshr.BackendProxyEndpoint
} }
return service.NewGetServiceOK().WithPayload(svc) return service.NewGetServiceOK().WithPayload(shr)
} }

View File

@ -119,7 +119,7 @@ func (ma *metricsAgent) processMetrics(m *model.Metrics) error {
for k, v := range m.Sessions { for k, v := range m.Sessions {
if ma.writeApi != nil { if ma.writeApi != nil {
pt := influxdb2.NewPoint("xfer", pt := influxdb2.NewPoint("xfer",
map[string]string{"namespace": m.Namespace, "service": k}, map[string]string{"namespace": m.Namespace, "share": k},
map[string]interface{}{"bytesRead": v.BytesRead, "bytesWritten": v.BytesWritten}, map[string]interface{}{"bytesRead": v.BytesRead, "bytesWritten": v.BytesWritten},
time.UnixMilli(v.LastUpdate)) time.UnixMilli(v.LastUpdate))
pts = append(pts, pt) pts = append(pts, pt)

View File

@ -21,7 +21,7 @@ func overviewHandler(_ metadata.OverviewParams, principal *rest_model_zrok.Princ
} }
var out rest_model_zrok.EnvironmentServicesList var out rest_model_zrok.EnvironmentServicesList
for _, env := range envs { for _, env := range envs {
svcs, err := str.FindServicesForEnvironment(env.Id, tx) shrs, err := str.FindSharesForEnvironment(env.Id, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding services for environment '%v': %v", env.ZId, err) logrus.Errorf("error finding services for environment '%v': %v", env.ZId, err)
return metadata.NewOverviewInternalServerError() return metadata.NewOverviewInternalServerError()
@ -37,30 +37,30 @@ func overviewHandler(_ metadata.OverviewParams, principal *rest_model_zrok.Princ
}, },
} }
for _, svc := range svcs { for _, shr := range shrs {
feEndpoint := "" feEndpoint := ""
if svc.FrontendEndpoint != nil { if shr.FrontendEndpoint != nil {
feEndpoint = *svc.FrontendEndpoint feEndpoint = *shr.FrontendEndpoint
} }
feSelection := "" feSelection := ""
if svc.FrontendSelection != nil { if shr.FrontendSelection != nil {
feSelection = *svc.FrontendSelection feSelection = *shr.FrontendSelection
} }
beProxyEndpoint := "" beProxyEndpoint := ""
if svc.BackendProxyEndpoint != nil { if shr.BackendProxyEndpoint != nil {
beProxyEndpoint = *svc.BackendProxyEndpoint beProxyEndpoint = *shr.BackendProxyEndpoint
} }
es.Services = append(es.Services, &rest_model_zrok.Service{ es.Services = append(es.Services, &rest_model_zrok.Service{
Token: svc.Token, Token: shr.Token,
ZID: svc.ZId, ZID: shr.ZId,
ShareMode: svc.ShareMode, ShareMode: shr.ShareMode,
BackendMode: svc.BackendMode, BackendMode: shr.BackendMode,
FrontendSelection: feSelection, FrontendSelection: feSelection,
FrontendEndpoint: feEndpoint, FrontendEndpoint: feEndpoint,
BackendProxyEndpoint: beProxyEndpoint, BackendProxyEndpoint: beProxyEndpoint,
Reserved: svc.Reserved, Reserved: shr.Reserved,
CreatedAt: svc.CreatedAt.UnixMilli(), CreatedAt: shr.CreatedAt.UnixMilli(),
UpdatedAt: svc.UpdatedAt.UnixMilli(), UpdatedAt: shr.UpdatedAt.UnixMilli(),
}) })
} }
out = append(out, es) out = append(out, es)

View File

@ -21,7 +21,7 @@ func (h *serviceDetailHandler) Handle(params metadata.GetServiceDetailParams, pr
return metadata.NewGetServiceDetailInternalServerError() return metadata.NewGetServiceDetailInternalServerError()
} }
defer func() { _ = tx.Rollback() }() defer func() { _ = tx.Rollback() }()
svc, err := str.FindServiceWithToken(params.SvcToken, tx) shr, err := str.FindShareWithToken(params.SvcToken, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding service '%v': %v", params.SvcToken, err) logrus.Errorf("error finding service '%v': %v", params.SvcToken, err)
return metadata.NewGetServiceDetailNotFound() return metadata.NewGetServiceDetailNotFound()
@ -33,7 +33,7 @@ func (h *serviceDetailHandler) Handle(params metadata.GetServiceDetailParams, pr
} }
found := false found := false
for _, env := range envs { for _, env := range envs {
if svc.EnvironmentId == env.Id { if shr.EnvironmentId == env.Id {
found = true found = true
break break
} }
@ -44,35 +44,35 @@ func (h *serviceDetailHandler) Handle(params metadata.GetServiceDetailParams, pr
} }
var sparkData map[string][]int64 var sparkData map[string][]int64
if cfg.Influx != nil { if cfg.Influx != nil {
sparkData, err = sparkDataForServices([]*store.Service{svc}) sparkData, err = sparkDataForServices([]*store.Share{shr})
if err != nil { if err != nil {
logrus.Errorf("error querying spark data for services: %v", err) logrus.Errorf("error querying spark data for services: %v", err)
return metadata.NewGetEnvironmentDetailInternalServerError() return metadata.NewGetEnvironmentDetailInternalServerError()
} }
} }
feEndpoint := "" feEndpoint := ""
if svc.FrontendEndpoint != nil { if shr.FrontendEndpoint != nil {
feEndpoint = *svc.FrontendEndpoint feEndpoint = *shr.FrontendEndpoint
} }
feSelection := "" feSelection := ""
if svc.FrontendSelection != nil { if shr.FrontendSelection != nil {
feSelection = *svc.FrontendSelection feSelection = *shr.FrontendSelection
} }
beProxyEndpoint := "" beProxyEndpoint := ""
if svc.BackendProxyEndpoint != nil { if shr.BackendProxyEndpoint != nil {
beProxyEndpoint = *svc.BackendProxyEndpoint beProxyEndpoint = *shr.BackendProxyEndpoint
} }
return metadata.NewGetServiceDetailOK().WithPayload(&rest_model_zrok.Service{ return metadata.NewGetServiceDetailOK().WithPayload(&rest_model_zrok.Service{
Token: svc.Token, Token: shr.Token,
ZID: svc.ZId, ZID: shr.ZId,
ShareMode: svc.ShareMode, ShareMode: shr.ShareMode,
BackendMode: svc.BackendMode, BackendMode: shr.BackendMode,
FrontendSelection: feSelection, FrontendSelection: feSelection,
FrontendEndpoint: feEndpoint, FrontendEndpoint: feEndpoint,
BackendProxyEndpoint: beProxyEndpoint, BackendProxyEndpoint: beProxyEndpoint,
Reserved: svc.Reserved, Reserved: shr.Reserved,
Metrics: sparkData[svc.Token], Metrics: sparkData[shr.Token],
CreatedAt: svc.CreatedAt.UnixMilli(), CreatedAt: shr.CreatedAt.UnixMilli(),
UpdatedAt: svc.UpdatedAt.UnixMilli(), UpdatedAt: shr.UpdatedAt.UnixMilli(),
}) })
} }

View File

@ -100,7 +100,7 @@ func (h *shareHandler) Handle(params service.ShareParams, principal *rest_model_
logrus.Debugf("allocated service '%v'", svcToken) logrus.Debugf("allocated service '%v'", svcToken)
reserved := params.Body.Reserved reserved := params.Body.Reserved
ssvc := &store.Service{ sshr := &store.Share{
ZId: svcZId, ZId: svcZId,
Token: svcToken, Token: svcToken,
ShareMode: params.Body.ShareMode, ShareMode: params.Body.ShareMode,
@ -109,12 +109,12 @@ func (h *shareHandler) Handle(params service.ShareParams, principal *rest_model_
Reserved: reserved, Reserved: reserved,
} }
if len(frontendEndpoints) > 0 { if len(frontendEndpoints) > 0 {
ssvc.FrontendEndpoint = &frontendEndpoints[0] sshr.FrontendEndpoint = &frontendEndpoints[0]
} else if ssvc.ShareMode == "private" { } else if sshr.ShareMode == "private" {
ssvc.FrontendEndpoint = &ssvc.ShareMode sshr.FrontendEndpoint = &sshr.ShareMode
} }
sid, err := str.CreateService(envId, ssvc, tx) sid, err := str.CreateShare(envId, sshr, tx)
if err != nil { if err != nil {
logrus.Errorf("error creating service record: %v", err) logrus.Errorf("error creating service record: %v", err)
return service.NewShareInternalServerError() return service.NewShareInternalServerError()

View File

@ -6,13 +6,13 @@ import (
"github.com/openziti-test-kitchen/zrok/controller/store" "github.com/openziti-test-kitchen/zrok/controller/store"
) )
func sparkDataForServices(svcs []*store.Service) (map[string][]int64, error) { func sparkDataForServices(shrs []*store.Share) (map[string][]int64, error) {
out := make(map[string][]int64) out := make(map[string][]int64)
if len(svcs) > 0 { if len(shrs) > 0 {
qapi := idb.QueryAPI(cfg.Influx.Org) qapi := idb.QueryAPI(cfg.Influx.Org)
result, err := qapi.Query(context.Background(), sparkFluxQuery(svcs)) result, err := qapi.Query(context.Background(), sparkFluxQuery(shrs))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -27,22 +27,22 @@ func sparkDataForServices(svcs []*store.Service) (map[string][]int64, error) {
if writeRate != nil { if writeRate != nil {
combinedRate += writeRate.(int64) combinedRate += writeRate.(int64)
} }
svcToken := result.Record().ValueByKey("service").(string) shrToken := result.Record().ValueByKey("share").(string)
svcMetrics := out[svcToken] shrMetrics := out[shrToken]
svcMetrics = append(svcMetrics, combinedRate) shrMetrics = append(shrMetrics, combinedRate)
out[svcToken] = svcMetrics out[shrToken] = shrMetrics
} }
} }
return out, nil return out, nil
} }
func sparkFluxQuery(svcs []*store.Service) string { func sparkFluxQuery(shrs []*store.Share) string {
svcFilter := "|> filter(fn: (r) =>" svcFilter := "|> filter(fn: (r) =>"
for i, svc := range svcs { for i, shr := range shrs {
if i > 0 { if i > 0 {
svcFilter += " or" svcFilter += " or"
} }
svcFilter += fmt.Sprintf(" r[\"service\"] == \"%v\"", svc.Token) svcFilter += fmt.Sprintf(" r[\"share\"] == \"%v\"", shr.Token)
} }
svcFilter += ")" svcFilter += ")"
query := "read = from(bucket: \"zrok\")" + query := "read = from(bucket: \"zrok\")" +

View File

@ -1,104 +0,0 @@
package store
import (
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
)
type Service struct {
Model
EnvironmentId int
ZId string
Token string
ShareMode string
BackendMode string
FrontendSelection *string
FrontendEndpoint *string
BackendProxyEndpoint *string
Reserved bool
}
func (self *Store) CreateService(envId int, svc *Service, tx *sqlx.Tx) (int, error) {
stmt, err := tx.Prepare("insert into services (environment_id, z_id, token, share_mode, backend_mode, frontend_selection, frontend_endpoint, backend_proxy_endpoint, reserved) values ($1, $2, $3, $4, $5, $6, $7, $8, $9) returning id")
if err != nil {
return 0, errors.Wrap(err, "error preparing services insert statement")
}
var id int
if err := stmt.QueryRow(envId, svc.ZId, svc.Token, svc.ShareMode, svc.BackendMode, svc.FrontendSelection, svc.FrontendEndpoint, svc.BackendProxyEndpoint, svc.Reserved).Scan(&id); err != nil {
return 0, errors.Wrap(err, "error executing services insert statement")
}
return id, nil
}
func (self *Store) GetService(id int, tx *sqlx.Tx) (*Service, error) {
svc := &Service{}
if err := tx.QueryRowx("select * from services where id = $1", id).StructScan(svc); err != nil {
return nil, errors.Wrap(err, "error selecting service by id")
}
return svc, nil
}
func (self *Store) GetAllServices(tx *sqlx.Tx) ([]*Service, error) {
rows, err := tx.Queryx("select * from services order by id")
if err != nil {
return nil, errors.Wrap(err, "error selecting all services")
}
var svcs []*Service
for rows.Next() {
svc := &Service{}
if err := rows.StructScan(svc); err != nil {
return nil, errors.Wrap(err, "error scanning service")
}
svcs = append(svcs, svc)
}
return svcs, nil
}
func (self *Store) FindServiceWithToken(svcToken string, tx *sqlx.Tx) (*Service, error) {
svc := &Service{}
if err := tx.QueryRowx("select * from services where token = $1", svcToken).StructScan(svc); err != nil {
return nil, errors.Wrap(err, "error selecting service by name")
}
return svc, nil
}
func (self *Store) FindServicesForEnvironment(envId int, tx *sqlx.Tx) ([]*Service, error) {
rows, err := tx.Queryx("select services.* from services where environment_id = $1", envId)
if err != nil {
return nil, errors.Wrap(err, "error selecting services by environment id")
}
var svcs []*Service
for rows.Next() {
svc := &Service{}
if err := rows.StructScan(svc); err != nil {
return nil, errors.Wrap(err, "error scanning service")
}
svcs = append(svcs, svc)
}
return svcs, nil
}
func (self *Store) UpdateService(svc *Service, tx *sqlx.Tx) error {
sql := "update services set z_id = $1, token = $2, share_mode = $3, backend_mode = $4, frontend_selection = $5, frontend_endpoint = $6, backend_proxy_endpoint = $7, reserved = $8, updated_at = current_timestamp where id = $9"
stmt, err := tx.Prepare(sql)
if err != nil {
return errors.Wrap(err, "error preparing services update statement")
}
_, err = stmt.Exec(svc.ZId, svc.Token, svc.ShareMode, svc.BackendMode, svc.FrontendSelection, svc.FrontendEndpoint, svc.BackendProxyEndpoint, svc.Reserved, svc.Id)
if err != nil {
return errors.Wrap(err, "error executing services update statement")
}
return nil
}
func (self *Store) DeleteService(id int, tx *sqlx.Tx) error {
stmt, err := tx.Prepare("delete from services where id = $1")
if err != nil {
return errors.Wrap(err, "error preparing services delete statement")
}
_, err = stmt.Exec(id)
if err != nil {
return errors.Wrap(err, "error executing services delete statement")
}
return nil
}

104
controller/store/share.go Normal file
View File

@ -0,0 +1,104 @@
package store
import (
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
)
type Share struct {
Model
EnvironmentId int
ZId string
Token string
ShareMode string
BackendMode string
FrontendSelection *string
FrontendEndpoint *string
BackendProxyEndpoint *string
Reserved bool
}
func (self *Store) CreateShare(envId int, shr *Share, tx *sqlx.Tx) (int, error) {
stmt, err := tx.Prepare("insert into shares (environment_id, z_id, token, share_mode, backend_mode, frontend_selection, frontend_endpoint, backend_proxy_endpoint, reserved) values ($1, $2, $3, $4, $5, $6, $7, $8, $9) returning id")
if err != nil {
return 0, errors.Wrap(err, "error preparing shares insert statement")
}
var id int
if err := stmt.QueryRow(envId, shr.ZId, shr.Token, shr.ShareMode, shr.BackendMode, shr.FrontendSelection, shr.FrontendEndpoint, shr.BackendProxyEndpoint, shr.Reserved).Scan(&id); err != nil {
return 0, errors.Wrap(err, "error executing shares insert statement")
}
return id, nil
}
func (self *Store) GetShare(id int, tx *sqlx.Tx) (*Share, error) {
shr := &Share{}
if err := tx.QueryRowx("select * from shares where id = $1", id).StructScan(shr); err != nil {
return nil, errors.Wrap(err, "error selecting share by id")
}
return shr, nil
}
func (self *Store) GetAllShares(tx *sqlx.Tx) ([]*Share, error) {
rows, err := tx.Queryx("select * from shares order by id")
if err != nil {
return nil, errors.Wrap(err, "error selecting all shares")
}
var shrs []*Share
for rows.Next() {
shr := &Share{}
if err := rows.StructScan(shr); err != nil {
return nil, errors.Wrap(err, "error scanning share")
}
shrs = append(shrs, shr)
}
return shrs, nil
}
func (self *Store) FindShareWithToken(shrToken string, tx *sqlx.Tx) (*Share, error) {
shr := &Share{}
if err := tx.QueryRowx("select * from shares where token = $1", shrToken).StructScan(shr); err != nil {
return nil, errors.Wrap(err, "error selecting share by token")
}
return shr, nil
}
func (self *Store) FindSharesForEnvironment(envId int, tx *sqlx.Tx) ([]*Share, error) {
rows, err := tx.Queryx("select shares.* from shares where environment_id = $1", envId)
if err != nil {
return nil, errors.Wrap(err, "error selecting shares by environment id")
}
var shrs []*Share
for rows.Next() {
shr := &Share{}
if err := rows.StructScan(shr); err != nil {
return nil, errors.Wrap(err, "error scanning share")
}
shrs = append(shrs, shr)
}
return shrs, nil
}
func (self *Store) UpdateShare(shr *Share, tx *sqlx.Tx) error {
sql := "update shares set z_id = $1, token = $2, share_mode = $3, backend_mode = $4, frontend_selection = $5, frontend_endpoint = $6, backend_proxy_endpoint = $7, reserved = $8, updated_at = current_timestamp where id = $9"
stmt, err := tx.Prepare(sql)
if err != nil {
return errors.Wrap(err, "error preparing shares update statement")
}
_, err = stmt.Exec(shr.ZId, shr.Token, shr.ShareMode, shr.BackendMode, shr.FrontendSelection, shr.FrontendEndpoint, shr.BackendProxyEndpoint, shr.Reserved, shr.Id)
if err != nil {
return errors.Wrap(err, "error executing shares update statement")
}
return nil
}
func (self *Store) DeleteShare(id int, tx *sqlx.Tx) error {
stmt, err := tx.Prepare("delete from shares where id = $1")
if err != nil {
return errors.Wrap(err, "error preparing shares delete statement")
}
_, err = stmt.Exec(id)
if err != nil {
return errors.Wrap(err, "error executing shares delete statement")
}
return nil
}

View File

@ -58,15 +58,15 @@ func (h *unshareHandler) Handle(params service.UnshareParams, principal *rest_mo
return service.NewUnshareNotFound() return service.NewUnshareNotFound()
} }
var ssvc *store.Service var sshr *store.Share
if svcs, err := str.FindServicesForEnvironment(senv.Id, tx); err == nil { if svcs, err := str.FindSharesForEnvironment(senv.Id, tx); err == nil {
for _, svc := range svcs { for _, svc := range svcs {
if svc.ZId == svcZId { if svc.ZId == svcZId {
ssvc = svc sshr = svc
break break
} }
} }
if ssvc == nil { if sshr == nil {
err := errors.Errorf("service with id '%v' not found for '%v'", svcZId, principal.Email) err := errors.Errorf("service with id '%v' not found for '%v'", svcZId, principal.Email)
logrus.Error(err) logrus.Error(err)
return service.NewUnshareNotFound() return service.NewUnshareNotFound()
@ -76,16 +76,16 @@ func (h *unshareHandler) Handle(params service.UnshareParams, principal *rest_mo
return service.NewUnshareInternalServerError() return service.NewUnshareInternalServerError()
} }
if ssvc.Reserved == params.Body.Reserved { if sshr.Reserved == params.Body.Reserved {
// single tag-based service deallocator; should work regardless of sharing mode // single tag-based service deallocator; should work regardless of sharing mode
if err := h.deallocateResources(senv, svcToken, svcZId, edge); err != nil { if err := h.deallocateResources(senv, svcToken, svcZId, edge); err != nil {
logrus.Errorf("error unsharing ziti resources for '%v': %v", ssvc, err) logrus.Errorf("error unsharing ziti resources for '%v': %v", sshr, err)
return service.NewUnshareInternalServerError() return service.NewUnshareInternalServerError()
} }
logrus.Debugf("deallocated service '%v'", svcToken) logrus.Debugf("deallocated service '%v'", svcToken)
if err := str.DeleteService(ssvc.Id, tx); err != nil { if err := str.DeleteShare(sshr.Id, tx); err != nil {
logrus.Errorf("error deactivating service '%v': %v", svcZId, err) logrus.Errorf("error deactivating service '%v': %v", svcZId, err)
return service.NewUnshareInternalServerError() return service.NewUnshareInternalServerError()
} }

View File

@ -24,7 +24,7 @@ func (h *updateShareHandler) Handle(params service.UpdateShareParams, principal
} }
defer func() { _ = tx.Rollback() }() defer func() { _ = tx.Rollback() }()
ssvc, err := str.FindServiceWithToken(svcToken, tx) sshr, err := str.FindShareWithToken(svcToken, tx)
if err != nil { if err != nil {
logrus.Errorf("service '%v' not found: %v", svcToken, err) logrus.Errorf("service '%v' not found: %v", svcToken, err)
return service.NewUpdateShareNotFound() return service.NewUpdateShareNotFound()
@ -38,7 +38,7 @@ func (h *updateShareHandler) Handle(params service.UpdateShareParams, principal
envFound := false envFound := false
for _, senv := range senvs { for _, senv := range senvs {
if senv.Id == ssvc.Id { if senv.Id == sshr.Id {
envFound = true envFound = true
break break
} }
@ -48,8 +48,8 @@ func (h *updateShareHandler) Handle(params service.UpdateShareParams, principal
return service.NewUpdateShareNotFound() return service.NewUpdateShareNotFound()
} }
ssvc.BackendProxyEndpoint = &backendProxyEndpoint sshr.BackendProxyEndpoint = &backendProxyEndpoint
if err := str.UpdateService(ssvc, tx); err != nil { if err := str.UpdateShare(sshr, tx); err != nil {
logrus.Errorf("error updating service '%v': %v", svcToken, err) logrus.Errorf("error updating service '%v': %v", svcToken, err)
return service.NewUpdateShareInternalServerError() return service.NewUpdateShareInternalServerError()
} }