Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
Server Mgr
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ifs
IPA
Erweiterung Server Manager (um Terraform)
Server Mgr
Commits
cb6e0ec7
Commit
cb6e0ec7
authored
1 year ago
by
Daniel Fässler
Browse files
Options
Downloads
Patches
Plain Diff
Format using blue
parent
616182cc
Branches
Branches containing commit
No related tags found
No related merge requests found
Pipeline
#337290
failed
1 year ago
Stage: tests
Stage: build
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
backend/app/server/providers/terraform_hetzner/__init__.py
+1
-3
1 addition, 3 deletions
backend/app/server/providers/terraform_hetzner/__init__.py
backend/app/server/providers/terraform_hetzner/base.py
+205
-65
205 additions, 65 deletions
backend/app/server/providers/terraform_hetzner/base.py
with
206 additions
and
68 deletions
backend/app/server/providers/terraform_hetzner/__init__.py
+
1
−
3
View file @
cb6e0ec7
from
.templates
import
SupersetHetznerTemplate
from
.templates
import
LinuxInstanceHetznerTemplate
__all__
=
[
'
LinuxInstanceHetznerTemplate
'
,
'
SupersetHetznerTemplate
'
]
__all__
=
[
'
LinuxInstanceHetznerTemplate
'
,
'
SupersetHetznerTemplate
'
]
This diff is collapsed.
Click to expand it.
backend/app/server/providers/terraform_hetzner/base.py
+
205
−
65
View file @
cb6e0ec7
...
...
@@ -30,7 +30,7 @@ from server.server_registration import (
ServerInfo
,
ServerTypeBase
,
StopServerMixin
,
)
)
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -49,37 +49,45 @@ terraform_status_to_server_state = {
def
_get_server_info
():
try
:
result
=
subprocess
.
run
([
"
terraform
"
,
"
output
"
,
"
-json
"
],
capture_output
=
True
,
text
=
True
,
check
=
True
)
result
=
subprocess
.
run
(
[
'
terraform
'
,
'
output
'
,
'
-json
'
],
capture_output
=
True
,
text
=
True
,
check
=
True
,
)
output_json
=
json
.
loads
(
result
.
stdout
.
strip
())
server_id
=
output_json
.
get
(
"
server_id
"
,
{}).
get
(
"
value
"
,
""
)
server_name
=
output_json
.
get
(
"
server_name
"
,
{}).
get
(
"
value
"
,
""
)
server_state
=
terraform_status_to_server_state
.
get
(
output_json
.
get
(
"
server_state
"
,
{}).
get
(
"
value
"
,
"
unknown
"
))
server_address
=
output_json
.
get
(
"
server_address
"
,
{}).
get
(
"
value
"
,
""
)
labels
=
output_json
.
get
(
"
server_labels
"
,
{}).
get
(
"
value
"
,
{})
server_id
=
output_json
.
get
(
'
server_id
'
,
{}).
get
(
'
value
'
,
''
)
server_name
=
output_json
.
get
(
'
server_name
'
,
{}).
get
(
'
value
'
,
''
)
server_state
=
terraform_status_to_server_state
.
get
(
output_json
.
get
(
'
server_state
'
,
{}).
get
(
'
value
'
,
'
unknown
'
)
)
server_address
=
output_json
.
get
(
'
server_address
'
,
{}).
get
(
'
value
'
,
''
)
labels
=
output_json
.
get
(
'
server_labels
'
,
{}).
get
(
'
value
'
,
{})
return
ServerInfo
(
server_id
=
server_id
,
server_name
=
server_name
,
server_state
=
server_state
,
created
=
datetime
.
now
(),
server_address
=
server_address
,
labels
=
labels
labels
=
labels
,
)
except
subprocess
.
CalledProcessError
as
e
:
print
(
f
"
Error:
{
e
}
"
)
print
(
f
'
Error:
{
e
}
'
)
return
None
_image_name
:
str
=
"
ubuntu-22.04
"
_server_type
:
str
=
"
cx11
"
_server_location
:
str
=
"
nbg1
"
HCLOUD_TOKEN
:
str
=
os
.
environ
.
get
(
"
HCLOUD_TOKEN
"
)
_image_name
:
str
=
'
ubuntu-22.04
'
_server_type
:
str
=
'
cx11
'
_server_location
:
str
=
'
nbg1
'
HCLOUD_TOKEN
:
str
=
os
.
environ
.
get
(
'
HCLOUD_TOKEN
'
)
terraform_directory
:
str
=
"
/terraform_workspace
"
terraform_directory
:
str
=
'
/terraform_workspace
'
if
not
HCLOUD_TOKEN
:
raise
ValueError
(
"
HCLOUD_TOKEN missing from environment.
"
)
raise
ValueError
(
'
HCLOUD_TOKEN missing from environment.
'
)
def
_create_random_string
(
...
...
@@ -95,29 +103,49 @@ def _create_random_name():
_server_password
:
str
=
_create_random_string
()
def
apply_configuration
(
server_name
,
server_password
,
hcloud_token
,
server_type
:
Optional
[
str
]
=
None
,
server_image
:
Optional
[
str
]
=
None
,
server_location
:
Optional
[
str
]
=
None
,
server_labels
:
Optional
[
str
]
=
None
,
server_action
:
Optional
[
str
]
=
None
,
server_password_reset
:
Optional
[
str
]
=
None
,
destroy
:
Optional
[
str
]
=
None
):
def
apply_configuration
(
server_name
,
server_password
,
hcloud_token
,
server_type
:
Optional
[
str
]
=
None
,
server_image
:
Optional
[
str
]
=
None
,
server_location
:
Optional
[
str
]
=
None
,
server_labels
:
Optional
[
str
]
=
None
,
server_action
:
Optional
[
str
]
=
None
,
server_password_reset
:
Optional
[
str
]
=
None
,
destroy
:
Optional
[
str
]
=
None
,
):
# Select Terraform workspace
subprocess
.
run
([
"
terraform
"
,
"
workspace
"
,
"
select
"
,
"
default
"
])
subprocess
.
run
([
'
terraform
'
,
'
workspace
'
,
'
select
'
,
'
default
'
])
# Apply Terraform configuration with variable inputs
terraform_apply_args
=
[
"
terraform
"
,
"
apply
"
,
"
-auto-approve
"
,
"
-var
"
,
f
"
hcloud_token=
{
hcloud_token
}
"
,
"
-var
"
,
f
"
server_name=
{
server_name
}
"
,
"
-var
"
,
f
"
server_password=
{
server_password
}
"
]
terraform_apply_args
=
[
'
terraform
'
,
'
apply
'
,
'
-auto-approve
'
,
'
-var
'
,
f
'
hcloud_token=
{
hcloud_token
}
'
,
'
-var
'
,
f
'
server_name=
{
server_name
}
'
,
'
-var
'
,
f
'
server_password=
{
server_password
}
'
,
]
if
server_type
:
terraform_apply_args
.
extend
([
"
-var
"
,
f
"
server_type=
{
server_type
}
"
])
terraform_apply_args
.
extend
([
'
-var
'
,
f
'
server_type=
{
server_type
}
'
])
if
server_image
:
terraform_apply_args
.
extend
([
"
-var
"
,
f
"
server_image=
{
server_image
}
"
])
terraform_apply_args
.
extend
([
'
-var
'
,
f
'
server_image=
{
server_image
}
'
])
if
server_location
:
terraform_apply_args
.
extend
([
"
-var
"
,
f
"
server_location=
{
server_location
}
"
])
terraform_apply_args
.
extend
(
[
'
-var
'
,
f
'
server_location=
{
server_location
}
'
]
)
if
server_labels
:
terraform_apply_args
.
extend
([
"
-var
"
,
f
"
server_labels=
{
server_labels
}
"
])
terraform_apply_args
.
extend
([
'
-var
'
,
f
'
server_labels=
{
server_labels
}
'
])
if
server_action
:
terraform_apply_args
.
extend
([
"
-var
"
,
f
"
server_action=
{
server_action
}
"
])
terraform_apply_args
.
extend
([
'
-var
'
,
f
'
server_action=
{
server_action
}
'
])
if
server_password_reset
:
terraform_apply_args
.
extend
([
"
-var
"
,
"
server_password_reset=true
"
])
terraform_apply_args
.
extend
([
'
-var
'
,
'
server_password_reset=true
'
])
if
destroy
:
terraform_apply_args
.
extend
([
"
-destroy
"
])
terraform_apply_args
.
extend
([
'
-destroy
'
])
subprocess
.
run
(
terraform_apply_args
)
...
...
@@ -130,7 +158,9 @@ def create_terraform_server(
location
,
description
:
str
,
)
->
ServerCreatedInfo
:
server_name
:
str
=
f
"
{
server_variant
}
-
{
_create_random_name
()
}
-
{
_create_random_name
()
}
"
server_name
:
str
=
(
f
'
{
server_variant
}
-
{
_create_random_name
()
}
-
{
_create_random_name
()
}
'
)
server_password
=
_server_password
server_type
:
str
=
instance_type
server_image
:
str
=
image_name
...
...
@@ -141,9 +171,9 @@ def create_terraform_server(
.
replace
(
'
+
'
,
'
-
'
)
)
labels
=
{
"
usage
"
:
f
"
{
server_variant
}
"
,
"
created-on
"
:
f
"
{
created_date
}
"
,
"
username
"
:
f
"
{
username
}
"
,
'
usage
'
:
f
'
{
server_variant
}
'
,
'
created-on
'
:
f
'
{
created_date
}
'
,
'
username
'
:
f
'
{
username
}
'
,
}
labels_json
=
json
.
dumps
(
labels
)
...
...
@@ -152,9 +182,17 @@ def create_terraform_server(
exit
(
1
)
os
.
chdir
(
terraform_directory
)
subprocess
.
run
([
"
terraform
"
,
"
init
"
])
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels_json
)
subprocess
.
run
([
'
terraform
'
,
'
init
'
])
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels_json
,
)
info
=
_get_server_info
()
if
info
:
return
ServerCreatedInfo
(
...
...
@@ -165,74 +203,154 @@ def create_terraform_server(
server_address
=
info
.
server_address
,
labels
=
info
.
labels
,
description
=
description
,
server_user
=
"
root
"
,
server_user
=
'
root
'
,
server_password
=
server_password
,
)
def
status
()
->
ServerInfo
:
return
_get_server_info
()
def
reboot
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
)
->
ServerInfo
:
def
reboot
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
,
)
->
ServerInfo
:
if
not
os
.
path
.
isdir
(
terraform_directory
):
print
(
f
"
Directory
'
{
terraform_directory
}
'
does not exist.
"
)
exit
(
1
)
os
.
chdir
(
terraform_directory
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
"
reboot
"
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
'
reboot
'
,
)
# wait for server to be up again
sleep
(
30
)
return
_get_server_info
()
def
stop
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
)
->
ServerInfo
:
def
stop
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
,
)
->
ServerInfo
:
info
=
_get_server_info
()
if
not
os
.
path
.
isdir
(
terraform_directory
):
print
(
f
"
Directory
'
{
terraform_directory
}
'
does not exist.
"
)
exit
(
1
)
os
.
chdir
(
terraform_directory
)
apply_configuration
(
info
.
server_name
,
server_password
,
HCLOUD_TOKEN
,
""
,
""
,
""
,
info
.
labels
,
server_action
=
"
poweroff
"
)
apply_configuration
(
info
.
server_name
,
server_password
,
HCLOUD_TOKEN
,
''
,
''
,
''
,
info
.
labels
,
server_action
=
'
poweroff
'
,
)
# wait for server to be up again
sleep
(
30
)
return
_get_server_info
()
def
start
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
)
->
ServerInfo
:
def
start
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
,
)
->
ServerInfo
:
if
not
os
.
path
.
isdir
(
terraform_directory
):
print
(
f
"
Directory
'
{
terraform_directory
}
'
does not exist.
"
)
exit
(
1
)
os
.
chdir
(
terraform_directory
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
"
poweron
"
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
'
poweron
'
,
)
# wait for server to be up again
sleep
(
30
)
return
_get_server_info
()
def
reset_pw
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
)
->
ServerPasswordResetInfo
:
def
reset_pw
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
,
)
->
ServerPasswordResetInfo
:
if
not
os
.
path
.
isdir
(
terraform_directory
):
print
(
f
"
Directory
'
{
terraform_directory
}
'
does not exist.
"
)
exit
(
1
)
os
.
chdir
(
terraform_directory
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
None
,
server_password_reset
=
True
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
None
,
server_password_reset
=
True
,
)
# wait for server to be up again
sleep
(
30
)
return
_get_server_info
()
def
destroy
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
)
->
ServerDeletedInfo
:
def
destroy
(
server_name
,
server_password
,
server_type
,
server_image
,
server_location
,
labels
,
)
->
ServerDeletedInfo
:
if
not
os
.
path
.
isdir
(
terraform_directory
):
print
(
f
"
Directory
'
{
terraform_directory
}
'
does not exist.
"
)
exit
(
1
)
os
.
chdir
(
terraform_directory
)
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
None
)
sleep
(
30
)
return
ServerDeletedInfo
(
deleted
=
True
apply_configuration
(
server_name
,
server_password
,
HCLOUD_TOKEN
,
server_type
,
server_image
,
server_location
,
labels
,
server_action
=
None
,
)
sleep
(
30
)
return
ServerDeletedInfo
(
deleted
=
True
)
class
ServerTypeTerraform
(
...
...
@@ -242,13 +360,13 @@ class ServerTypeTerraform(
StartServerMixin
,
ServerTypeBase
,
):
server_variant
:
str
=
""
server_variant
:
str
=
''
location
:
str
=
_server_location
instance_type
=
_server_type
image_name
:
str
=
_image_name
def
create_instance
(
self
,
model_instance_id
,
*
args
,
**
kwargs
self
,
model_instance_id
,
*
args
,
**
kwargs
)
->
ServerCreatedInfo
:
from
server.models
import
ProvisionedServerInstance
...
...
@@ -262,9 +380,8 @@ class ServerTypeTerraform(
username
=
username
,
image_name
=
self
.
image_name
,
location
=
self
.
location
,
description
=
server_instance
.
server_type
.
description
or
""
,
description
=
server_instance
.
server_type
.
description
or
''
,
)
def
get_server_info
(
self
,
model_instance_id
:
str
,
*
args
,
**
kwargs
...
...
@@ -272,28 +389,51 @@ class ServerTypeTerraform(
instance
=
self
.
get_server_instance
(
model_instance_id
)
return
status
()
def
reset_password
(
self
,
model_instance_id
,
*
args
,
**
kwargs
)
->
ServerPasswordResetInfo
:
instance
=
self
.
get_server_instance
(
model_instance_id
)
return
reset_pw
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
)
return
reset_pw
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
,
)
def
start_server
(
self
,
model_instance_id
,
*
args
,
**
kwargs
)
->
ServerInfo
:
instance
=
self
.
get_server_instance
(
model_instance_id
)
return
start
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
)
return
start
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
,
)
def
restart_server
(
self
,
model_instance_id
,
*
args
,
**
kwargs
)
->
ServerInfo
:
instance
=
self
.
get_server_instance
(
model_instance_id
)
return
reboot
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
)
return
reboot
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
,
)
def
stop_server
(
self
,
model_instance_id
,
*
args
,
**
kwargs
)
->
ServerInfo
:
instance
=
self
.
get_server_instance
(
model_instance_id
)
return
stop
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
)
return
stop
(
instance
.
server_name
,
instance
.
server_password
,
_server_type
,
_image_name
,
_server_location
,
None
,
)
def
delete_server
(
self
,
model_instance_id
,
*
args
,
**
kwargs
...
...
@@ -310,7 +450,7 @@ class ServerTypeTerraform(
deleted
=
True
except
APIException
:
logger
.
exception
(
f
"
Could not delete hetzner server with id
{
instance
.
server_id
}
but continuing anyway.
"
f
'
Could not delete hetzner server with id
{
instance
.
server_id
}
but continuing anyway.
'
)
return
ServerDeletedInfo
(
server_id
=
model_instance_id
,
deleted
=
deleted
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment