Skip to content

Commit c9451cc

Browse files
Fix IRB container package
- implement docker API changes Signed-off-by: Marcus Brandenburger <bur@zurich.ibm.com>
1 parent d8e108e commit c9451cc

File tree

16 files changed

+666
-353
lines changed

16 files changed

+666
-353
lines changed

config.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ DOCKER_CMD := docker
3939
# (Note: vars are exported as env variables as we also need them in various scripts)
4040
# alternatives for SGX_MODE: SIM or HW
4141
export SGX_MODE ?= SIM
42-
export SGX_BUILD ?= PRERELEASE
42+
export SGX_BUILD ?= DEBUG
4343
export SGX_SSL ?= /opt/intel/sgxssl
4444
export SGX_SDK ?= /opt/intel/sgxsdk
4545
export SGX_ARCH ?= x64

samples/demos/Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ include $(TOP)/build.mk
88

99
DEMOS = irb
1010

11-
build clean:
11+
test:
12+
$(foreach DIR, $(DEMOS), $(MAKE) -C $(DIR) || exit;)
13+
14+
clean:
1215
$(foreach DIR, $(DEMOS), $(MAKE) -C $(DIR) $@ || exit;)
1316

samples/demos/irb/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
cmd/**
1+
cmd/
22
users/**
33
pkg/protos/**

samples/demos/irb/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ include $(TOP)/build.mk
77

88
COMPONENTS = protos chaincode experimenter
99

10-
all: pull-images ercc build test
10+
all: ercc build test clean
1111

1212
pull-images:
1313
$(DOCKER) pull redis:latest
@@ -23,11 +23,11 @@ ercc:
2323
build: ercc
2424
$(foreach DIR, $(COMPONENTS), $(MAKE) -C $(DIR) $@ || exit;)
2525

26-
test:
27-
$(GO) test -v ./...
26+
test: pull-images
27+
$(GO) test -v -failfast ./...
2828

2929
run:
30-
$(GO) test -v .
30+
$(GO) test -v -failfast .
3131

3232
clean:
3333
$(GO) clean

samples/demos/irb/experimenter/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ run: build
1717
$(MAKE) -C worker stop-docker run-docker
1818

1919
test:
20-
$(GO) test -v ./...
20+
$(GO) test -v -failfast ./...

samples/demos/irb/experimenter/test/worker_test.go

Lines changed: 98 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,35 @@ package test
88

99
import (
1010
"bytes"
11+
"cmp"
12+
"context"
1113
"fmt"
1214
"io"
1315
"net/http"
16+
"os"
17+
"strconv"
1418
"testing"
15-
"time"
1619

17-
"github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/container"
20+
"github.com/docker/go-connections/nat"
1821
"github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/crypto"
1922
pb "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/protos"
2023
"github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/storage"
21-
"github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/utils"
2224
"github.com/pkg/errors"
25+
"github.com/stretchr/testify/require"
26+
"github.com/testcontainers/testcontainers-go"
27+
"github.com/testcontainers/testcontainers-go/network"
28+
"github.com/testcontainers/testcontainers-go/wait"
2329
"google.golang.org/protobuf/proto"
2430
)
2531

26-
func requestAttestation() ([]byte, error) {
32+
func experimentEndpoint(ep string) string {
33+
host := os.Getenv("EXPERIMENT_HOST")
34+
port := os.Getenv("EXPERIMENT_PORT")
35+
return fmt.Sprintf("http://%s:%s/%s", host, port, ep)
36+
}
2737

28-
resp, err := http.Get("http://localhost:5000/attestation")
38+
func requestAttestation() ([]byte, error) {
39+
resp, err := http.Get(experimentEndpoint("attestation"))
2940
if err != nil {
3041
return nil, err
3142
}
@@ -57,7 +68,6 @@ func requestAttestation() ([]byte, error) {
5768
}
5869

5970
func submitEvaluationPack(pk []byte, req *pb.RegisterDataRequest) error {
60-
6171
epm := &pb.EvaluationPackMessage{}
6272
epm.RegisteredData = []*pb.RegisterDataRequest{req}
6373

@@ -92,7 +102,7 @@ func submitEvaluationPack(pk []byte, req *pb.RegisterDataRequest) error {
92102
return err
93103
}
94104

95-
resp, err := http.Post("http://localhost:5000/execute-evaluationpack", "", bytes.NewBuffer(evalPackBytes))
105+
resp, err := http.Post(experimentEndpoint("execute-evaluationpack"), "", bytes.NewBuffer(evalPackBytes))
96106
if err != nil {
97107
return err
98108
}
@@ -122,8 +132,15 @@ func upload() (*pb.RegisterDataRequest, error) {
122132
return nil, errors.Wrap(err, "cannot encrypt message")
123133
}
124134

135+
host := cmp.Or(os.Getenv("REDIS_HOST"), "localhost")
136+
port, err := strconv.Atoi(cmp.Or(os.Getenv("REDIS_PORT"), strconv.Itoa(storage.DefaultRedisPort)))
137+
if err != nil {
138+
return nil, errors.Wrap(err, "invalid redis port")
139+
}
140+
password := cmp.Or(os.Getenv("REDIS_PASSWORD"))
141+
125142
// upload encrypted data
126-
kvs := storage.NewClient()
143+
kvs := storage.NewClient(storage.WithHost(host), storage.WithPort(port), storage.WithPassword(password))
127144
handle, err := kvs.Upload(encryptedData)
128145
if err != nil {
129146
return nil, errors.Wrap(err, "cannot upload data to kvs")
@@ -134,7 +151,7 @@ func upload() (*pb.RegisterDataRequest, error) {
134151
PublicKey: []byte("some verification key"),
135152
}
136153

137-
//build request
154+
// build request
138155
registerDataRequest := &pb.RegisterDataRequest{
139156
Participant: &userIdentity,
140157
DecryptionKey: sk,
@@ -148,70 +165,85 @@ func upload() (*pb.RegisterDataRequest, error) {
148165
const networkID = "mytestnetwork"
149166

150167
func TestWorker(t *testing.T) {
151-
152-
network := &container.Network{Name: networkID}
153-
err := network.Create()
154-
defer network.Remove()
155-
if err != nil {
156-
panic(err)
157-
}
158-
159-
// setup redis
160-
redis := &container.Container{
161-
Image: "redis",
162-
Name: "redis-container",
163-
HostIP: "localhost",
164-
HostPort: "6379",
165-
Network: networkID,
166-
}
167-
err = redis.Start()
168-
defer redis.Stop()
169-
if err != nil {
170-
panic(err)
171-
}
172-
173-
// setup experiment container
174-
experiment := &container.Container{
175-
Image: "irb-experimenter-worker",
176-
Name: "experiment-container",
177-
HostIP: "localhost",
178-
HostPort: "5000",
179-
Env: []string{"REDIS_HOST=redis-container"},
180-
Network: networkID,
181-
}
182-
err = experiment.Start()
183-
defer experiment.Stop()
184-
if err != nil {
185-
panic(err)
186-
}
187-
188-
// let's wait until experiment service is up an running
189-
err = utils.Retry(func() bool {
190-
resp, err := http.Get("http://localhost:5000/info")
191-
if err != nil {
192-
return false
193-
}
194-
return resp.StatusCode == 200
195-
}, 5, 60*time.Second, 2*time.Second)
196-
if err != nil {
197-
panic(err)
198-
}
168+
ctx := context.Background()
169+
170+
// network
171+
net, err := network.New(ctx)
172+
require.NoError(t, err)
173+
defer func() {
174+
err := net.Remove(ctx)
175+
require.NoError(t, err)
176+
}()
177+
networkName := net.Name
178+
179+
// redis
180+
redisImageName := "redis"
181+
redisExportedPort := fmt.Sprintf("%d/tcp", storage.DefaultRedisPort)
182+
redis, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
183+
ContainerRequest: testcontainers.ContainerRequest{
184+
Image: redisImageName,
185+
ExposedPorts: []string{redisExportedPort},
186+
Networks: []string{networkName},
187+
// WaitingFor: wait.ForLog("* Ready to accept connections"),
188+
WaitingFor: wait.ForExposedPort(),
189+
},
190+
Started: true,
191+
})
192+
require.NoError(t, err)
193+
defer func() {
194+
err := redis.Terminate(ctx)
195+
require.NoError(t, err)
196+
}()
197+
198+
redisHost, err := redis.Host(ctx)
199+
require.NoError(t, err)
200+
redisPort, err := redis.MappedPort(ctx, nat.Port(redisExportedPort))
201+
require.NoError(t, err)
202+
t.Logf("redisHost: %s:%s", redisHost, redisPort.Port())
203+
204+
os.Setenv("REDIS_HOST", redisHost)
205+
os.Setenv("REDIS_PORT", redisPort.Port())
206+
207+
// experiment
208+
experimentImageName := "irb-experimenter-worker"
209+
experiment, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
210+
ContainerRequest: testcontainers.ContainerRequest{
211+
Image: experimentImageName,
212+
ExposedPorts: []string{"5000/tcp"},
213+
Networks: []string{networkName},
214+
Env: map[string]string{
215+
"REDIS_HOST": redisHost,
216+
"REDIS_PORT": redisPort.Port(),
217+
},
218+
WaitingFor: wait.ForExposedPort(),
219+
},
220+
Started: true,
221+
})
222+
require.NoError(t, err)
223+
defer func() {
224+
err := experiment.Terminate(ctx)
225+
require.NoError(t, err)
226+
}()
227+
228+
experimentHost, err := experiment.Host(ctx)
229+
require.NoError(t, err)
230+
experimentPort, err := experiment.MappedPort(ctx, "5000/tcp")
231+
require.NoError(t, err)
232+
t.Logf("experimentHost: %s:%s", experimentHost, experimentPort.Port())
233+
234+
os.Setenv("EXPERIMENT_HOST", experimentHost)
235+
os.Setenv("EXPERIMENT_PORT", experimentPort.Port())
199236

200237
req, err := upload()
201-
if err != nil {
202-
panic(err)
203-
}
238+
require.NoError(t, err)
204239

205240
fmt.Println("Testing attestation...")
206241
pk, err := requestAttestation()
207-
if err != nil {
208-
panic(err)
209-
}
242+
require.NoError(t, err)
210243

211244
fmt.Println("Testing evaluation pack...")
212-
if err := submitEvaluationPack(pk, req); err != nil {
213-
panic(err)
214-
}
245+
err = submitEvaluationPack(pk, req)
246+
require.NoError(t, err)
215247

216248
fmt.Println("Test done.")
217249
}

0 commit comments

Comments
 (0)