forked from 3wordchant/capsul-flask
create capsul and capsuls list page working
This commit is contained in:
@ -25,62 +25,63 @@ def makeCapsulId():
|
||||
@bp.route("/")
|
||||
@account_required
|
||||
def index():
|
||||
return render_template("capsuls.html", vms=get_model().list_vms_for_account(session["account"]))
|
||||
vms = list(map(
|
||||
lambda x: dict(
|
||||
id=x['id'],
|
||||
size=x['size'],
|
||||
ipv4=(x['ipv4'] if x['ipv4'] else "..booting.."),
|
||||
ipv4_status=("ok" if x['ipv4'] else "waiting-pulse"),
|
||||
os=x['os'],
|
||||
created=x['created'].strftime("%b %d %Y %H:%M")
|
||||
),
|
||||
get_model().list_vms_for_account(session["account"])
|
||||
))
|
||||
return render_template("capsuls.html", vms=vms, has_vms=len(vms) > 0)
|
||||
|
||||
@bp.route("/ssh", methods=("GET", "POST"))
|
||||
@account_required
|
||||
def ssh_public_keys():
|
||||
db_model = get_model()
|
||||
error = None
|
||||
|
||||
errors = list()
|
||||
|
||||
if request.method == "POST":
|
||||
method = request.form["method"]
|
||||
|
||||
name = request.form["name"]
|
||||
if not name or len(name.strip()) < 1:
|
||||
error = "Name is required"
|
||||
errors.append("Name is required")
|
||||
elif not re.match(r"^[0-9A-Za-z_ -]+$", name):
|
||||
error = "Name must match \"^[0-9A-Za-z_ -]+$\""
|
||||
errors.append("Name must match \"^[0-9A-Za-z_ -]+$\"")
|
||||
|
||||
if method == "POST":
|
||||
content = request.form["content"]
|
||||
if not content or len(content.strip()) < 1:
|
||||
error = "Content is required"
|
||||
errors.append("Content is required")
|
||||
else:
|
||||
content = content.replace("\r", "").replace("\n", "")
|
||||
if not re.match(r"^(ssh|ecdsa)-[0-9A-Za-z+/_=@ -]+$", content):
|
||||
error = "Content must match \"^(ssh|ecdsa)-[0-9A-Za-z+/_=@ -]+$\""
|
||||
errors.append("Content must match \"^(ssh|ecdsa)-[0-9A-Za-z+/_=@ -]+$\"")
|
||||
|
||||
if db_model.ssh_public_key_name_exists(session["account"], name):
|
||||
error = "A key with that name already exists"
|
||||
errors.append("A key with that name already exists")
|
||||
|
||||
if error is None:
|
||||
if len(errors) == 0:
|
||||
db_model.create_ssh_public_key(session["account"], name, content)
|
||||
|
||||
elif method == "DELETE":
|
||||
|
||||
if error is None:
|
||||
if len(errors) == 0:
|
||||
db_model.delete_ssh_public_key(session["account"], name)
|
||||
|
||||
if error:
|
||||
for error in errors:
|
||||
flash(error)
|
||||
|
||||
# keys_list=
|
||||
# for key in keys_list:
|
||||
# if len(key['content']) > 40:
|
||||
# print(key['content'])
|
||||
# print(f"{key['content'][:20]}...{key['content'][len(key['content'])-20:]}")
|
||||
# key["content"] =
|
||||
keys_list=list(map(
|
||||
lambda x: dict(name=x['name'], content=f"{x['content'][:20]}...{x['content'][len(x['content'])-20:]}"),
|
||||
db_model.list_ssh_public_keys_for_account(session["account"])
|
||||
))
|
||||
|
||||
# return
|
||||
|
||||
return render_template(
|
||||
"ssh-public-keys.html",
|
||||
ssh_public_keys=map(
|
||||
lambda x: dict(name=x['name'], content=f"{x['content'][:20]}...{x['content'][len(x['content'])-20:]}"),
|
||||
db_model.list_ssh_public_keys_for_account(session["account"])
|
||||
)
|
||||
)
|
||||
return render_template("ssh-public-keys.html", ssh_public_keys=keys_list, has_ssh_public_keys=len(keys_list) > 0)
|
||||
|
||||
@bp.route("/create", methods=("GET", "POST"))
|
||||
@account_required
|
||||
@ -89,22 +90,45 @@ def create():
|
||||
vm_sizes = db_model.vm_sizes_dict()
|
||||
operating_systems = db_model.operating_systems_dict()
|
||||
ssh_public_keys = db_model.list_ssh_public_keys_for_account(session["account"])
|
||||
error = None
|
||||
errors = list()
|
||||
created_os = None
|
||||
|
||||
if request.method == "POST":
|
||||
|
||||
size = request.form["size"]
|
||||
os = request.form["os"]
|
||||
if not size:
|
||||
error = "Size is required"
|
||||
errors.append("Size is required")
|
||||
elif size not in vm_sizes:
|
||||
error = f"Invalid size {size}"
|
||||
errors.append(f"Invalid size {size}")
|
||||
|
||||
if not os:
|
||||
error = "OS is required"
|
||||
errors.append("OS is required")
|
||||
elif os not in operating_systems:
|
||||
error = f"Invalid os {os}"
|
||||
errors.append(f"Invalid os {os}")
|
||||
|
||||
if error is None:
|
||||
posted_keys_count = int(request.form["ssh_public_key_count"])
|
||||
posted_keys_contents = list()
|
||||
|
||||
if posted_keys_count > 1000:
|
||||
errors.append("something went wrong with ssh keys")
|
||||
else:
|
||||
for i in range(0, posted_keys_count):
|
||||
if f"ssh_key_{i}" in request.form:
|
||||
posted_name = request.form[f"ssh_key_{i}"]
|
||||
key_content = None
|
||||
for key in ssh_public_keys:
|
||||
if key['name'] == posted_name:
|
||||
key_content = key['content']
|
||||
if key_content:
|
||||
posted_keys_contents.append(key_content)
|
||||
else:
|
||||
errors.append(f"SSH Key \"{posted_name}\" doesn't exist")
|
||||
|
||||
if len(posted_keys_contents) == 0:
|
||||
errors.append("At least one SSH Public Key is required")
|
||||
|
||||
if len(errors) == 0:
|
||||
id = makeCapsulId()
|
||||
db_model.create_vm(
|
||||
email=session["account"],
|
||||
@ -115,17 +139,22 @@ def create():
|
||||
current_app.config["VIRTUALIZATION_MODEL"].create(
|
||||
email = session["account"],
|
||||
id=id,
|
||||
template_image_file_name=operating_systems[os].template_image_file_name,
|
||||
vcpus=vm_sizes[size].vcpus,
|
||||
memory=vm_sizes[size].memory
|
||||
template_image_file_name=operating_systems[os]['template_image_file_name'],
|
||||
vcpus=vm_sizes[size]['vcpus'],
|
||||
memory_mb=vm_sizes[size]['memory_mb'],
|
||||
ssh_public_keys=posted_keys_contents
|
||||
)
|
||||
|
||||
if error:
|
||||
created_os = os
|
||||
|
||||
for error in errors:
|
||||
flash(error)
|
||||
|
||||
return render_template(
|
||||
"create-capsul.html",
|
||||
created_os=created_os,
|
||||
ssh_public_keys=ssh_public_keys,
|
||||
ssh_public_key_count=len(ssh_public_keys),
|
||||
has_ssh_public_keys=len(ssh_public_keys) > 0,
|
||||
operating_systems=operating_systems,
|
||||
vm_sizes=vm_sizes
|
||||
)
|
||||
|
Reference in New Issue
Block a user