Skip to content

Commit

Permalink
FAB-9759 Make controllers instantiate by intf
Browse files Browse the repository at this point in the history
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 <jyellick@us.ibm.com>
  • Loading branch information
Jason Yellick committed May 8, 2018
1 parent 143d35a commit fa12924
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
21 changes: 12 additions & 9 deletions core/container/controller.go
Expand Up @@ -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
Expand All @@ -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")
Expand All @@ -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(),
},
}
}

Expand All @@ -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) {
Expand Down
13 changes: 13 additions & 0 deletions core/container/dockercontroller/dockercontroller.go
Expand Up @@ -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{}
Expand Down
13 changes: 13 additions & 0 deletions core/container/inproccontroller/inproccontroller.go
Expand Up @@ -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
Expand Down

0 comments on commit fa12924

Please sign in to comment.