3
0
Files
corteza/pkg/envoy/yaml/document.go
Tomaž Jerman 104bfb23de Update Envoy for new/extended resources
* Reports
* API GW
* Module field; user role filter
* Comment page block
2021-09-22 11:38:35 +02:00

423 lines
8.7 KiB
Go

package yaml
import (
"context"
"github.com/cortezaproject/corteza-server/pkg/envoy"
"github.com/cortezaproject/corteza-server/pkg/envoy/resource"
"github.com/cortezaproject/corteza-server/pkg/y7s"
"gopkg.in/yaml.v3"
)
type (
// Document defines the supported yaml structure
Document struct {
compose *compose
automation *automation
roles roleSet
users userSet
templates templateSet
applications applicationSet
apiGateway apiGatewaySet
reports reportSet
settings settingSet
rbac rbacRuleSet
locale resourceTranslationSet
cfg *EncoderConfig
}
)
func (doc *Document) UnmarshalYAML(n *yaml.Node) (err error) {
if err = n.Decode(&doc.compose); err != nil {
return
}
if err = n.Decode(&doc.automation); err != nil {
return
}
if doc.rbac, err = decodeRbac(n); err != nil {
return
}
if doc.locale, err = decodeLocale(n); err != nil {
return
}
return y7s.EachMap(n, func(k, v *yaml.Node) error {
switch k.Value {
case "roles":
return v.Decode(&doc.roles)
case "users":
return v.Decode(&doc.users)
case "templates":
return v.Decode(&doc.templates)
case "apigateway", "apigw":
return v.Decode(&doc.apiGateway)
case "reports":
return v.Decode(&doc.reports)
case "applications":
return v.Decode(&doc.applications)
case "settings":
return v.Decode(&doc.settings)
}
return nil
})
}
func (doc *Document) MarshalYAML() (interface{}, error) {
var err error
dn, _ := makeMap()
if doc.compose != nil {
doc.compose.EncoderConfig = doc.cfg
cn, err := encodeNode(doc.compose)
if err != nil {
return nil, err
}
dn, _ = inlineContent(dn, cn)
}
if doc.automation != nil {
doc.automation.EncoderConfig = doc.cfg
cn, err := encodeNode(doc.automation)
if err != nil {
return nil, err
}
dn, _ = inlineContent(dn, cn)
}
if doc.roles != nil {
doc.roles.configureEncoder(doc.cfg)
dn, err = encodeResource(dn, "roles", doc.roles, doc.cfg.MappedOutput, "handle")
if err != nil {
return nil, err
}
}
if doc.users != nil && len(doc.users) > 0 {
doc.users.configureEncoder(doc.cfg)
dn, err = encodeResource(dn, "users", doc.users, doc.cfg.MappedOutput, "handle")
if err != nil {
return nil, err
}
}
if doc.templates != nil && len(doc.templates) > 0 {
doc.templates.configureEncoder(doc.cfg)
dn, err = encodeResource(dn, "templates", doc.templates, doc.cfg.MappedOutput, "handle")
if err != nil {
return nil, err
}
}
if doc.reports != nil && len(doc.reports) > 0 {
doc.reports.configureEncoder(doc.cfg)
dn, err = encodeResource(dn, "reports", doc.reports, doc.cfg.MappedOutput, "handle")
if err != nil {
return nil, err
}
}
if doc.apiGateway != nil && len(doc.apiGateway) > 0 {
doc.apiGateway.configureEncoder(doc.cfg)
// API GW don't support map representation
// @todo use path+proto?
dn, err = addMap(dn,
"apigateway", doc.apiGateway,
)
if err != nil {
return nil, err
}
}
if doc.applications != nil && len(doc.applications) > 0 {
doc.applications.configureEncoder(doc.cfg)
// Applications don't support map representation
dn, err = addMap(dn,
"applications", doc.applications,
)
if err != nil {
return nil, err
}
}
if doc.settings != nil {
dn, err = encodeResource(dn, "settings", doc.settings, doc.cfg.MappedOutput, "name")
if err != nil {
return nil, err
}
}
if doc.locale != nil {
doc.templates.configureEncoder(doc.cfg)
dn, err = encodeResource(dn, "locale", doc.locale, doc.cfg.MappedOutput, "lang")
if err != nil {
return nil, err
}
}
if doc.rbac != nil && len(doc.rbac) > 0 {
// rbac doesn't support map representation
m, err := encodeNode(doc.rbac)
if err != nil {
return nil, err
}
dn, err = inlineContent(dn, m)
if err != nil {
return nil, err
}
}
return dn, nil
}
func (doc *Document) Decode(ctx context.Context) ([]resource.Interface, error) {
nn := make([]resource.Interface, 0, 100)
mm := make([]envoy.Marshaller, 0, 20)
if doc.compose != nil {
mm = append(mm, doc.compose)
}
if doc.roles != nil {
mm = append(mm, doc.roles)
}
if doc.users != nil {
mm = append(mm, doc.users)
}
if doc.templates != nil {
mm = append(mm, doc.templates)
}
if doc.automation != nil {
mm = append(mm, doc.automation)
}
if doc.applications != nil {
mm = append(mm, doc.applications)
}
if doc.reports != nil {
mm = append(mm, doc.reports)
}
if doc.apiGateway != nil {
mm = append(mm, doc.apiGateway)
}
if doc.settings != nil {
for _, s := range doc.settings {
mm = append(mm, s)
}
}
if doc.locale != nil {
mm = append(mm, doc.locale)
}
if doc.rbac != nil {
mm = append(mm, doc.rbac)
}
for _, m := range mm {
if tmp, err := m.MarshalEnvoy(); err != nil {
return nil, err
} else {
nn = append(nn, tmp...)
}
}
return nn, nil
}
func (doc *Document) addComposeNamespace(n *composeNamespace) {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Namespaces == nil {
doc.compose.Namespaces = make(composeNamespaceSet, 0, 3)
}
doc.compose.Namespaces = append(doc.compose.Namespaces, n)
}
func (doc *Document) addComposeModule(m *composeModule) {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Modules == nil {
doc.compose.Modules = make(composeModuleSet, 0)
}
doc.compose.Modules = append(doc.compose.Modules, m)
}
func (doc *Document) addComposeRecord(r *composeRecord) {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Records == nil {
doc.compose.Records = make(composeRecordSet, 0)
}
doc.compose.Records = append(doc.compose.Records, r)
}
func (doc *Document) addComposePage(p *composePage) {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Pages == nil {
doc.compose.Pages = make(composePageSet, 0)
}
doc.compose.Pages = append(doc.compose.Pages, p)
}
func (doc *Document) addComposeChart(c *composeChart) {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Charts == nil {
doc.compose.Charts = make(composeChartSet, 0)
}
doc.compose.Charts = append(doc.compose.Charts, c)
}
func (doc *Document) addAutomationWorkflow(m *automationWorkflow) {
if doc.automation == nil {
doc.automation = &automation{}
}
if doc.automation.Workflows == nil {
doc.automation.Workflows = make(automationWorkflowSet, 0)
}
doc.automation.Workflows = append(doc.automation.Workflows, m)
}
func (doc *Document) addApiGateway(a *apiGateway) {
doc.apiGateway = append(doc.apiGateway, a)
}
func (doc *Document) addReport(a *report) {
doc.reports = append(doc.reports, a)
}
func (doc *Document) addRole(r *role) {
if doc.roles == nil {
doc.roles = make(roleSet, 0, 20)
}
doc.roles = append(doc.roles, r)
}
func (doc *Document) addUser(u *user) {
if doc.users == nil {
doc.users = make(userSet, 0, 20)
}
doc.users = append(doc.users, u)
}
func (doc *Document) addTemplate(u *template) {
if doc.templates == nil {
doc.templates = make(templateSet, 0, 20)
}
doc.templates = append(doc.templates, u)
}
func (doc *Document) addApplication(a *application) {
if doc.applications == nil {
doc.applications = make(applicationSet, 0, 20)
}
doc.applications = append(doc.applications, a)
}
func (doc *Document) addSetting(s *setting) {
if doc.settings == nil {
doc.settings = make([]*setting, 0, 100)
}
doc.settings = append(doc.settings, s)
}
func (doc *Document) addRbacRule(r *rbacRule) {
if doc.rbac == nil {
doc.rbac = make(rbacRuleSet, 0, 100)
}
doc.rbac = append(doc.rbac, r)
}
func (doc *Document) addResourceTranslation(l *resourceTranslation) {
if doc.locale == nil {
doc.locale = make(resourceTranslationSet, 0, 100)
}
doc.locale = append(doc.locale, l)
}
func (doc *Document) nestComposeModule(ns string, m *composeModule) error {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Namespaces == nil {
return composeNamespaceErrNotFound(ns)
}
return doc.compose.Namespaces.addComposeModule(ns, m)
}
func (doc *Document) nestComposePage(ns string, p *composePage) error {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Namespaces == nil {
return composeNamespaceErrNotFound(ns)
}
return doc.compose.Namespaces.addComposePage(ns, p)
}
func (doc *Document) nestComposePageChild(parent string, p *composePage) error {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Namespaces == nil {
return composeNamespaceErrNotFound(parent)
}
return doc.compose.Pages.addComposePage(parent, p)
}
func (doc *Document) nestComposeChart(ns string, c *composeChart) error {
if doc.compose == nil {
doc.compose = &compose{}
}
if doc.compose.Namespaces == nil {
return composeNamespaceErrNotFound(ns)
}
return doc.compose.Namespaces.addComposeChart(ns, c)
}