Skip to content

Commit 8cee074

Browse files
committed
Expose CF home dir via rw bind mount of container instance on podcvd
1 parent bfee5b1 commit 8cee074

3 files changed

Lines changed: 42 additions & 11 deletions

File tree

container/src/podcvd/internal/cvd.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ package internal
1717
import (
1818
"encoding/json"
1919
"fmt"
20-
"path/filepath"
20+
"regexp"
2121
"strings"
2222

2323
"github.com/go-playground/validator/v10"
@@ -70,33 +70,35 @@ func ParseInstanceGroups(jsonStr, groupName string) (*InstanceGroup, error) {
7070
return &instanceGroup, nil
7171
}
7272

73-
func UpdateCvdGroupJsonRaw(data any, containerName, ipAddr string) {
73+
func UpdateCvdGroupJsonRaw(data any, podcvdHomeDir, ipAddr string) {
7474
switch v := data.(type) {
7575
case map[string]any:
7676
for k, val := range v {
7777
if s, ok := val.(string); ok {
78-
v[k] = updateStringOnCvdGroupJsonRaw(s, containerName, ipAddr)
78+
v[k] = updateStringOnCvdGroupJsonRaw(s, podcvdHomeDir, ipAddr)
7979
} else {
80-
UpdateCvdGroupJsonRaw(val, containerName, ipAddr)
80+
UpdateCvdGroupJsonRaw(val, podcvdHomeDir, ipAddr)
8181
}
8282
}
8383
case []any:
8484
for k, val := range v {
8585
if s, ok := val.(string); ok {
86-
v[k] = updateStringOnCvdGroupJsonRaw(s, containerName, ipAddr)
86+
v[k] = updateStringOnCvdGroupJsonRaw(s, podcvdHomeDir, ipAddr)
8787
} else {
88-
UpdateCvdGroupJsonRaw(val, containerName, ipAddr)
88+
UpdateCvdGroupJsonRaw(val, podcvdHomeDir, ipAddr)
8989
}
9090
}
9191
}
9292
}
9393

94-
func updateStringOnCvdGroupJsonRaw(data, containerName, ipAddr string) string {
94+
var cvdPathRegex = regexp.MustCompile(`^/var/tmp/cvd/[0-9]+/[0-9]+/home`)
95+
96+
func updateStringOnCvdGroupJsonRaw(data, podcvdHomeDir, ipAddr string) string {
9597
data = strings.ReplaceAll(data, "0.0.0.0", ipAddr)
9698
data = strings.ReplaceAll(data, "localhost", ipAddr)
9799
data = strings.ReplaceAll(data, "127.0.0.1", ipAddr)
98-
if filepath.IsAbs(data) {
99-
data = fmt.Sprintf("%s:%s", containerName, data)
100+
if cvdPathRegex.MatchString(data) {
101+
data = cvdPathRegex.ReplaceAllString(data, podcvdHomeDir)
100102
}
101103
return data
102104
}

container/src/podcvd/internal/host.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ func createAndStartContainer(ccm libcfcontainer.CuttlefishContainerManager, comm
264264
Env: []string{
265265
"ANDROID_HOST_OUT=/host_out",
266266
"ANDROID_PRODUCT_OUT=/product_out",
267+
"HOME=/podcvd_home",
267268
},
268269
Image: imageName,
269270
Labels: map[string]string{
@@ -294,13 +295,22 @@ func createAndStartContainer(ccm libcfcontainer.CuttlefishContainerManager, comm
294295
if productOut == "" {
295296
productOut = currentDir
296297
}
298+
podcvdRootDir := "/var/tmp/podcvd"
299+
if err := os.MkdirAll(podcvdRootDir, 0777); err != nil {
300+
return "", fmt.Errorf("failed to create podcvd root dir: %w", err)
301+
}
302+
podcvdHomeDir := filepath.Join(podcvdRootDir, strconv.Itoa(os.Getuid()), attemptID)
303+
if err := os.MkdirAll(podcvdHomeDir, 0755); err != nil {
304+
return "", fmt.Errorf("failed to create podcvd home dir: %w", err)
305+
}
297306
pidsLimit := int64(8192)
298307
containerHostCfg := &container.HostConfig{
299308
Annotations: map[string]string{"run.oci.keep_original_groups": "1"},
300309
Binds: []string{
301310
fmt.Sprintf("%s:/host_out:O", hostOut),
302311
fmt.Sprintf("%s:/product_out:O", productOut),
303312
fmt.Sprintf("%s:/root/.local/share/cvd:ro", cvdDataHome),
313+
fmt.Sprintf("%s:/podcvd_home:rw", podcvdHomeDir),
304314
},
305315
CapAdd: []string{"NET_RAW"},
306316
Resources: container.Resources{

container/src/podcvd/internal/main.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"errors"
2222
"fmt"
2323
"os"
24+
"path/filepath"
25+
"strconv"
2426
"sync"
2527

2628
"github.com/google/android-cuttlefish/container/src/libcfcontainer"
@@ -154,7 +156,13 @@ func handleSubcommandsForSingleInstanceGroup(ccm libcfcontainer.CuttlefishContai
154156
if !exists {
155157
return fmt.Errorf("failed to find IPv4 address for group name %q", cvdArgs.CommonArgs.GroupName)
156158
}
157-
UpdateCvdGroupJsonRaw(res, ContainerName(cvdArgs.CommonArgs.GroupName), ip)
159+
inspectRes, err := ccm.GetClient().ContainerInspect(context.Background(), ContainerName(cvdArgs.CommonArgs.GroupName))
160+
if err != nil {
161+
return fmt.Errorf("failed to inspect container: %w", err)
162+
}
163+
attemptID := inspectRes.Config.Labels["attempt_id"]
164+
podcvdHomeDir := filepath.Join("/var/tmp/podcvd", strconv.Itoa(os.Getuid()), attemptID)
165+
UpdateCvdGroupJsonRaw(res, podcvdHomeDir, ip)
158166
stdout, err := json.MarshalIndent(res, "", " ")
159167
if err != nil {
160168
return fmt.Errorf("failed to marshal json: %w", err)
@@ -201,6 +209,10 @@ func clearAllCuttlefishHosts(ccm libcfcontainer.CuttlefishContainerManager) erro
201209
for err := range errCh {
202210
errs = append(errs, err)
203211
}
212+
uidDir := filepath.Join("/var/tmp/podcvd", strconv.Itoa(os.Getuid()))
213+
if err := os.RemoveAll(uidDir); err != nil {
214+
errs = append(errs, fmt.Errorf("failed to remove uid dir: %w", err))
215+
}
204216
return errors.Join(errs...)
205217
}
206218

@@ -231,8 +243,15 @@ func fleetAllCuttlefishHosts(ccm libcfcontainer.CuttlefishContainerManager) erro
231243
errCh <- err
232244
return
233245
}
246+
inspectRes, err := ccm.GetClient().ContainerInspect(context.Background(), containerName)
247+
if err != nil {
248+
errCh <- err
249+
return
250+
}
251+
attemptID := inspectRes.Config.Labels["attempt_id"]
252+
podcvdHomeDir := filepath.Join("/var/tmp/podcvd", strconv.Itoa(os.Getuid()), attemptID)
234253
for idx := range res.Groups {
235-
UpdateCvdGroupJsonRaw(res.Groups[idx], containerName, ip)
254+
UpdateCvdGroupJsonRaw(res.Groups[idx], podcvdHomeDir, ip)
236255
}
237256
resCh <- res
238257
}(groupName, ip)

0 commit comments

Comments
 (0)