Newer
Older
AnthosCertManager / pkg / issuer / factory.go
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)
}