Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
1295 lines
30 KiB
Go
Generated
1295 lines
30 KiB
Go
Generated
package envoy
|
|
|
|
// This file is auto-generated.
|
|
//
|
|
// Changes to this file may cause incorrect behavior and will be lost if
|
|
// the code is regenerated.
|
|
//
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/cortezaproject/corteza/server/pkg/dal"
|
|
"github.com/cortezaproject/corteza/server/pkg/envoyx"
|
|
"github.com/cortezaproject/corteza/server/pkg/id"
|
|
"github.com/cortezaproject/corteza/server/store"
|
|
"github.com/cortezaproject/corteza/server/system/types"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type (
|
|
// StoreDecoder is responsible for generating Envoy nodes from already stored
|
|
// resources which can then be managed by Envoy and imported via an encoder.
|
|
StoreDecoder struct{}
|
|
|
|
filterWrap struct {
|
|
rt string
|
|
f envoyx.ResourceFilter
|
|
}
|
|
)
|
|
|
|
const (
|
|
paramsKeyStorer = "storer"
|
|
paramsKeyDAL = "dal"
|
|
)
|
|
|
|
var (
|
|
// @todo temporary fix to make unused pkg/id not throw errors
|
|
_ = id.Next
|
|
)
|
|
|
|
// Decode returns a set of envoy nodes based on the provided params
|
|
//
|
|
// StoreDecoder expects the DecodeParam of `storer` and `dal` which conform
|
|
// to the store.Storer and dal.FullService interfaces.
|
|
func (d StoreDecoder) Decode(ctx context.Context, p envoyx.DecodeParams) (out envoyx.NodeSet, err error) {
|
|
// @todo we can optionally not require them based on what we're doing
|
|
s, err := d.getStorer(p)
|
|
if err != nil {
|
|
return
|
|
}
|
|
dl, err := d.getDal(p)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return d.decode(ctx, s, dl, p)
|
|
}
|
|
|
|
func (d StoreDecoder) decode(ctx context.Context, s store.Storer, dl dal.FullService, p envoyx.DecodeParams) (out envoyx.NodeSet, err error) {
|
|
// Preprocessing and basic filtering (to omit what this decoder can't handle)
|
|
wrappedFilters := d.prepFilters(p.Filter)
|
|
|
|
// Get all scoped nodes
|
|
scopedNodes, err := d.getScopeNodes(ctx, s, dl, wrappedFilters)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// Get all reference nodes
|
|
refNodes, refRefs, err := d.getReferenceNodes(ctx, s, dl, wrappedFilters)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// Process filters to get the envoy nodes
|
|
err = func() (err error) {
|
|
var aux envoyx.NodeSet
|
|
for i, wf := range wrappedFilters {
|
|
switch wf.rt {
|
|
case types.ApplicationResourceType:
|
|
aux, err = d.decodeApplication(ctx, s, dl, d.makeApplicationFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.ApigwRouteResourceType:
|
|
aux, err = d.decodeApigwRoute(ctx, s, dl, d.makeApigwRouteFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.ApigwFilterResourceType:
|
|
aux, err = d.decodeApigwFilter(ctx, s, dl, d.makeApigwFilterFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.AuthClientResourceType:
|
|
aux, err = d.decodeAuthClient(ctx, s, dl, d.makeAuthClientFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.QueueResourceType:
|
|
aux, err = d.decodeQueue(ctx, s, dl, d.makeQueueFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.ReportResourceType:
|
|
aux, err = d.decodeReport(ctx, s, dl, d.makeReportFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.RoleResourceType:
|
|
aux, err = d.decodeRole(ctx, s, dl, d.makeRoleFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.TemplateResourceType:
|
|
aux, err = d.decodeTemplate(ctx, s, dl, d.makeTemplateFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.UserResourceType:
|
|
aux, err = d.decodeUser(ctx, s, dl, d.makeUserFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.DalConnectionResourceType:
|
|
aux, err = d.decodeDalConnection(ctx, s, dl, d.makeDalConnectionFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
case types.DalSensitivityLevelResourceType:
|
|
aux, err = d.decodeDalSensitivityLevel(ctx, s, dl, d.makeDalSensitivityLevelFilter(scopedNodes[i], refNodes[i], wf.f))
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
default:
|
|
aux, err = d.extendDecoder(ctx, s, dl, p, wf.rt, refNodes[i], wf.f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, a := range aux {
|
|
a.Identifiers = a.Identifiers.Merge(wf.f.Identifiers)
|
|
a.References = envoyx.MergeRefs(a.References, refRefs[i])
|
|
}
|
|
out = append(out, aux...)
|
|
}
|
|
}
|
|
return
|
|
}()
|
|
if err != nil {
|
|
err = errors.Wrap(err, "failed to decode filters")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource application
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeApplication(ctx context.Context, s store.Storer, dl dal.FullService, f types.ApplicationFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchApplications(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = ApplicationToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func ApplicationToEnvoyNode(r *types.Application) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.OwnerID > 0 {
|
|
refs["OwnerID"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.OwnerID),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.ApplicationResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeApplicationFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.ApplicationFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.ApplicationID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Name = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource apigwRoute
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeApigwRoute(ctx context.Context, s store.Storer, dl dal.FullService, f types.ApigwRouteFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchApigwRoutes(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = ApigwRouteToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
aux, err := d.extendedApigwRouteDecoder(ctx, s, dl, f, out)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, aux...)
|
|
|
|
return
|
|
}
|
|
|
|
func ApigwRouteToEnvoyNode(r *types.ApigwRoute) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.Group > 0 {
|
|
refs["Group"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:apigw-group",
|
|
Identifiers: envoyx.MakeIdentifiers(r.Group),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.ApigwRouteResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeApigwRouteFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.ApigwRouteFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.ApigwRouteID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Endpoint = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource apigwFilter
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeApigwFilter(ctx context.Context, s store.Storer, dl dal.FullService, f types.ApigwFilterFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchApigwFilters(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = ApigwFilterToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func ApigwFilterToEnvoyNode(r *types.ApigwFilter) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.Route > 0 {
|
|
refs["Route"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:apigw-route",
|
|
Identifiers: envoyx.MakeIdentifiers(r.Route),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.ApigwFilterResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeApigwFilterFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.ApigwFilterFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.ApigwFilterID = id.Strings(ids...)
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource authClient
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeAuthClient(ctx context.Context, s store.Storer, dl dal.FullService, f types.AuthClientFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchAuthClients(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = AuthClientToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func AuthClientToEnvoyNode(r *types.AuthClient) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.OwnedBy > 0 {
|
|
refs["OwnedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.OwnedBy),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
refs = envoyx.MergeRefs(refs, decodeAuthClientRefs(r))
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.AuthClientResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeAuthClientFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.AuthClientFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.AuthClientID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource queue
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeQueue(ctx context.Context, s store.Storer, dl dal.FullService, f types.QueueFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchQueues(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = QueueToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func QueueToEnvoyNode(r *types.Queue) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.ID,
|
|
r.Queue,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.QueueResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeQueueFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.QueueFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.QueueID = id.Strings(ids...)
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource report
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeReport(ctx context.Context, s store.Storer, dl dal.FullService, f types.ReportFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchReports(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = ReportToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func ReportToEnvoyNode(r *types.Report) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.OwnedBy > 0 {
|
|
refs["OwnedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.OwnedBy),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.ReportResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeReportFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.ReportFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.ReportID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource role
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeRole(ctx context.Context, s store.Storer, dl dal.FullService, f types.RoleFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchRoles(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = RoleToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func RoleToEnvoyNode(r *types.Role) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.RoleResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeRoleFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.RoleFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.RoleID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource template
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeTemplate(ctx context.Context, s store.Storer, dl dal.FullService, f types.TemplateFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchTemplates(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = TemplateToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func TemplateToEnvoyNode(r *types.Template) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.OwnerID > 0 {
|
|
refs["OwnerID"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.OwnerID),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.TemplateResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeTemplateFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.TemplateFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.TemplateID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource user
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeUser(ctx context.Context, s store.Storer, dl dal.FullService, f types.UserFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchUsers(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = UserToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func UserToEnvoyNode(r *types.User) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.UserGroupID > 0 {
|
|
refs["UserGroupID"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user-group",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UserGroupID),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.UserResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeUserFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.UserFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.UserID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
ar, ok = refs["UserGroupID"]
|
|
if ok {
|
|
out.UserGroupID = ar.Resource.GetID()
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource dalConnection
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeDalConnection(ctx context.Context, s store.Storer, dl dal.FullService, f types.DalConnectionFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchDalConnections(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = DalConnectionToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func DalConnectionToEnvoyNode(r *types.DalConnection) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
refs = envoyx.MergeRefs(refs, decodeDalConnectionRefs(r))
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.DalConnectionResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeDalConnectionFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.DalConnectionFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.DalConnectionID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Functions for resource dalSensitivityLevel
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) decodeDalSensitivityLevel(ctx context.Context, s store.Storer, dl dal.FullService, f types.DalSensitivityLevelFilter) (out envoyx.NodeSet, err error) {
|
|
// @todo this might need to be improved.
|
|
// Currently, no resource is vast enough to pose a problem.
|
|
rr, _, err := store.SearchDalSensitivityLevels(ctx, s, f)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, r := range rr {
|
|
var n *envoyx.Node
|
|
n, err = DalSensitivityLevelToEnvoyNode(r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
out = append(out, n)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func DalSensitivityLevelToEnvoyNode(r *types.DalSensitivityLevel) (node *envoyx.Node, err error) {
|
|
// Identifiers
|
|
ii := envoyx.MakeIdentifiers(
|
|
r.Handle,
|
|
r.ID,
|
|
)
|
|
|
|
// Handle references
|
|
// Omit any non-defined values
|
|
refs := map[string]envoyx.Ref{}
|
|
if r.CreatedBy > 0 {
|
|
refs["CreatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.CreatedBy),
|
|
}
|
|
}
|
|
if r.DeletedBy > 0 {
|
|
refs["DeletedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.DeletedBy),
|
|
}
|
|
}
|
|
if r.UpdatedBy > 0 {
|
|
refs["UpdatedBy"] = envoyx.Ref{
|
|
ResourceType: "corteza::system:user",
|
|
Identifiers: envoyx.MakeIdentifiers(r.UpdatedBy),
|
|
}
|
|
}
|
|
|
|
var scope envoyx.Scope
|
|
|
|
node = &envoyx.Node{
|
|
Resource: r,
|
|
|
|
ResourceType: types.DalSensitivityLevelResourceType,
|
|
Identifiers: ii,
|
|
References: refs,
|
|
Scope: scope,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) makeDalSensitivityLevelFilter(scope *envoyx.Node, refs map[string]*envoyx.Node, auxf envoyx.ResourceFilter) (out types.DalSensitivityLevelFilter) {
|
|
out.Limit = auxf.Limit
|
|
|
|
ids, hh := auxf.Identifiers.Idents()
|
|
_ = ids
|
|
_ = hh
|
|
|
|
out.DalSensitivityLevelID = id.Strings(ids...)
|
|
|
|
if len(hh) > 0 {
|
|
out.Handle = hh[0]
|
|
}
|
|
|
|
// Refs
|
|
var (
|
|
ar *envoyx.Node
|
|
ok bool
|
|
)
|
|
_ = ar
|
|
_ = ok
|
|
|
|
return
|
|
}
|
|
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
// Utilities
|
|
// // // // // // // // // // // // // // // // // // // // // // // // //
|
|
|
|
func (d StoreDecoder) getStorer(p envoyx.DecodeParams) (s store.Storer, err error) {
|
|
aux, ok := p.Params[paramsKeyStorer]
|
|
if ok {
|
|
s, ok = aux.(store.Storer)
|
|
if ok {
|
|
return
|
|
}
|
|
}
|
|
|
|
err = errors.Errorf("store decoder expects a storer conforming to store.Storer interface")
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) getDal(p envoyx.DecodeParams) (dl dal.FullService, err error) {
|
|
aux, ok := p.Params[paramsKeyDAL]
|
|
if ok {
|
|
dl, ok = aux.(dal.FullService)
|
|
if ok {
|
|
return
|
|
}
|
|
}
|
|
|
|
err = errors.Errorf("store decoder expects a DAL conforming to dal.FullService interface")
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) prepFilters(ff map[string]envoyx.ResourceFilter) (out []filterWrap) {
|
|
out = make([]filterWrap, 0, len(ff))
|
|
for rt, f := range ff {
|
|
// Handle resources that don't belong to this decoder
|
|
if !strings.HasPrefix(rt, "corteza::system") {
|
|
continue
|
|
}
|
|
|
|
out = append(out, filterWrap{rt: rt, f: f})
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (d StoreDecoder) getScopeNodes(ctx context.Context, s store.Storer, dl dal.FullService, ff []filterWrap) (scopes envoyx.NodeSet, err error) {
|
|
// Get all requested scopes
|
|
scopes = make(envoyx.NodeSet, len(ff))
|
|
|
|
// @note skipping scope logic since it's currently only supported within
|
|
// Compose resources.
|
|
|
|
return
|
|
}
|
|
|
|
// getReferenceNodes returns all of the nodes referenced by the nodes defined by the filters
|
|
//
|
|
// The nodes are provided as a slice (the same order as the filters) and as a map for easier lookups.
|
|
func (d StoreDecoder) getReferenceNodes(ctx context.Context, s store.Storer, dl dal.FullService, ff []filterWrap) (nodes []map[string]*envoyx.Node, refs []map[string]envoyx.Ref, err error) {
|
|
nodes = make([]map[string]*envoyx.Node, len(ff))
|
|
refs = make([]map[string]envoyx.Ref, len(ff))
|
|
err = func() (err error) {
|
|
for i, a := range ff {
|
|
if len(a.f.Refs) == 0 {
|
|
continue
|
|
}
|
|
|
|
auxr := make(map[string]*envoyx.Node, len(a.f.Refs))
|
|
auxa := make(map[string]envoyx.Ref)
|
|
for field, ref := range a.f.Refs {
|
|
f := ref.ResourceFilter()
|
|
aux, err := d.decode(ctx, s, dl, envoyx.DecodeParams{
|
|
Type: envoyx.DecodeTypeStore,
|
|
Filter: f,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// @todo consider changing this.
|
|
// Currently it's required because the .decode may return some
|
|
// nested nodes as well.
|
|
// Consider a flag or a new function.
|
|
aux = envoyx.NodesForResourceType(ref.ResourceType, aux...)
|
|
if len(aux) == 0 {
|
|
return fmt.Errorf("invalid reference %v", ref)
|
|
}
|
|
if len(aux) > 1 {
|
|
return fmt.Errorf("ambiguous reference: too many resources returned %v", a.f)
|
|
}
|
|
|
|
auxr[field] = aux[0]
|
|
auxa[field] = aux[0].ToRef()
|
|
}
|
|
|
|
nodes[i] = auxr
|
|
refs[i] = auxa
|
|
}
|
|
return
|
|
}()
|
|
if err != nil {
|
|
err = errors.Wrap(err, "failed to decode node references")
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|