Adding new provider
Introduce new provider type
domain/provider.go
package domain
...
const (
    ...
    // ProviderTypeNoOp is the type name for No-Op provider
    ProviderTypeNoOp = "noop"
)
Initialize the provider
internal/server/services.go
import (
    ...
    "github.com/raystack/guardian/plugins/providers/noop"
)
...
func InitServices(deps ServiceDeps) (*Services, error) {
    ...
    providerClients := []provider.Client{
        ...
        noop.NewProvider(domain.ProviderTypeNoOp, deps.Logger),
    }
Provider implementation
Interfaces
Provider should implement provider.Client, providers.PermissionManager and providers.Client interface
core/provider/service.go
type Client interface {
    providers.PermissionManager
    providers.Client
}
plugins/providers/client.go
type Client interface {
    GetType() string
    CreateConfig(*domain.ProviderConfig) error
    GetResources(pc *domain.ProviderConfig) ([]*domain.Resource, error)
    GrantAccess(*domain.ProviderConfig, domain.Grant) error
    RevokeAccess(*domain.ProviderConfig, domain.Grant) error
    GetRoles(pc *domain.ProviderConfig, resourceType string) ([]*domain.Role, error)
    GetAccountTypes() []string
    ListAccess(context.Context, domain.ProviderConfig, []*domain.Resource) (domain.MapResourceAccess, error)
}
type PermissionManager interface {
    GetPermissions(p *domain.ProviderConfig, resourceType, role string) ([]interface{}, error)
}
Example NoOp Provider
plugins/providers/noop/provider.go
package noop
...
type Provider struct {
    provider.UnimplementedClient
    provider.PermissionManager
    typeName string
    logger log.Logger
}
func NewProvider(typeName string, logger log.Logger) *Provider {
    return &Provider{
        typeName: typeName,
        logger: logger,
    }
}
func (p *Provider) GetType() string {
    return p.typeName
}
func (p *Provider) CreateConfig(cfg *domain.ProviderConfig) error {
    // CreateConfig implementation
}
func (p *Provider) GetResources(pc *domain.ProviderConfig) ([]*domain.Resource, error) {
    // GetResources implementation
}
func (p *Provider) GrantAccess(*domain.ProviderConfig, domain.Grant) error {
    // GrantAccess implementation
}
func (p *Provider) RevokeAccess(*domain.ProviderConfig, domain.Grant) error {
    // RevokeAccess implementation
}
func (p *Provider) GetRoles(pc *domain.ProviderConfig, resourceType string) ([]*domain.Role, error) {
    // GetRoles implementation
}
func (p *Provider) GetAccountTypes() []string {
    // GetAccountTypes implementation
}
See full implementation here