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)