-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·241 lines (207 loc) · 6.55 KB
/
deploy.sh
File metadata and controls
executable file
·241 lines (207 loc) · 6.55 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
#!/bin/bash
# Variables
PREFIX='websql'
SUFFIX='test'
LOCATION='westeurope'
ADMIN_USER='sqladmin'
ADMIN_PASSWORD='P@ssw0rd1234!'
DATABASE_USER_NAME='testuser'
DATABASE_USER_PASSWORD='TestP@ssw0rd123'
CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
ZIPFILE="planner_website.zip"
DEPLOY_APP=1
# Change the current directory to the script's directory
cd "$CURRENT_DIR" || exit
echo "Initializing Terraform..."
terraform init -upgrade
# Run terraform plan and check for errors
echo "Planning Terraform deployment..."
terraform plan -out=tfplan \
-var "prefix=$PREFIX" \
-var "suffix=$SUFFIX" \
-var "location=$LOCATION" \
-var "administrator_login=$ADMIN_USER" \
-var "administrator_login_password=$ADMIN_PASSWORD" \
-var "sql_database_username=$DATABASE_USER_NAME" \
-var "sql_database_password=$DATABASE_USER_PASSWORD"
# Apply the Terraform configuration
echo "Applying Terraform configuration..."
terraform apply -auto-approve tfplan
if [[ $? != 0 ]]; then
echo "Terraform apply failed. Exiting."
exit 1
fi
# Get the output values
RESOURCE_GROUP_NAME=$(terraform output -raw resource_group_name)
WEB_APP_NAME=$(terraform output -raw web_app_name)
SQL_SERVER_NAME=$(terraform output -raw sql_server_name)
SQL_DATABASE_NAME=$(terraform output -raw sql_database_name)
if [[ -z "$WEB_APP_NAME" || -z "$SQL_SERVER_NAME" || -z "$SQL_DATABASE_NAME" ]]; then
echo "Web App Name, SQL Server Name, or SQL Database Name is empty. Exiting."
exit 1
fi
# Retrieve the fullyQualifiedDomainName of the SQL server
echo "Retrieving the fullyQualifiedDomainName of the [$SQL_SERVER_NAME] SQL server..."
SQL_SERVER_FQDN=$(az sql server show \
--name "$SQL_SERVER_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--query "fullyQualifiedDomainName" \
--output tsv)
if [ -z "$SQL_SERVER_FQDN" ]; then
echo "Failed to retrieve the fullyQualifiedDomainName of the SQL server"
exit 1
fi
# Create server-level login
echo "Creating login [$DATABASE_USER_NAME] at server level..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d master \
-U "$ADMIN_USER" \
-P "$ADMIN_PASSWORD" \
-C \
-Q "IF NOT EXISTS (SELECT * FROM sys.sql_logins WHERE name = '$DATABASE_USER_NAME')
CREATE LOGIN [$DATABASE_USER_NAME] WITH PASSWORD = '$DATABASE_USER_PASSWORD';" \
-V 1
if [ $? -eq 0 ]; then
echo "Login [$DATABASE_USER_NAME] created successfully"
else
echo "Failed to create login [$DATABASE_USER_NAME]"
exit 1
fi
# Create database user
echo "Creating user [$DATABASE_USER_NAME] in database [$SQL_DATABASE_NAME]..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$ADMIN_USER" \
-P "$ADMIN_PASSWORD" \
-C \
-Q "IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = '$DATABASE_USER_NAME')
CREATE USER [$DATABASE_USER_NAME] FOR LOGIN [$DATABASE_USER_NAME];" \
-V 1
if [ $? -eq 0 ]; then
echo "User [$DATABASE_USER_NAME] created successfully in database [$SQL_DATABASE_NAME]"
else
echo "Failed to create user [$DATABASE_USER_NAME]"
exit 1
fi
# Grant permissions including DDL rights
echo "Granting permissions to [$DATABASE_USER_NAME]..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$ADMIN_USER" \
-P "$ADMIN_PASSWORD" \
-C \
-Q "ALTER ROLE db_datareader ADD MEMBER [$DATABASE_USER_NAME];
ALTER ROLE db_datawriter ADD MEMBER [$DATABASE_USER_NAME];
ALTER ROLE db_ddladmin ADD MEMBER [$DATABASE_USER_NAME];" \
-V 1
if [ $? -eq 0 ]; then
echo "Permissions granted successfully to [$DATABASE_USER_NAME]"
else
echo "Failed to grant permissions to [$DATABASE_USER_NAME]"
exit 1
fi
# Test connection
echo "Testing connection with user [$DATABASE_USER_NAME]..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$DATABASE_USER_NAME" \
-P "$DATABASE_USER_PASSWORD" \
-C \
-Q "SELECT SYSTEM_USER AS CurrentUser, DB_NAME() AS CurrentDatabase, GETDATE() AS CurrentTime;" \
-V 1
if [ $? -eq 0 ]; then
echo "Connection test successful with user [$DATABASE_USER_NAME]"
else
echo "Connection test failed with user [$DATABASE_USER_NAME]"
exit 1
fi
# Create table
echo "Creating test [Products] table..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$DATABASE_USER_NAME" \
-P "$DATABASE_USER_PASSWORD" \
-C \
-Q "IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Activities' AND schema_id = SCHEMA_ID('dbo'))
CREATE TABLE dbo.Activities (
-- Primary Key: UNIQUEIDENTIFIER with a default of a new sequential GUID (best for indexing)
id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
-- Username field
username VARCHAR(32) NOT NULL,
-- Description of the activity
activity VARCHAR(128) NOT NULL,
-- Timestamp of the activity
timestamp DATETIME NOT NULL
);" \
-V 1
if [ $? -eq 0 ]; then
echo "Test [Activities] table created successfully"
else
echo "Failed to create test [Activities] table"
exit 1
fi
# Insert data
echo "Inserting test data into [Activities] table..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$DATABASE_USER_NAME" \
-P "$DATABASE_USER_PASSWORD" \
-C \
-Q "INSERT INTO Activities (username, activity, timestamp)
VALUES
('paolo', 'Go to Paris', GETDATE()),
('paolo', 'Go to London', GETDATE()),
('paolo', 'Go to Mexico', GETDATE());" \
-V 1
if [ $? -eq 0 ]; then
echo "Test data inserted successfully into [Activities] table"
else
echo "Failed to insert test data into [Activities] table"
exit 1
fi
# Query data
echo "Querying test data from [Activities] table..."
sqlcmd -S "$SQL_SERVER_FQDN" \
-d "$SQL_DATABASE_NAME" \
-U "$DATABASE_USER_NAME" \
-P "$DATABASE_USER_PASSWORD" \
-C \
-Q "SELECT * FROM Activities;" \
-V 1
if [ $? -eq 0 ]; then
echo "Test data queried successfully from [Activities] table"
else
echo "Failed to query test data from [Activities] table"
exit 1
fi
if [[ $DEPLOY_APP -eq 0 ]]; then
echo "Skipping web app deployment as DEPLOY_APP flag is set to 0."
exit 0
fi
# Change current directory to source folder
cd "../src" || exit
# Remove any existing zip package of the web app
if [ -f "$ZIPFILE" ]; then
rm "$ZIPFILE"
fi
# Create the zip package of the web app
echo "Creating zip package of the web app..."
zip -r "$ZIPFILE" app.py activities.py database.py certificates.py static templates requirements.txt
# Deploy the web app
echo "Deploying web app [$WEB_APP_NAME] with zip file [$ZIPFILE]..."
az webapp deploy \
--resource-group "$RESOURCE_GROUP_NAME" \
--name "$WEB_APP_NAME" \
--src-path "$ZIPFILE" \
--type zip \
--async true 1>/dev/null
if [ $? -eq 0 ]; then
echo "Web app [$WEB_APP_NAME] created successfully."
else
echo "Failed to create web app [$WEB_APP_NAME]."
exit 1
fi
# Remove the zip package of the web app
if [ -f "$ZIPFILE" ]; then
rm "$ZIPFILE"
fi