/
create-instance.sh
executable file
·141 lines (117 loc) · 5.01 KB
/
create-instance.sh
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
#!/usr/bin/env bash
if [ -z "$BASH" ]; then
echo "create-instance.sh must be run in a Bash shell!" 1>&2
exit 1
fi
set -o errexit
set +o xtrace # Disable xtrace to ensure credentials aren't leaked
# Supported environment variables:
#
# SERVERLESS_INSTANCE_NAME Optional. Serverless instance to create (defaults to a random name).
# SERVERLESS_DRIVERS_GROUP Required. Atlas group for drivers testing.
# SERVERLESS_API_PUBLIC_KEY Required. Public key for Atlas API request.
# SERVERLESS_API_PRIVATE_KEY Required. Private key for Atlas API request.
# SERVERLESS_SKIP_CRYPT Optional. If set, skips installing mongocryptd and crypt_shared (defaults to "ON")
#
# On success, this script will output serverless-expansion.yml with the
# following expansions:
#
# SERVERLESS_URI SRV connection string for newly created instance
# SERVERLESS_INSTANCE_NAME Name of newly created instance (required for "get" and "delete" scripts)
SCRIPT_DIR=$(dirname ${BASH_SOURCE[0]})
. $SCRIPT_DIR/../handle-paths.sh
# Ensure that secrets have already been set up.
if [ -f "$SCRIPT_DIR/secrets-export.sh" ]; then
source "$SCRIPT_DIR/secrets-export.sh"
fi
if [ -z "$SERVERLESS_DRIVERS_GROUP" ]; then
echo "Drivers Atlas group must be provided via SERVERLESS_DRIVERS_GROUP environment variable"
exit 1
fi
if [ -z "$SERVERLESS_API_PRIVATE_KEY" ]; then
echo "Atlas API private key must be provided via SERVERLESS_API_PRIVATE_KEY environment variable"
exit 1
fi
if [ -z "$SERVERLESS_API_PUBLIC_KEY" ]; then
echo "Atlas API public key must be provided via SERVERLESS_API_PUBLIC_KEY environment variable"
exit 1
fi
# Historically, this script accepted LOADBALANCED=ON to opt in to testing load
# balanced serverless instances. Since all serverless instances now use a load
# balancer, prohibit opting out (i.e. defining LOADBALANCED != ON).
if [ -n "$LOADBALANCED" -a "$LOADBALANCED" != "ON" ]; then
echo "Cannot opt out of testing load balanced serverless instances"
exit 1
fi
# Generate a random instance name if one was not provided.
# See: https://docs.atlas.mongodb.com/reference/atlas-limits/#label-limits
if [ -z "$SERVERLESS_INSTANCE_NAME" ]; then
SERVERLESS_INSTANCE_NAME="$RANDOM-DRIVERTEST"
fi
SERVERLESS_REGION="${SERVERLESS_REGION:-US_EAST_2}"
# Ensure that a Python binary is available for JSON decoding
. $SCRIPT_DIR/../find-python3.sh || exit 1
echo "Finding Python3 binary..."
PYTHON_BINARY="$(find_python3 2>/dev/null)" || exit 1
echo "Finding Python3 binary... done."
echo "Creating new serverless instance \"$SERVERLESS_INSTANCE_NAME\"..."
# See: https://www.mongodb.com/docs/atlas/reference/api/serverless/create-one-serverless-instance/
API_BASE_URL="https://account-dev.mongodb.com/api/atlas/v1.0/groups/$SERVERLESS_DRIVERS_GROUP"
# Note: backingProviderName and regionName below should correspond to the
# multi-tenant MongoDB (MTM) associated with $SERVERLESS_DRIVERS_GROUP.
curl \
-u "$SERVERLESS_API_PUBLIC_KEY:$SERVERLESS_API_PRIVATE_KEY" \
--silent \
--show-error \
-X POST \
--digest \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
"$API_BASE_URL/serverless?pretty=true" \
--data @- << EOF
{
"name" : "$SERVERLESS_INSTANCE_NAME",
"providerSettings" : {
"providerName": "SERVERLESS",
"backingProviderName": "AWS",
"instanceSizeName" : "SERVERLESS_V2",
"regionName" : "$SERVERLESS_REGION"
}
}
EOF
echo ""
SECONDS=0
while [ true ]; do
API_RESPONSE=`SERVERLESS_INSTANCE_NAME=$SERVERLESS_INSTANCE_NAME bash $SCRIPT_DIR/get-instance.sh`
STATE_NAME=`echo $API_RESPONSE | $PYTHON_BINARY -c "import sys, json; print(json.load(sys.stdin)['stateName'])" | tr -d '\r\n'`
SERVERLESS_MONGODB_VERSION=`echo $API_RESPONSE | $PYTHON_BINARY -c "import sys, json; print(json.load(sys.stdin)['mongoDBVersion'])" | tr -d '\r\n'`
if [ "$STATE_NAME" = "IDLE" ]; then
duration="$SECONDS"
echo "Setup done! ($(($duration / 60))m $(($duration % 60))s elapsed)"
SERVERLESS_URI=`echo $API_RESPONSE | $PYTHON_BINARY -c "import sys, json; print(json.load(sys.stdin)['connectionStrings']['standardSrv'])" | tr -d '\r\n'`
SERVERLESS_URI=$SERVERLESS_URI \
SERVERLESS_INSTANCE_NAME=$SERVERLESS_INSTANCE_NAME \
cat << EOF > serverless-expansion.yml
SERVERLESS_URI: "$SERVERLESS_URI"
SERVERLESS_INSTANCE_NAME: "$SERVERLESS_INSTANCE_NAME"
# Define original variables for backwards compatibility
MONGODB_URI: "$SERVERLESS_URI"
MONGODB_SRV_URI: "$SERVERLESS_URI"
SSL: "ssl"
AUTH: "auth"
TOPOLOGY: "sharded_cluster"
SERVERLESS: "serverless"
SINGLE_ATLASPROXY_SERVERLESS_URI: "$SERVERLESS_URI"
MULTI_ATLASPROXY_SERVERLESS_URI: "$SERVERLESS_URI"
SERVERLESS_MONGODB_VERSION: "$SERVERLESS_MONGODB_VERSION"
EOF
if [ "$SERVERLESS_SKIP_CRYPT" != "OFF" ]; then
# Download binaries and crypt_shared
MONGODB_VERSION=rapid bash $SCRIPT_DIR/download-crypt.sh
fi
exit 0
else
echo "Setup still in progress, status=$STATE_NAME, sleeping for 1 minute..."
sleep 60
fi
done