diff --git a/panel/templates/panel/base.html b/panel/templates/panel/base.html index 5437472..dcc6156 100644 --- a/panel/templates/panel/base.html +++ b/panel/templates/panel/base.html @@ -9,7 +9,7 @@ {% block title %}{% endblock %} - + {% block extrahead %}{% endblock %} @@ -34,13 +34,18 @@ {% block applist%}
  • Release Dashboard
  • {% endblock %} + {% if user.is_authenticated %} +
  • logout {{ user.get_username }}
  • + {% else %} +
  • login
  • + {% endif %} {% block content %}{% endblock %} - - + + {% block extrajs %}{% endblock %} diff --git a/release_dashboard/test/test_views.py b/release_dashboard/test/test_views.py index e2c1466..ca70b42 100644 --- a/release_dashboard/test/test_views.py +++ b/release_dashboard/test/test_views.py @@ -28,3 +28,15 @@ class TestHotfix(TestCase): self.client.force_login(user) res = self.client.get(reverse("release_dashboard:hotfix")) self.assertEqual(res.status_code, 200) + + +class TestDocker(TestCase): + def test_no_login(self): + res = self.client.get(reverse("release_dashboard:docker_images")) + self.assertNotEqual(res.status_code, 200) + + def test_login_ok(self): + user = User.objects.create_user(username="test") + self.client.force_login(user) + res = self.client.get(reverse("release_dashboard:docker_images")) + self.assertEqual(res.status_code, 200) diff --git a/release_dashboard/views/build.py b/release_dashboard/views/build.py index e451aba..f8d9a21 100644 --- a/release_dashboard/views/build.py +++ b/release_dashboard/views/build.py @@ -36,13 +36,13 @@ logger = logging.getLogger(__name__) def index(request): context = {} - return render(request, 'release_dashboard/index.html', context) + return render(request, "release_dashboard/index.html", context) @login_required -@require_http_methods(["POST", ]) +@require_http_methods(["POST"]) def hotfix_build(request, branch, project): - if project not in rd_settings['projects']: + if project not in rd_settings["projects"]: error = "repo:%s not valid" % project logger.error(error) return HttpResponseNotFound(error) @@ -58,158 +58,139 @@ def hotfix_build(request, branch, project): logger.error(error) return HttpResponseNotFound(error) - json_data = json.loads(request.body.decode('utf-8')) - if json_data['push'] == 'no': + json_data = json.loads(request.body.decode("utf-8")) + if json_data["push"] == "no": logger.warn("dryrun for %s:%s", project, branch) - url = build.trigger_hotfix(project, branch, json_data['push']) - return JsonResponse({'url': url}) + url = build.trigger_hotfix(project, branch, json_data["push"]) + return JsonResponse({"url": url}) def _build_logic(form, projects): - version_release = form.cleaned_data['version_release'] - distribution = form.cleaned_data['distribution'] + version_release = form.cleaned_data["version_release"] + distribution = form.cleaned_data["distribution"] result = _hash_versions(form.cleaned_data, projects) - context = {'projects': [], 'release': version_release} + context = {"projects": [], "release": version_release} flow_uuid = uuid.uuid4() + msg = "trying to trigger release %s, project %s" for pro in projects: try: - logger.debug( - "trying to trigger release %s, project %s", - version_release, pro) - url = build.trigger_build("%s-get-code" % pro, - version_release, result[pro], - distribution, flow_uuid) - context['projects'].append( - {'name': pro, 'url': url}) + logger.debug(msg, version_release, pro) + url = build.trigger_build( + "%s-get-code" % pro, + version_release, + result[pro], + distribution, + flow_uuid, + ) + context["projects"].append({"name": pro, "url": url}) except KeyError: - logger.error("Houston, we have a problem with" - "trigger for %s", pro) - context['projects'].append( - {'name': pro, 'url': None}) + msg = "Houston, we have a problem with trigger for %s" + logger.error(msg, pro) + context["projects"].append({"name": pro, "url": None}) return context +@login_required def build_deps(request, tag_only=False): if request.method == "POST": form = BuildDepForm(request.POST) if form.is_valid(): - context = _build_logic(form, rd_settings['build_deps']) + context = _build_logic(form, rd_settings["build_deps"]) else: - context = {'error': 'form validation error'} - return render(request, 'release_dashboard/build_result.html', context) + context = {"error": "form validation error"} + return render(request, "release_dashboard/build_result.html", context) else: context = { - 'projects': _projects_versions( - rd_settings['build_deps'], - regex_mr, - True, - not tag_only, + "projects": _projects_versions( + rd_settings["build_deps"], regex_mr, True, not tag_only, ), - 'debian': rd_settings['debian_supported'], + "debian": rd_settings["debian_supported"], } _common_versions(context, True, not tag_only) - return render(request, 'release_dashboard/build_deps.html', context) + return render(request, "release_dashboard/build_deps.html", context) @login_required def hotfix(request): - context = { - 'projects': _projects_versions( - rd_settings['projects'], - regex_hotfix, - ) - } - return render(request, 'release_dashboard/hotfix.html', context) + prj_list = _projects_versions(rd_settings["projects"], regex_hotfix) + context = {"projects": prj_list} + return render(request, "release_dashboard/hotfix.html", context) +@login_required def build_release(request, tag_only=False): if request.method == "POST": form = BuildReleaseForm(request.POST) if form.is_valid(): - context = _build_logic(form, rd_settings['projects']) + context = _build_logic(form, rd_settings["projects"]) else: - context = {'error': 'form validation error'} - return render(request, 'release_dashboard/build_result.html', context) + context = {"error": "form validation error"} + return render(request, "release_dashboard/build_result.html", context) else: context = { - 'projects': _projects_versions( - rd_settings['projects'], - regex_mr, - True, - not tag_only, + "projects": _projects_versions( + rd_settings["projects"], regex_mr, True, not tag_only, ), - 'debian': rd_settings['debian_supported'], + "debian": rd_settings["debian_supported"], } _common_versions(context, True, not tag_only) if tag_only: - return render(request, 'release_dashboard/build_tag.html', context) - return render(request, 'release_dashboard/build.html', context) + return render(request, "release_dashboard/build_tag.html", context) + return render(request, "release_dashboard/build.html", context) +@login_required def refresh_all(request): if request.method == "POST": res = gerrit_fetch_all.delay() - return JsonResponse({'url': '/flower/task/%s' % res.id}) + return JsonResponse({"url": "/flower/task/%s" % res.id}) else: + template = "release_dashboard/refresh.html" projects = [] - for project in rd_settings['projects']: - info = { - 'name': project, - 'tags': None - } + for project in rd_settings["projects"]: + info = {"name": project, "tags": None} projects.append(info) - return render(request, 'release_dashboard/refresh.html', - {'projects': projects}) + return render(request, template, {"projects": projects}) -@require_http_methods(["POST", ]) +@require_http_methods(["POST"]) def refresh(request, project): res = gerrit_fetch_info.delay(project) - return JsonResponse({'url': '/flower/task/%s' % res.id}) + return JsonResponse({"url": "/flower/task/%s" % res.id}) +@login_required def build_trunk_deps(request): if request.method == "POST": form = BuildTrunkDepForm(request.POST) if form.is_valid(): - context = _build_logic(form, rd_settings['build_deps']) + context = _build_logic(form, rd_settings["build_deps"]) else: - context = {'error': 'form validation error'} - return render(request, 'release_dashboard/build_result.html', context) + context = {"error": "form validation error"} + return render(request, "release_dashboard/build_result.html", context) else: + template = "release_dashboard/build_trunk_deps.html" context = { - 'projects': _projects_versions( - trunk_build_deps, - regex_master, - ), - 'common_versions': { - 'tags': [], - 'branches': ['master', ] - }, - 'debian': rd_settings['debian_supported'], + "projects": _projects_versions(trunk_build_deps, regex_master,), + "common_versions": {"tags": [], "branches": ["master"]}, + "debian": rd_settings["debian_supported"], } - return render(request, - 'release_dashboard/build_trunk_deps.html', context) + return render(request, template, context) +@login_required def build_trunk_release(request): if request.method == "POST": form = BuildTrunkReleaseForm(request.POST) if form.is_valid(): context = _build_logic(form, trunk_projects) else: - context = {'error': 'form validation error'} - return render(request, 'release_dashboard/build_result.html', context) + context = {"error": "form validation error"} + return render(request, "release_dashboard/build_result.html", context) else: context = { - 'projects': _projects_versions( - trunk_projects, - regex_master, - ), - 'common_versions': { - 'tags': [], - 'branches': ['master', ] - }, - 'debian': rd_settings['debian_supported'], + "projects": _projects_versions(trunk_projects, regex_master,), + "common_versions": {"tags": [], "branches": ["master"]}, + "debian": rd_settings["debian_supported"], } - return render(request, 'release_dashboard/build_trunk.html', context) + return render(request, "release_dashboard/build_trunk.html", context) diff --git a/release_dashboard/views/docker.py b/release_dashboard/views/docker.py index 7754712..39a600e 100644 --- a/release_dashboard/views/docker.py +++ b/release_dashboard/views/docker.py @@ -19,6 +19,7 @@ from django.shortcuts import render from django.http import JsonResponse, Http404 from django.views.decorators.http import require_http_methods from django.conf import settings +from django.contrib.auth.decorators import login_required from rest_framework import generics, status from rest_framework.response import Response from release_dashboard.utils import docker @@ -40,12 +41,12 @@ def _get_docker_tags(project, tag=None): logger.debug("%s: %s" % (project, project_repos)) docker_tags = [] for image in project_repos: - res = {'name': image} + res = {"name": image} tags = docker.get_docker_tags(image) if tag: logger.degug("non filtered tags: %s" % tags) tags = filter(re.compile(tag).match, tags) - res['tags'] = tags + res["tags"] = tags docker_tags.append(res) logger.debug("docker_tags: %s" % docker_tags) return docker_tags @@ -53,88 +54,78 @@ def _get_docker_tags(project, tag=None): def _build_docker_logic(form, projects): result = _hash_versions(form.cleaned_data, projects) - context = {'projects': []} + context = {"projects": []} for pro in projects: try: logger.debug( "trying to trigger docker image at branch %s for project %s", - result[pro], pro) + result[pro], + pro, + ) url = docker.trigger_docker_build(pro, result[pro]) - context['projects'].append( - {'name': pro, 'url': url}) + context["projects"].append({"name": pro, "url": url}) except KeyError: - logger.error("Houston, we have a problem with" - "trigger for %s", pro) - context['projects'].append( - {'name': pro, 'url': None}) + msg = "Houston, we have a problem with trigger for %s" + logger.error(msg, pro) + context["projects"].append({"name": pro, "url": None}) return context +@login_required def build_docker_images(request): if request.method == "POST": form = BuildDockerForm(request.POST) if form.is_valid(): context = _build_docker_logic(form, docker_projects) else: - context = {'error': 'form validation error'} - return render(request, - 'release_dashboard/build_result.html', - context) + context = {"error": "form validation error"} + return render(request, "release_dashboard/build_result.html", context) else: context = { - 'projects': _projects_versions( - docker_projects, - regex_mr, - False, - True, - True, + "projects": _projects_versions( + docker_projects, regex_mr, False, True, True, ), - 'common_versions': { - 'tags': [], - 'branches': ['master', ] - }, - 'docker': True, + "common_versions": {"tags": [], "branches": ["master"]}, + "docker": True, } _common_versions(context, False, True) - return render(request, - 'release_dashboard/build_docker.html', - context) + return render(request, "release_dashboard/build_docker.html", context) +@login_required def refresh_all(request): if request.method == "POST": res = tasks.docker_fetch_all.delay() - return JsonResponse({'url': '/flower/task/%s' % res.id}) + return JsonResponse({"url": "/flower/task/%s" % res.id}) else: + template = "release_dashboard/refresh_docker.html" projects = [] for project in docker_projects: - info = { - 'name': project, - 'tags': None - } + info = {"name": project, "tags": None} projects.append(info) - return render(request, 'release_dashboard/refresh_docker.html', - {'projects': projects}) + return render(request, template, {"projects": projects}) -@require_http_methods(["POST", ]) +@login_required +@require_http_methods(["POST"]) def refresh(request, project): res = tasks.docker_fetch_project.delay(project) - return JsonResponse({'url': '/flower/task/%s' % res.id}) + return JsonResponse({"url": "/flower/task/%s" % res.id}) -@require_http_methods(["GET", ]) +@login_required +@require_http_methods(["GET"]) def docker_images(request): images = DockerImage.objects.images_with_tags context = { - 'images': images, - 'URL_BASE': settings.DOCKER_REGISTRY_URL.format(''), + "images": images, + "URL_BASE": settings.DOCKER_REGISTRY_URL.format(""), } - return render(request, 'release_dashboard/docker_images.html', - context) + return render(request, "release_dashboard/docker_images.html", context) -@require_http_methods(["GET", ]) +@login_required +@require_http_methods(["GET"]) def docker_project_images(request, project): try: Project.objects.get(name=project) @@ -142,14 +133,14 @@ def docker_project_images(request, project): raise Http404("Project does not exist") images = DockerImage.objects.images_with_tags(project) context = { - 'images': images, - 'URL_BASE': settings.DOCKER_REGISTRY_URL.format(''), + "images": images, + "URL_BASE": settings.DOCKER_REGISTRY_URL.format(""), } - return render(request, 'release_dashboard/docker_images.html', - context) + return render(request, "release_dashboard/docker_images.html", context) -@require_http_methods(["GET", ]) +@login_required +@require_http_methods(["GET"]) def docker_image_tags(request, project, image): try: proj = Project.objects.get(name=project) @@ -159,11 +150,10 @@ def docker_image_tags(request, project, image): except DockerImage.DoesNotExist: raise Http404("Project does not exist") context = { - 'images': [image, ], - 'URL_BASE': settings.DOCKER_REGISTRY_URL.format(''), + "images": [image], + "URL_BASE": settings.DOCKER_REGISTRY_URL.format(""), } - return render(request, 'release_dashboard/docker_image.html', - context) + return render(request, "release_dashboard/docker_image.html", context) class DockerImageList(generics.ListAPIView): diff --git a/repoapi/settings/common.py b/repoapi/settings/common.py index 87b3dd4..7b0882a 100644 --- a/repoapi/settings/common.py +++ b/repoapi/settings/common.py @@ -57,7 +57,8 @@ MIDDLEWARE_CLASSES = ( ) ROOT_URLCONF = "repoapi.urls" -LOGIN_URL = "/api-auth/login/" +LOGIN_URL = "rest_framework:login" +LOGOUT_URL = "rest_framework:logout" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates",