Skip to content

Commit 0f1cac6

Browse files
committed
Another pack of test
1 parent e51c0c1 commit 0f1cac6

11 files changed

Lines changed: 225 additions & 50 deletions

File tree

cmd/heimdall/heimdall.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ var (
2929

3030
func init() {
3131

32-
flag.StringVar(&configFile, `conf`, `/etc/heimdall/heimdall.yaml`, `config file`)
32+
flag.StringVar(&configFile, `conf`, `/Users/ivanhladush/git/heimdall/configs/local.yaml`, `config file`)
3333
flag.Parse()
3434

3535
}

configs/local.yaml

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# database settings
32
database:
43
connection_string: "postgres://heimdall:heimdall@postgres:5432/heimdall?sslmode=disable"
@@ -8,14 +7,14 @@ pool:
87
size: 5
98
sleep: 500
109

11-
# plugins location
12-
plugin_directory: ./plugins
10+
# # plugins location
11+
# plugin_directory: ./plugins
1312

14-
# auth plugin
15-
auth:
16-
plugin: ./plugins/auth_header.so
17-
context:
18-
header: X-Heimdall-User
13+
# # auth plugin
14+
# auth:
15+
# plugin: ./plugins/auth_header.so
16+
# context:
17+
# header: X-Heimdall-User
1918

2019
# supported commands
2120
commands:
@@ -36,6 +35,34 @@ clusters:
3635
status: active
3736
version: 0.0.1
3837
description: Just a localhost
38+
rbacs:
39+
- trino
40+
- trino2
3941
tags:
4042
- type:localhost
41-
- data:local
43+
- data:local
44+
45+
rbacs:
46+
- name: trino
47+
type: apache_ranger
48+
service_name: TrinoRanger
49+
sync_interval_in_minutes: 1
50+
client:
51+
url: http://localhost:6080
52+
username: admin
53+
password: admin
54+
parser:
55+
type: trino
56+
default_catalog: hive
57+
58+
- name: trino2
59+
type: apache_ranger
60+
service_name: TrinoRanger
61+
sync_interval_in_minutes: 1
62+
client:
63+
url: http://localhost:6080
64+
username: admin
65+
password:
66+
parser:
67+
type: trino
68+
default_catalog: hive

internal/pkg/heimdall/heimdall.go

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package heimdall
22

33
import (
4+
"context"
45
"fmt"
56
"net/http"
67
"net/http/httputil"
@@ -20,6 +21,7 @@ import (
2021
"github.com/patterninc/heimdall/pkg/object/command"
2122
"github.com/patterninc/heimdall/pkg/object/job"
2223
"github.com/patterninc/heimdall/pkg/plugin"
24+
"github.com/patterninc/heimdall/pkg/rbac"
2325
)
2426

2527
const (
@@ -42,6 +44,7 @@ type Heimdall struct {
4244
Server *server.Server `yaml:"server,omitempty" json:"server,omitempty"`
4345
Commands command.Commands `yaml:"commands,omitempty" json:"commands,omitempty"`
4446
Clusters cluster.Clusters `yaml:"clusters,omitempty" json:"clusters,omitempty"`
47+
RBACs rbac.RBACs `yaml:"rbacs,omitempty" json:"rbacs,omitempty"`
4548
JobsDirectory string `yaml:"jobs_directory,omitempty" json:"jobs_directory,omitempty"`
4649
ArchiveDirectory string `yaml:"archive_directory,omitempty" json:"archive_directory,omitempty"`
4750
ResultDirectory string `yaml:"result_directory,omitempty" json:"result_directory,omitempty"`
@@ -79,41 +82,48 @@ func (h *Heimdall) Init() error {
7982
}
8083
h.agentName = fmt.Sprintf("%s-%d", strings.ToLower(hostname), time.Now().UnixMicro())
8184

82-
// let's load all the plugins
83-
plugins, err := h.loadPlugins()
84-
if err != nil {
85-
return err
86-
}
85+
// // let's load all the plugins
86+
// plugins, err := h.loadPlugins()
87+
// if err != nil {
88+
// return err
89+
// }
8790

88-
h.commandHandlers = make(map[string]plugin.Handler)
91+
// h.commandHandlers = make(map[string]plugin.Handler)
8992

9093
// process commands / add default values if missing, write commands to db
91-
for _, c := range h.Commands {
92-
93-
// set defaults for missing properties
94-
if err := c.Init(); err != nil {
95-
return err
96-
}
97-
98-
// set command handlers
99-
pluginNew, found := plugins[c.Plugin]
100-
if !found {
101-
return fmt.Errorf(formatErrUnknownPlugin, c.Plugin)
102-
}
103-
104-
handler, err := pluginNew(c.Context)
105-
if err != nil {
106-
return err
107-
}
108-
h.commandHandlers[c.ID] = handler
109-
110-
// let's record command in the database
111-
if err := h.commandUpsert(c); err != nil {
112-
return err
94+
// for _, c := range h.Commands {
95+
96+
// // set defaults for missing properties
97+
// if err := c.Init(); err != nil {
98+
// return err
99+
// }
100+
101+
// // // set command handlers
102+
// // pluginNew, found := plugins[c.Plugin]
103+
// // if !found {
104+
// // return fmt.Errorf(formatErrUnknownPlugin, c.Plugin)
105+
// // }
106+
107+
// // handler, err := pluginNew(c.Context)
108+
// // if err != nil {
109+
// // return err
110+
// // }
111+
// // h.commandHandlers[c.ID] = handler
112+
113+
// // let's record command in the database
114+
// if err := h.commandUpsert(c); err != nil {
115+
// return err
116+
// }
117+
118+
// }
119+
120+
rbacsByName := map[string]rbac.RBAC{}
121+
for rbacName, r := range h.RBACs {
122+
if err := r.Init(context.Background()); err != nil {
123+
return fmt.Errorf("failed to init rbac %s: %w", rbacName, err)
113124
}
114-
125+
rbacsByName[rbacName] = r
115126
}
116-
117127
// process commands / add default values if missing, write commands to db
118128
for _, c := range h.Clusters {
119129

@@ -122,11 +132,19 @@ func (h *Heimdall) Init() error {
122132
return err
123133
}
124134

125-
// let's record command in the database
126-
if err := h.clusterUpsert(c); err != nil {
127-
return err
135+
// // let's record command in the database
136+
// if err := h.clusterUpsert(c); err != nil {
137+
// return err
138+
// }
139+
if len(c.RBACNames) > 0 {
140+
for _, rbacName := range c.RBACNames {
141+
r, found := rbacsByName[rbacName]
142+
if !found {
143+
return fmt.Errorf("failed to find rbac %s for cluster %s", rbacName, c.Name)
144+
}
145+
c.RBACs = append(c.RBACs, r)
146+
}
128147
}
129-
130148
}
131149

132150
// start janitor

pkg/object/cluster/cluster.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/patterninc/heimdall/pkg/object"
77
"github.com/patterninc/heimdall/pkg/object/status"
8+
"github.com/patterninc/heimdall/pkg/rbac"
89
)
910

1011
var (
@@ -14,6 +15,8 @@ var (
1415
type Cluster struct {
1516
object.Object `yaml:",inline" json:",inline"`
1617
Status status.Status `yaml:"status,omitempty" json:"status,omitempty"`
18+
RBACNames []string `yaml:"rbacs,omitempty" json:"rbacs,omitempty"`
19+
RBACs []rbac.RBAC `yaml:"-" json:"-"`
1720
}
1821

1922
type Clusters map[string]*Cluster

pkg/rbac/ranger/client.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"net/http"
1010
"strings"
1111
"time"
12+
13+
"gopkg.in/yaml.v3"
1214
)
1315

1416
const (
@@ -46,6 +48,32 @@ type getResponse struct {
4648

4749
//go:generate go run github.com/vektra/mockery/v2@v2.53.4 --name=Client --output=./mocks --outpkg=mocks
4850

51+
type ClientWrapper struct {
52+
Client Client
53+
}
54+
55+
func (aw *ClientWrapper) UnmarshalYAML(value *yaml.Node) error {
56+
var cl client
57+
if err := value.Decode(&cl); err != nil {
58+
return err
59+
}
60+
aw.Client = &cl
61+
cl.client = &http.Client{}
62+
return nil
63+
}
64+
65+
func (cw *ClientWrapper) GetUsers() (map[string]*User, error) {
66+
return cw.Client.GetUsers()
67+
}
68+
69+
func (cw *ClientWrapper) GetGroups() (map[string]*Group, error) {
70+
return cw.Client.GetGroups()
71+
}
72+
73+
func (cw *ClientWrapper) GetPolicies(serviceName string) ([]*Policy, error) {
74+
return cw.Client.GetPolicies(serviceName)
75+
}
76+
4977
type Client interface {
5078
GetUsers() (map[string]*User, error)
5179
GetGroups() (map[string]*Group, error)

pkg/rbac/ranger/policy.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ func (p *Policy) controlTableAccess(a *parser.TableAccess) bool {
150150
continue
151151
}
152152
}
153-
154153
return true
155154
}
156155
return false

pkg/rbac/ranger/ranger.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ import (
1010
)
1111

1212
type ApacheRanger struct {
13-
Name string `yaml:"name,omitempty" json:"name,omitempty"`
14-
ServiceName string `yaml:"service_name,omitempty" json:"service_name,omitempty"`
15-
Client Client
16-
SyncIntervalInMinutes int `yaml:"sync_interval_in_minutes,omitempty" json:"sync_interval_in_minutes,omitempty"`
13+
Name string `yaml:"name,omitempty" json:"name,omitempty"`
14+
ServiceName string `yaml:"service_name,omitempty" json:"service_name,omitempty"`
15+
Client ClientWrapper `yaml:"client,omitempty" json:"client,omitempty"`
16+
SyncIntervalInMinutes int `yaml:"sync_interval_in_minutes,omitempty" json:"sync_interval_in_minutes,omitempty"`
1717
AccessReceiver parser.AccessReceiver
1818
permitionsByUser map[string]*UserPermitions
19+
Parser ParserConfig `yaml:"parser,omitempty" json:"parser,omitempty"`
20+
}
21+
22+
type ParserConfig struct {
23+
Type string `yaml:"type,omitempty" json:"type,omitempty"`
24+
DefaultCatalog string `yaml:"default_catalog,omitempty" json:"default_catalog,omitempty"`
1925
}
2026

2127
type PermitionStatus int
@@ -98,3 +104,7 @@ func (ar *ApacheRanger) startSyncPolicies(ctx context.Context) {
98104
}
99105
}()
100106
}
107+
108+
func (r *ApacheRanger) GetName() string {
109+
return r.Name
110+
}

pkg/rbac/rbac.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,79 @@ package rbac
22

33
import (
44
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/patterninc/heimdall/pkg/rbac/ranger"
9+
parserFactory "github.com/patterninc/heimdall/pkg/sql/parser/factory"
10+
"gopkg.in/yaml.v3"
11+
)
12+
13+
var (
14+
ErrRBACIDsAreNotUnique = errors.New("rbac IDs are not unique")
515
)
616

717
type RBAC interface {
818
Init(ctx context.Context) error
919
HasAccess(user string, query string) (bool, error)
20+
GetName() string
21+
}
22+
23+
type RBACs map[string]RBAC
24+
25+
func (c *RBACs) UnmarshalYAML(unmarshal func(interface{}) error) error {
26+
27+
var temp RBACConfig
28+
29+
if err := unmarshal(&temp); err != nil {
30+
return err
31+
}
32+
33+
items := make(map[string]RBAC)
34+
35+
for _, t := range temp.RBAC {
36+
items[t.GetName()] = t
37+
}
38+
39+
if len(temp.RBAC) != len(items) {
40+
return ErrRBACIDsAreNotUnique
41+
}
42+
43+
*c = items
44+
45+
return nil
46+
47+
}
48+
49+
type RBACConfig struct {
50+
RBAC []RBAC
51+
}
52+
53+
// Implements custom unmarshaling based on `type` field in YAML
54+
func (c *RBACConfig) UnmarshalYAML(value *yaml.Node) error {
55+
for _, value := range value.Content {
56+
var probe struct {
57+
Type string `yaml:"type"`
58+
}
59+
if err := value.Decode(&probe); err != nil {
60+
return err
61+
}
62+
63+
switch probe.Type {
64+
case "apache_ranger":
65+
var r ranger.ApacheRanger
66+
if err := value.Decode(&r); err != nil {
67+
return err
68+
}
69+
c.RBAC = append(c.RBAC, &r)
70+
parser, err := parserFactory.CreateParserByType(r.Parser.Type, r.Parser.DefaultCatalog)
71+
if err != nil {
72+
return err
73+
}
74+
r.AccessReceiver = parser
75+
default:
76+
return fmt.Errorf("unknown RBAC type: %s", probe.Type)
77+
}
78+
}
79+
return nil
1080
}

pkg/sql/parser/factory/factory.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package factory
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/patterninc/heimdall/pkg/sql/parser"
7+
"github.com/patterninc/heimdall/pkg/sql/parser/trino"
8+
)
9+
10+
func CreateParserByType(typ string, defaultCatalog string) (parser.AccessReceiver, error) {
11+
switch typ {
12+
case "trino":
13+
return trino.NewTrinoAccessReceiver(defaultCatalog), nil
14+
default:
15+
return nil, fmt.Errorf("unknown parser type: %s", typ)
16+
}
17+
}

0 commit comments

Comments
 (0)