From 20e3ffb6a2b6ac5acfe6640e49a2858189350823 Mon Sep 17 00:00:00 2001
From: Nuwan Goonasekera <2070605+nuwang@users.noreply.github.com>
Date: Tue, 9 Jun 2020 14:37:57 +0530
Subject: [PATCH] Make sure project namespace is used instead of project name
---
.../helmsman/tests/data/helmsman_config.yaml | 8 ++--
cloudman/helmsman/tests/mock_helm.py | 28 +++++++++++---
cloudman/helmsman/tests/test_helmsman_api.py | 4 +-
cloudman/projman/api.py | 12 ++++--
.../projman/tests/data/helmsman_config.yaml | 8 ++--
cloudman/projman/tests/test_project_api.py | 37 +++++++++++++++----
6 files changed, 69 insertions(+), 28 deletions(-)
diff --git a/cloudman/helmsman/tests/data/helmsman_config.yaml b/cloudman/helmsman/tests/data/helmsman_config.yaml
index 3cba753a..4815ce95 100644
--- a/cloudman/helmsman/tests/data/helmsman_config.yaml
+++ b/cloudman/helmsman/tests/data/helmsman_config.yaml
@@ -23,9 +23,9 @@ install_templates:
template: |
ingress:
enabled: true
- path: '/{{context.project}}/jupyterhub'
+ path: '{{context.project.access_path}}/jupyterhub'
hub:
- baseUrl: '/{{context.project}}/jupyterhub'
+ baseUrl: '{{context.project.access_path}}/jupyterhub'
proxy:
secretToken: '{{random_alphanumeric(65)}}'
galaxy:
@@ -41,7 +41,7 @@ install_templates:
https://ngkc4.cloudve.org/auth
galaxy-auth
{{random_alphanumeric(8)}}-{{random_alphanumeric(4)}}-{{random_alphanumeric(4)}}-{{random_alphanumeric(12)}}
- https://ngkc4.cloudve.org/{{context.project}}/galaxy/authnz/custos/callback
+ https://ngkc4.cloudve.org{{context.project.access_path}}/galaxy/authnz/custos/callback
master
@@ -65,7 +65,7 @@ install_templates:
enabled: true
hosts:
- ngkc4.cloudve.org
- path: /{{context.project}}/galaxy
+ path: {{context.project.access_path}}/galaxy
tls:
- hosts:
- ngkc4.cloudve.org
diff --git a/cloudman/helmsman/tests/mock_helm.py b/cloudman/helmsman/tests/mock_helm.py
index 380d55aa..7d00185f 100644
--- a/cloudman/helmsman/tests/mock_helm.py
+++ b/cloudman/helmsman/tests/mock_helm.py
@@ -1,6 +1,7 @@
import argparse
import csv
from io import StringIO
+import re
import uuid
import yaml
@@ -13,6 +14,8 @@ class MockHelm(object):
to simulate helm commands.
"""
+ DNS_SUBDOMAIN_REGEX = re.compile('^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{,63}(?https://ngkc4.cloudve.org/auth
galaxy-auth
{{random_alphanumeric(8)}}-{{random_alphanumeric(4)}}-{{random_alphanumeric(4)}}-{{random_alphanumeric(12)}}
- https://ngkc4.cloudve.org/{{context.project}}/galaxy/authnz/custos/callback
+ https://ngkc4.cloudve.org{{context.project.access_path}}/galaxy/authnz/custos/callback
master
@@ -54,7 +54,7 @@ install_templates:
enabled: true
hosts:
- ngkc4.cloudve.org
- path: /{{context.project}}/galaxy
+ path: {{context.project.access_path}}/galaxy
tls:
- hosts:
- ngkc4.cloudve.org
diff --git a/cloudman/projman/tests/test_project_api.py b/cloudman/projman/tests/test_project_api.py
index ac9c2443..8382d0f8 100644
--- a/cloudman/projman/tests/test_project_api.py
+++ b/cloudman/projman/tests/test_project_api.py
@@ -34,25 +34,25 @@ class ProjectServiceTests(ProjManManServiceTestBase):
'name': 'GVL'
}
- def _create_project(self):
+ def _create_project(self, project_data=None):
# create the object
url = reverse('projman:projects-list')
- return self.client.post(url, self.PROJECT_DATA, format='json')
+ return self.client.post(url, project_data or self.PROJECT_DATA, format='json')
- def _list_project(self):
+ def _list_project(self, project_data=None):
# list existing objects
url = reverse('projman:projects-list')
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
- self.assertDictContainsSubset(self.PROJECT_DATA, response.data['results'][0])
+ self.assertDictContainsSubset(project_data or self.PROJECT_DATA, response.data['results'][0])
return response.data['results'][0]['id']
- def _check_project_exists(self, project_id):
+ def _check_project_exists(self, project_id, project_data=None):
# check it exists
url = reverse('projman:projects-detail', args=[project_id])
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertDictContainsSubset(self.PROJECT_DATA, response.data)
+ self.assertDictContainsSubset(project_data or self.PROJECT_DATA, response.data)
return response.data['id']
def _delete_project(self, project_id):
@@ -139,6 +139,27 @@ def test_namespace_tied_to_project(self):
obj = client.namespaces.get(namespace)
self.assertIsNone(obj, "Deleting the project should delete namespace")
+ def test_project_name_special_chars(self):
+ """
+ When creating a project with special chars, the corresponding namespace
+ should be RFC1123 compliant.
+ """
+ PROJECT_DATA = {
+ "name": "A non RFC1123 compli'ant name"
+ }
+ response = self._create_project(project_data=PROJECT_DATA)
+ # Namespace should be slugified version of project name
+ project_id = response.data['id']
+ namespace = response.data['namespace']
+ self.assertEquals(namespace, "a-non-rfc1123-compliant-name")
+ admin = User.objects.filter(is_superuser=True).first()
+ client = HelmsManAPI(HMServiceContext(user=admin))
+ obj = client.namespaces.get(namespace)
+ assert obj
+ self._delete_project(project_id)
+ obj = client.namespaces.get(namespace)
+ self.assertIsNone(obj, "Deleting the project should delete namespace")
+
class ProjectChartServiceTests(ProjManManServiceTestBase):
@@ -196,11 +217,11 @@ def _list_project_chart(self, project_id):
return response.data['results'][1]['id']
- def _check_project_chart_exists(self, project_id, chart_id):
+ def _check_project_chart_exists(self, project_id, chart_id, project_data=None):
url = reverse('projman:chart-detail', args=[project_id, chart_id])
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertDictContainsSubset(self.PROJECT_DATA, response.data['project'])
+ self.assertDictContainsSubset(project_data or self.PROJECT_DATA, response.data['project'])
# Flatten dicts because assertDictContainsSubset doesn't handle nested dicts
response_chart = hm_helpers.flatten_dict(response.data)
expected_chart = hm_helpers.flatten_dict(self.CHART_DATA)