Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 9f03a592 authored by Laurent VENIER's avatar Laurent VENIER :speech_balloon:
Browse files

Merge branch 'certificate_plugin' into 'main'

Add new plugin for certificate management

See merge request !36
parents 8f8353d6 cc004a72
No related branches found
No related tags found
1 merge request!36Add new plugin for certificate management
Pipeline #90422 passed
"""URL definitions"""
from django.urls import path
from netbox_cert_plugin import views, models
from netbox.views.generic import ObjectChangeLogView, ObjectJournalView
urlpatterns = (
# Cert
path('certificates/', views.CertificateListView.as_view(), name='certificate_list'),
path('certificates/add/', views.CertificateEditView.as_view(), name='certificate_add'),
path('certificates/import/', views.CertificateBulkImportView.as_view(), name='certificate_import'),
path('certificates/delete/', views.CertificateBulkDeleteView.as_view(), name='certificate_bulk_delete'),
path('certificates/<int:pk>/', views.CertificateView.as_view(), name='certificate'),
path('certificates/<int:pk>/edit/', views.CertificateEditView.as_view(), name='certificate_edit'),
path('certificates/<int:pk>/delete/', views.CertificateDeleteView.as_view(), name='certificate_delete'),
path('certificates/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='certificate_changelog', kwargs={
'model': models.Certificate
}),
path('certificates/<int:pk>/journal/', ObjectJournalView.as_view(), name='certificate_journal', kwargs={
'model': models.Certificate
}),
)
"""Model views definitions"""
from netbox.views import generic
from netbox_cert_plugin import models, tables, filtersets, forms
from django.utils.translation import gettext as _
class CertificateView(generic.ObjectView):
"""Certificate view definition"""
queryset = models.Certificate.objects.all()
class CertificateListView(generic.ObjectListView):
"""Certificate list view definition"""
queryset = models.Certificate.objects.all()
table = tables.CertificateTable
filterset = filtersets.CertificateFilterSet
filterset_form = forms.CertificateFilterForm
class CertificateEditView(generic.ObjectEditView):
"""Certificate edition view definition"""
queryset = models.Certificate.objects.all()
form = forms.CertificateForm
class CertificateBulkImportView(generic.BulkImportView):
"""Certificate bulk import view definition"""
queryset = models.Certificate.objects.all()
model_form = forms.CertificateImportForm
class CertificateDeleteView(generic.ObjectDeleteView):
"""Certificate delete view definition"""
queryset = models.Certificate.objects.all()
class CertificateBulkDeleteView(generic.BulkDeleteView):
"""Certificate bulk delete view definition"""
queryset = models.Certificate.objects.all()
filterset = filtersets.CertificateFilterSet
table = tables.CertificateTable
from setuptools import find_packages, setup
setup(
name='netbox_cert_plugin',
version='0.0.1',
description='A Netbox plugin to manage certificates',
install_requires=[],
packages=find_packages(),
include_package_data=True,
zip_safe=False
)
# Testing the plugin
## End to end
Prepare a python environment to execute the E2E tests suite
```shell
python3 -m venv venv
source venv/bin/activate
pip install -r tests/requirements.e2e.txt
python -m unittest discover tests/e2e
```
"""Test case for Mapping creation"""
import unittest
import json
import os
import requests
HOST = os.getenv("HOST", default="localhost")
PORT = os.getenv("PORT", default="8080")
API_KEY = os.getenv("API_KEY", "only4testingpurpose")
class TestCertificateCreation(unittest.TestCase):
"""Test case for Mapping creation class"""
mapping_id = None
def test_that_certificate_is_created(self) -> None:
"""Test that certificate is created"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json={
"cn": "truc00.com",
"ca": "letsencrypt",
"expiration_time": "1m"
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 201)
self.mapping_id = json.loads(response.content)["id"]
def test_that_cn_is_unique(self) -> None:
"""Test that CN is unique"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json={
"cn": "truc00.com",
"ca": "letsencrypt",
"expiration_time": "1m"
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 201)
self.mapping_id = json.loads(response.content)["id"]
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json={
"cn": "truc00.com",
"ca": "comisign",
"expiration_time": "3m"
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 400)
self.assertEqual(response.content, b'{"cn":["certificate with this Common Name already exists."]}')
def test_that_ca_is_valid(self) -> None:
"""Test that CA is valid"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json={
"cn": "truc00.com",
"ca": "randomca",
"expiration_time": "3m"
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 400)
self.assertEqual(response.content, b'{"ca":["\\"randomca\\" is not a valid choice."]}')
def test_that_expiration_time_is_valid(self) -> None:
"""Test that expiration time is valid"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json={
"cn": "truc00.com",
"ca": "comisign",
"expiration_time": "10m"
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 400)
self.assertEqual(response.content, b'{"expiration_time":["\\"10m\\" is not a valid choice."]}')
def tearDown(self) -> None:
"""Teardown function"""
requests.delete(
url=f"http://{HOST}:{PORT}/api/plugins/cert/certificate/",
json=[{"id": self.mapping_id}],
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
if __name__ == "__main__":
unittest.main()
requests==2.30.0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment