Skip to content

Commit a3a0dad

Browse files
[BB-1783] Update connector to use ResourceSyncerV2 and SessionStorage as cache (#13)
* Update connector to use ResourceSyncerV2 and SessionStorage as cache * avoid manual pagination and populate cache on demand
1 parent af32aa0 commit a3a0dad

File tree

8 files changed

+186
-189
lines changed

8 files changed

+186
-189
lines changed

cmd/baton-onelogin/main.go

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,24 @@ package main
22

33
import (
44
"context"
5-
"fmt"
6-
"os"
75

86
cfg "github.com/conductorone/baton-onelogin/pkg/config"
97

108
"github.com/conductorone/baton-onelogin/pkg/connector"
11-
configSchema "github.com/conductorone/baton-sdk/pkg/config"
12-
"github.com/conductorone/baton-sdk/pkg/connectorbuilder"
13-
14-
"github.com/conductorone/baton-sdk/pkg/types"
15-
"github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
16-
"go.uber.org/zap"
9+
"github.com/conductorone/baton-sdk/pkg/config"
10+
"github.com/conductorone/baton-sdk/pkg/connectorrunner"
1711
)
1812

1913
var version = "dev"
2014

2115
func main() {
2216
ctx := context.Background()
23-
_, cmd, err := configSchema.DefineConfiguration(
17+
config.RunConnector(
2418
ctx,
2519
"baton-onelogin",
26-
getConnector,
20+
version,
2721
cfg.Config,
22+
connector.New,
23+
connectorrunner.WithSessionStoreEnabled(),
2824
)
29-
if err != nil {
30-
fmt.Fprintln(os.Stderr, err.Error())
31-
os.Exit(1)
32-
}
33-
34-
cmd.Version = version
35-
err = cmd.Execute()
36-
if err != nil {
37-
fmt.Fprintln(os.Stderr, err.Error())
38-
os.Exit(1)
39-
}
40-
}
41-
42-
func getConnector(ctx context.Context, cc *cfg.Onelogin) (types.ConnectorServer, error) {
43-
l := ctxzap.Extract(ctx)
44-
if err := cfg.ValidateConfig(cc); err != nil {
45-
return nil, err
46-
}
47-
cb, err := connector.New(ctx, cc.OneloginClientId, cc.OneloginClientSecret, cc.Subdomain, cc.PrivilegesEnabled)
48-
if err != nil {
49-
l.Error("error creating connector", zap.Error(err))
50-
return nil, err
51-
}
52-
53-
c, err := connectorbuilder.NewConnector(ctx, cb)
54-
if err != nil {
55-
l.Error("error creating connector", zap.Error(err))
56-
return nil, err
57-
}
58-
59-
return c, nil
6025
}

pkg/connector/apps.go

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77

88
"github.com/conductorone/baton-onelogin/pkg/onelogin"
99
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
10-
"github.com/conductorone/baton-sdk/pkg/annotations"
11-
"github.com/conductorone/baton-sdk/pkg/pagination"
1210
ent "github.com/conductorone/baton-sdk/pkg/types/entitlement"
1311
"github.com/conductorone/baton-sdk/pkg/types/grant"
1412
rs "github.com/conductorone/baton-sdk/pkg/types/resource"
@@ -48,10 +46,11 @@ func appResource(app *onelogin.App) (*v2.Resource, error) {
4846
return resource, nil
4947
}
5048

51-
func (a *appResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
52-
bag, cursor, err := parsePageToken(pt.Token, &v2.ResourceId{ResourceType: resourceTypeApp.Id})
49+
func (a *appResourceType) List(ctx context.Context, _ *v2.ResourceId, attr rs.SyncOpAttrs) ([]*v2.Resource, *rs.SyncOpResults, error) {
50+
token := attr.PageToken.Token
51+
bag, cursor, err := parsePageToken(token, &v2.ResourceId{ResourceType: resourceTypeApp.Id})
5352
if err != nil {
54-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for application list: %w", err)
53+
return nil, nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for application list: %w", err)
5554
}
5655

5756
apps, nextCursor, err := a.client.GetApps(
@@ -62,12 +61,12 @@ func (a *appResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagina
6261
},
6362
)
6463
if err != nil {
65-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to list apps: %w", err)
64+
return nil, nil, fmt.Errorf("onelogin-connector: failed to list apps: %w", err)
6665
}
6766

6867
nextPage, err := bag.NextToken(nextCursor)
6968
if err != nil {
70-
return nil, "", nil, fmt.Errorf("onelogin-connector:failed to generate next pagination token for applications: %w", err)
69+
return nil, nil, fmt.Errorf("onelogin-connector:failed to generate next pagination token for applications: %w", err)
7170
}
7271

7372
var rv []*v2.Resource
@@ -76,16 +75,18 @@ func (a *appResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagina
7675
ur, err := appResource(&appCopy)
7776

7877
if err != nil {
79-
return nil, "", nil, fmt.Errorf("onelogin-connector:failed to create resource for application %d: %w", appCopy.Id, err)
78+
return nil, nil, fmt.Errorf("onelogin-connector:failed to create resource for application %d: %w", appCopy.Id, err)
8079
}
8180

8281
rv = append(rv, ur)
8382
}
8483

85-
return rv, nextPage, nil, nil
84+
return rv, &rs.SyncOpResults{
85+
NextPageToken: nextPage,
86+
}, nil
8687
}
8788

88-
func (a *appResourceType) Entitlements(_ context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Entitlement, string, annotations.Annotations, error) {
89+
func (a *appResourceType) Entitlements(_ context.Context, resource *v2.Resource, _ rs.SyncOpAttrs) ([]*v2.Entitlement, *rs.SyncOpResults, error) {
8990
var rv []*v2.Entitlement
9091
memberAssignmentOptions := []ent.EntitlementOption{
9192
ent.WithGrantableTo(resourceTypeUser),
@@ -102,13 +103,14 @@ func (a *appResourceType) Entitlements(_ context.Context, resource *v2.Resource,
102103
),
103104
)
104105

105-
return rv, "", nil, nil
106+
return rv, nil, nil
106107
}
107108

108-
func (a *appResourceType) Grants(ctx context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Grant, string, annotations.Annotations, error) {
109-
bag, cursor, err := parsePageToken(token.Token, resource.Id)
109+
func (a *appResourceType) Grants(ctx context.Context, resource *v2.Resource, attr rs.SyncOpAttrs) ([]*v2.Grant, *rs.SyncOpResults, error) {
110+
token := attr.PageToken.Token
111+
bag, cursor, err := parsePageToken(token, resource.Id)
110112
if err != nil {
111-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for grants of application %s: %w", resource.Id.Resource, err)
113+
return nil, nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for grants of application %s: %w", resource.Id.Resource, err)
112114
}
113115

114116
appUsers, nextCursor, err := a.client.GetAppUsers(
@@ -120,7 +122,7 @@ func (a *appResourceType) Grants(ctx context.Context, resource *v2.Resource, tok
120122
},
121123
)
122124
if err != nil {
123-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to list app users: %w", err)
125+
return nil, nil, fmt.Errorf("onelogin-connector: failed to list app users: %w", err)
124126
}
125127

126128
var rv []*v2.Grant
@@ -143,10 +145,12 @@ func (a *appResourceType) Grants(ctx context.Context, resource *v2.Resource, tok
143145

144146
nextPage, err := bag.NextToken(nextCursor)
145147
if err != nil {
146-
return nil, "", nil, fmt.Errorf("onelogin-connector:failed to generate next pagination token for application %s grants: %w", resource.Id.Resource, err)
148+
return nil, nil, fmt.Errorf("onelogin-connector:failed to generate next pagination token for application %s grants: %w", resource.Id.Resource, err)
147149
}
148150

149-
return rv, nextPage, nil, nil
151+
return rv, &rs.SyncOpResults{
152+
NextPageToken: nextPage,
153+
}, nil
150154
}
151155

152156
func appBuilder(client *onelogin.Client) *appResourceType {

pkg/connector/connector.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import (
44
"context"
55
"fmt"
66

7+
cfg "github.com/conductorone/baton-onelogin/pkg/config"
78
"github.com/conductorone/baton-onelogin/pkg/onelogin"
89
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
910
"github.com/conductorone/baton-sdk/pkg/annotations"
11+
"github.com/conductorone/baton-sdk/pkg/cli"
1012
"github.com/conductorone/baton-sdk/pkg/connectorbuilder"
13+
"github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
14+
"go.uber.org/zap"
1115
)
1216

1317
var (
@@ -55,8 +59,8 @@ type OneLogin struct {
5559
syncPrivileges bool
5660
}
5761

58-
func (o *OneLogin) ResourceSyncers(ctx context.Context) []connectorbuilder.ResourceSyncer {
59-
resources := []connectorbuilder.ResourceSyncer{
62+
func (o *OneLogin) ResourceSyncers(ctx context.Context) []connectorbuilder.ResourceSyncerV2 {
63+
resources := []connectorbuilder.ResourceSyncerV2{
6064
userBuilder(o.client),
6165
roleBuilder(o.client),
6266
appBuilder(o.client),
@@ -88,7 +92,7 @@ func (o *OneLogin) Validate(ctx context.Context) (annotations.Annotations, error
8892
}
8993

9094
// New returns the OneLogin connector.
91-
func New(ctx context.Context, clientId, clientSecret, subdomain string, syncPrivileges bool) (*OneLogin, error) {
95+
func NewConnector(ctx context.Context, clientId, clientSecret, subdomain string, syncPrivileges bool) (*OneLogin, error) {
9296
oneLoginClient, err := onelogin.NewClient(ctx, clientId, clientSecret, subdomain)
9397
if err != nil {
9498
return nil, fmt.Errorf("onelogin-connector: failed to initialize OneLogin client: %w", err)
@@ -99,3 +103,21 @@ func New(ctx context.Context, clientId, clientSecret, subdomain string, syncPriv
99103
syncPrivileges: syncPrivileges,
100104
}, nil
101105
}
106+
107+
// New returns the OneLogin connector configured to sync against the instance URL.
108+
func New(ctx context.Context, config *cfg.Onelogin, opts *cli.ConnectorOpts) (connectorbuilder.ConnectorBuilderV2, []connectorbuilder.Opt, error) {
109+
l := ctxzap.Extract(ctx)
110+
cb, err := NewConnector(
111+
ctx,
112+
config.OneloginClientId,
113+
config.OneloginClientSecret,
114+
config.Subdomain,
115+
config.PrivilegesEnabled,
116+
)
117+
if err != nil {
118+
l.Error("error creating connector", zap.Error(err))
119+
return nil, nil, err
120+
}
121+
122+
return cb, nil, nil
123+
}

pkg/connector/group.go

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77

88
"github.com/conductorone/baton-onelogin/pkg/onelogin"
99
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
10-
"github.com/conductorone/baton-sdk/pkg/annotations"
11-
"github.com/conductorone/baton-sdk/pkg/pagination"
1210
ent "github.com/conductorone/baton-sdk/pkg/types/entitlement"
1311
"github.com/conductorone/baton-sdk/pkg/types/grant"
1412
rs "github.com/conductorone/baton-sdk/pkg/types/resource"
@@ -48,10 +46,11 @@ func groupResource(group *onelogin.Group) (*v2.Resource, error) {
4846
return resource, nil
4947
}
5048

51-
func (g *groupResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagination.Token) ([]*v2.Resource, string, annotations.Annotations, error) {
52-
bag, cursor, err := parsePageToken(pt.Token, &v2.ResourceId{ResourceType: resourceTypeGroup.Id})
49+
func (g *groupResourceType) List(ctx context.Context, _ *v2.ResourceId, attr rs.SyncOpAttrs) ([]*v2.Resource, *rs.SyncOpResults, error) {
50+
token := attr.PageToken.Token
51+
bag, cursor, err := parsePageToken(token, &v2.ResourceId{ResourceType: resourceTypeGroup.Id})
5352
if err != nil {
54-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for group list: %w", err)
53+
return nil, nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for group list: %w", err)
5554
}
5655

5756
groups, nextCursor, err := g.client.GetGroups(
@@ -62,12 +61,12 @@ func (g *groupResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagi
6261
},
6362
)
6463
if err != nil {
65-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to list groups: %w", err)
64+
return nil, nil, fmt.Errorf("onelogin-connector: failed to list groups: %w", err)
6665
}
6766

6867
nextPage, err := bag.NextToken(nextCursor)
6968
if err != nil {
70-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to generate next pagination token for groups: %w", err)
69+
return nil, nil, fmt.Errorf("onelogin-connector: failed to generate next pagination token for groups: %w", err)
7170
}
7271

7372
var rv []*v2.Resource
@@ -76,16 +75,18 @@ func (g *groupResourceType) List(ctx context.Context, _ *v2.ResourceId, pt *pagi
7675
ur, err := groupResource(&groupCopy)
7776

7877
if err != nil {
79-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to create resource for group %d: %w", groupCopy.Id, err)
78+
return nil, nil, fmt.Errorf("onelogin-connector: failed to create resource for group %d: %w", groupCopy.Id, err)
8079
}
8180

8281
rv = append(rv, ur)
8382
}
8483

85-
return rv, nextPage, nil, nil
84+
return rv, &rs.SyncOpResults{
85+
NextPageToken: nextPage,
86+
}, nil
8687
}
8788

88-
func (g *groupResourceType) Entitlements(_ context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Entitlement, string, annotations.Annotations, error) {
89+
func (g *groupResourceType) Entitlements(_ context.Context, resource *v2.Resource, attr rs.SyncOpAttrs) ([]*v2.Entitlement, *rs.SyncOpResults, error) {
8990
var rv []*v2.Entitlement
9091
memberAssignmentOptions := []ent.EntitlementOption{
9192
ent.WithGrantableTo(resourceTypeUser),
@@ -102,13 +103,14 @@ func (g *groupResourceType) Entitlements(_ context.Context, resource *v2.Resourc
102103
),
103104
)
104105

105-
return rv, "", nil, nil
106+
return rv, nil, nil
106107
}
107108

108-
func (g *groupResourceType) Grants(ctx context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Grant, string, annotations.Annotations, error) {
109-
bag, cursor, err := parsePageToken(token.Token, resource.Id)
109+
func (g *groupResourceType) Grants(ctx context.Context, resource *v2.Resource, attr rs.SyncOpAttrs) ([]*v2.Grant, *rs.SyncOpResults, error) {
110+
token := attr.PageToken.Token
111+
bag, cursor, err := parsePageToken(token, resource.Id)
110112
if err != nil {
111-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for grants of group %s: %w", resource.Id.Resource, err)
113+
return nil, nil, fmt.Errorf("onelogin-connector: failed to parse pagination token for grants of group %s: %w", resource.Id.Resource, err)
112114
}
113115

114116
users, nextCursor, err := g.client.GetUsers(
@@ -120,7 +122,7 @@ func (g *groupResourceType) Grants(ctx context.Context, resource *v2.Resource, t
120122
resource.Id.Resource,
121123
)
122124
if err != nil {
123-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to list group users: %w", err)
125+
return nil, nil, fmt.Errorf("onelogin-connector: failed to list group users: %w", err)
124126
}
125127

126128
var rv []*v2.Grant
@@ -143,10 +145,12 @@ func (g *groupResourceType) Grants(ctx context.Context, resource *v2.Resource, t
143145

144146
nextPage, err := bag.NextToken(nextCursor)
145147
if err != nil {
146-
return nil, "", nil, fmt.Errorf("onelogin-connector: failed to generate next pagination token for group %s grants: %w", resource.Id.Resource, err)
148+
return nil, nil, fmt.Errorf("onelogin-connector: failed to generate next pagination token for group %s grants: %w", resource.Id.Resource, err)
147149
}
148150

149-
return rv, nextPage, nil, nil
151+
return rv, &rs.SyncOpResults{
152+
NextPageToken: nextPage,
153+
}, nil
150154
}
151155

152156
func groupBuilder(client *onelogin.Client) *groupResourceType {

0 commit comments

Comments
 (0)