Skip to content

Commit aa1bf2d

Browse files
authored
Refactor VM port parsing to handle ignore flags (#17)
1 parent d447187 commit aa1bf2d

2 files changed

Lines changed: 93 additions & 21 deletions

File tree

lib/vm.sh

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,83 @@ dvm_vm_dir() {
4949
printf '%s\n' "${LIMA_HOME:-$HOME/.lima}/$vm"
5050
}
5151

52-
dvm_vm_ports_from_yaml() {
53-
local file guest host ports
52+
dvm_vm_ports_from_yaml_parse() {
53+
local file mode
5454
file="$1/lima.yaml"
55-
[ -f "$file" ] || {
56-
printf -- '-\n'
57-
return 0
58-
}
59-
ports="$(
60-
awk '
61-
/hostPort:/ { host=$NF; gsub(/"/, "", host) }
62-
/guestPort:/ { guest=$NF; gsub(/"/, "", guest) }
63-
host && guest { print host ":" guest; host=""; guest="" }
64-
' "$file" | paste -sd, -
65-
)"
55+
mode="$2"
56+
[ -f "$file" ] || return 0
57+
awk -v mode="$mode" '
58+
function reset() {
59+
host = ""
60+
guest = ""
61+
ignore = ""
62+
}
63+
function value(line, key, tmp) {
64+
tmp = line
65+
gsub(/"/, "", tmp)
66+
sub("^.*" key ":[[:space:]]*", "", tmp)
67+
sub("[[:space:]]*#.*$", "", tmp)
68+
sub("[[:space:]].*$", "", tmp)
69+
return tmp
70+
}
71+
function emit() {
72+
if (guest == "") {
73+
return
74+
}
75+
if (ignore == "true") {
76+
if (mode == "canonical") {
77+
print guest ":" guest
78+
}
79+
return
80+
}
81+
if (host != "") {
82+
print host ":" guest
83+
}
84+
}
85+
BEGIN {
86+
reset()
87+
}
88+
/^[[:space:]]*portForwards:/ {
89+
in_ports = 1
90+
next
91+
}
92+
in_ports && /^[^[:space:]-]/ {
93+
emit()
94+
reset()
95+
in_ports = 0
96+
}
97+
!in_ports {
98+
next
99+
}
100+
/^[[:space:]]*-/ {
101+
emit()
102+
reset()
103+
}
104+
/hostPort:[[:space:]]*/ {
105+
host = value($0, "hostPort")
106+
}
107+
/guestPort:[[:space:]]*/ {
108+
guest = value($0, "guestPort")
109+
}
110+
/ignore:[[:space:]]*true/ {
111+
ignore = "true"
112+
}
113+
END {
114+
if (in_ports) {
115+
emit()
116+
}
117+
}
118+
' "$file"
119+
}
120+
121+
dvm_vm_ports_from_yaml() {
122+
local ports
123+
ports="$(dvm_vm_ports_from_yaml_parse "$1" display | paste -sd, -)"
66124
printf '%s\n' "${ports:-"-"}"
67125
}
68126

69127
dvm_vm_ports_canonical_from_yaml() {
70-
local file
71-
file="$1/lima.yaml"
72-
[ -f "$file" ] || return 0
73-
awk '
74-
/hostPort:/ { host=$NF; gsub(/"/, "", host) }
75-
/guestPort:/ { guest=$NF; gsub(/"/, "", guest) }
76-
host && guest { print host ":" guest; host=""; guest="" }
77-
' "$file" | sort
128+
dvm_vm_ports_from_yaml_parse "$1" canonical | sort
78129
}
79130

80131
dvm_list() {

tests/smoke.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,29 @@ write_port_forward() {
9191
YAML
9292
}
9393
94+
write_ignore_port() {
95+
local guest vm
96+
vm="$1"
97+
guest="$2"
98+
mkdir -p "$DVM_TEST_VM_HOME/$vm"
99+
if [ ! -f "$DVM_TEST_VM_HOME/$vm/lima.yaml" ]; then
100+
printf 'portForwards:\n' >"$DVM_TEST_VM_HOME/$vm/lima.yaml"
101+
fi
102+
cat >>"$DVM_TEST_VM_HOME/$vm/lima.yaml" <<YAML
103+
- guestPort: $guest
104+
proto: any
105+
ignore: true
106+
YAML
107+
}
108+
94109
write_port_forwards_from_expr() {
95110
local expr port vm
96111
vm="$1"
97112
expr="$2"
98113
rm -f "$DVM_TEST_VM_HOME/$vm/lima.yaml"
99114
if printf '%s\n' "$expr" | grep -Fq '"ignore":true'; then
100115
printf 'ignore-port 5355\n' >>"$DVM_TEST_LOG"
116+
write_ignore_port "$vm" 5355
101117
fi
102118
while IFS= read -r port; do
103119
[ -n "$port" ] || continue
@@ -145,6 +161,7 @@ create)
145161
case "$2" in
146162
*'"guestPort":5355'*'"ignore":true'* | *'"ignore":true'*'"guestPort":5355'*)
147163
printf 'ignore-port 5355\n' >>"$DVM_TEST_LOG"
164+
write_ignore_port "$vm" 5355
148165
;;
149166
esac
150167
shift
@@ -301,6 +318,10 @@ grep -Fxq 'inline:app' "$VM_HOME_ROOT/dvm-app/home/inline-ran"
301318
"$TMP/local-bin/dvm-test" list >"$TMP/list.out"
302319
grep -Fq app "$TMP/list.out"
303320
grep -Fq '3000:3000,5173:5173' "$TMP/list.out"
321+
if grep -Fq '5355' "$TMP/list.out"; then
322+
echo "ignored port 5355 leaked into dvm list output" >&2
323+
exit 1
324+
fi
304325

305326
cat >"$DVM_CONFIG/vms/app.sh" <<CONFIG
306327
DVM_GUEST_HOME="$VM_HOME_ROOT/dvm-app/home"

0 commit comments

Comments
 (0)