def tool_deploy(self, message):
        """
        Deploy the named tool for the specified user
        Expects a message with `tool_name`, `version` and `user_id` values
        """

        tool, user = self.get_tool_and_user(message)
        id_token = message["id_token"]
        old_chart_name = message.get("old_chart_name", None)
        tool_deployment = ToolDeployment(tool, user, old_chart_name)

        update_tool_status(tool_deployment, id_token, TOOL_DEPLOYING)
        try:
            tool_deployment.save()
        except ToolDeployment.Error as err:
            update_tool_status(tool_deployment, id_token, TOOL_DEPLOY_FAILED)
            log.error(err)
            return

        status = wait_for_deployment(tool_deployment, id_token)

        if status == TOOL_DEPLOY_FAILED:
            log.warning(f"Failed deploying {tool.name} for {user}")
        else:
            log.debug(f"Deployed {tool.name} for {user}")
def test_deploy_for_generic(helm, token_hex, tool, users):
    cookie_secret_proxy = "cookie secret proxy"
    cookie_secret_tool = "cookie secret tool"
    token_hex.side_effect = [cookie_secret_proxy, cookie_secret_tool]
    user = users["normal_user"]

    # simulate release with old naming scheme installed
    old_release_name = f"{user.username}-{tool.chart_name}"
    helm.list_releases.return_value = [old_release_name]

    tool_deployment = ToolDeployment(tool, user)
    tool_deployment.save()

    # uninstall tool with old naming scheme
    helm.delete.assert_called_with(True, old_release_name)

    # install new release
    helm.upgrade_release.assert_called_with(
        f"{tool.chart_name}-{user.slug}",
        f"mojanalytics/{tool.chart_name}",
        "--version",
        tool.version,
        "--namespace",
        user.k8s_namespace,
        "--set",
        f"username={user.username}",
        "--set",
        f"Username={user.username}",
        "--set",
        f"aws.iamRole={user.iam_role_name}",
        "--set",
        f"toolsDomain={settings.TOOLS_DOMAIN}",
    )
 def create(self, request):
     try:
         tool = Tool.objects.get(chart_name=request.data["name"])
     except Tool.DoesNotExist:
         return Response({}, status=status.HTTP_400_BAD_REQUEST)
     tool_deployment = ToolDeployment(tool, request.user)
     tool_deployment.save()
     return Response({}, status=status.HTTP_201_CREATED)