Skip to content

Commit b8ec3e5

Browse files
authored
Merge pull request #281 from hyperledger/permissions
Set group permissions in volumes
2 parents c1379b3 + a5a22ff commit b8ec3e5

File tree

11 files changed

+62
-28
lines changed

11 files changed

+62
-28
lines changed

internal/blockchain/ethereum/connector/ethconnect/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ func (e *Ethconnect) GenerateConfig(stack *types.Stack, member *types.Organizati
8686
RPC: &RPC{URL: fmt.Sprintf("http://%s:8545", blockchainServiceName)},
8787
OpenAPI: &OpenAPI{
8888
EventPollingIntervalSec: 1,
89-
StoragePath: "./abis",
90-
EventsDB: "./events",
89+
StoragePath: "./data/abis",
90+
EventsDB: "./data/events",
9191
},
9292
HTTP: &HTTP{
9393
Port: 8080,

internal/blockchain/ethereum/connector/ethconnect/docker.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,13 @@ func (e *Ethconnect) GetServiceDefinitions(s *types.Stack, dependentServices map
4040
Ports: []string{fmt.Sprintf("%d:8080", member.ExposedConnectorPort)},
4141
Volumes: []string{
4242
fmt.Sprintf("ethconnect_config_%s:/ethconnect/config", member.ID),
43-
fmt.Sprintf("ethconnect_abis_%s:/ethconnect/abis", member.ID),
44-
fmt.Sprintf("ethconnect_events_%s:/ethconnect/events", member.ID),
43+
fmt.Sprintf("ethconnect_data_%s:/ethconnect/data", member.ID),
4544
},
4645
Logging: docker.StandardLogOptions,
4746
},
4847
VolumeNames: []string{
4948
fmt.Sprintf("ethconnect_config_%v", member.ID),
50-
fmt.Sprintf("ethconnect_abis_%v", member.ID),
51-
fmt.Sprintf("ethconnect_events_%v", member.ID),
49+
fmt.Sprintf("ethconnect_data_%v", member.ID),
5250
},
5351
}
5452
}

internal/blockchain/ethereum/connector/evmconnect/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (e *Evmconnect) GenerateConfig(stack *types.Stack, org *types.Organization,
129129
},
130130
Persistence: &PersistenceConfig{
131131
LevelDB: &LevelDBConfig{
132-
Path: "/evmconnect/leveldb",
132+
Path: "/evmconnect/data/leveldb",
133133
},
134134
},
135135
FFCore: &FFCoreConfig{

internal/blockchain/ethereum/connector/evmconnect/docker.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,17 @@ func (e *Evmconnect) GetServiceDefinitions(s *types.Stack, dependentServices map
3535
Service: &docker.Service{
3636
Image: s.VersionManifest.Evmconnect.GetDockerImageString(),
3737
ContainerName: fmt.Sprintf("%s_evmconnect_%v", s.Name, i),
38-
Command: "-f /evmconnect/config/config.yaml",
38+
Command: "-f /evmconnect/config.yaml",
3939
DependsOn: dependsOn,
4040
Ports: []string{fmt.Sprintf("%d:%v", member.ExposedConnectorPort, e.Port())},
4141
Volumes: []string{
42-
fmt.Sprintf("evmconnect_config_%s:/evmconnect/config", member.ID),
43-
fmt.Sprintf("evmconnect_leveldb_%s:/evmconnect/leveldb", member.ID),
42+
fmt.Sprintf("%s/config/evmconnect_%s.yaml:/evmconnect/config.yaml", s.RuntimeDir, member.ID),
43+
fmt.Sprintf("evmconnect_data_%s:/evmconnect/data", member.ID),
4444
},
4545
Logging: docker.StandardLogOptions,
4646
},
4747
VolumeNames: []string{
48-
fmt.Sprintf("evmconnect_config_%s", member.ID),
49-
fmt.Sprintf("evmconnect_leveldb_%s", member.ID),
48+
fmt.Sprintf("evmconnect_data_%s", member.ID),
5049
},
5150
}
5251
}

internal/blockchain/ethereum/connector/evmconnect/docker_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func TestGetServiceDefinition(t *testing.T) {
8383
serviceDefinitions := e.GetServiceDefinitions(tc.Members, tc.DependentServices)
8484
assert.NotNil(t, serviceDefinitions)
8585

86-
expectedCommand := "-f /evmconnect/config/config.yaml"
86+
expectedCommand := "-f /evmconnect/config.yaml"
8787
if serviceDefinitions[0].Service.Command != expectedCommand {
8888
t.Errorf("Expected Command %q, got %q", expectedCommand, serviceDefinitions[0].Service.Command)
8989
}

internal/blockchain/fabric/fabconnect/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type EnrollIdentityRequest struct {
4242

4343
type EnrollIdentityResponse struct {
4444
Name string
45-
Success string
45+
Success bool
4646
}
4747

4848
func CreateIdentity(fabconnectURL string, signer string) (*CreateIdentityResponse, error) {

internal/blockchain/fabric/fabconnect/client_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ func TestEnrollIdentity(t *testing.T) {
110110
ApiResponse: `
111111
{
112112
"Name": "fabric_user-1",
113-
"Success": "success"
113+
"Success": true
114114
}`,
115115
ExpectedResponse: &EnrollIdentityResponse{
116116
Name: "fabric_user-1",
117-
Success: "success",
117+
Success: true,
118118
},
119119
},
120120
{
@@ -126,11 +126,11 @@ func TestEnrollIdentity(t *testing.T) {
126126
ApiResponse: `
127127
{
128128
"Name": "fabric_user-2",
129-
"Success": "success"
129+
"Success": true
130130
}`,
131131
ExpectedResponse: &EnrollIdentityResponse{
132132
Name: "fabric_user-2",
133-
Success: "success",
133+
Success: true,
134134
},
135135
},
136136
{
@@ -142,11 +142,11 @@ func TestEnrollIdentity(t *testing.T) {
142142
ApiResponse: `
143143
{
144144
"Name": "fabric_user-3",
145-
"Success": "success"
145+
"Success": true
146146
}`,
147147
ExpectedResponse: &EnrollIdentityResponse{
148148
Name: "fabric_user-3",
149-
Success: "success",
149+
Success: true,
150150
},
151151
},
152152
{
@@ -157,12 +157,12 @@ func TestEnrollIdentity(t *testing.T) {
157157
ApiResponse: `
158158
{
159159
"Name": "fabric_user-4",
160-
"Success": "success"
160+
"Success": true
161161
}
162162
`,
163163
ExpectedResponse: &EnrollIdentityResponse{
164164
Name: "fabric_user-4",
165-
Success: "success",
165+
Success: true,
166166
},
167167
},
168168
}

internal/core/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func getPostgresURL(member *types.Organization) string {
162162

163163
func getSQLitePath(member *types.Organization, runtimeDir string) string {
164164
if !member.External {
165-
return "/etc/firefly/db/sqlite.db?_busy_timeout=5000"
165+
return "/etc/firefly/data/db/sqlite.db?_busy_timeout=5000"
166166
} else {
167167
return path.Join(runtimeDir, member.ID+".db")
168168
}

internal/docker/docker.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,17 @@ func CreateVolume(ctx context.Context, volumeName string) error {
4848

4949
func CopyFileToVolume(ctx context.Context, volumeName string, sourcePath string, destPath string) error {
5050
fileName := path.Base(sourcePath)
51-
return RunDockerCommand(ctx, ".", "run", "--rm", "-v", fmt.Sprintf("%s:/source/%s", sourcePath, fileName), "-v", fmt.Sprintf("%s:/dest", volumeName), "alpine", "cp", "-R", path.Join("/", "source", fileName), path.Join("/", "dest", destPath))
51+
source := path.Join("/", "source", fileName)
52+
dest := path.Join("/", "dest", destPath)
53+
// command := fmt.Sprintf("run --rm -v %s:%s -v %s:%s alpine /bin/sh -c 'cp -R %s %s '", sourcePath, source, volumeName, dest, source, dest, dest, dest)
54+
command := fmt.Sprintf("cp -R %s %s && chgrp -R 0 %s && chmod -R g+rwX %s", source, dest, dest, dest)
55+
return RunDockerCommand(ctx, ".", "run", "--rm", "-v", fmt.Sprintf("%s:%s", sourcePath, source), "-v", fmt.Sprintf("%s:/dest", volumeName), "alpine", "/bin/sh", "-c", command)
5256
}
5357

5458
func MkdirInVolume(ctx context.Context, volumeName string, directory string) error {
55-
return RunDockerCommand(ctx, ".", "run", "--rm", "-v", fmt.Sprintf("%s:/dest", volumeName), "alpine", "mkdir", "-p", path.Join("/", "dest", directory))
59+
dest := path.Join("/", "dest", directory)
60+
command := fmt.Sprintf("mkdir -p %s && chgrp -R 0 %s && chmod -R g+rwX %s", dest, dest, dest)
61+
return RunDockerCommand(ctx, ".", "run", "--rm", "-v", fmt.Sprintf("%s:/dest", volumeName), "alpine", "/bin/sh", "-c", command)
5662
}
5763

5864
func RemoveVolume(ctx context.Context, volumeName string) error {
@@ -85,6 +91,18 @@ func RunDockerCommand(ctx context.Context, workingDir string, command ...string)
8591
//nolint:gosec
8692
dockerCmd := exec.Command("docker", command...)
8793
dockerCmd.Dir = workingDir
94+
output, err := runCommand(ctx, dockerCmd)
95+
if err != nil && output != "" {
96+
return fmt.Errorf(output)
97+
}
98+
return err
99+
}
100+
101+
func RunDockerCommandLine(ctx context.Context, workingDir string, command string) error {
102+
parsedCommand := strings.Split(command, " ")
103+
fmt.Println(parsedCommand)
104+
dockerCmd := exec.Command("docker", parsedCommand...)
105+
dockerCmd.Dir = workingDir
88106
_, err := runCommand(ctx, dockerCmd)
89107
return err
90108
}

internal/docker/docker_config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ func CreateDockerCompose(s *types.Stack) *DockerComposeConfig {
9797
},
9898
Volumes: []string{
9999
fmt.Sprintf("%s:/etc/firefly/firefly.core.yml:ro", configFile),
100-
fmt.Sprintf("%s_db_%s:/etc/firefly/db", fireflyCore, member.ID),
100+
fmt.Sprintf("%s_data_%s:/etc/firefly/data", fireflyCore, member.ID),
101101
},
102102
DependsOn: map[string]map[string]string{},
103103
Logging: StandardLogOptions,
104104
}
105-
compose.Volumes[fmt.Sprintf("%s_db_%s", fireflyCore, member.ID)] = struct{}{}
105+
compose.Volumes[fmt.Sprintf("%s_data_%s", fireflyCore, member.ID)] = struct{}{}
106106
compose.Services[fireflyCore+"_"+member.ID].DependsOn["dataexchange_"+member.ID] = map[string]string{"condition": "service_started"}
107107
compose.Services[fireflyCore+"_"+member.ID].DependsOn["ipfs_"+member.ID] = map[string]string{"condition": "service_healthy"}
108108
}

internal/stacks/stack_manager.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,12 @@ func (s *StackManager) copyDataExchangeConfigToVolumes() error {
520520
// Copy files into docker volumes
521521
memberDXDir := path.Join(configDir, "dataexchange_"+member.ID)
522522
volumeName := fmt.Sprintf("%s_dataexchange_%s", s.Stack.Name, member.ID)
523+
if err := docker.MkdirInVolume(s.ctx, volumeName, "destinations"); err != nil {
524+
return err
525+
}
526+
if err := docker.MkdirInVolume(s.ctx, volumeName, "peers"); err != nil {
527+
return err
528+
}
523529
if err := docker.MkdirInVolume(s.ctx, volumeName, "peer-certs"); err != nil {
524530
return err
525531
}
@@ -695,7 +701,9 @@ func (s *StackManager) removeVolumes() error {
695701
}
696702
for _, volumeName := range volumes {
697703
if err := docker.RunDockerCommand(s.ctx, "", "volume", "remove", fmt.Sprintf("%s_%s", s.Stack.Name, volumeName)); err != nil {
698-
return err
704+
if !strings.Contains(err.Error(), "no such volume") {
705+
return err
706+
}
699707
}
700708
}
701709
return nil
@@ -952,9 +960,20 @@ func (s *StackManager) runFirstTimeSetup(options *types.StartOptions) (messages
952960
},
953961
}
954962
}
963+
955964
if err := s.patchFireFlyCoreConfigs(configDir, member, newConfig); err != nil {
956965
return messages, err
957966
}
967+
968+
// Create data directory with correct permissions inside volume
969+
dataVolumeName := fmt.Sprintf("%s_firefly_core_data_%s", s.Stack.Name, member.ID)
970+
if err := docker.CreateVolume(s.ctx, dataVolumeName); err != nil {
971+
return messages, err
972+
}
973+
if err := docker.MkdirInVolume(s.ctx, dataVolumeName, "db"); err != nil {
974+
return messages, err
975+
}
976+
958977
}
959978

960979
// Re-write the docker-compose config again, in case new values have been added

0 commit comments

Comments
 (0)