package issuer
import (
"fmt"
"sync"
apiutil "gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/api/util"
v1 "gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/apis/anthoscertmanager/v1"
"gitbucket.jerxie.com/yangyangxie/AnthosCertManager/pkg/controller"
)
type IssuerConstructor func(*controller.Context, v1.GenericIssuer) (Interface, error)
var (
constructors = make(map[string]IssuerConstructor)
constructorLock sync.RWMutex
)
func RegisterIssuer(name string, c IssuerConstructor) {
constructorLock.Lock()
defer constructorLock.Unlock()
constructors[name] = c
}
type Factory interface {
IssuerFor(v1.GenericIssuer) (Interface, error)
}
type factory struct {
ctx *controller.Context
}
func NewFactory(ctx *controller.Context) Factory {
return &factory{ctx: ctx}
}
func (f *factory) IssuerFor(issuer v1.GenericIssuer) (Interface, error) {
issuerType, err := apiutil.NameForIssuer(issuer)
if err != nil {
return nil, fmt.Errorf("could not get issuer type: %s", err.Error())
}
constructorLock.RLock()
defer constructorLock.RUnlock()
if constructor, ok := constructors[issuerType]; ok {
return constructor(f.ctx, issuer)
}
return nil, fmt.Errorf("issuer %s' not registered", issuerType)
}