Skip to content

Commit

Permalink
Update tool deploy api view
Browse files Browse the repository at this point in the history
Simplify the logic to deploy tools based on the
ID. Update ToolDeployment serializer
  • Loading branch information
michaeljcollinsuk committed Jan 3, 2025
1 parent 75f9335 commit de6d95c
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 51 deletions.
9 changes: 1 addition & 8 deletions controlpanel/api/models/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,6 @@ def delete(self, *args, **kwargs):
self.uninstall()
super().delete(*args, **kwargs)

@property
def host(self):
return f"{self.user.slug}-{self.tool.chart_name}.{settings.TOOLS_DOMAIN}"

def deploy(self):
"""
Deploy the tool to the cluster (asynchronous)
Expand All @@ -220,6 +216,7 @@ def get_status(self, id_token=None, deployment=None):
id_token or self.user.get_id_token(), deployment=deployment
)

@property
def url(self):
tool = self.tool.tool_domain or self.tool.chart_name
return f"https://{self.user.slug}-{tool}.{settings.TOOLS_DOMAIN}/"
Expand All @@ -239,10 +236,6 @@ def _poll(self):
log.info(self._subprocess.stdout.read().strip())
self._subprocess = None

@property
def url(self):
return f"https://{self.host}/"

def restart(self, id_token):
"""
Restart the tool deployment
Expand Down
33 changes: 22 additions & 11 deletions controlpanel/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
AppS3Bucket,
IPAllowlist,
S3Bucket,
ToolDeployment,
User,
UserApp,
UserS3Bucket,
Expand Down Expand Up @@ -337,17 +338,27 @@ class DeleteAppCustomerSerializer(serializers.Serializer):
env_name = serializers.CharField(max_length=64, required=True)


class ToolDeploymentSerializer(serializers.Serializer):
old_chart_name = serializers.CharField(max_length=64, required=False)
version = serializers.CharField(max_length=64, required=True)

def validate_version(self, value):
try:
_, _, _ = value.split("__")
except ValueError:
raise serializers.ValidationError(
"This field include chart name, version and tool.id," ' they are joined by "__".'
)
class ToolDeploymentSerializer(serializers.ModelSerializer):
class Meta:
model = ToolDeployment
fields = ("tool",)

# def __init__(self, *args, **kwargs):
# self.request = kwargs.pop("request")
# super().__init__(*args, **kwargs)

# def create(self, validated_data):
# tool = validated_data["tool"]
# ToolDeployment.objects.filter(user=self.request.user, tool_type=tool.tool_type).update(
# is_active=False
# )
# tool_deployment = ToolDeployment.objects.create(
# tool=tool,
# tool_type=tool.tool_type,
# user=self.request.user,
# is_active=True,
# )
# return tool_deployment


class ESBucketHitsSerializer(serializers.BaseSerializer):
Expand Down
31 changes: 22 additions & 9 deletions controlpanel/api/views/tool_deployments.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,27 @@ def _deploy(self, chart_name, data):
)

def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer = self.get_serializer(data={"tool": request.data.get("version")})
serializer.is_valid(raise_exception=True)
# tool_deployment = serializer.save()

chart_name = self.kwargs["tool_name"]
tool_action = self.kwargs["action"]
tool_action_function = getattr(self, f"_{tool_action}", None)
if tool_action_function and callable(tool_action_function):
tool_action_function(chart_name, request.data)
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
start_background_task(
"tool.deploy",
{
# "tool_name": tool_deployment.tool_type,
# "version": tool_version,
"tool_id": serializer.validated_data["tool"].id,
"user_id": self.request.user.id,
"id_token": self.request.user.get_id_token(),
},
)
return Response(status=status.HTTP_200_OK)

# chart_name = self.kwargs["tool_name"]
# tool_action = self.kwargs["action"]
# tool_action_function = getattr(self, f"_{tool_action}", None)
# if tool_action_function and callable(tool_action_function):
# tool_action_function(chart_name, request.data)
# return Response(status=status.HTTP_200_OK)
# else:
# return Response(status=status.HTTP_400_BAD_REQUEST)
17 changes: 6 additions & 11 deletions controlpanel/frontend/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,18 @@

# Third-party
from django import forms
from django.db.models import Q
from django.contrib.auth.models import Permission
from django.contrib.postgres.forms import SimpleArrayField
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator, validate_email
from django.db.models import Q

# First-party/Local
from controlpanel.api import validators
from controlpanel.api.cluster import AWSRoleCategory
from controlpanel.api.cluster import S3Folder as ClusterS3Folder
from controlpanel.api.github import GithubAPI, RepositoryNotFound, extract_repo_info_from_url
from controlpanel.api.models import (
QUICKSIGHT_EMBED_PERMISSION,
App,
Feedback,
S3Bucket,
Tool,
User,
)
from controlpanel.api.models import QUICKSIGHT_EMBED_PERMISSION, App, Feedback, S3Bucket, Tool, User
from controlpanel.api.models.access_to_s3bucket import S3BUCKET_PATH_REGEX
from controlpanel.api.models.iam_managed_policy import POLICY_NAME_REGEX
from controlpanel.api.models.ip_allowlist import IPAllowlist
Expand Down Expand Up @@ -674,14 +667,16 @@ class Meta:
class ToolChoice(forms.Select):

def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
if selected:
label = f"{label} (installed)"

option = super().create_option(name, value, label, selected, index, subindex, attrs)
if value:
option["attrs"]["data-is-deprecated"] = f"{value.instance.is_deprecated}"
option["attrs"]["data-deprecated-message"] = value.instance.get_deprecated_message

if selected:
option["attrs"]["label"] = f"{label} (installed)"
option["attrs"]["class"] = "installed"

return option


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,14 @@ moj.Modules.toolStatus = {
let oldVersionOption = selectElement.querySelector("option." + this.versionInstalledClass);

if (oldVersionOption) {
oldVersionOption.innerText = oldVersionOption.innerText.replace(this.installedSuffix, "");
oldVersionOption.label = oldVersionOption.label.replace(this.installedSuffix, "");
oldVersionOption.classList.remove(this.versionInstalledClass);
}

// 3. add "(installed)" suffix and class to new version
let newValue = newVersionData.toolName + "__" + newVersionData.version + "__" + newVersionData.tool_id;
let newVersionOption = listener.querySelector(this.versionSelector + " option[value='" + newValue + "']");
let newVersionOption = listener.querySelector(this.versionSelector + " option[value='" + newVersionData.tool_id + "']");
if (newVersionOption) {
newVersionOption.innerText = newVersionOption.innerText + this.installedSuffix;
newVersionOption.label = newVersionOption.label + this.installedSuffix;
newVersionOption.classList.add(this.versionInstalledClass)

// set the new version as the current chosen item
Expand Down
10 changes: 2 additions & 8 deletions controlpanel/frontend/views/tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,21 +170,15 @@ def get_context_data(self, *args, **kwargs):
context["tool_forms"] = []
for tool_type in ToolDeployment.ToolType:
context["tool_forms"].append(self.get_tool_release_form(tool_type=tool_type))
# context[f"{tool_type}_form"] = self.get_tool_release_form(tool_type=tool_type)

# context["tool_forms"].append(context["jupyter_form"])
# context["jupyter_form"] = self.get_tool_release_form(tool_type=ToolDeployment.ToolType.JUPYTER)
# context["rstudio_form"] = ToolForm(user=self.request.user, tool_type=ToolDeployment.ToolType.RSTUDIO)
# context["vscode_form"] = ToolForm(user=self.request.user, tool_type=ToolDeployment.ToolType.VSCODE)
return context

def get_tool_release_form(self, tool_type):
deployment = self.request.user.tool_deployments.filter(tool_type=tool_type).active().first()
return ToolForm(
user=self.request.user,
tool_type=tool_type,
deployment=self.request.user.tool_deployments.filter(tool_type=tool_type)
.active()
.first(),
deployment=deployment,
)


Expand Down

0 comments on commit de6d95c

Please sign in to comment.