-
Notifications
You must be signed in to change notification settings - Fork 6
/
platform.go
97 lines (73 loc) · 2.94 KB
/
platform.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
Copyright IBM Corp. 2016 All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package car
import (
"archive/tar"
"io/ioutil"
"strings"
"bytes"
"fmt"
"io"
"github.com/hyperledger/fabric/core/chaincode/platforms/ccmetadata"
"github.com/hyperledger/fabric/core/chaincode/platforms/util"
cutil "github.com/hyperledger/fabric/core/container/util"
pb "github.com/hyperledger/fabric/protos/peer"
)
// Platform for the CAR type
type Platform struct {
}
// ValidateSpec validates the chaincode specification for CAR types to satisfy
// the platform interface. This chaincode type currently doesn't
// require anything specific so we just implicitly approve any spec
func (carPlatform *Platform) ValidateSpec(spec *pb.ChaincodeSpec) error {
return nil
}
func (carPlatform *Platform) ValidateDeploymentSpec(cds *pb.ChaincodeDeploymentSpec) error {
// CAR platform will validate the code package within chaintool
return nil
}
func (carPlatform *Platform) GetDeploymentPayload(spec *pb.ChaincodeSpec) ([]byte, error) {
return ioutil.ReadFile(spec.ChaincodeId.Path)
}
func (carPlatform *Platform) GenerateDockerfile(cds *pb.ChaincodeDeploymentSpec) (string, error) {
var buf []string
//let the executable's name be chaincode ID's name
buf = append(buf, "FROM "+cutil.GetDockerfileFromConfig("chaincode.car.runtime"))
buf = append(buf, "ADD binpackage.tar /usr/local/bin")
dockerFileContents := strings.Join(buf, "\n")
return dockerFileContents, nil
}
func (carPlatform *Platform) GenerateDockerBuild(cds *pb.ChaincodeDeploymentSpec, tw *tar.Writer) error {
// Bundle the .car file into a tar stream so it may be transferred to the builder container
codepackage, output := io.Pipe()
go func() {
tw := tar.NewWriter(output)
err := cutil.WriteBytesToPackage("codepackage.car", cds.CodePackage, tw)
tw.Close()
output.CloseWithError(err)
}()
binpackage := bytes.NewBuffer(nil)
err := util.DockerBuild(util.DockerBuildOptions{
Cmd: "java -jar /usr/local/bin/chaintool buildcar /chaincode/input/codepackage.car -o /chaincode/output/chaincode",
InputStream: codepackage,
OutputStream: binpackage,
})
if err != nil {
return fmt.Errorf("Error building CAR: %s", err)
}
return cutil.WriteBytesToPackage("binpackage.tar", binpackage.Bytes(), tw)
}
//GetMetadataProvider fetches metadata provider given deployment spec
func (carPlatform *Platform) GetMetadataProvider(cds *pb.ChaincodeDeploymentSpec) ccmetadata.MetadataProvider {
return &MetadataProvider{}
}