Repository navigation
Expand file tree
/
Copy pathcall-web-app.sh
More file actions
executable file
·246 lines (199 loc) · 7.62 KB
/
Copy pathcall-web-app.sh
File metadata and controls
executable file
·246 lines (199 loc) · 7.62 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#!/bin/bash
# Usage: call-web-app.sh [web-app-name]
#
# The web app to call is the one named by the first argument, else by WEB_APP_NAME, else the only web app in the
# subscription. Name it when several are deployed.
get_docker_container_name_by_prefix() {
local app_prefix="$1"
local container_name
# Check if Docker is running
if ! docker info >/dev/null 2>&1; then
echo "Error: Docker is not running" >&2
return 1
fi
echo "Looking for containers with names starting with [$app_prefix]..." >&2
# Find the container using grep
container_name=$(docker ps --format "{{.Names}}" | grep "^${app_prefix}" | head -1)
if [ -z "$container_name" ]; then
echo "Error: No running container found with name starting with [$app_prefix]" >&2
return 1
fi
echo "Found matching container [$container_name]" >&2
echo "$container_name"
}
get_docker_container_ip_address_by_name() {
local container_name="$1"
local ip_address
if [ -z "$container_name" ]; then
echo "Error: Container name is required" >&2
return 1
fi
# Get IP address
ip_address=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container_name")
if [ -z "$ip_address" ]; then
echo "Error: Container [$container_name] has no IP address assigned" >&2
return 1
fi
echo "$ip_address"
}
get_docker_container_port_mapping() {
local container_name="$1"
local container_port="$2"
local host_port
if [ -z "$container_name" ] || [ -z "$container_port" ]; then
echo "Error: Container name and container port are required" >&2
return 1
fi
# Get host port mapping
host_port=$(docker inspect -f "{{(index (index .NetworkSettings.Ports \"${container_port}/tcp\") 0).HostPort}}" "$container_name")
if [ -z "$host_port" ]; then
echo "Error: No host port mapping found for container [$container_name] port [$container_port]" >&2
return 1
fi
echo "$host_port"
}
get_docker_container_app_port() {
local container_name="$1"
local container_port
if [ -z "$container_name" ]; then
echo "Error: Container name is required" >&2
return 1
fi
# The emulator publishes the port the app listens on in its container, which is not necessarily 80:
# an app listens on the port its WEBSITES_PORT app setting names. Read it from the container.
container_port=$(docker inspect -f '{{range $port, $bindings := .NetworkSettings.Ports}}{{if $bindings}}{{println $port}}{{end}}{{end}}' "$container_name" | grep '/tcp$' | head -n 1)
container_port="${container_port%/tcp}"
if [ -z "$container_port" ]; then
echo "Error: Container [$container_name] publishes no TCP port" >&2
return 1
fi
echo "$container_port"
}
call_web_app() {
# Web app port
local web_app_port
# The web app to call: the one the caller named, else the only one in the subscription
web_app_name="$1"
if [ -z "$web_app_name" ]; then
echo "Getting the name of the only web app in the subscription..."
web_app_count=$(az webapp list --query "length(@)" --output tsv)
if [ "$web_app_count" != "1" ]; then
echo "Error: Found [${web_app_count:-0}] web apps; name the one to call: $0 <web-app-name>"
exit 1
fi
web_app_name=$(az webapp list --query "[0].name" --output tsv)
fi
if [ -n "$web_app_name" ]; then
echo "Web app [$web_app_name] successfully retrieved."
else
echo "Error: No web app found"
exit 1
fi
# Get the resource group name
echo "Getting resource group name for web app [$web_app_name]..."
resource_group_name=$(az webapp list --query "[?name=='${web_app_name}'] | [0].resourceGroup" --output tsv)
if [ -n "$resource_group_name" ]; then
echo "Resource group [$resource_group_name] successfully retrieved."
else
echo "Error: No resource group found for web app [$web_app_name]"
exit 1
fi
# Get the the default host name of the web app
echo "Getting the default host name of the web app [$web_app_name]..."
app_host_name=$(az webapp show \
--name "$web_app_name" \
--resource-group "$resource_group_name" \
--query 'defaultHostName' \
--output tsv)
if [ -n "$app_host_name" ]; then
echo "Web app default host name [$app_host_name] successfully retrieved."
else
echo "Error: No web app default host name found"
exit 1
fi
# Get the Docker container name
echo "Finding container name with prefix [ls-$web_app_name]..."
container_name=$(get_docker_container_name_by_prefix "ls-$web_app_name")
if [ $? -eq 0 ] && [ -n "$container_name" ]; then
echo "Container [$container_name] found successfully"
else
echo "Failed to get container name"
exit 1
fi
# Get the container IP address
echo "Getting IP address for container [$container_name]..."
container_ip=$(get_docker_container_ip_address_by_name "$container_name")
if [ $? -eq 0 ] && [ -n "$container_ip" ]; then
echo "IP address [$container_ip] retrieved successfully for container [$container_name]"
else
echo "Failed to get container IP address"
exit 1
fi
# Get the port the web app listens on in its container
echo "Getting the port the web app listens on in container [$container_name]..."
web_app_port=$(get_docker_container_app_port "$container_name")
if [ $? -eq 0 ] && [ -n "$web_app_port" ]; then
echo "Web app listens on port [$web_app_port] in container [$container_name]"
else
echo "Failed to get the port the web app listens on in container [$container_name]"
fi
# Get the host port mapped to it
echo "Getting the host port mapped to port [$web_app_port] in container [$container_name]..."
host_port=$(get_docker_container_port_mapping "$container_name" "$web_app_port")
if [ $? -eq 0 ] && [ -n "$host_port" ]; then
echo "Mapped host port [$host_port] retrieved successfully for container [$container_name]"
else
echo "Failed to get mapped host port for container [$container_name]"
fi
# Retrieve LocalStack proxy port
proxy_port=$(curl --max-time 10 http://localhost:4566/_localstack/proxy -s | jq '.proxy_port')
if [ -n "$proxy_port" ]; then
# Call the web app via emulator proxy
echo "Calling web app [$web_app_name] via emulator..."
curl --max-time 10 --proxy "http://localhost:$proxy_port/" -s "http://$app_host_name/" 1> /dev/null
if [ $? == 0 ]; then
echo "Web app call via emulator proxy port [$proxy_port] succeeded."
else
echo "Web app call via emulator proxy port [$proxy_port] failed."
fi
else
echo "Failed to retrieve LocalStack proxy port"
fi
if [ -n "$container_ip" ] && [ -n "$web_app_port" ]; then
# Call the web app via the container IP address
echo "Calling web app [$web_app_name] via container IP address [$container_ip]..."
curl --max-time 10 -s "http://$container_ip:$web_app_port/" 1> /dev/null
if [ $? == 0 ]; then
echo "Web app call via container IP address [$container_ip] succeeded."
else
echo "Web app call via container IP address [$container_ip] failed."
fi
else
echo "Failed to retrieve container IP address"
fi
if [ -n "$host_port" ]; then
# Call the web app via the host port
echo "Calling web app [$web_app_name] via host port [$host_port]..."
curl --max-time 10 -s "http://127.0.0.1:$host_port/" 1> /dev/null
if [ $? == 0 ]; then
echo "Web app call via host port [$host_port] succeeded."
else
echo "Web app call via host port [$host_port] failed."
fi
else
echo "Failed to retrieve host port"
fi
if [ -n "$app_host_name" ]; then
# Call the web app via the default hostname
echo "Calling web app [$web_app_name] via default hostname [$app_host_name]..."
curl --max-time 10 -s "http://$app_host_name/" 1> /dev/null
if [ $? == 0 ]; then
echo "Web app call via default hostname [$app_host_name] succeeded."
else
echo "Web app call via default hostname [$app_host_name] failed."
fi
else
echo "Failed to retrieve web app hostname"
fi
}
call_web_app "${1:-${WEB_APP_NAME:-}}"