lint: reformat python code with black
This commit is contained in:
parent
331beb01b4
commit
a406a7974b
88 changed files with 2579 additions and 1608 deletions
|
@ -3,8 +3,15 @@ from typing import Dict, List, Optional, Type, Union
|
|||
from flask import Blueprint, redirect, render_template, url_for
|
||||
from flask.typing import ResponseReturnValue
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import (BooleanField, Form, FormField, IntegerField, SelectField,
|
||||
StringField, SubmitField)
|
||||
from wtforms import (
|
||||
BooleanField,
|
||||
Form,
|
||||
FormField,
|
||||
IntegerField,
|
||||
SelectField,
|
||||
StringField,
|
||||
SubmitField,
|
||||
)
|
||||
from wtforms.validators import InputRequired
|
||||
|
||||
from app.extensions import db
|
||||
|
@ -14,54 +21,72 @@ bp = Blueprint("cloud", __name__)
|
|||
|
||||
_SECTION_TEMPLATE_VARS = {
|
||||
"section": "cloud",
|
||||
"help_url": "https://bypass.censorship.guide/user/cloud.html"
|
||||
"help_url": "https://bypass.censorship.guide/user/cloud.html",
|
||||
}
|
||||
|
||||
|
||||
class NewCloudAccountForm(FlaskForm): # type: ignore
|
||||
provider = SelectField('Cloud Provider', validators=[InputRequired()])
|
||||
submit = SubmitField('Next')
|
||||
provider = SelectField("Cloud Provider", validators=[InputRequired()])
|
||||
submit = SubmitField("Next")
|
||||
|
||||
|
||||
class AWSAccountForm(FlaskForm): # type: ignore
|
||||
provider = StringField('Platform', render_kw={"disabled": ""})
|
||||
description = StringField('Description', validators=[InputRequired()])
|
||||
aws_access_key = StringField('AWS Access Key', validators=[InputRequired()])
|
||||
aws_secret_key = StringField('AWS Secret Key', validators=[InputRequired()])
|
||||
aws_region = StringField('AWS Region', default='us-east-2', validators=[InputRequired()])
|
||||
max_distributions = IntegerField('Cloudfront Distributions Quota', default=200,
|
||||
description="This is the quota for number of distributions per account.",
|
||||
validators=[InputRequired()])
|
||||
max_instances = IntegerField('EC2 Instance Quota', default=2,
|
||||
description="This can be impacted by a number of quotas including instance limits "
|
||||
"and IP address limits.",
|
||||
validators=[InputRequired()])
|
||||
enabled = BooleanField('Enable this account', default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.")
|
||||
submit = SubmitField('Save Changes')
|
||||
provider = StringField("Platform", render_kw={"disabled": ""})
|
||||
description = StringField("Description", validators=[InputRequired()])
|
||||
aws_access_key = StringField("AWS Access Key", validators=[InputRequired()])
|
||||
aws_secret_key = StringField("AWS Secret Key", validators=[InputRequired()])
|
||||
aws_region = StringField(
|
||||
"AWS Region", default="us-east-2", validators=[InputRequired()]
|
||||
)
|
||||
max_distributions = IntegerField(
|
||||
"Cloudfront Distributions Quota",
|
||||
default=200,
|
||||
description="This is the quota for number of distributions per account.",
|
||||
validators=[InputRequired()],
|
||||
)
|
||||
max_instances = IntegerField(
|
||||
"EC2 Instance Quota",
|
||||
default=2,
|
||||
description="This can be impacted by a number of quotas including instance limits "
|
||||
"and IP address limits.",
|
||||
validators=[InputRequired()],
|
||||
)
|
||||
enabled = BooleanField(
|
||||
"Enable this account",
|
||||
default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.",
|
||||
)
|
||||
submit = SubmitField("Save Changes")
|
||||
|
||||
|
||||
class HcloudAccountForm(FlaskForm): # type: ignore
|
||||
provider = StringField('Platform', render_kw={"disabled": ""})
|
||||
description = StringField('Description', validators=[InputRequired()])
|
||||
hcloud_token = StringField('Hetzner Cloud Token', validators=[InputRequired()])
|
||||
max_instances = IntegerField('Server Limit', default=10,
|
||||
validators=[InputRequired()])
|
||||
enabled = BooleanField('Enable this account', default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.")
|
||||
submit = SubmitField('Save Changes')
|
||||
provider = StringField("Platform", render_kw={"disabled": ""})
|
||||
description = StringField("Description", validators=[InputRequired()])
|
||||
hcloud_token = StringField("Hetzner Cloud Token", validators=[InputRequired()])
|
||||
max_instances = IntegerField(
|
||||
"Server Limit", default=10, validators=[InputRequired()]
|
||||
)
|
||||
enabled = BooleanField(
|
||||
"Enable this account",
|
||||
default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.",
|
||||
)
|
||||
submit = SubmitField("Save Changes")
|
||||
|
||||
|
||||
class GitlabAccountForm(FlaskForm): # type: ignore
|
||||
provider = StringField('Platform', render_kw={"disabled": ""})
|
||||
description = StringField('Description', validators=[InputRequired()])
|
||||
gitlab_token = StringField('GitLab Access Token', validators=[InputRequired()])
|
||||
enabled = BooleanField('Enable this account', default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.")
|
||||
submit = SubmitField('Save Changes')
|
||||
provider = StringField("Platform", render_kw={"disabled": ""})
|
||||
description = StringField("Description", validators=[InputRequired()])
|
||||
gitlab_token = StringField("GitLab Access Token", validators=[InputRequired()])
|
||||
enabled = BooleanField(
|
||||
"Enable this account",
|
||||
default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.",
|
||||
)
|
||||
submit = SubmitField("Save Changes")
|
||||
|
||||
|
||||
class OvhHorizonForm(Form): # type: ignore[misc]
|
||||
|
@ -77,16 +102,20 @@ class OvhApiForm(Form): # type: ignore[misc]
|
|||
|
||||
|
||||
class OvhAccountForm(FlaskForm): # type: ignore
|
||||
provider = StringField('Platform', render_kw={"disabled": ""})
|
||||
description = StringField('Description', validators=[InputRequired()])
|
||||
horizon = FormField(OvhHorizonForm, 'OpenStack Horizon API')
|
||||
ovh_api = FormField(OvhApiForm, 'OVH API')
|
||||
max_instances = IntegerField('Server Limit', default=10,
|
||||
validators=[InputRequired()])
|
||||
enabled = BooleanField('Enable this account', default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.")
|
||||
submit = SubmitField('Save Changes')
|
||||
provider = StringField("Platform", render_kw={"disabled": ""})
|
||||
description = StringField("Description", validators=[InputRequired()])
|
||||
horizon = FormField(OvhHorizonForm, "OpenStack Horizon API")
|
||||
ovh_api = FormField(OvhApiForm, "OVH API")
|
||||
max_instances = IntegerField(
|
||||
"Server Limit", default=10, validators=[InputRequired()]
|
||||
)
|
||||
enabled = BooleanField(
|
||||
"Enable this account",
|
||||
default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.",
|
||||
)
|
||||
submit = SubmitField("Save Changes")
|
||||
|
||||
|
||||
class GandiHorizonForm(Form): # type: ignore[misc]
|
||||
|
@ -96,18 +125,24 @@ class GandiHorizonForm(Form): # type: ignore[misc]
|
|||
|
||||
|
||||
class GandiAccountForm(FlaskForm): # type: ignore
|
||||
provider = StringField('Platform', render_kw={"disabled": ""})
|
||||
description = StringField('Description', validators=[InputRequired()])
|
||||
horizon = FormField(GandiHorizonForm, 'OpenStack Horizon API')
|
||||
max_instances = IntegerField('Server Limit', default=10,
|
||||
validators=[InputRequired()])
|
||||
enabled = BooleanField('Enable this account', default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.")
|
||||
submit = SubmitField('Save Changes')
|
||||
provider = StringField("Platform", render_kw={"disabled": ""})
|
||||
description = StringField("Description", validators=[InputRequired()])
|
||||
horizon = FormField(GandiHorizonForm, "OpenStack Horizon API")
|
||||
max_instances = IntegerField(
|
||||
"Server Limit", default=10, validators=[InputRequired()]
|
||||
)
|
||||
enabled = BooleanField(
|
||||
"Enable this account",
|
||||
default=True,
|
||||
description="New resources will not be deployed to disabled accounts, however existing "
|
||||
"resources will persist until destroyed at the end of their lifecycle.",
|
||||
)
|
||||
submit = SubmitField("Save Changes")
|
||||
|
||||
|
||||
CloudAccountForm = Union[AWSAccountForm, HcloudAccountForm, GandiAccountForm, OvhAccountForm]
|
||||
CloudAccountForm = Union[
|
||||
AWSAccountForm, HcloudAccountForm, GandiAccountForm, OvhAccountForm
|
||||
]
|
||||
|
||||
provider_forms: Dict[str, Type[CloudAccountForm]] = {
|
||||
CloudProvider.AWS.name: AWSAccountForm,
|
||||
|
@ -118,7 +153,9 @@ provider_forms: Dict[str, Type[CloudAccountForm]] = {
|
|||
}
|
||||
|
||||
|
||||
def cloud_account_save(account: Optional[CloudAccount], provider: CloudProvider, form: CloudAccountForm) -> None:
|
||||
def cloud_account_save(
|
||||
account: Optional[CloudAccount], provider: CloudProvider, form: CloudAccountForm
|
||||
) -> None:
|
||||
if not account:
|
||||
account = CloudAccount()
|
||||
account.provider = provider
|
||||
|
@ -162,7 +199,9 @@ def cloud_account_save(account: Optional[CloudAccount], provider: CloudProvider,
|
|||
"ovh_openstack_password": form.horizon.data["ovh_openstack_password"],
|
||||
"ovh_openstack_tenant_id": form.horizon.data["ovh_openstack_tenant_id"],
|
||||
"ovh_cloud_application_key": form.ovh_api.data["ovh_cloud_application_key"],
|
||||
"ovh_cloud_application_secret": form.ovh_api.data["ovh_cloud_application_secret"],
|
||||
"ovh_cloud_application_secret": form.ovh_api.data[
|
||||
"ovh_cloud_application_secret"
|
||||
],
|
||||
"ovh_cloud_consumer_key": form.ovh_api.data["ovh_cloud_consumer_key"],
|
||||
}
|
||||
account.max_distributions = 0
|
||||
|
@ -182,53 +221,82 @@ def cloud_account_populate(form: CloudAccountForm, account: CloudAccount) -> Non
|
|||
form.aws_region.data = account.credentials["aws_region"]
|
||||
form.max_distributions.data = account.max_distributions
|
||||
form.max_instances.data = account.max_instances
|
||||
elif account.provider == CloudProvider.HCLOUD and isinstance(form, HcloudAccountForm):
|
||||
elif account.provider == CloudProvider.HCLOUD and isinstance(
|
||||
form, HcloudAccountForm
|
||||
):
|
||||
form.hcloud_token.data = account.credentials["hcloud_token"]
|
||||
form.max_instances.data = account.max_instances
|
||||
elif account.provider == CloudProvider.GANDI and isinstance(form, GandiAccountForm):
|
||||
form.horizon.form.gandi_openstack_user.data = account.credentials["gandi_openstack_user"]
|
||||
form.horizon.form.gandi_openstack_password.data = account.credentials["gandi_openstack_password"]
|
||||
form.horizon.form.gandi_openstack_tenant_id.data = account.credentials["gandi_openstack_tenant_id"]
|
||||
form.horizon.form.gandi_openstack_user.data = account.credentials[
|
||||
"gandi_openstack_user"
|
||||
]
|
||||
form.horizon.form.gandi_openstack_password.data = account.credentials[
|
||||
"gandi_openstack_password"
|
||||
]
|
||||
form.horizon.form.gandi_openstack_tenant_id.data = account.credentials[
|
||||
"gandi_openstack_tenant_id"
|
||||
]
|
||||
form.max_instances.data = account.max_instances
|
||||
elif account.provider == CloudProvider.GITLAB and isinstance(form, GitlabAccountForm):
|
||||
elif account.provider == CloudProvider.GITLAB and isinstance(
|
||||
form, GitlabAccountForm
|
||||
):
|
||||
form.gitlab_token.data = account.credentials["gitlab_token"]
|
||||
elif account.provider == CloudProvider.OVH and isinstance(form, OvhAccountForm):
|
||||
form.horizon.form.ovh_openstack_user.data = account.credentials["ovh_openstack_user"]
|
||||
form.horizon.form.ovh_openstack_password.data = account.credentials["ovh_openstack_password"]
|
||||
form.horizon.form.ovh_openstack_tenant_id.data = account.credentials["ovh_openstack_tenant_id"]
|
||||
form.ovh_api.form.ovh_cloud_application_key.data = account.credentials["ovh_cloud_application_key"]
|
||||
form.ovh_api.form.ovh_cloud_application_secret.data = account.credentials["ovh_cloud_application_secret"]
|
||||
form.ovh_api.form.ovh_cloud_consumer_key.data = account.credentials["ovh_cloud_consumer_key"]
|
||||
form.horizon.form.ovh_openstack_user.data = account.credentials[
|
||||
"ovh_openstack_user"
|
||||
]
|
||||
form.horizon.form.ovh_openstack_password.data = account.credentials[
|
||||
"ovh_openstack_password"
|
||||
]
|
||||
form.horizon.form.ovh_openstack_tenant_id.data = account.credentials[
|
||||
"ovh_openstack_tenant_id"
|
||||
]
|
||||
form.ovh_api.form.ovh_cloud_application_key.data = account.credentials[
|
||||
"ovh_cloud_application_key"
|
||||
]
|
||||
form.ovh_api.form.ovh_cloud_application_secret.data = account.credentials[
|
||||
"ovh_cloud_application_secret"
|
||||
]
|
||||
form.ovh_api.form.ovh_cloud_consumer_key.data = account.credentials[
|
||||
"ovh_cloud_consumer_key"
|
||||
]
|
||||
form.max_instances.data = account.max_instances
|
||||
else:
|
||||
raise RuntimeError(f"Unknown provider {account.provider} or form data {type(form)} did not match provider.")
|
||||
raise RuntimeError(
|
||||
f"Unknown provider {account.provider} or form data {type(form)} did not match provider."
|
||||
)
|
||||
|
||||
|
||||
@bp.route("/list")
|
||||
def cloud_account_list() -> ResponseReturnValue:
|
||||
accounts: List[CloudAccount] = CloudAccount.query.filter(CloudAccount.destroyed.is_(None)).all()
|
||||
return render_template("list.html.j2",
|
||||
title="Cloud Accounts",
|
||||
item="cloud account",
|
||||
items=accounts,
|
||||
new_link=url_for("portal.cloud.cloud_account_new"),
|
||||
**_SECTION_TEMPLATE_VARS)
|
||||
accounts: List[CloudAccount] = CloudAccount.query.filter(
|
||||
CloudAccount.destroyed.is_(None)
|
||||
).all()
|
||||
return render_template(
|
||||
"list.html.j2",
|
||||
title="Cloud Accounts",
|
||||
item="cloud account",
|
||||
items=accounts,
|
||||
new_link=url_for("portal.cloud.cloud_account_new"),
|
||||
**_SECTION_TEMPLATE_VARS,
|
||||
)
|
||||
|
||||
|
||||
@bp.route("/new", methods=['GET', 'POST'])
|
||||
@bp.route("/new", methods=["GET", "POST"])
|
||||
def cloud_account_new() -> ResponseReturnValue:
|
||||
form = NewCloudAccountForm()
|
||||
form.provider.choices = sorted([
|
||||
(provider.name, provider.description) for provider in CloudProvider
|
||||
], key=lambda p: p[1].lower())
|
||||
form.provider.choices = sorted(
|
||||
[(provider.name, provider.description) for provider in CloudProvider],
|
||||
key=lambda p: p[1].lower(),
|
||||
)
|
||||
if form.validate_on_submit():
|
||||
return redirect(url_for("portal.cloud.cloud_account_new_for", provider=form.provider.data))
|
||||
return render_template("new.html.j2",
|
||||
form=form,
|
||||
**_SECTION_TEMPLATE_VARS)
|
||||
return redirect(
|
||||
url_for("portal.cloud.cloud_account_new_for", provider=form.provider.data)
|
||||
)
|
||||
return render_template("new.html.j2", form=form, **_SECTION_TEMPLATE_VARS)
|
||||
|
||||
|
||||
@bp.route("/new/<provider>", methods=['GET', 'POST'])
|
||||
@bp.route("/new/<provider>", methods=["GET", "POST"])
|
||||
def cloud_account_new_for(provider: str) -> ResponseReturnValue:
|
||||
form = provider_forms[provider]()
|
||||
form.provider.data = CloudProvider[provider].description
|
||||
|
@ -236,12 +304,10 @@ def cloud_account_new_for(provider: str) -> ResponseReturnValue:
|
|||
cloud_account_save(None, CloudProvider[provider], form)
|
||||
db.session.commit()
|
||||
return redirect(url_for("portal.cloud.cloud_account_list"))
|
||||
return render_template("new.html.j2",
|
||||
form=form,
|
||||
**_SECTION_TEMPLATE_VARS)
|
||||
return render_template("new.html.j2", form=form, **_SECTION_TEMPLATE_VARS)
|
||||
|
||||
|
||||
@bp.route("/edit/<account_id>", methods=['GET', 'POST'])
|
||||
@bp.route("/edit/<account_id>", methods=["GET", "POST"])
|
||||
def cloud_account_edit(account_id: int) -> ResponseReturnValue:
|
||||
account = CloudAccount.query.filter(
|
||||
CloudAccount.id == account_id,
|
||||
|
@ -256,6 +322,4 @@ def cloud_account_edit(account_id: int) -> ResponseReturnValue:
|
|||
db.session.commit()
|
||||
return redirect(url_for("portal.cloud.cloud_account_list"))
|
||||
cloud_account_populate(form, account)
|
||||
return render_template("new.html.j2",
|
||||
form=form,
|
||||
**_SECTION_TEMPLATE_VARS)
|
||||
return render_template("new.html.j2", form=form, **_SECTION_TEMPLATE_VARS)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue