Skip to content

Commit

Permalink
Merge changes Ifab0b225,I2cb31655
Browse files Browse the repository at this point in the history
* changes:
  FAB-9761 Convert BuilderSpecFactory to intf
  FAB-9760 Remove unused prelaunch func
  • Loading branch information
mastersingh24 authored and Gerrit Code Review committed May 10, 2018
2 parents d4ae20b + a1da4f8 commit 12f7f1d
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 64 deletions.
10 changes: 9 additions & 1 deletion core/chaincode/container_runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ type ContainerRuntime struct {
PeerNetworkID string
}

type platformBuilder struct {
cds *pb.ChaincodeDeploymentSpec
}

func (b *platformBuilder) Build() (io.Reader, error) {
return platforms.GenerateDockerBuild(b.cds)
}

// Start launches chaincode in a runtime environment.
func (c *ContainerRuntime) Start(ctxt context.Context, cccid *ccprovider.CCContext, cds *pb.ChaincodeDeploymentSpec) error {
cname := cccid.GetCanonicalName()
Expand All @@ -59,7 +67,7 @@ func (c *ContainerRuntime) Start(ctxt context.Context, cccid *ccprovider.CCConte
chaincodeLogger.Debugf("start container with args: %s", strings.Join(lc.Args, " "))
chaincodeLogger.Debugf("start container with env:\n\t%s", strings.Join(lc.Envs, "\n\t"))

builder := func() (io.Reader, error) { return platforms.GenerateDockerBuild(cds) }
builder := &platformBuilder{cds: cds}
scr := container.StartContainerReq{
Builder: builder,
Args: lc.Args,
Expand Down
7 changes: 4 additions & 3 deletions core/container/api/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@ import (
"github.com/hyperledger/fabric/core/container/ccintf"
)

type BuildSpecFactory func() (io.Reader, error)
type PrelaunchFunc func() error
type Builder interface {
Build() (io.Reader, error)
}

//VM is an abstract virtual image for supporting arbitrary virual machines
type VM interface {
Deploy(ctxt context.Context, ccid ccintf.CCID, args []string, env []string, reader io.Reader) error
Start(ctxt context.Context, ccid ccintf.CCID, args []string, env []string, filesToUpload map[string][]byte, builder BuildSpecFactory, preLaunchFunc PrelaunchFunc) error
Start(ctxt context.Context, ccid ccintf.CCID, args []string, env []string, filesToUpload map[string][]byte, builder Builder) error
Stop(ctxt context.Context, ccid ccintf.CCID, timeout uint, dontkill bool, dontremove bool) error
Destroy(ctxt context.Context, ccid ccintf.CCID, force bool, noprune bool) error
GetVMName(ccID ccintf.CCID, format func(string) (string, error)) (string, error)
Expand Down
5 changes: 2 additions & 3 deletions core/container/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,17 +122,16 @@ type VMCResp struct {
//StartContainerReq - properties for starting a container.
type StartContainerReq struct {
ccintf.CCID
Builder api.BuildSpecFactory
Builder api.Builder
Args []string
Env []string
FilesToUpload map[string][]byte
PrelaunchFunc api.PrelaunchFunc
}

func (si StartContainerReq) do(ctxt context.Context, v api.VM) VMCResp {
var resp VMCResp

if err := v.Start(ctxt, si.CCID, si.Args, si.Env, si.FilesToUpload, si.Builder, si.PrelaunchFunc); err != nil {
if err := v.Start(ctxt, si.CCID, si.Args, si.Env, si.FilesToUpload, si.Builder); err != nil {
resp = VMCResp{Err: err}
} else {
resp = VMCResp{}
Expand Down
10 changes: 2 additions & 8 deletions core/container/dockercontroller/dockercontroller.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ func (vm *DockerVM) Deploy(ctxt context.Context, ccid ccintf.CCID,

//Start starts a container using a previously created docker image
func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID,
args []string, env []string, filesToUpload map[string][]byte, builder container.BuildSpecFactory, prelaunchFunc container.PrelaunchFunc) error {
args []string, env []string, filesToUpload map[string][]byte, builder container.Builder) error {
imageName, err := vm.GetVMName(ccid, formatImageName)
if err != nil {
return err
Expand Down Expand Up @@ -261,7 +261,7 @@ func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID,
dockerLogger.Debugf("start-could not find image <%s> (container id <%s>), because of <%s>..."+
"attempt to recreate image", imageName, containerName, err)

reader, err1 := builder()
reader, err1 := builder.Build()
if err1 != nil {
dockerLogger.Errorf("Error creating image builder for image <%s> (container id <%s>), "+
"because of <%s>", imageName, containerName, err1)
Expand Down Expand Up @@ -387,12 +387,6 @@ func (vm *DockerVM) Start(ctxt context.Context, ccid ccintf.CCID,
}
}

if prelaunchFunc != nil {
if err = prelaunchFunc(); err != nil {
return err
}
}

// start container with HostConfig was deprecated since v1.10 and removed in v1.2
err = client.StartContainer(containerName, nil)
if err != nil {
Expand Down
50 changes: 21 additions & 29 deletions core/container/dockercontroller/dockercontroller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,25 +110,25 @@ func Test_Start(t *testing.T) {
// case 1: getMockClient returns error
dvm.getClientFnc = getMockClient
getClientErr = true
err := dvm.Start(ctx, ccid, args, env, files, nil, nil)
err := dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, false)
getClientErr = false

// case 2: dockerClient.CreateContainer returns error
createErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, false)
createErr = false

// case 3: dockerClient.UploadToContainer returns error
uploadErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, false)
uploadErr = false

// case 4: dockerClient.StartContainer returns docker.noSuchImgErr
noSuchImgErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, false)

chaincodePath := "github.com/hyperledger/fabric/examples/chaincode/go/example01/cmd"
Expand All @@ -140,59 +140,43 @@ func Test_Start(t *testing.T) {
t.Fatal()
}
cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: codePackage}
bldr := func() (io.Reader, error) { return platforms.GenerateDockerBuild(cds) }
bldr := &mockBuilder{
buildFunc: func() (io.Reader, error) { return platforms.GenerateDockerBuild(cds) },
}

// case 4: start called with builder and dockerClient.CreateContainer returns
// docker.noSuchImgErr and dockerClient.Start returns error
viper.Set("vm.docker.attachStdout", true)
startErr = true
err = dvm.Start(ctx, ccid, args, env, files, bldr, nil)
err = dvm.Start(ctx, ccid, args, env, files, bldr)
testerr(t, err, false)
startErr = false

// Success cases
err = dvm.Start(ctx, ccid, args, env, files, bldr, nil)
err = dvm.Start(ctx, ccid, args, env, files, bldr)
testerr(t, err, true)
noSuchImgErr = false

// dockerClient.StopContainer returns error
stopErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, true)
stopErr = false

// dockerClient.KillContainer returns error
killErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, true)
killErr = false

// dockerClient.RemoveContainer returns error
removeErr = true
err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, true)
removeErr = false

err = dvm.Start(ctx, ccid, args, env, files, nil, nil)
err = dvm.Start(ctx, ccid, args, env, files, nil)
testerr(t, err, true)

//test preLaunchFunc works correctly
preLaunchStr := "notset"
preLaunchFunc := func() error {
preLaunchStr = "set"
return nil
}

err = dvm.Start(ctx, ccid, args, env, files, nil, preLaunchFunc)
testerr(t, err, true)
assert.Equal(t, preLaunchStr, "set")

preLaunchFunc = func() error {
return fmt.Errorf("testing error path")
}

err = dvm.Start(ctx, ccid, args, env, files, nil, preLaunchFunc)
testerr(t, err, false)
}

func Test_Stop(t *testing.T) {
Expand Down Expand Up @@ -301,6 +285,14 @@ func getMockClient() (dockerClient, error) {
return &mockClient{noSuchImgErrReturned: false}, nil
}

type mockBuilder struct {
buildFunc func() (io.Reader, error)
}

func (m *mockBuilder) Build() (io.Reader, error) {
return m.buildFunc()
}

type mockClient struct {
noSuchImgErrReturned bool
}
Expand Down
8 changes: 1 addition & 7 deletions core/container/inproccontroller/inproccontroller.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func (ipc *inprocContainer) launchInProc(ctxt context.Context, id string, args [
}

//Start starts a previously registered system codechain
func (vm *InprocVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string, env []string, filesToUpload map[string][]byte, builder container.BuildSpecFactory, prelaunchFunc container.PrelaunchFunc) error {
func (vm *InprocVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string, env []string, filesToUpload map[string][]byte, builder container.Builder) error {
path := ccid.ChaincodeSpec.ChaincodeId.Path

ipctemplate := typeRegistry[path]
Expand Down Expand Up @@ -186,12 +186,6 @@ func (vm *InprocVM) Start(ctxt context.Context, ccid ccintf.CCID, args []string,
return fmt.Errorf("in-process communication generator not supplied")
}

if prelaunchFunc != nil {
if err = prelaunchFunc(); err != nil {
return err
}
}

ipc.running = true

go func() {
Expand Down
14 changes: 1 addition & 13 deletions core/container/inproccontroller/inproccontroller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import (

"golang.org/x/net/context"

"io"

"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/core/container/ccintf"
pb "github.com/hyperledger/fabric/protos/peer"
Expand Down Expand Up @@ -425,12 +423,6 @@ func TestLaunchprocCCSupportHandleChaincodeStreamError(t *testing.T) {
assert.Nil(t, err, "err should be nil")
}

type MockIOReader struct{}

func (io MockIOReader) Read(p []byte) (int, error) {
return 0, nil
}

func TestStart(t *testing.T) {
defer func() {
typeRegistry = make(map[string]*inprocContainer)
Expand All @@ -455,15 +447,11 @@ func TestStart(t *testing.T) {
"hello": []byte("world"),
}

mockBuilder := func() (io.Reader, error) {
return MockIOReader{}, nil
}

ipc := &inprocContainer{args: args, env: env, chaincode: mockInprocContainer.chaincode, stopChan: make(chan struct{})}

typeRegistry["path"] = ipc

err := vm.Start(mockContext, ccid, args, env, files, mockBuilder, nil)
err := vm.Start(mockContext, ccid, args, env, files, nil)
assert.Nil(t, err, "err should be nil")
}

Expand Down

0 comments on commit 12f7f1d

Please sign in to comment.