From fa12924798ea10a5d04f8c4e2374ddbe734ff15e Mon Sep 17 00:00:00 2001 From: Jason Yellick Date: Thu, 26 Apr 2018 14:00:48 -0400 Subject: [PATCH] FAB-9759 Make controllers instantiate by intf Presently, the core/container package reaches directly into the core/container/inproccontroller and core/container/dockercontroller packages. Because these packages need to implement interfaces for core/container, this creates an awkward core/container/api directory. In reality, these VM provider types should be registered as part of the construction of the container vm controller. This CR takes the first step of instantiating the providers by interface, rather than by reaching into the package directly. Change-Id: Ifed8a01a68fb11cab6058a15242f4cda335d2297 Signed-off-by: Jason Yellick --- core/container/controller.go | 21 +++++++++++-------- .../dockercontroller/dockercontroller.go | 13 ++++++++++++ .../inproccontroller/inproccontroller.go | 13 ++++++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) 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