diff --git a/core/container/controller.go b/core/container/controller.go index a02b689dd12..1117ce62d8b 100644 --- a/core/container/controller.go +++ b/core/container/controller.go @@ -21,6 +21,10 @@ import ( pb "github.com/hyperledger/fabric/protos/peer" ) +type VMProvider interface { + NewVM() api.VM +} + type refCountedLock struct { refCount int lock *sync.RWMutex @@ -34,6 +38,7 @@ type VMController struct { sync.RWMutex // Handlers for each chaincode containerLocks map[string]*refCountedLock + vmProviders map[string]VMProvider } var vmLogger = flogging.MustGetLogger("container") @@ -42,6 +47,10 @@ var vmLogger = flogging.MustGetLogger("container") func NewVMController() *VMController { return &VMController{ containerLocks: make(map[string]*refCountedLock), + vmProviders: map[string]VMProvider{ + DOCKER: dockercontroller.NewProvider(), + SYSTEM: inproccontroller.NewProvider(), + }, } } @@ -52,17 +61,11 @@ const ( ) func (vmc *VMController) newVM(typ string) api.VM { - var v api.VM - - switch typ { - case DOCKER: - v = dockercontroller.NewDockerVM() - case SYSTEM: - v = &inproccontroller.InprocVM{} - default: + v, ok := vmc.vmProviders[typ] + if !ok { vmLogger.Panicf("Programming error: unsupported VM type: %s", typ) } - return v + return v.NewVM() } func (vmc *VMController) lockContainer(id string) { diff --git a/core/container/dockercontroller/dockercontroller.go b/core/container/dockercontroller/dockercontroller.go index aa08625fb18..7779980aa2f 100644 --- a/core/container/dockercontroller/dockercontroller.go +++ b/core/container/dockercontroller/dockercontroller.go @@ -85,6 +85,19 @@ type dockerClient interface { RemoveContainer(opts docker.RemoveContainerOptions) error } +// Controller implements container.VMProvider +type Provider struct{} + +// NewProvider creates a new instance of Provider +func NewProvider() *Provider { + return &Provider{} +} + +// NewVM creates a new DockerVM instance +func (p *Provider) NewVM() container.VM { + return NewDockerVM() +} + // NewDockerVM returns a new DockerVM instance func NewDockerVM() *DockerVM { vm := DockerVM{} diff --git a/core/container/inproccontroller/inproccontroller.go b/core/container/inproccontroller/inproccontroller.go index 0c37725b031..2cd2ec65724 100644 --- a/core/container/inproccontroller/inproccontroller.go +++ b/core/container/inproccontroller/inproccontroller.go @@ -19,6 +19,19 @@ import ( "golang.org/x/net/context" ) +// Provider implements container.VMProvider +type Provider struct{} + +// NewProvider creates a new instances of Provider +func NewProvider() *Provider { + return &Provider{} +} + +// NewVM creates an inproc VM instance +func (c *Provider) NewVM() container.VM { + return &InprocVM{} +} + type inprocContainer struct { chaincode shim.Chaincode running bool