From fa2ccc1c18643f65892e0d5c706a11e5ac18992a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Jul 2016 14:58:37 -0400 Subject: [PATCH] Initial multitenancy implementation --- docs/data-model/tenancy.md | 9 ++ netbox/netbox/settings.py | 3 +- netbox/netbox/urls.py | 2 + netbox/netbox/views.py | 6 +- netbox/templates/_base.html | 27 +++-- netbox/templates/home.html | 42 ++++--- netbox/templates/tenancy/tenant.html | 81 ++++++++++++++ .../templates/tenancy/tenant_bulk_edit.html | 13 +++ netbox/templates/tenancy/tenant_edit.html | 20 ++++ netbox/templates/tenancy/tenant_import.html | 52 +++++++++ netbox/templates/tenancy/tenant_list.html | 42 +++++++ .../templates/tenancy/tenantgroup_list.html | 21 ++++ netbox/tenancy/__init__.py | 0 netbox/tenancy/admin.py | 23 ++++ netbox/tenancy/api/__init__.py | 0 netbox/tenancy/api/serializers.py | 38 +++++++ netbox/tenancy/api/urls.py | 16 +++ netbox/tenancy/api/views.py | 39 +++++++ netbox/tenancy/apps.py | 5 + netbox/tenancy/filters.py | 29 +++++ netbox/tenancy/forms.py | 61 +++++++++++ netbox/tenancy/migrations/0001_initial.py | 47 ++++++++ netbox/tenancy/migrations/__init__.py | 0 netbox/tenancy/models.py | 48 ++++++++ netbox/tenancy/tables.py | 43 ++++++++ netbox/tenancy/urls.py | 24 ++++ netbox/tenancy/views.py | 103 ++++++++++++++++++ 27 files changed, 768 insertions(+), 26 deletions(-) create mode 100644 docs/data-model/tenancy.md create mode 100644 netbox/templates/tenancy/tenant.html create mode 100644 netbox/templates/tenancy/tenant_bulk_edit.html create mode 100644 netbox/templates/tenancy/tenant_edit.html create mode 100644 netbox/templates/tenancy/tenant_import.html create mode 100644 netbox/templates/tenancy/tenant_list.html create mode 100644 netbox/templates/tenancy/tenantgroup_list.html create mode 100644 netbox/tenancy/__init__.py create mode 100644 netbox/tenancy/admin.py create mode 100644 netbox/tenancy/api/__init__.py create mode 100644 netbox/tenancy/api/serializers.py create mode 100644 netbox/tenancy/api/urls.py create mode 100644 netbox/tenancy/api/views.py create mode 100644 netbox/tenancy/apps.py create mode 100644 netbox/tenancy/filters.py create mode 100644 netbox/tenancy/forms.py create mode 100644 netbox/tenancy/migrations/0001_initial.py create mode 100644 netbox/tenancy/migrations/__init__.py create mode 100644 netbox/tenancy/models.py create mode 100644 netbox/tenancy/tables.py create mode 100644 netbox/tenancy/urls.py create mode 100644 netbox/tenancy/views.py diff --git a/docs/data-model/tenancy.md b/docs/data-model/tenancy.md new file mode 100644 index 000000000..d3e8b8c29 --- /dev/null +++ b/docs/data-model/tenancy.md @@ -0,0 +1,9 @@ +NetBox supports the concept of individual tenants within its parent organization. Typically, these are used to represent individual customers or internal departments. + +# Tenants + +A tenant represents a discrete organization. Certain resources within NetBox can be assigned to a tenant. This makes it very convenient to track which resources are assigned to which customers, for instance. + +### Tenant Groups + +Tenants are grouped by type. For instance, you might create one group called "Customers" and one called "Acquisitions." diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 649049378..256c6d4ce 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -12,7 +12,7 @@ except ImportError: "the documentation.") -VERSION = '1.3.3-dev' +VERSION = '1.4.0-dev' # Import local configuration for setting in ['ALLOWED_HOSTS', 'DATABASE', 'SECRET_KEY']: @@ -108,6 +108,7 @@ INSTALLED_APPS = ( 'ipam', 'extras', 'secrets', + 'tenancy', 'users', 'utilities', ) diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index 3a9d6b00a..b67f04cfd 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -22,6 +22,7 @@ urlpatterns = [ url(r'^dcim/', include('dcim.urls', namespace='dcim')), url(r'^ipam/', include('ipam.urls', namespace='ipam')), url(r'^secrets/', include('secrets.urls', namespace='secrets')), + url(r'^tenancy/', include('tenancy.urls', namespace='tenancy')), url(r'^profile/', include('users.urls', namespace='users')), # API @@ -29,6 +30,7 @@ urlpatterns = [ url(r'^api/dcim/', include('dcim.api.urls', namespace='dcim-api')), url(r'^api/ipam/', include('ipam.api.urls', namespace='ipam-api')), url(r'^api/secrets/', include('secrets.api.urls', namespace='secrets-api')), + url(r'^api/tenancy/', include('tenancy.api.urls', namespace='tenancy-api')), url(r'^api/docs/', include('rest_framework_swagger.urls')), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), diff --git a/netbox/netbox/views.py b/netbox/netbox/views.py index 9fda7f92c..5abde702e 100644 --- a/netbox/netbox/views.py +++ b/netbox/netbox/views.py @@ -7,14 +7,18 @@ from dcim.models import Site, Rack, Device, ConsolePort, PowerPort, InterfaceCon from extras.models import UserAction from ipam.models import Aggregate, Prefix, IPAddress, VLAN from secrets.models import Secret +from tenancy.models import Tenant def home(request): stats = { - # DCIM + # Organization 'site_count': Site.objects.count(), + 'tenant_count': Tenant.objects.count(), + + # DCIM 'rack_count': Rack.objects.count(), 'device_count': Device.objects.count(), 'interface_connections_count': InterfaceConnection.objects.count(), diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index fedbd43bf..d3097fb68 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -24,17 +24,26 @@