Jeremy Stretch 9 лет назад
Родитель
Сommit
4e4996e88f
53 измененных файлов с 1259 добавлено и 4509 удалено
  1. 1 0
      .gitignore
  2. 4 0
      CONTRIBUTING.md
  3. 30 0
      Dockerfile
  4. 52 0
      docker-compose.yml
  5. 22 0
      docker/docker-entrypoint.sh
  6. 5 0
      docker/gunicorn_config.py
  7. 35 0
      docker/nginx.conf
  8. 7 3
      docs/dcim.md
  9. 54 0
      docs/getting-started-docker.md
  10. 0 4391
      docs/schema.sql
  11. 2 0
      docs/secrets.md
  12. 20 4
      netbox/dcim/admin.py
  13. 49 8
      netbox/dcim/api/serializers.py
  14. 1 0
      netbox/dcim/api/urls.py
  15. 29 2
      netbox/dcim/api/views.py
  16. 44 0
      netbox/dcim/fields.py
  17. 4 1
      netbox/dcim/fixtures/dcim.json
  18. 26 0
      netbox/dcim/formfields.py
  19. 50 7
      netbox/dcim/forms.py
  20. 56 0
      netbox/dcim/migrations/0004_auto_20160701_2049.py
  21. 26 0
      netbox/dcim/migrations/0005_auto_20160706_1722.py
  22. 102 2
      netbox/dcim/models.py
  23. 17 3
      netbox/dcim/tables.py
  24. 4 0
      netbox/dcim/tests/test_apis.py
  25. 13 1
      netbox/dcim/urls.py
  26. 156 5
      netbox/dcim/views.py
  27. 75 0
      netbox/netbox/configuration.docker.py
  28. 1 1
      netbox/netbox/settings.py
  29. 1 1
      netbox/netbox/views.py
  30. 10 8
      netbox/secrets/api/views.py
  31. 9 1
      netbox/secrets/models.py
  32. 0 0
      netbox/secrets/templatetags/__init__.py
  33. 12 0
      netbox/secrets/templatetags/secret_helpers.py
  34. 6 1
      netbox/templates/dcim/_rack_elevation.html
  35. 1 1
      netbox/templates/dcim/component_template_delete.html
  36. 58 14
      netbox/templates/dcim/device.html
  37. 8 0
      netbox/templates/dcim/devicebay_delete.html
  38. 8 0
      netbox/templates/dcim/devicebay_depopulate.html
  39. 51 0
      netbox/templates/dcim/devicebay_edit.html
  40. 46 0
      netbox/templates/dcim/devicebay_populate.html
  41. 29 16
      netbox/templates/dcim/devicetype.html
  42. 4 1
      netbox/templates/dcim/inc/_consoleport.html
  43. 3 1
      netbox/templates/dcim/inc/_consoleserverport.html
  44. 4 0
      netbox/templates/dcim/inc/_device_header.html
  45. 44 0
      netbox/templates/dcim/inc/_devicebay.html
  46. 6 1
      netbox/templates/dcim/inc/_interface.html
  47. 3 1
      netbox/templates/dcim/inc/_poweroutlet.html
  48. 4 1
      netbox/templates/dcim/inc/_powerport.html
  49. 7 0
      netbox/templates/dcim/rack.html
  50. 13 6
      netbox/templates/secrets/inc/secret_tr.html
  51. 27 19
      netbox/templates/secrets/secret.html
  52. 6 6
      netbox/utilities/views.py
  53. 14 3
      upgrade.sh

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@ configuration.py
 /*.sh
 !upgrade.sh
 fabfile.py
+*.swp

+ 4 - 0
CONTRIBUTING.md

@@ -51,6 +51,10 @@ Even if it's not quite right for NetBox, we may be able to point you to a tool b
 
 ## Submitting Pull Requests
 
+* Be sure to open an issue before starting work on a pull request, and discuss your idea with the NetBox maintainers
+before beginning work​. This will help prevent wasting time on something that might we might not be able to implement.
+When suggesting a new feature, also make sure it won't conflict with any work that's already in progress.
+
 * When submitting a pull request, please be sure to work off of branch `develop`, rather than branch `master`.
 In NetBox, the `develop` branch is used for ongoing development, while `master` is used for tagging new
 stable releases.

+ 30 - 0
Dockerfile

@@ -0,0 +1,30 @@
+FROM ubuntu:14.04
+
+RUN apt-get update && apt-get install -y \
+	python2.7 \
+	python-dev \
+	git \
+	python-pip \
+	libxml2-dev \
+	libxslt1-dev \
+	libffi-dev \
+	graphviz \
+	libpq-dev \
+	build-essential \
+	gunicorn \
+	--no-install-recommends \
+	&& rm -rf /var/lib/apt/lists/* \
+	&& mkdir -p /opt/netbox \
+	&& cd /opt/netbox \
+	&& git clone --depth 1 https://github.com/digitalocean/netbox.git -b master . \
+	&& pip install -r requirements.txt \
+	&& apt-get purge -y --auto-remove git build-essential
+
+ADD docker/docker-entrypoint.sh /docker-entrypoint.sh
+ADD netbox/netbox/configuration.docker.py /opt/netbox/netbox/netbox/configuration.py
+
+ENTRYPOINT [ "/docker-entrypoint.sh" ]
+
+ADD docker/gunicorn_config.py /opt/netbox/
+ADD docker/nginx.conf /etc/netbox-nginx/
+VOLUME ["/etc/netbox-nginx/"]

+ 52 - 0
docker-compose.yml

@@ -0,0 +1,52 @@
+version: '2'
+
+services:
+    postgres:
+        image: postgres:9.6
+        container_name: postgres
+        environment:
+            POSTGRES_USER: netbox
+            POSTGRES_PASSWORD: J5brHrAXFLQSif0K
+            POSTGRES_DB: netbox
+    netbox:
+        image: digitalocean/netbox
+        links:
+        - postgres
+        container_name: netbox
+        depends_on:
+        - postgres
+        environment:
+            SUPERUSER_NAME: admin
+            SUPERUSER_EMAIL: admin@example.com
+            SUPERUSER_PASSWORD: admin
+            ALLOWED_HOSTS: localhost
+            DB_NAME: netbox
+            DB_USER: netbox
+            DB_PASSWORD: J5brHrAXFLQSif0K
+            DB_HOST: postgres
+            SECRET_KEY: r8OwDznj!!dci#P9ghmRfdu1Ysxm0AiPeDCQhKE+N_rClfWNj
+            EMAIL_SERVER: localhost
+            EMAIL_PORT: 25
+            EMAIL_USERNAME: foo
+            EMAIL_PASSWORD: bar
+            EMAIL_TIMEOUT: 10
+            EMAIL_FROM: netbox@bar.com
+            NETBOX_USERNAME: guest
+            NETBOX_PASSWORD: guest
+        volumes:
+        - netbox-static-files:/opt/netbox/netbox/static
+    nginx:
+        image: nginx:1.11.1-alpine
+        links:
+        - netbox
+        container_name: nginx
+        command: nginx -g 'daemon off;' -c /etc/netbox-nginx/nginx.conf
+        depends_on:
+        - netbox
+        ports:
+        - 80:80
+        volumes_from:
+        - netbox
+volumes:
+    netbox-static-files:
+        driver: local

+ 22 - 0
docker/docker-entrypoint.sh

@@ -0,0 +1,22 @@
+#!/bin/bash
+set -e
+
+# run db migrations (retry on error)
+while ! /opt/netbox/netbox/manage.py migrate 2>&1; do
+    sleep 5
+done
+
+# create superuser silently
+if [[ -z ${SUPERUSER_NAME} || -z ${SUPERUSER_EMAIL} || -z ${SUPERUSER_PASSWORD} ]]; then
+        SUPERUSER_NAME='admin'
+        SUPERUSER_EMAIL='admin@example.com'
+        SUPERUSER_PASSWORD='admin'
+        echo "Using defaults: Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}, Password: ${SUPERUSER_PASSWORD}"
+fi
+echo "from django.contrib.auth.models import User; User.objects.create_superuser('${SUPERUSER_NAME}', '${SUPERUSER_EMAIL}', '${SUPERUSER_PASSWORD}')" | python /opt/netbox/netbox/manage.py shell
+
+# copy static files
+/opt/netbox/netbox/manage.py collectstatic --no-input
+
+# start unicorn
+gunicorn --log-level debug --debug --error-logfile /dev/stderr --log-file /dev/stdout -c /opt/netbox/gunicorn_config.py netbox.wsgi

+ 5 - 0
docker/gunicorn_config.py

@@ -0,0 +1,5 @@
+command = '/usr/bin/gunicorn'
+pythonpath = '/opt/netbox/netbox'
+bind = '0.0.0.0:8001'
+workers = 3
+user = 'root'

+ 35 - 0
docker/nginx.conf

@@ -0,0 +1,35 @@
+worker_processes 1;
+
+events {
+    worker_connections  1024;
+}
+
+http {
+    include       /etc/nginx/mime.types;
+    default_type  application/octet-stream;
+    sendfile        on;
+    tcp_nopush     on;
+    keepalive_timeout  65;
+    gzip  on;
+    server_tokens off;
+
+    server {
+        listen 80;
+
+        server_name localhost;
+
+        access_log off;
+
+        location /static/ {
+            alias /opt/netbox/netbox/static/;
+        }
+
+        location / {
+            proxy_pass http://netbox:8001;
+            proxy_set_header X-Forwarded-Host $server_name;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-Proto $scheme;
+            add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
+        }
+    }
+}

+ 7 - 3
docs/dcim.md

@@ -43,6 +43,7 @@ Each device type is assigned a number of component templates which describe the
 * Power port templates
 * Power outlet templates
 * Interface templates
+* Device bay templates
 
 Whenever a new device is created, it is automatically assigned console, power, and interface components per the templates assigned to its device type. For example, suppose your network employs Juniper EX4300-48T switches. You would create a device type with a model name "EX4300-48T" and assign it to the manufacturer "Juniper." You might then also create the following templates for it:
 
@@ -81,16 +82,19 @@ A device can be assigned modules which represent internal components. Currently,
 
 ### Components
 
-There are five types of device components which comprise all of the interconnection logic with NetBox:
+There are six types of device components which comprise all of the interconnection logic with NetBox:
 
 * Console ports
 * Console server ports
 * Power ports
 * Power outlets
 * Interfaces
+* Device bays
 
 Console ports connect only to console server ports, and power ports connect only to power outlets. Interfaces connect to one another in a symmetric manner: If interface A connects to interface B, interface B therefore connects to interface A. (The relationship between two interfaces is actually represented in the database by an InterfaceConnection object, but this is transparent to the user.)
 
-Each type of connection can be defined as either *planned* or *connected*. This allows for easily denoting connections which have not yet been installed.
+Each type of connection can be classified as either *planned* or *connected*. This allows for easily denoting connections which have not yet been installed. In addition to a connecting peer, interfaces are also assigned a form factor and may be designated as management-only (for out-of-band management). Interfaces may also be assigned a short description.
 
-In addition to a connecting peer, interfaces are also assigned a form factor and may be designated as management-only (for out-of-band management). Interfaces may also be assigned a short description.
+Device bays represent the ability of a device to house child devices. For example, you might install four blade servers into a 2U chassis. The chassis would appear in the rack elevation as a 2U device with four device bays. Each server within it would be defined as a 0U device installed in one of the device bays. Child devices do not appear on rack elevations, but they are included in the "Non-Racked Devices" list within the rack view.
+
+Note that child devices differ from modules in that they are still treated as independent devices, with their own console/power/data components, modules, and IP addresses. Modules, on the other hand, are parts within a device, such as a hard disk or power supply.

+ 54 - 0
docs/getting-started-docker.md

@@ -0,0 +1,54 @@
+<h1>Getting Started with NetBox and Docker</h1>
+
+This guide assumes that the latest versions of [Docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/) are already installed in your host.
+
+# Quickstart
+
+To get NetBox up and running:
+
+```
+git clone https://github.com/digitalocean/netbox.git
+cd netbox
+docker-compose up -d
+```
+
+The application will be available on http://localhost/ after a few minutes.
+
+Default credentials:
+* user: admin
+* password: admin
+
+# Configuration
+You can configure the app at runtime using variables (see docker-compose.yml).
+
+Possible environment variables:
+
+* SUPERUSER_NAME
+* SUPERUSER_EMAIL
+* SUPERUSER_PASSWORD
+* ALLOWED_HOSTS
+* DB_NAME
+* DB_USER
+* DB_PASSWORD
+* DB_HOST
+* DB_PORT
+* SECRET_KEY
+* EMAIL_SERVER
+* EMAIL_PORT
+* EMAIL_USERNAME
+* EMAIL_PASSWORD
+* EMAIL_TIMEOUT
+* EMAIL_FROM
+* LOGIN_REQUIRED
+* MAINTENANCE_MODE
+* NETBOX_USERNAME
+* NETBOX_PASSWORD
+* PAGINATE_COUNT
+* TIME_ZONE
+* DATE_FORMAT
+* SHORT_DATE_FORMAT
+* TIME_FORMAT
+* SHORT_TIME_FORMAT
+* DATETIME_FORMAT
+* SHORT_DATETIME_FORMAT
+

+ 0 - 4391
docs/schema.sql

@@ -1,4391 +0,0 @@
---
--- PostgreSQL database dump
---
-
-SET statement_timeout = 0;
-SET lock_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = on;
-SET check_function_bodies = false;
-SET client_min_messages = warning;
-
---
--- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
---
-
-CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
-
-
---
--- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
---
-
-COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
-
-
-SET search_path = public, pg_catalog;
-
-SET default_tablespace = '';
-
-SET default_with_oids = false;
-
---
--- Name: auth_group; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_group (
-    id integer NOT NULL,
-    name character varying(80) NOT NULL
-);
-
-
-ALTER TABLE public.auth_group OWNER TO django;
-
---
--- Name: auth_group_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_group_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_group_id_seq OWNER TO django;
-
---
--- Name: auth_group_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_group_id_seq OWNED BY auth_group.id;
-
-
---
--- Name: auth_group_permissions; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_group_permissions (
-    id integer NOT NULL,
-    group_id integer NOT NULL,
-    permission_id integer NOT NULL
-);
-
-
-ALTER TABLE public.auth_group_permissions OWNER TO django;
-
---
--- Name: auth_group_permissions_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_group_permissions_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_group_permissions_id_seq OWNER TO django;
-
---
--- Name: auth_group_permissions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_group_permissions_id_seq OWNED BY auth_group_permissions.id;
-
-
---
--- Name: auth_permission; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_permission (
-    id integer NOT NULL,
-    name character varying(255) NOT NULL,
-    content_type_id integer NOT NULL,
-    codename character varying(100) NOT NULL
-);
-
-
-ALTER TABLE public.auth_permission OWNER TO django;
-
---
--- Name: auth_permission_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_permission_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_permission_id_seq OWNER TO django;
-
---
--- Name: auth_permission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_permission_id_seq OWNED BY auth_permission.id;
-
-
---
--- Name: auth_user; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_user (
-    id integer NOT NULL,
-    password character varying(128) NOT NULL,
-    last_login timestamp with time zone,
-    is_superuser boolean NOT NULL,
-    username character varying(30) NOT NULL,
-    first_name character varying(30) NOT NULL,
-    last_name character varying(30) NOT NULL,
-    email character varying(254) NOT NULL,
-    is_staff boolean NOT NULL,
-    is_active boolean NOT NULL,
-    date_joined timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE public.auth_user OWNER TO django;
-
---
--- Name: auth_user_groups; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_user_groups (
-    id integer NOT NULL,
-    user_id integer NOT NULL,
-    group_id integer NOT NULL
-);
-
-
-ALTER TABLE public.auth_user_groups OWNER TO django;
-
---
--- Name: auth_user_groups_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_user_groups_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_user_groups_id_seq OWNER TO django;
-
---
--- Name: auth_user_groups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_user_groups_id_seq OWNED BY auth_user_groups.id;
-
-
---
--- Name: auth_user_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_user_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_user_id_seq OWNER TO django;
-
---
--- Name: auth_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_user_id_seq OWNED BY auth_user.id;
-
-
---
--- Name: auth_user_user_permissions; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE auth_user_user_permissions (
-    id integer NOT NULL,
-    user_id integer NOT NULL,
-    permission_id integer NOT NULL
-);
-
-
-ALTER TABLE public.auth_user_user_permissions OWNER TO django;
-
---
--- Name: auth_user_user_permissions_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE auth_user_user_permissions_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.auth_user_user_permissions_id_seq OWNER TO django;
-
---
--- Name: auth_user_user_permissions_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE auth_user_user_permissions_id_seq OWNED BY auth_user_user_permissions.id;
-
-
---
--- Name: cidr; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE cidr (
-    id integer NOT NULL,
-    field pg_catalog.cidr NOT NULL
-);
-
-
-ALTER TABLE public.cidr OWNER TO django;
-
---
--- Name: cidr_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE cidr_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.cidr_id_seq OWNER TO django;
-
---
--- Name: cidr_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE cidr_id_seq OWNED BY cidr.id;
-
-
---
--- Name: circuits_circuit; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE circuits_circuit (
-    id integer NOT NULL,
-    cid character varying(50) NOT NULL,
-    install_date date,
-    port_speed integer NOT NULL,
-    commit_rate integer,
-    comments text NOT NULL,
-    interface_id integer,
-    provider_id integer NOT NULL,
-    site_id integer NOT NULL,
-    xconnect_id character varying(50) NOT NULL,
-    type_id integer NOT NULL,
-    pp_info character varying(100) NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT circuits_circuit_commit_rate_check CHECK ((commit_rate >= 0)),
-    CONSTRAINT circuits_circuit_port_speed_check CHECK ((port_speed >= 0))
-);
-
-
-ALTER TABLE public.circuits_circuit OWNER TO django;
-
---
--- Name: circuits_circuit_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE circuits_circuit_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.circuits_circuit_id_seq OWNER TO django;
-
---
--- Name: circuits_circuit_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE circuits_circuit_id_seq OWNED BY circuits_circuit.id;
-
-
---
--- Name: circuits_circuittype; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE circuits_circuittype (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL
-);
-
-
-ALTER TABLE public.circuits_circuittype OWNER TO django;
-
---
--- Name: circuits_circuittype_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE circuits_circuittype_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.circuits_circuittype_id_seq OWNER TO django;
-
---
--- Name: circuits_circuittype_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE circuits_circuittype_id_seq OWNED BY circuits_circuittype.id;
-
-
---
--- Name: circuits_provider; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE circuits_provider (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    asn integer,
-    account character varying(30) NOT NULL,
-    portal_url character varying(200) NOT NULL,
-    noc_contact text NOT NULL,
-    admin_contact text NOT NULL,
-    comments text NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT circuits_provider_asn_check CHECK ((asn >= 0))
-);
-
-
-ALTER TABLE public.circuits_provider OWNER TO django;
-
---
--- Name: circuits_provider_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE circuits_provider_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.circuits_provider_id_seq OWNER TO django;
-
---
--- Name: circuits_provider_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE circuits_provider_id_seq OWNED BY circuits_provider.id;
-
-
---
--- Name: dcim_consoleport; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_consoleport (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_id integer NOT NULL,
-    cs_port_id integer,
-    connection_status boolean
-);
-
-
-ALTER TABLE public.dcim_consoleport OWNER TO django;
-
---
--- Name: dcim_consoleport_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_consoleport_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_consoleport_id_seq OWNER TO django;
-
---
--- Name: dcim_consoleport_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_consoleport_id_seq OWNED BY dcim_consoleport.id;
-
-
---
--- Name: dcim_consoleporttemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_consoleporttemplate (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_type_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_consoleporttemplate OWNER TO django;
-
---
--- Name: dcim_consoleporttemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_consoleporttemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_consoleporttemplate_id_seq OWNER TO django;
-
---
--- Name: dcim_consoleporttemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_consoleporttemplate_id_seq OWNED BY dcim_consoleporttemplate.id;
-
-
---
--- Name: dcim_consoleserverport; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_consoleserverport (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_consoleserverport OWNER TO django;
-
---
--- Name: dcim_consoleserverport_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_consoleserverport_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_consoleserverport_id_seq OWNER TO django;
-
---
--- Name: dcim_consoleserverport_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_consoleserverport_id_seq OWNED BY dcim_consoleserverport.id;
-
-
---
--- Name: dcim_consoleserverporttemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_consoleserverporttemplate (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_type_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_consoleserverporttemplate OWNER TO django;
-
---
--- Name: dcim_consoleserverporttemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_consoleserverporttemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_consoleserverporttemplate_id_seq OWNER TO django;
-
---
--- Name: dcim_consoleserverporttemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_consoleserverporttemplate_id_seq OWNED BY dcim_consoleserverporttemplate.id;
-
-
---
--- Name: dcim_device; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_device (
-    id integer NOT NULL,
-    name character varying(50),
-    serial character varying(50) NOT NULL,
-    "position" smallint,
-    face smallint,
-    device_type_id integer NOT NULL,
-    rack_id integer NOT NULL,
-    device_role_id integer NOT NULL,
-    primary_ip_id integer,
-    status boolean NOT NULL,
-    platform_id integer,
-    comments text NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT dcim_device_face_check CHECK ((face >= 0)),
-    CONSTRAINT dcim_device_position_check CHECK (("position" >= 0))
-);
-
-
-ALTER TABLE public.dcim_device OWNER TO django;
-
---
--- Name: dcim_device_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_device_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_device_id_seq OWNER TO django;
-
---
--- Name: dcim_device_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_device_id_seq OWNED BY dcim_device.id;
-
-
---
--- Name: dcim_devicerole; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_devicerole (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    color character varying(30) NOT NULL
-);
-
-
-ALTER TABLE public.dcim_devicerole OWNER TO django;
-
---
--- Name: dcim_devicerole_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_devicerole_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_devicerole_id_seq OWNER TO django;
-
---
--- Name: dcim_devicerole_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_devicerole_id_seq OWNED BY dcim_devicerole.id;
-
-
---
--- Name: dcim_devicetype; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_devicetype (
-    id integer NOT NULL,
-    model character varying(50) NOT NULL,
-    u_height smallint NOT NULL,
-    manufacturer_id integer NOT NULL,
-    slug character varying(50) NOT NULL,
-    is_console_server boolean NOT NULL,
-    is_pdu boolean NOT NULL,
-    is_network_device boolean NOT NULL,
-    is_full_depth boolean NOT NULL,
-    CONSTRAINT dcim_devicetype_u_height_check CHECK ((u_height >= 0))
-);
-
-
-ALTER TABLE public.dcim_devicetype OWNER TO django;
-
---
--- Name: dcim_devicetype_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_devicetype_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_devicetype_id_seq OWNER TO django;
-
---
--- Name: dcim_devicetype_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_devicetype_id_seq OWNED BY dcim_devicetype.id;
-
-
---
--- Name: dcim_interface; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_interface (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    form_factor smallint NOT NULL,
-    mgmt_only boolean NOT NULL,
-    device_id integer NOT NULL,
-    description character varying(100) NOT NULL,
-    CONSTRAINT dcim_interface_form_factor_check CHECK ((form_factor >= 0))
-);
-
-
-ALTER TABLE public.dcim_interface OWNER TO django;
-
---
--- Name: dcim_interface_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_interface_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_interface_id_seq OWNER TO django;
-
---
--- Name: dcim_interface_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_interface_id_seq OWNED BY dcim_interface.id;
-
-
---
--- Name: dcim_interfaceconnection; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_interfaceconnection (
-    id integer NOT NULL,
-    interface_a_id integer NOT NULL,
-    interface_b_id integer NOT NULL,
-    connection_status boolean NOT NULL
-);
-
-
-ALTER TABLE public.dcim_interfaceconnection OWNER TO django;
-
---
--- Name: dcim_interfaceconnection_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_interfaceconnection_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_interfaceconnection_id_seq OWNER TO django;
-
---
--- Name: dcim_interfaceconnection_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_interfaceconnection_id_seq OWNED BY dcim_interfaceconnection.id;
-
-
---
--- Name: dcim_interfacetemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_interfacetemplate (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    form_factor smallint NOT NULL,
-    mgmt_only boolean NOT NULL,
-    device_type_id integer NOT NULL,
-    CONSTRAINT dcim_interfacetemplate_form_factor_check CHECK ((form_factor >= 0))
-);
-
-
-ALTER TABLE public.dcim_interfacetemplate OWNER TO django;
-
---
--- Name: dcim_interfacetemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_interfacetemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_interfacetemplate_id_seq OWNER TO django;
-
---
--- Name: dcim_interfacetemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_interfacetemplate_id_seq OWNED BY dcim_interfacetemplate.id;
-
-
---
--- Name: dcim_manufacturer; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_manufacturer (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL
-);
-
-
-ALTER TABLE public.dcim_manufacturer OWNER TO django;
-
---
--- Name: dcim_manufacturer_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_manufacturer_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_manufacturer_id_seq OWNER TO django;
-
---
--- Name: dcim_manufacturer_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_manufacturer_id_seq OWNED BY dcim_manufacturer.id;
-
-
---
--- Name: dcim_module; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_module (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    part_id character varying(50) NOT NULL,
-    serial character varying(50) NOT NULL,
-    device_id integer NOT NULL,
-    parent_id integer,
-    discovered boolean NOT NULL
-);
-
-
-ALTER TABLE public.dcim_module OWNER TO django;
-
---
--- Name: dcim_module_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_module_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_module_id_seq OWNER TO django;
-
---
--- Name: dcim_module_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_module_id_seq OWNED BY dcim_module.id;
-
-
---
--- Name: dcim_platform; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_platform (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    rpc_client character varying(30) NOT NULL
-);
-
-
-ALTER TABLE public.dcim_platform OWNER TO django;
-
---
--- Name: dcim_platform_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_platform_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_platform_id_seq OWNER TO django;
-
---
--- Name: dcim_platform_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_platform_id_seq OWNED BY dcim_platform.id;
-
-
---
--- Name: dcim_poweroutlet; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_poweroutlet (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_poweroutlet OWNER TO django;
-
---
--- Name: dcim_poweroutlet_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_poweroutlet_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_poweroutlet_id_seq OWNER TO django;
-
---
--- Name: dcim_poweroutlet_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_poweroutlet_id_seq OWNED BY dcim_poweroutlet.id;
-
-
---
--- Name: dcim_poweroutlettemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_poweroutlettemplate (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_type_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_poweroutlettemplate OWNER TO django;
-
---
--- Name: dcim_poweroutlettemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_poweroutlettemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_poweroutlettemplate_id_seq OWNER TO django;
-
---
--- Name: dcim_poweroutlettemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_poweroutlettemplate_id_seq OWNED BY dcim_poweroutlettemplate.id;
-
-
---
--- Name: dcim_powerport; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_powerport (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_id integer NOT NULL,
-    power_outlet_id integer,
-    connection_status boolean
-);
-
-
-ALTER TABLE public.dcim_powerport OWNER TO django;
-
---
--- Name: dcim_powerport_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_powerport_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_powerport_id_seq OWNER TO django;
-
---
--- Name: dcim_powerport_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_powerport_id_seq OWNED BY dcim_powerport.id;
-
-
---
--- Name: dcim_powerporttemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_powerporttemplate (
-    id integer NOT NULL,
-    name character varying(30) NOT NULL,
-    device_type_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_powerporttemplate OWNER TO django;
-
---
--- Name: dcim_powerporttemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_powerporttemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_powerporttemplate_id_seq OWNER TO django;
-
---
--- Name: dcim_powerporttemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_powerporttemplate_id_seq OWNED BY dcim_powerporttemplate.id;
-
-
---
--- Name: dcim_rack; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_rack (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    facility_id character varying(30),
-    u_height smallint NOT NULL,
-    site_id integer NOT NULL,
-    comments text NOT NULL,
-    group_id integer,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT dcim_rack_u_height_check CHECK ((u_height >= 0))
-);
-
-
-ALTER TABLE public.dcim_rack OWNER TO django;
-
---
--- Name: dcim_rack_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_rack_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_rack_id_seq OWNER TO django;
-
---
--- Name: dcim_rack_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_rack_id_seq OWNED BY dcim_rack.id;
-
-
---
--- Name: dcim_rackgroup; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_rackgroup (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    site_id integer NOT NULL
-);
-
-
-ALTER TABLE public.dcim_rackgroup OWNER TO django;
-
---
--- Name: dcim_rackgroup_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_rackgroup_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_rackgroup_id_seq OWNER TO django;
-
---
--- Name: dcim_rackgroup_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_rackgroup_id_seq OWNED BY dcim_rackgroup.id;
-
-
---
--- Name: dcim_site; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE dcim_site (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    facility character varying(50) NOT NULL,
-    asn integer,
-    physical_address character varying(200) NOT NULL,
-    shipping_address character varying(200) NOT NULL,
-    comments text NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT dcim_site_asn_check CHECK ((asn >= 0))
-);
-
-
-ALTER TABLE public.dcim_site OWNER TO django;
-
---
--- Name: dcim_site_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE dcim_site_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.dcim_site_id_seq OWNER TO django;
-
---
--- Name: dcim_site_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE dcim_site_id_seq OWNED BY dcim_site.id;
-
-
---
--- Name: django_admin_log; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE django_admin_log (
-    id integer NOT NULL,
-    action_time timestamp with time zone NOT NULL,
-    object_id text,
-    object_repr character varying(200) NOT NULL,
-    action_flag smallint NOT NULL,
-    change_message text NOT NULL,
-    content_type_id integer,
-    user_id integer NOT NULL,
-    CONSTRAINT django_admin_log_action_flag_check CHECK ((action_flag >= 0))
-);
-
-
-ALTER TABLE public.django_admin_log OWNER TO django;
-
---
--- Name: django_admin_log_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE django_admin_log_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.django_admin_log_id_seq OWNER TO django;
-
---
--- Name: django_admin_log_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE django_admin_log_id_seq OWNED BY django_admin_log.id;
-
-
---
--- Name: django_content_type; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE django_content_type (
-    id integer NOT NULL,
-    app_label character varying(100) NOT NULL,
-    model character varying(100) NOT NULL
-);
-
-
-ALTER TABLE public.django_content_type OWNER TO django;
-
---
--- Name: django_content_type_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE django_content_type_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.django_content_type_id_seq OWNER TO django;
-
---
--- Name: django_content_type_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE django_content_type_id_seq OWNED BY django_content_type.id;
-
-
---
--- Name: django_migrations; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE django_migrations (
-    id integer NOT NULL,
-    app character varying(255) NOT NULL,
-    name character varying(255) NOT NULL,
-    applied timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE public.django_migrations OWNER TO django;
-
---
--- Name: django_migrations_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE django_migrations_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.django_migrations_id_seq OWNER TO django;
-
---
--- Name: django_migrations_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE django_migrations_id_seq OWNED BY django_migrations.id;
-
-
---
--- Name: django_session; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE django_session (
-    session_key character varying(40) NOT NULL,
-    session_data text NOT NULL,
-    expire_date timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE public.django_session OWNER TO django;
-
---
--- Name: extras_exporttemplate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE extras_exporttemplate (
-    id integer NOT NULL,
-    name character varying(200) NOT NULL,
-    template_code text NOT NULL,
-    mime_type character varying(15) NOT NULL,
-    file_extension character varying(15) NOT NULL,
-    content_type_id integer NOT NULL
-);
-
-
-ALTER TABLE public.extras_exporttemplate OWNER TO django;
-
---
--- Name: extras_exporttemplate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE extras_exporttemplate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.extras_exporttemplate_id_seq OWNER TO django;
-
---
--- Name: extras_exporttemplate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE extras_exporttemplate_id_seq OWNED BY extras_exporttemplate.id;
-
-
---
--- Name: extras_graph; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE extras_graph (
-    id integer NOT NULL,
-    type smallint NOT NULL,
-    source character varying(500) NOT NULL,
-    link character varying(200) NOT NULL,
-    name character varying(100) NOT NULL,
-    weight smallint NOT NULL,
-    CONSTRAINT extras_graph_type_check CHECK ((type >= 0)),
-    CONSTRAINT extras_graph_weight_check CHECK ((weight >= 0))
-);
-
-
-ALTER TABLE public.extras_graph OWNER TO django;
-
---
--- Name: extras_graph_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE extras_graph_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.extras_graph_id_seq OWNER TO django;
-
---
--- Name: extras_graph_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE extras_graph_id_seq OWNED BY extras_graph.id;
-
-
---
--- Name: extras_topologymap; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE extras_topologymap (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL,
-    device_patterns text NOT NULL,
-    description character varying(100) NOT NULL,
-    site_id integer
-);
-
-
-ALTER TABLE public.extras_topologymap OWNER TO django;
-
---
--- Name: extras_topologymap_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE extras_topologymap_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.extras_topologymap_id_seq OWNER TO django;
-
---
--- Name: extras_topologymap_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE extras_topologymap_id_seq OWNED BY extras_topologymap.id;
-
-
---
--- Name: extras_useraction; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE extras_useraction (
-    id integer NOT NULL,
-    "time" timestamp with time zone NOT NULL,
-    object_id integer,
-    action smallint NOT NULL,
-    message text NOT NULL,
-    content_type_id integer NOT NULL,
-    user_id integer NOT NULL,
-    CONSTRAINT extras_useraction_action_check CHECK ((action >= 0)),
-    CONSTRAINT extras_useraction_object_id_check CHECK ((object_id >= 0))
-);
-
-
-ALTER TABLE public.extras_useraction OWNER TO django;
-
---
--- Name: extras_useraction_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE extras_useraction_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.extras_useraction_id_seq OWNER TO django;
-
---
--- Name: extras_useraction_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE extras_useraction_id_seq OWNED BY extras_useraction.id;
-
-
---
--- Name: inet; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE inet (
-    id integer NOT NULL,
-    field pg_catalog.inet NOT NULL
-);
-
-
-ALTER TABLE public.inet OWNER TO django;
-
---
--- Name: inet_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE inet_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.inet_id_seq OWNER TO django;
-
---
--- Name: inet_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE inet_id_seq OWNED BY inet.id;
-
-
---
--- Name: ipam_aggregate; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_aggregate (
-    id integer NOT NULL,
-    family smallint NOT NULL,
-    prefix pg_catalog.cidr NOT NULL,
-    rir_id integer NOT NULL,
-    date_added date,
-    description character varying(100) NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT ipam_aggregate_family_check CHECK ((family >= 0))
-);
-
-
-ALTER TABLE public.ipam_aggregate OWNER TO django;
-
---
--- Name: ipam_aggregate_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_aggregate_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_aggregate_id_seq OWNER TO django;
-
---
--- Name: ipam_aggregate_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_aggregate_id_seq OWNED BY ipam_aggregate.id;
-
-
---
--- Name: ipam_ipaddress; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_ipaddress (
-    id integer NOT NULL,
-    family smallint NOT NULL,
-    address pg_catalog.inet NOT NULL,
-    vrf_id integer,
-    interface_id integer,
-    nat_inside_id integer,
-    description character varying(100) NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT ipam_ipaddress_family_check CHECK ((family >= 0))
-);
-
-
-ALTER TABLE public.ipam_ipaddress OWNER TO django;
-
---
--- Name: ipam_ipaddress_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_ipaddress_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_ipaddress_id_seq OWNER TO django;
-
---
--- Name: ipam_ipaddress_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_ipaddress_id_seq OWNED BY ipam_ipaddress.id;
-
-
---
--- Name: ipam_prefix; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_prefix (
-    id integer NOT NULL,
-    family smallint NOT NULL,
-    prefix pg_catalog.cidr NOT NULL,
-    vrf_id integer,
-    description character varying(100) NOT NULL,
-    site_id integer,
-    vlan_id integer,
-    status smallint NOT NULL,
-    role_id integer,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT ipam_prefix_family_check CHECK ((family >= 0)),
-    CONSTRAINT ipam_prefix_status_4735d2a1_check CHECK ((status >= 0))
-);
-
-
-ALTER TABLE public.ipam_prefix OWNER TO django;
-
---
--- Name: ipam_prefix_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_prefix_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_prefix_id_seq OWNER TO django;
-
---
--- Name: ipam_prefix_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_prefix_id_seq OWNED BY ipam_prefix.id;
-
-
---
--- Name: ipam_rir; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_rir (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL
-);
-
-
-ALTER TABLE public.ipam_rir OWNER TO django;
-
---
--- Name: ipam_rir_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_rir_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_rir_id_seq OWNER TO django;
-
---
--- Name: ipam_rir_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_rir_id_seq OWNED BY ipam_rir.id;
-
-
---
--- Name: ipam_role; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_role (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    weight smallint NOT NULL,
-    slug character varying(50) NOT NULL,
-    CONSTRAINT ipam_role_weight_check CHECK ((weight >= 0))
-);
-
-
-ALTER TABLE public.ipam_role OWNER TO django;
-
---
--- Name: ipam_role_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_role_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_role_id_seq OWNER TO django;
-
---
--- Name: ipam_role_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_role_id_seq OWNED BY ipam_role.id;
-
-
---
--- Name: ipam_vlan; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_vlan (
-    id integer NOT NULL,
-    vid smallint NOT NULL,
-    name character varying(30) NOT NULL,
-    site_id integer NOT NULL,
-    status smallint NOT NULL,
-    role_id integer,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    CONSTRAINT ipam_vlan_status_77289327_check CHECK ((status >= 0)),
-    CONSTRAINT ipam_vlan_vid_check CHECK ((vid >= 0))
-);
-
-
-ALTER TABLE public.ipam_vlan OWNER TO django;
-
---
--- Name: ipam_vlan_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_vlan_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_vlan_id_seq OWNER TO django;
-
---
--- Name: ipam_vlan_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_vlan_id_seq OWNED BY ipam_vlan.id;
-
-
---
--- Name: ipam_vrf; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE ipam_vrf (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    description character varying(100) NOT NULL,
-    rd character varying(21) NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE public.ipam_vrf OWNER TO django;
-
---
--- Name: ipam_vrf_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE ipam_vrf_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.ipam_vrf_id_seq OWNER TO django;
-
---
--- Name: ipam_vrf_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE ipam_vrf_id_seq OWNED BY ipam_vrf.id;
-
-
---
--- Name: mac; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE mac (
-    id integer NOT NULL,
-    field macaddr
-);
-
-
-ALTER TABLE public.mac OWNER TO django;
-
---
--- Name: mac_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE mac_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.mac_id_seq OWNER TO django;
-
---
--- Name: mac_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE mac_id_seq OWNED BY mac.id;
-
-
---
--- Name: nullcidr; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE nullcidr (
-    id integer NOT NULL,
-    field pg_catalog.cidr
-);
-
-
-ALTER TABLE public.nullcidr OWNER TO django;
-
---
--- Name: nullcidr_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE nullcidr_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.nullcidr_id_seq OWNER TO django;
-
---
--- Name: nullcidr_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE nullcidr_id_seq OWNED BY nullcidr.id;
-
-
---
--- Name: nullinet; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE nullinet (
-    id integer NOT NULL,
-    field pg_catalog.inet
-);
-
-
-ALTER TABLE public.nullinet OWNER TO django;
-
---
--- Name: nullinet_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE nullinet_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.nullinet_id_seq OWNER TO django;
-
---
--- Name: nullinet_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE nullinet_id_seq OWNED BY nullinet.id;
-
-
---
--- Name: secrets_secret; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE secrets_secret (
-    id integer NOT NULL,
-    name character varying(100) NOT NULL,
-    ciphertext bytea NOT NULL,
-    hash character varying(128) NOT NULL,
-    created date NOT NULL,
-    last_updated timestamp with time zone NOT NULL,
-    role_id integer NOT NULL,
-    device_id integer NOT NULL
-);
-
-
-ALTER TABLE public.secrets_secret OWNER TO django;
-
---
--- Name: secrets_secret_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE secrets_secret_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.secrets_secret_id_seq OWNER TO django;
-
---
--- Name: secrets_secret_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE secrets_secret_id_seq OWNED BY secrets_secret.id;
-
-
---
--- Name: secrets_secretrole; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE secrets_secretrole (
-    id integer NOT NULL,
-    name character varying(50) NOT NULL,
-    slug character varying(50) NOT NULL
-);
-
-
-ALTER TABLE public.secrets_secretrole OWNER TO django;
-
---
--- Name: secrets_secretrole_groups; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE secrets_secretrole_groups (
-    id integer NOT NULL,
-    secretrole_id integer NOT NULL,
-    group_id integer NOT NULL
-);
-
-
-ALTER TABLE public.secrets_secretrole_groups OWNER TO django;
-
---
--- Name: secrets_secretrole_groups_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE secrets_secretrole_groups_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.secrets_secretrole_groups_id_seq OWNER TO django;
-
---
--- Name: secrets_secretrole_groups_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE secrets_secretrole_groups_id_seq OWNED BY secrets_secretrole_groups.id;
-
-
---
--- Name: secrets_secretrole_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE secrets_secretrole_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.secrets_secretrole_id_seq OWNER TO django;
-
---
--- Name: secrets_secretrole_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE secrets_secretrole_id_seq OWNED BY secrets_secretrole.id;
-
-
---
--- Name: secrets_secretrole_users; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE secrets_secretrole_users (
-    id integer NOT NULL,
-    secretrole_id integer NOT NULL,
-    user_id integer NOT NULL
-);
-
-
-ALTER TABLE public.secrets_secretrole_users OWNER TO django;
-
---
--- Name: secrets_secretrole_users_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE secrets_secretrole_users_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.secrets_secretrole_users_id_seq OWNER TO django;
-
---
--- Name: secrets_secretrole_users_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE secrets_secretrole_users_id_seq OWNED BY secrets_secretrole_users.id;
-
-
---
--- Name: secrets_userkey; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE secrets_userkey (
-    id integer NOT NULL,
-    public_key text NOT NULL,
-    user_id integer NOT NULL,
-    created date NOT NULL,
-    master_key_cipher bytea,
-    last_updated timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE public.secrets_userkey OWNER TO django;
-
---
--- Name: secrets_userkey_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE secrets_userkey_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.secrets_userkey_id_seq OWNER TO django;
-
---
--- Name: secrets_userkey_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE secrets_userkey_id_seq OWNED BY secrets_userkey.id;
-
-
---
--- Name: uniquecidr; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE uniquecidr (
-    id integer NOT NULL,
-    field pg_catalog.cidr NOT NULL
-);
-
-
-ALTER TABLE public.uniquecidr OWNER TO django;
-
---
--- Name: uniquecidr_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE uniquecidr_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.uniquecidr_id_seq OWNER TO django;
-
---
--- Name: uniquecidr_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE uniquecidr_id_seq OWNED BY uniquecidr.id;
-
-
---
--- Name: uniqueinet; Type: TABLE; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE TABLE uniqueinet (
-    id integer NOT NULL,
-    field pg_catalog.inet NOT NULL
-);
-
-
-ALTER TABLE public.uniqueinet OWNER TO django;
-
---
--- Name: uniqueinet_id_seq; Type: SEQUENCE; Schema: public; Owner: django
---
-
-CREATE SEQUENCE uniqueinet_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE public.uniqueinet_id_seq OWNER TO django;
-
---
--- Name: uniqueinet_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: django
---
-
-ALTER SEQUENCE uniqueinet_id_seq OWNED BY uniqueinet.id;
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_group ALTER COLUMN id SET DEFAULT nextval('auth_group_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_group_permissions ALTER COLUMN id SET DEFAULT nextval('auth_group_permissions_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_permission ALTER COLUMN id SET DEFAULT nextval('auth_permission_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user ALTER COLUMN id SET DEFAULT nextval('auth_user_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_groups ALTER COLUMN id SET DEFAULT nextval('auth_user_groups_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_user_permissions ALTER COLUMN id SET DEFAULT nextval('auth_user_user_permissions_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY cidr ALTER COLUMN id SET DEFAULT nextval('cidr_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuit ALTER COLUMN id SET DEFAULT nextval('circuits_circuit_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuittype ALTER COLUMN id SET DEFAULT nextval('circuits_circuittype_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_provider ALTER COLUMN id SET DEFAULT nextval('circuits_provider_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleport ALTER COLUMN id SET DEFAULT nextval('dcim_consoleport_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleporttemplate ALTER COLUMN id SET DEFAULT nextval('dcim_consoleporttemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleserverport ALTER COLUMN id SET DEFAULT nextval('dcim_consoleserverport_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleserverporttemplate ALTER COLUMN id SET DEFAULT nextval('dcim_consoleserverporttemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device ALTER COLUMN id SET DEFAULT nextval('dcim_device_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_devicerole ALTER COLUMN id SET DEFAULT nextval('dcim_devicerole_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_devicetype ALTER COLUMN id SET DEFAULT nextval('dcim_devicetype_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interface ALTER COLUMN id SET DEFAULT nextval('dcim_interface_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interfaceconnection ALTER COLUMN id SET DEFAULT nextval('dcim_interfaceconnection_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interfacetemplate ALTER COLUMN id SET DEFAULT nextval('dcim_interfacetemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_manufacturer ALTER COLUMN id SET DEFAULT nextval('dcim_manufacturer_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_module ALTER COLUMN id SET DEFAULT nextval('dcim_module_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_platform ALTER COLUMN id SET DEFAULT nextval('dcim_platform_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_poweroutlet ALTER COLUMN id SET DEFAULT nextval('dcim_poweroutlet_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_poweroutlettemplate ALTER COLUMN id SET DEFAULT nextval('dcim_poweroutlettemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_powerport ALTER COLUMN id SET DEFAULT nextval('dcim_powerport_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_powerporttemplate ALTER COLUMN id SET DEFAULT nextval('dcim_powerporttemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_rack ALTER COLUMN id SET DEFAULT nextval('dcim_rack_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_rackgroup ALTER COLUMN id SET DEFAULT nextval('dcim_rackgroup_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_site ALTER COLUMN id SET DEFAULT nextval('dcim_site_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY django_admin_log ALTER COLUMN id SET DEFAULT nextval('django_admin_log_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY django_content_type ALTER COLUMN id SET DEFAULT nextval('django_content_type_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY django_migrations ALTER COLUMN id SET DEFAULT nextval('django_migrations_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_exporttemplate ALTER COLUMN id SET DEFAULT nextval('extras_exporttemplate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_graph ALTER COLUMN id SET DEFAULT nextval('extras_graph_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_topologymap ALTER COLUMN id SET DEFAULT nextval('extras_topologymap_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_useraction ALTER COLUMN id SET DEFAULT nextval('extras_useraction_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY inet ALTER COLUMN id SET DEFAULT nextval('inet_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_aggregate ALTER COLUMN id SET DEFAULT nextval('ipam_aggregate_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_ipaddress ALTER COLUMN id SET DEFAULT nextval('ipam_ipaddress_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_prefix ALTER COLUMN id SET DEFAULT nextval('ipam_prefix_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_rir ALTER COLUMN id SET DEFAULT nextval('ipam_rir_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_role ALTER COLUMN id SET DEFAULT nextval('ipam_role_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_vlan ALTER COLUMN id SET DEFAULT nextval('ipam_vlan_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_vrf ALTER COLUMN id SET DEFAULT nextval('ipam_vrf_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY mac ALTER COLUMN id SET DEFAULT nextval('mac_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY nullcidr ALTER COLUMN id SET DEFAULT nextval('nullcidr_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY nullinet ALTER COLUMN id SET DEFAULT nextval('nullinet_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secret ALTER COLUMN id SET DEFAULT nextval('secrets_secret_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole ALTER COLUMN id SET DEFAULT nextval('secrets_secretrole_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_groups ALTER COLUMN id SET DEFAULT nextval('secrets_secretrole_groups_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_users ALTER COLUMN id SET DEFAULT nextval('secrets_secretrole_users_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_userkey ALTER COLUMN id SET DEFAULT nextval('secrets_userkey_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY uniquecidr ALTER COLUMN id SET DEFAULT nextval('uniquecidr_id_seq'::regclass);
-
-
---
--- Name: id; Type: DEFAULT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY uniqueinet ALTER COLUMN id SET DEFAULT nextval('uniqueinet_id_seq'::regclass);
-
-
---
--- Name: auth_group_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_group
-    ADD CONSTRAINT auth_group_name_key UNIQUE (name);
-
-
---
--- Name: auth_group_permissions_group_id_permission_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_group_permissions
-    ADD CONSTRAINT auth_group_permissions_group_id_permission_id_key UNIQUE (group_id, permission_id);
-
-
---
--- Name: auth_group_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_group_permissions
-    ADD CONSTRAINT auth_group_permissions_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_group_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_group
-    ADD CONSTRAINT auth_group_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_permission_content_type_id_codename_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_permission
-    ADD CONSTRAINT auth_permission_content_type_id_codename_key UNIQUE (content_type_id, codename);
-
-
---
--- Name: auth_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_permission
-    ADD CONSTRAINT auth_permission_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_user_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user_groups
-    ADD CONSTRAINT auth_user_groups_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_user_groups_user_id_group_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user_groups
-    ADD CONSTRAINT auth_user_groups_user_id_group_id_key UNIQUE (user_id, group_id);
-
-
---
--- Name: auth_user_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user
-    ADD CONSTRAINT auth_user_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_user_user_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user_user_permissions
-    ADD CONSTRAINT auth_user_user_permissions_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_user_user_permissions_user_id_permission_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user_user_permissions
-    ADD CONSTRAINT auth_user_user_permissions_user_id_permission_id_key UNIQUE (user_id, permission_id);
-
-
---
--- Name: auth_user_username_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY auth_user
-    ADD CONSTRAINT auth_user_username_key UNIQUE (username);
-
-
---
--- Name: cidr_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY cidr
-    ADD CONSTRAINT cidr_pkey PRIMARY KEY (id);
-
-
---
--- Name: circuits_circuit_interface_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_circuit_interface_id_key UNIQUE (interface_id);
-
-
---
--- Name: circuits_circuit_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_circuit_pkey PRIMARY KEY (id);
-
-
---
--- Name: circuits_circuit_provider_id_4eab740723ebc621_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_circuit_provider_id_4eab740723ebc621_uniq UNIQUE (provider_id, cid);
-
-
---
--- Name: circuits_circuittype_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuittype
-    ADD CONSTRAINT circuits_circuittype_name_key UNIQUE (name);
-
-
---
--- Name: circuits_circuittype_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuittype
-    ADD CONSTRAINT circuits_circuittype_pkey PRIMARY KEY (id);
-
-
---
--- Name: circuits_circuittype_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_circuittype
-    ADD CONSTRAINT circuits_circuittype_slug_key UNIQUE (slug);
-
-
---
--- Name: circuits_provider_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_provider
-    ADD CONSTRAINT circuits_provider_name_key UNIQUE (name);
-
-
---
--- Name: circuits_provider_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_provider
-    ADD CONSTRAINT circuits_provider_pkey PRIMARY KEY (id);
-
-
---
--- Name: circuits_provider_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY circuits_provider
-    ADD CONSTRAINT circuits_provider_slug_key UNIQUE (slug);
-
-
---
--- Name: dcim_consoleport_cs_port_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleport
-    ADD CONSTRAINT dcim_consoleport_cs_port_id_key UNIQUE (cs_port_id);
-
-
---
--- Name: dcim_consoleport_device_id_2bfdd4b8ce9af21e_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleport
-    ADD CONSTRAINT dcim_consoleport_device_id_2bfdd4b8ce9af21e_uniq UNIQUE (device_id, name);
-
-
---
--- Name: dcim_consoleport_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleport
-    ADD CONSTRAINT dcim_consoleport_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_consoleporttemplate_device_type_id_4181f4f26d97545e_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleporttemplate
-    ADD CONSTRAINT dcim_consoleporttemplate_device_type_id_4181f4f26d97545e_uniq UNIQUE (device_type_id, name);
-
-
---
--- Name: dcim_consoleporttemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleporttemplate
-    ADD CONSTRAINT dcim_consoleporttemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_consoleserverport_device_id_7736709af378c53f_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleserverport
-    ADD CONSTRAINT dcim_consoleserverport_device_id_7736709af378c53f_uniq UNIQUE (device_id, name);
-
-
---
--- Name: dcim_consoleserverport_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleserverport
-    ADD CONSTRAINT dcim_consoleserverport_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_consoleserverporttempl_device_type_id_edd19c09550c93f_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleserverporttemplate
-    ADD CONSTRAINT dcim_consoleserverporttempl_device_type_id_edd19c09550c93f_uniq UNIQUE (device_type_id, name);
-
-
---
--- Name: dcim_consoleserverporttemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_consoleserverporttemplate
-    ADD CONSTRAINT dcim_consoleserverporttemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_device_name_203dd9298ce638c1_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_name_203dd9298ce638c1_uniq UNIQUE (name);
-
-
---
--- Name: dcim_device_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_device_primary_ip_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_primary_ip_id_key UNIQUE (primary_ip_id);
-
-
---
--- Name: dcim_device_rack_id_51ba816b607befb4_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_rack_id_51ba816b607befb4_uniq UNIQUE (rack_id, "position", face);
-
-
---
--- Name: dcim_devicerole_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicerole
-    ADD CONSTRAINT dcim_devicerole_name_key UNIQUE (name);
-
-
---
--- Name: dcim_devicerole_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicerole
-    ADD CONSTRAINT dcim_devicerole_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_devicerole_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicerole
-    ADD CONSTRAINT dcim_devicerole_slug_key UNIQUE (slug);
-
-
---
--- Name: dcim_devicetype_manufacturer_id_1261ef49562adaa4_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicetype
-    ADD CONSTRAINT dcim_devicetype_manufacturer_id_1261ef49562adaa4_uniq UNIQUE (manufacturer_id, slug);
-
-
---
--- Name: dcim_devicetype_manufacturer_id_1cfa2f3e364bcae3_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicetype
-    ADD CONSTRAINT dcim_devicetype_manufacturer_id_1cfa2f3e364bcae3_uniq UNIQUE (manufacturer_id, model);
-
-
---
--- Name: dcim_devicetype_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_devicetype
-    ADD CONSTRAINT dcim_devicetype_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_interface_device_id_1a96eafe3cd9e3df_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interface
-    ADD CONSTRAINT dcim_interface_device_id_1a96eafe3cd9e3df_uniq UNIQUE (device_id, name);
-
-
---
--- Name: dcim_interface_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interface
-    ADD CONSTRAINT dcim_interface_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_interfaceconnection_interface_a_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interfaceconnection
-    ADD CONSTRAINT dcim_interfaceconnection_interface_a_id_key UNIQUE (interface_a_id);
-
-
---
--- Name: dcim_interfaceconnection_interface_b_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interfaceconnection
-    ADD CONSTRAINT dcim_interfaceconnection_interface_b_id_key UNIQUE (interface_b_id);
-
-
---
--- Name: dcim_interfaceconnection_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interfaceconnection
-    ADD CONSTRAINT dcim_interfaceconnection_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_interfacetemplate_device_type_id_7a05c4e376f93953_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interfacetemplate
-    ADD CONSTRAINT dcim_interfacetemplate_device_type_id_7a05c4e376f93953_uniq UNIQUE (device_type_id, name);
-
-
---
--- Name: dcim_interfacetemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_interfacetemplate
-    ADD CONSTRAINT dcim_interfacetemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_manufacturer_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_manufacturer
-    ADD CONSTRAINT dcim_manufacturer_name_key UNIQUE (name);
-
-
---
--- Name: dcim_manufacturer_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_manufacturer
-    ADD CONSTRAINT dcim_manufacturer_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_manufacturer_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_manufacturer
-    ADD CONSTRAINT dcim_manufacturer_slug_key UNIQUE (slug);
-
-
---
--- Name: dcim_module_device_id_4d8292af_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_module
-    ADD CONSTRAINT dcim_module_device_id_4d8292af_uniq UNIQUE (device_id, parent_id, name);
-
-
---
--- Name: dcim_module_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_module
-    ADD CONSTRAINT dcim_module_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_platform_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_platform
-    ADD CONSTRAINT dcim_platform_name_key UNIQUE (name);
-
-
---
--- Name: dcim_platform_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_platform
-    ADD CONSTRAINT dcim_platform_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_platform_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_platform
-    ADD CONSTRAINT dcim_platform_slug_key UNIQUE (slug);
-
-
---
--- Name: dcim_poweroutlet_device_id_7c22b6bb01a5ff2c_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_poweroutlet
-    ADD CONSTRAINT dcim_poweroutlet_device_id_7c22b6bb01a5ff2c_uniq UNIQUE (device_id, name);
-
-
---
--- Name: dcim_poweroutlet_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_poweroutlet
-    ADD CONSTRAINT dcim_poweroutlet_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_poweroutlettemplate_device_type_id_6e69f9502b62feb8_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_poweroutlettemplate
-    ADD CONSTRAINT dcim_poweroutlettemplate_device_type_id_6e69f9502b62feb8_uniq UNIQUE (device_type_id, name);
-
-
---
--- Name: dcim_poweroutlettemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_poweroutlettemplate
-    ADD CONSTRAINT dcim_poweroutlettemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_powerport_device_id_75960a10f268db28_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_powerport
-    ADD CONSTRAINT dcim_powerport_device_id_75960a10f268db28_uniq UNIQUE (device_id, name);
-
-
---
--- Name: dcim_powerport_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_powerport
-    ADD CONSTRAINT dcim_powerport_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_powerport_power_outlet_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_powerport
-    ADD CONSTRAINT dcim_powerport_power_outlet_id_key UNIQUE (power_outlet_id);
-
-
---
--- Name: dcim_powerporttemplate_device_type_id_13286ca135e2f6c0_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_powerporttemplate
-    ADD CONSTRAINT dcim_powerporttemplate_device_type_id_13286ca135e2f6c0_uniq UNIQUE (device_type_id, name);
-
-
---
--- Name: dcim_powerporttemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_powerporttemplate
-    ADD CONSTRAINT dcim_powerporttemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_rack_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rack
-    ADD CONSTRAINT dcim_rack_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_rack_site_id_30be92c1bfc1d387_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rack
-    ADD CONSTRAINT dcim_rack_site_id_30be92c1bfc1d387_uniq UNIQUE (site_id, name);
-
-
---
--- Name: dcim_rack_site_id_69909272a1e4c508_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rack
-    ADD CONSTRAINT dcim_rack_site_id_69909272a1e4c508_uniq UNIQUE (site_id, facility_id);
-
-
---
--- Name: dcim_rackgroup_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rackgroup
-    ADD CONSTRAINT dcim_rackgroup_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_rackgroup_site_id_7fbfd118_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rackgroup
-    ADD CONSTRAINT dcim_rackgroup_site_id_7fbfd118_uniq UNIQUE (site_id, slug);
-
-
---
--- Name: dcim_rackgroup_site_id_c9bd921f_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_rackgroup
-    ADD CONSTRAINT dcim_rackgroup_site_id_c9bd921f_uniq UNIQUE (site_id, name);
-
-
---
--- Name: dcim_site_name_78bc7a96590ccbd0_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_site
-    ADD CONSTRAINT dcim_site_name_78bc7a96590ccbd0_uniq UNIQUE (name);
-
-
---
--- Name: dcim_site_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_site
-    ADD CONSTRAINT dcim_site_pkey PRIMARY KEY (id);
-
-
---
--- Name: dcim_site_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY dcim_site
-    ADD CONSTRAINT dcim_site_slug_key UNIQUE (slug);
-
-
---
--- Name: django_admin_log_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY django_admin_log
-    ADD CONSTRAINT django_admin_log_pkey PRIMARY KEY (id);
-
-
---
--- Name: django_content_type_app_label_45f3b1d93ec8c61c_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY django_content_type
-    ADD CONSTRAINT django_content_type_app_label_45f3b1d93ec8c61c_uniq UNIQUE (app_label, model);
-
-
---
--- Name: django_content_type_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY django_content_type
-    ADD CONSTRAINT django_content_type_pkey PRIMARY KEY (id);
-
-
---
--- Name: django_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY django_migrations
-    ADD CONSTRAINT django_migrations_pkey PRIMARY KEY (id);
-
-
---
--- Name: django_session_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY django_session
-    ADD CONSTRAINT django_session_pkey PRIMARY KEY (session_key);
-
-
---
--- Name: extras_exporttemplate_content_type_id_7c9266ee8ac6d527_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_exporttemplate
-    ADD CONSTRAINT extras_exporttemplate_content_type_id_7c9266ee8ac6d527_uniq UNIQUE (content_type_id, name);
-
-
---
--- Name: extras_exporttemplate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_exporttemplate
-    ADD CONSTRAINT extras_exporttemplate_pkey PRIMARY KEY (id);
-
-
---
--- Name: extras_graph_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_graph
-    ADD CONSTRAINT extras_graph_pkey PRIMARY KEY (id);
-
-
---
--- Name: extras_topologymap_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_topologymap
-    ADD CONSTRAINT extras_topologymap_name_key UNIQUE (name);
-
-
---
--- Name: extras_topologymap_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_topologymap
-    ADD CONSTRAINT extras_topologymap_pkey PRIMARY KEY (id);
-
-
---
--- Name: extras_topologymap_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_topologymap
-    ADD CONSTRAINT extras_topologymap_slug_key UNIQUE (slug);
-
-
---
--- Name: extras_useraction_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY extras_useraction
-    ADD CONSTRAINT extras_useraction_pkey PRIMARY KEY (id);
-
-
---
--- Name: inet_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY inet
-    ADD CONSTRAINT inet_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_aggregate_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_aggregate
-    ADD CONSTRAINT ipam_aggregate_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_ipaddress_nat_inside_id_54e134739a4fce35_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_ipaddress
-    ADD CONSTRAINT ipam_ipaddress_nat_inside_id_54e134739a4fce35_uniq UNIQUE (nat_inside_id);
-
-
---
--- Name: ipam_ipaddress_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_ipaddress
-    ADD CONSTRAINT ipam_ipaddress_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_prefix_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_prefix
-    ADD CONSTRAINT ipam_prefix_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_rir_name_189e93024f01ec65_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_rir
-    ADD CONSTRAINT ipam_rir_name_189e93024f01ec65_uniq UNIQUE (name);
-
-
---
--- Name: ipam_rir_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_rir
-    ADD CONSTRAINT ipam_rir_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_rir_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_rir
-    ADD CONSTRAINT ipam_rir_slug_key UNIQUE (slug);
-
-
---
--- Name: ipam_role_name_1f2da3fe0d1ed5cf_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_role
-    ADD CONSTRAINT ipam_role_name_1f2da3fe0d1ed5cf_uniq UNIQUE (name);
-
-
---
--- Name: ipam_role_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_role
-    ADD CONSTRAINT ipam_role_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_role_slug_b1b7426c7eb1a07_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_role
-    ADD CONSTRAINT ipam_role_slug_b1b7426c7eb1a07_uniq UNIQUE (slug);
-
-
---
--- Name: ipam_vlan_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_vlan
-    ADD CONSTRAINT ipam_vlan_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_vrf_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_vrf
-    ADD CONSTRAINT ipam_vrf_pkey PRIMARY KEY (id);
-
-
---
--- Name: ipam_vrf_rd_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY ipam_vrf
-    ADD CONSTRAINT ipam_vrf_rd_key UNIQUE (rd);
-
-
---
--- Name: mac_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY mac
-    ADD CONSTRAINT mac_pkey PRIMARY KEY (id);
-
-
---
--- Name: nullcidr_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY nullcidr
-    ADD CONSTRAINT nullcidr_pkey PRIMARY KEY (id);
-
-
---
--- Name: nullinet_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY nullinet
-    ADD CONSTRAINT nullinet_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_secret_device_id_f8acc218_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secret
-    ADD CONSTRAINT secrets_secret_device_id_f8acc218_uniq UNIQUE (device_id, role_id, name);
-
-
---
--- Name: secrets_secret_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secret
-    ADD CONSTRAINT secrets_secret_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_secretrole_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole_groups
-    ADD CONSTRAINT secrets_secretrole_groups_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_secretrole_groups_secretrole_id_1c7f7ee5_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole_groups
-    ADD CONSTRAINT secrets_secretrole_groups_secretrole_id_1c7f7ee5_uniq UNIQUE (secretrole_id, group_id);
-
-
---
--- Name: secrets_secretrole_name_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole
-    ADD CONSTRAINT secrets_secretrole_name_key UNIQUE (name);
-
-
---
--- Name: secrets_secretrole_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole
-    ADD CONSTRAINT secrets_secretrole_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_secretrole_slug_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole
-    ADD CONSTRAINT secrets_secretrole_slug_key UNIQUE (slug);
-
-
---
--- Name: secrets_secretrole_users_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole_users
-    ADD CONSTRAINT secrets_secretrole_users_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_secretrole_users_secretrole_id_41832d38_uniq; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_secretrole_users
-    ADD CONSTRAINT secrets_secretrole_users_secretrole_id_41832d38_uniq UNIQUE (secretrole_id, user_id);
-
-
---
--- Name: secrets_userkey_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_userkey
-    ADD CONSTRAINT secrets_userkey_pkey PRIMARY KEY (id);
-
-
---
--- Name: secrets_userkey_user_id_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY secrets_userkey
-    ADD CONSTRAINT secrets_userkey_user_id_key UNIQUE (user_id);
-
-
---
--- Name: uniquecidr_field_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY uniquecidr
-    ADD CONSTRAINT uniquecidr_field_key UNIQUE (field);
-
-
---
--- Name: uniquecidr_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY uniquecidr
-    ADD CONSTRAINT uniquecidr_pkey PRIMARY KEY (id);
-
-
---
--- Name: uniqueinet_field_key; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY uniqueinet
-    ADD CONSTRAINT uniqueinet_field_key UNIQUE (field);
-
-
---
--- Name: uniqueinet_pkey; Type: CONSTRAINT; Schema: public; Owner: django; Tablespace: 
---
-
-ALTER TABLE ONLY uniqueinet
-    ADD CONSTRAINT uniqueinet_pkey PRIMARY KEY (id);
-
-
---
--- Name: auth_group_name_253ae2a6331666e8_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_group_name_253ae2a6331666e8_like ON auth_group USING btree (name varchar_pattern_ops);
-
-
---
--- Name: auth_group_permissions_0e939a4f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_group_permissions_0e939a4f ON auth_group_permissions USING btree (group_id);
-
-
---
--- Name: auth_group_permissions_8373b171; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_group_permissions_8373b171 ON auth_group_permissions USING btree (permission_id);
-
-
---
--- Name: auth_permission_417f1b1c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_permission_417f1b1c ON auth_permission USING btree (content_type_id);
-
-
---
--- Name: auth_user_groups_0e939a4f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_user_groups_0e939a4f ON auth_user_groups USING btree (group_id);
-
-
---
--- Name: auth_user_groups_e8701ad4; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_user_groups_e8701ad4 ON auth_user_groups USING btree (user_id);
-
-
---
--- Name: auth_user_user_permissions_8373b171; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_user_user_permissions_8373b171 ON auth_user_user_permissions USING btree (permission_id);
-
-
---
--- Name: auth_user_user_permissions_e8701ad4; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_user_user_permissions_e8701ad4 ON auth_user_user_permissions USING btree (user_id);
-
-
---
--- Name: auth_user_username_51b3b110094b8aae_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX auth_user_username_51b3b110094b8aae_like ON auth_user USING btree (username varchar_pattern_ops);
-
-
---
--- Name: circuits_circuit_32ca2ddc; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_circuit_32ca2ddc ON circuits_circuit USING btree (provider_id);
-
-
---
--- Name: circuits_circuit_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_circuit_9365d6e7 ON circuits_circuit USING btree (site_id);
-
-
---
--- Name: circuits_circuit_94757cae; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_circuit_94757cae ON circuits_circuit USING btree (type_id);
-
-
---
--- Name: circuits_circuittype_name_1c2ade2dc0696954_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_circuittype_name_1c2ade2dc0696954_like ON circuits_circuittype USING btree (name varchar_pattern_ops);
-
-
---
--- Name: circuits_circuittype_slug_476ab74403291bbc_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_circuittype_slug_476ab74403291bbc_like ON circuits_circuittype USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: circuits_provider_name_6edbf97e6646bc6d_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_provider_name_6edbf97e6646bc6d_like ON circuits_provider USING btree (name varchar_pattern_ops);
-
-
---
--- Name: circuits_provider_slug_14c10aece416912b_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX circuits_provider_slug_14c10aece416912b_like ON circuits_provider USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: dcim_consoleport_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_consoleport_9379346c ON dcim_consoleport USING btree (device_id);
-
-
---
--- Name: dcim_consoleporttemplate_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_consoleporttemplate_bddcf45f ON dcim_consoleporttemplate USING btree (device_type_id);
-
-
---
--- Name: dcim_consoleserverport_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_consoleserverport_9379346c ON dcim_consoleserverport USING btree (device_id);
-
-
---
--- Name: dcim_consoleserverporttemplate_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_consoleserverporttemplate_bddcf45f ON dcim_consoleserverporttemplate USING btree (device_type_id);
-
-
---
--- Name: dcim_device_136ca3fc; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_device_136ca3fc ON dcim_device USING btree (device_role_id);
-
-
---
--- Name: dcim_device_21556361; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_device_21556361 ON dcim_device USING btree (rack_id);
-
-
---
--- Name: dcim_device_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_device_bddcf45f ON dcim_device USING btree (device_type_id);
-
-
---
--- Name: dcim_device_cb857215; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_device_cb857215 ON dcim_device USING btree (platform_id);
-
-
---
--- Name: dcim_devicerole_name_2ba786129816183_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_devicerole_name_2ba786129816183_like ON dcim_devicerole USING btree (name varchar_pattern_ops);
-
-
---
--- Name: dcim_devicetype_2dbcba41; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_devicetype_2dbcba41 ON dcim_devicetype USING btree (slug);
-
-
---
--- Name: dcim_devicetype_4d136c4a; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_devicetype_4d136c4a ON dcim_devicetype USING btree (manufacturer_id);
-
-
---
--- Name: dcim_interface_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_interface_9379346c ON dcim_interface USING btree (device_id);
-
-
---
--- Name: dcim_interfacetemplate_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_interfacetemplate_bddcf45f ON dcim_interfacetemplate USING btree (device_type_id);
-
-
---
--- Name: dcim_manufacturer_name_d0e87afc92d84ee_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_manufacturer_name_d0e87afc92d84ee_like ON dcim_manufacturer USING btree (name varchar_pattern_ops);
-
-
---
--- Name: dcim_module_6be37982; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_module_6be37982 ON dcim_module USING btree (parent_id);
-
-
---
--- Name: dcim_module_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_module_9379346c ON dcim_module USING btree (device_id);
-
-
---
--- Name: dcim_platform_name_79dfde6abeff3d4_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_platform_name_79dfde6abeff3d4_like ON dcim_platform USING btree (name varchar_pattern_ops);
-
-
---
--- Name: dcim_platform_slug_7c74a6b8ac58979c_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_platform_slug_7c74a6b8ac58979c_like ON dcim_platform USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: dcim_poweroutlet_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_poweroutlet_9379346c ON dcim_poweroutlet USING btree (device_id);
-
-
---
--- Name: dcim_poweroutlettemplate_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_poweroutlettemplate_bddcf45f ON dcim_poweroutlettemplate USING btree (device_type_id);
-
-
---
--- Name: dcim_powerport_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_powerport_9379346c ON dcim_powerport USING btree (device_id);
-
-
---
--- Name: dcim_powerporttemplate_bddcf45f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_powerporttemplate_bddcf45f ON dcim_powerporttemplate USING btree (device_type_id);
-
-
---
--- Name: dcim_rack_0e939a4f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_rack_0e939a4f ON dcim_rack USING btree (group_id);
-
-
---
--- Name: dcim_rack_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_rack_9365d6e7 ON dcim_rack USING btree (site_id);
-
-
---
--- Name: dcim_rackgroup_2dbcba41; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_rackgroup_2dbcba41 ON dcim_rackgroup USING btree (slug);
-
-
---
--- Name: dcim_rackgroup_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_rackgroup_9365d6e7 ON dcim_rackgroup USING btree (site_id);
-
-
---
--- Name: dcim_rackgroup_slug_3f4582a7_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_rackgroup_slug_3f4582a7_like ON dcim_rackgroup USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: dcim_site_slug_7e27fbff5c4239c8_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX dcim_site_slug_7e27fbff5c4239c8_like ON dcim_site USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: django_admin_log_417f1b1c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX django_admin_log_417f1b1c ON django_admin_log USING btree (content_type_id);
-
-
---
--- Name: django_admin_log_e8701ad4; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX django_admin_log_e8701ad4 ON django_admin_log USING btree (user_id);
-
-
---
--- Name: django_session_de54fa62; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX django_session_de54fa62 ON django_session USING btree (expire_date);
-
-
---
--- Name: django_session_session_key_461cfeaa630ca218_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX django_session_session_key_461cfeaa630ca218_like ON django_session USING btree (session_key varchar_pattern_ops);
-
-
---
--- Name: extras_exporttemplate_417f1b1c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_exporttemplate_417f1b1c ON extras_exporttemplate USING btree (content_type_id);
-
-
---
--- Name: extras_topologymap_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_topologymap_9365d6e7 ON extras_topologymap USING btree (site_id);
-
-
---
--- Name: extras_topologymap_name_f377ebf1_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_topologymap_name_f377ebf1_like ON extras_topologymap USING btree (name varchar_pattern_ops);
-
-
---
--- Name: extras_topologymap_slug_9ba3d31e_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_topologymap_slug_9ba3d31e_like ON extras_topologymap USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: extras_useraction_417f1b1c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_useraction_417f1b1c ON extras_useraction USING btree (content_type_id);
-
-
---
--- Name: extras_useraction_e8701ad4; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX extras_useraction_e8701ad4 ON extras_useraction USING btree (user_id);
-
-
---
--- Name: ipam_aggregate_rir_id_6b95f7cbf861b265_uniq; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_aggregate_rir_id_6b95f7cbf861b265_uniq ON ipam_aggregate USING btree (rir_id);
-
-
---
--- Name: ipam_ipaddress_0db30079; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_ipaddress_0db30079 ON ipam_ipaddress USING btree (vrf_id);
-
-
---
--- Name: ipam_ipaddress_455280ca; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_ipaddress_455280ca ON ipam_ipaddress USING btree (nat_inside_id);
-
-
---
--- Name: ipam_ipaddress_991706b3; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_ipaddress_991706b3 ON ipam_ipaddress USING btree (interface_id);
-
-
---
--- Name: ipam_prefix_0db30079; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_prefix_0db30079 ON ipam_prefix USING btree (vrf_id);
-
-
---
--- Name: ipam_prefix_84566833; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_prefix_84566833 ON ipam_prefix USING btree (role_id);
-
-
---
--- Name: ipam_prefix_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_prefix_9365d6e7 ON ipam_prefix USING btree (site_id);
-
-
---
--- Name: ipam_prefix_cd1dc8b7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_prefix_cd1dc8b7 ON ipam_prefix USING btree (vlan_id);
-
-
---
--- Name: ipam_rir_slug_416a41a245986cd_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_rir_slug_416a41a245986cd_like ON ipam_rir USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: ipam_role_2dbcba41; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_role_2dbcba41 ON ipam_role USING btree (slug);
-
-
---
--- Name: ipam_vlan_84566833; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_vlan_84566833 ON ipam_vlan USING btree (role_id);
-
-
---
--- Name: ipam_vlan_9365d6e7; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX ipam_vlan_9365d6e7 ON ipam_vlan USING btree (site_id);
-
-
---
--- Name: secrets_secret_84566833; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secret_84566833 ON secrets_secret USING btree (role_id);
-
-
---
--- Name: secrets_secret_9379346c; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secret_9379346c ON secrets_secret USING btree (device_id);
-
-
---
--- Name: secrets_secretrole_groups_0e939a4f; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_groups_0e939a4f ON secrets_secretrole_groups USING btree (group_id);
-
-
---
--- Name: secrets_secretrole_groups_be893205; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_groups_be893205 ON secrets_secretrole_groups USING btree (secretrole_id);
-
-
---
--- Name: secrets_secretrole_name_7b6ee7a4_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_name_7b6ee7a4_like ON secrets_secretrole USING btree (name varchar_pattern_ops);
-
-
---
--- Name: secrets_secretrole_slug_a06c885e_like; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_slug_a06c885e_like ON secrets_secretrole USING btree (slug varchar_pattern_ops);
-
-
---
--- Name: secrets_secretrole_users_be893205; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_users_be893205 ON secrets_secretrole_users USING btree (secretrole_id);
-
-
---
--- Name: secrets_secretrole_users_e8701ad4; Type: INDEX; Schema: public; Owner: django; Tablespace: 
---
-
-CREATE INDEX secrets_secretrole_users_e8701ad4 ON secrets_secretrole_users USING btree (user_id);
-
-
---
--- Name: auth_content_type_id_508cf46651277a81_fk_django_content_type_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_permission
-    ADD CONSTRAINT auth_content_type_id_508cf46651277a81_fk_django_content_type_id FOREIGN KEY (content_type_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_group_permissio_group_id_689710a9a73b7457_fk_auth_group_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_group_permissions
-    ADD CONSTRAINT auth_group_permissio_group_id_689710a9a73b7457_fk_auth_group_id FOREIGN KEY (group_id) REFERENCES auth_group(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_group_permission_id_1f49ccbbdc69d2fc_fk_auth_permission_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_group_permissions
-    ADD CONSTRAINT auth_group_permission_id_1f49ccbbdc69d2fc_fk_auth_permission_id FOREIGN KEY (permission_id) REFERENCES auth_permission(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_user__permission_id_384b62483d7071f0_fk_auth_permission_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_user_permissions
-    ADD CONSTRAINT auth_user__permission_id_384b62483d7071f0_fk_auth_permission_id FOREIGN KEY (permission_id) REFERENCES auth_permission(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_user_groups_group_id_33ac548dcf5f8e37_fk_auth_group_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_groups
-    ADD CONSTRAINT auth_user_groups_group_id_33ac548dcf5f8e37_fk_auth_group_id FOREIGN KEY (group_id) REFERENCES auth_group(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_user_groups_user_id_4b5ed4ffdb8fd9b0_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_groups
-    ADD CONSTRAINT auth_user_groups_user_id_4b5ed4ffdb8fd9b0_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: auth_user_user_permiss_user_id_7f0938558328534a_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY auth_user_user_permissions
-    ADD CONSTRAINT auth_user_user_permiss_user_id_7f0938558328534a_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: circuits_c_provider_id_167247d72362b097_fk_circuits_provider_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_c_provider_id_167247d72362b097_fk_circuits_provider_id FOREIGN KEY (provider_id) REFERENCES circuits_provider(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: circuits_ci_type_id_1d69462c5f0198ee_fk_circuits_circuittype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_ci_type_id_1d69462c5f0198ee_fk_circuits_circuittype_id FOREIGN KEY (type_id) REFERENCES circuits_circuittype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: circuits_circ_interface_id_a7a235094605e66_fk_dcim_interface_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_circ_interface_id_a7a235094605e66_fk_dcim_interface_id FOREIGN KEY (interface_id) REFERENCES dcim_interface(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: circuits_circuit_site_id_1fda25e8f4b8a5d_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY circuits_circuit
-    ADD CONSTRAINT circuits_circuit_site_id_1fda25e8f4b8a5d_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_co_cs_port_id_1f865a9aeca79c3_fk_dcim_consoleserverport_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleport
-    ADD CONSTRAINT dcim_co_cs_port_id_1f865a9aeca79c3_fk_dcim_consoleserverport_id FOREIGN KEY (cs_port_id) REFERENCES dcim_consoleserverport(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_cons_device_type_id_2b0cd8d64161d670_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleporttemplate
-    ADD CONSTRAINT dcim_cons_device_type_id_2b0cd8d64161d670_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_conso_device_type_id_9b0ca867cae19a1_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleserverporttemplate
-    ADD CONSTRAINT dcim_conso_device_type_id_9b0ca867cae19a1_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_consoleport_device_id_29b9f8e27e9d6770_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleport
-    ADD CONSTRAINT dcim_consoleport_device_id_29b9f8e27e9d6770_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_consoleserver_device_id_511cd2919b14863f_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_consoleserverport
-    ADD CONSTRAINT dcim_consoleserver_device_id_511cd2919b14863f_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_d_manufacturer_id_579c553080e9dedc_fk_dcim_manufacturer_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_devicetype
-    ADD CONSTRAINT dcim_d_manufacturer_id_579c553080e9dedc_fk_dcim_manufacturer_id FOREIGN KEY (manufacturer_id) REFERENCES dcim_manufacturer(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_devi_device_type_id_52445e10d85be955_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_devi_device_type_id_52445e10d85be955_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_devic_device_role_id_56eba740fa716a1_fk_dcim_devicerole_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_devic_device_role_id_56eba740fa716a1_fk_dcim_devicerole_id FOREIGN KEY (device_role_id) REFERENCES dcim_devicerole(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_device_platform_id_23623cd01a633f9a_fk_dcim_platform_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_platform_id_23623cd01a633f9a_fk_dcim_platform_id FOREIGN KEY (platform_id) REFERENCES dcim_platform(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_device_primary_ip_id_584ce7bd0806540b_fk_ipam_ipaddress_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_primary_ip_id_584ce7bd0806540b_fk_ipam_ipaddress_id FOREIGN KEY (primary_ip_id) REFERENCES ipam_ipaddress(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_device_rack_id_6e66edde5ed2479a_fk_dcim_rack_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_device
-    ADD CONSTRAINT dcim_device_rack_id_6e66edde5ed2479a_fk_dcim_rack_id FOREIGN KEY (rack_id) REFERENCES dcim_rack(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_inte_device_type_id_39b236aeb5adb9e5_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interfacetemplate
-    ADD CONSTRAINT dcim_inte_device_type_id_39b236aeb5adb9e5_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_inter_interface_a_id_4a90ee91ee670fa1_fk_dcim_interface_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interfaceconnection
-    ADD CONSTRAINT dcim_inter_interface_a_id_4a90ee91ee670fa1_fk_dcim_interface_id FOREIGN KEY (interface_a_id) REFERENCES dcim_interface(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_inter_interface_b_id_1e536e3d7fa00862_fk_dcim_interface_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interfaceconnection
-    ADD CONSTRAINT dcim_inter_interface_b_id_1e536e3d7fa00862_fk_dcim_interface_id FOREIGN KEY (interface_b_id) REFERENCES dcim_interface(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_interface_device_id_cebcbb2c2f43d21_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_interface
-    ADD CONSTRAINT dcim_interface_device_id_cebcbb2c2f43d21_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_module_device_id_75c6e9c983691bed_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_module
-    ADD CONSTRAINT dcim_module_device_id_75c6e9c983691bed_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_module_parent_id_bb5d0341_fk_dcim_module_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_module
-    ADD CONSTRAINT dcim_module_parent_id_bb5d0341_fk_dcim_module_id FOREIGN KEY (parent_id) REFERENCES dcim_module(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_po_power_outlet_id_4099940c71613091_fk_dcim_poweroutlet_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_powerport
-    ADD CONSTRAINT dcim_po_power_outlet_id_4099940c71613091_fk_dcim_poweroutlet_id FOREIGN KEY (power_outlet_id) REFERENCES dcim_poweroutlet(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_powe_device_type_id_384e9ac366036152_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_powerporttemplate
-    ADD CONSTRAINT dcim_powe_device_type_id_384e9ac366036152_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_powe_device_type_id_7807d6dc359b9cd6_fk_dcim_devicetype_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_poweroutlettemplate
-    ADD CONSTRAINT dcim_powe_device_type_id_7807d6dc359b9cd6_fk_dcim_devicetype_id FOREIGN KEY (device_type_id) REFERENCES dcim_devicetype(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_poweroutlet_device_id_5e311222f8451092_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_poweroutlet
-    ADD CONSTRAINT dcim_poweroutlet_device_id_5e311222f8451092_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_powerport_device_id_67713503b63c2a2a_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_powerport
-    ADD CONSTRAINT dcim_powerport_device_id_67713503b63c2a2a_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_rack_group_id_44e90ea9_fk_dcim_rackgroup_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_rack
-    ADD CONSTRAINT dcim_rack_group_id_44e90ea9_fk_dcim_rackgroup_id FOREIGN KEY (group_id) REFERENCES dcim_rackgroup(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_rack_site_id_5d7ccc420afb55f5_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_rack
-    ADD CONSTRAINT dcim_rack_site_id_5d7ccc420afb55f5_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: dcim_rackgroup_site_id_13520e89_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY dcim_rackgroup
-    ADD CONSTRAINT dcim_rackgroup_site_id_13520e89_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: djan_content_type_id_697914295151027a_fk_django_content_type_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY django_admin_log
-    ADD CONSTRAINT djan_content_type_id_697914295151027a_fk_django_content_type_id FOREIGN KEY (content_type_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY django_admin_log
-    ADD CONSTRAINT django_admin_log_user_id_52fdd58701c5f563_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: extr_content_type_id_3d11dce08b0c7e23_fk_django_content_type_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_exporttemplate
-    ADD CONSTRAINT extr_content_type_id_3d11dce08b0c7e23_fk_django_content_type_id FOREIGN KEY (content_type_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: extras_topologymap_site_id_b56b3ceb_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_topologymap
-    ADD CONSTRAINT extras_topologymap_site_id_b56b3ceb_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: extras_usera_content_type_id_99f782d7_fk_django_content_type_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_useraction
-    ADD CONSTRAINT extras_usera_content_type_id_99f782d7_fk_django_content_type_id FOREIGN KEY (content_type_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: extras_useraction_user_id_8aacec56_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY extras_useraction
-    ADD CONSTRAINT extras_useraction_user_id_8aacec56_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_aggregate_rir_id_6b95f7cbf861b265_fk_ipam_rir_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_aggregate
-    ADD CONSTRAINT ipam_aggregate_rir_id_6b95f7cbf861b265_fk_ipam_rir_id FOREIGN KEY (rir_id) REFERENCES ipam_rir(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_ipaddr_nat_inside_id_54e134739a4fce35_fk_ipam_ipaddress_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_ipaddress
-    ADD CONSTRAINT ipam_ipaddr_nat_inside_id_54e134739a4fce35_fk_ipam_ipaddress_id FOREIGN KEY (nat_inside_id) REFERENCES ipam_ipaddress(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_ipaddre_interface_id_1453a9dc6dd4107f_fk_dcim_interface_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_ipaddress
-    ADD CONSTRAINT ipam_ipaddre_interface_id_1453a9dc6dd4107f_fk_dcim_interface_id FOREIGN KEY (interface_id) REFERENCES dcim_interface(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_ipaddress_vrf_id_7961a6a27bac9dc0_fk_ipam_vrf_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_ipaddress
-    ADD CONSTRAINT ipam_ipaddress_vrf_id_7961a6a27bac9dc0_fk_ipam_vrf_id FOREIGN KEY (vrf_id) REFERENCES ipam_vrf(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_prefix_role_id_176ef537da785ba5_fk_ipam_role_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_prefix
-    ADD CONSTRAINT ipam_prefix_role_id_176ef537da785ba5_fk_ipam_role_id FOREIGN KEY (role_id) REFERENCES ipam_role(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_prefix_site_id_1256d3efdf9f08e8_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_prefix
-    ADD CONSTRAINT ipam_prefix_site_id_1256d3efdf9f08e8_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_prefix_vlan_id_46c10e1ba4efd5ae_fk_ipam_vlan_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_prefix
-    ADD CONSTRAINT ipam_prefix_vlan_id_46c10e1ba4efd5ae_fk_ipam_vlan_id FOREIGN KEY (vlan_id) REFERENCES ipam_vlan(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_prefix_vrf_id_6a821d8b02f9f14c_fk_ipam_vrf_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_prefix
-    ADD CONSTRAINT ipam_prefix_vrf_id_6a821d8b02f9f14c_fk_ipam_vrf_id FOREIGN KEY (vrf_id) REFERENCES ipam_vrf(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_vlan_role_id_61511bbc81bb1474_fk_ipam_role_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_vlan
-    ADD CONSTRAINT ipam_vlan_role_id_61511bbc81bb1474_fk_ipam_role_id FOREIGN KEY (role_id) REFERENCES ipam_role(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: ipam_vlan_site_id_3d425e66fe6edb31_fk_dcim_site_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY ipam_vlan
-    ADD CONSTRAINT ipam_vlan_site_id_3d425e66fe6edb31_fk_dcim_site_id FOREIGN KEY (site_id) REFERENCES dcim_site(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secret_device_id_c7c13124_fk_dcim_device_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secret
-    ADD CONSTRAINT secrets_secret_device_id_c7c13124_fk_dcim_device_id FOREIGN KEY (device_id) REFERENCES dcim_device(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secret_role_id_39d9347f_fk_secrets_secretrole_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secret
-    ADD CONSTRAINT secrets_secret_role_id_39d9347f_fk_secrets_secretrole_id FOREIGN KEY (role_id) REFERENCES secrets_secretrole(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secretr_secretrole_id_3cf0338b_fk_secrets_secretrole_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_groups
-    ADD CONSTRAINT secrets_secretr_secretrole_id_3cf0338b_fk_secrets_secretrole_id FOREIGN KEY (secretrole_id) REFERENCES secrets_secretrole(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secretr_secretrole_id_d2eac298_fk_secrets_secretrole_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_users
-    ADD CONSTRAINT secrets_secretr_secretrole_id_d2eac298_fk_secrets_secretrole_id FOREIGN KEY (secretrole_id) REFERENCES secrets_secretrole(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secretrole_groups_group_id_a687dd10_fk_auth_group_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_groups
-    ADD CONSTRAINT secrets_secretrole_groups_group_id_a687dd10_fk_auth_group_id FOREIGN KEY (group_id) REFERENCES auth_group(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_secretrole_users_user_id_25be95ad_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_secretrole_users
-    ADD CONSTRAINT secrets_secretrole_users_user_id_25be95ad_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: secrets_userkey_user_id_13ada46b_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: django
---
-
-ALTER TABLE ONLY secrets_userkey
-    ADD CONSTRAINT secrets_userkey_user_id_13ada46b_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED;
-
-
---
--- Name: public; Type: ACL; Schema: -; Owner: postgres
---
-
-REVOKE ALL ON SCHEMA public FROM PUBLIC;
-REVOKE ALL ON SCHEMA public FROM postgres;
-GRANT ALL ON SCHEMA public TO postgres;
-GRANT ALL ON SCHEMA public TO PUBLIC;
-
-
---
--- PostgreSQL database dump complete
---
-

+ 2 - 0
docs/secrets.md

@@ -20,6 +20,8 @@ Each secret is assigned a functional role which indicates what it is used for. T
 * IKE key strings
 * Routing protocol shared secrets
 
+Roles are also used to control access to secrets. Each role is assigned an arbitrary number of groups and/or users. Only the users associated with a role have permission to decrypt the secrets assigned to that role. (A superuser has permission to decrypt all secrets, provided they have an active user key.)
+
 ---
 
 # User Keys

+ 20 - 4
netbox/dcim/admin.py

@@ -2,9 +2,9 @@ from django.contrib import admin
 from django.db.models import Count
 
 from .models import (
-    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType,
-    Interface, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
-    PowerPortTemplate, Rack, RackGroup, Site,
+    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
+    DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceTemplate, Manufacturer, Module, Platform,
+    PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
 )
 
 
@@ -61,6 +61,10 @@ class InterfaceTemplateAdmin(admin.TabularInline):
     model = InterfaceTemplate
 
 
+class DeviceBayTemplateAdmin(admin.TabularInline):
+    model = DeviceBayTemplate
+
+
 @admin.register(DeviceType)
 class DeviceTypeAdmin(admin.ModelAdmin):
     prepopulated_fields = {
@@ -72,9 +76,10 @@ class DeviceTypeAdmin(admin.ModelAdmin):
         PowerPortTemplateAdmin,
         PowerOutletTemplateAdmin,
         InterfaceTemplateAdmin,
+        DeviceBayTemplateAdmin,
     ]
     list_display = ['model', 'manufacturer', 'slug', 'u_height', 'console_ports', 'console_server_ports', 'power_ports',
-                    'power_outlets', 'interfaces']
+                    'power_outlets', 'interfaces', 'device_bays']
     list_filter = ['manufacturer']
 
     def get_queryset(self, request):
@@ -84,6 +89,7 @@ class DeviceTypeAdmin(admin.ModelAdmin):
             power_port_count=Count('power_port_templates', distinct=True),
             power_outlet_count=Count('power_outlet_templates', distinct=True),
             interface_count=Count('interface_templates', distinct=True),
+            devicebay_count=Count('devicebay_templates', distinct=True),
         )
 
     def console_ports(self, instance):
@@ -101,6 +107,9 @@ class DeviceTypeAdmin(admin.ModelAdmin):
     def interfaces(self, instance):
         return instance.interface_count
 
+    def device_bays(self, instance):
+        return instance.devicebay_count
+
 
 #
 # Devices
@@ -144,6 +153,12 @@ class InterfaceAdmin(admin.TabularInline):
     model = Interface
 
 
+class DeviceBayAdmin(admin.TabularInline):
+    model = DeviceBay
+    fk_name = 'device'
+    readonly_fields = ['installed_device']
+
+
 class ModuleAdmin(admin.TabularInline):
     model = Module
     readonly_fields = ['parent', 'discovered']
@@ -157,6 +172,7 @@ class DeviceAdmin(admin.ModelAdmin):
         PowerPortAdmin,
         PowerOutletAdmin,
         InterfaceAdmin,
+        DeviceBayAdmin,
         ModuleAdmin,
     ]
     list_display = ['display_name', 'device_type', 'device_role', 'primary_ip', 'rack', 'position', 'serial']

+ 49 - 8
netbox/dcim/api/serializers.py

@@ -2,9 +2,9 @@ from rest_framework import serializers
 
 from ipam.models import IPAddress
 from dcim.models import (
-    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceType, DeviceRole,
-    Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate,
-    PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site,
+    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceType,
+    DeviceRole, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet,
+    PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site,
 )
 
 
@@ -221,16 +221,31 @@ class DeviceSerializer(serializers.ModelSerializer):
     platform = PlatformNestedSerializer()
     rack = RackNestedSerializer()
     primary_ip = DeviceIPAddressNestedSerializer()
+    parent_device = serializers.SerializerMethodField()
 
     class Meta:
         model = Device
         fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'platform', 'serial', 'rack', 'position',
-                  'face', 'status', 'primary_ip', 'comments']
+                  'face', 'parent_device', 'status', 'primary_ip', 'comments']
 
+    def get_parent_device(self, obj):
+        try:
+            device_bay = obj.parent_bay
+        except DeviceBay.DoesNotExist:
+            return None
+        return {
+            'id': device_bay.device.pk,
+            'name': device_bay.device.name,
+            'device_bay': {
+                'id': device_bay.pk,
+                'name': device_bay.name,
+            }
+        }
 
-class DeviceNestedSerializer(DeviceSerializer):
 
-    class Meta(DeviceSerializer.Meta):
+class DeviceNestedSerializer(serializers.ModelSerializer):
+
+    class Meta:
         model = Device
         fields = ['id', 'name', 'display_name']
 
@@ -319,7 +334,7 @@ class InterfaceSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = Interface
-        fields = ['id', 'device', 'name', 'form_factor', 'mgmt_only', 'description', 'is_connected']
+        fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected']
 
 
 class InterfaceNestedSerializer(InterfaceSerializer):
@@ -333,10 +348,36 @@ class InterfaceDetailSerializer(InterfaceSerializer):
     connected_interface = InterfaceSerializer(source='get_connected_interface')
 
     class Meta(InterfaceSerializer.Meta):
-        fields = ['id', 'device', 'name', 'form_factor', 'mgmt_only', 'description', 'is_connected',
+        fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected',
                   'connected_interface']
 
 
+#
+# Device bays
+#
+
+class DeviceBaySerializer(serializers.ModelSerializer):
+    device = DeviceNestedSerializer()
+
+    class Meta:
+        model = DeviceBay
+        fields = ['id', 'device', 'name']
+
+
+class DeviceBayNestedSerializer(DeviceBaySerializer):
+    installed_device = DeviceNestedSerializer()
+
+    class Meta(DeviceBaySerializer.Meta):
+        fields = ['id', 'name', 'installed_device']
+
+
+class DeviceBayDetailSerializer(DeviceBaySerializer):
+    installed_device = DeviceNestedSerializer()
+
+    class Meta(DeviceBaySerializer.Meta):
+        fields = ['id', 'device', 'name', 'installed_device']
+
+
 #
 # Interface connections
 #

+ 1 - 0
netbox/dcim/api/urls.py

@@ -49,6 +49,7 @@ urlpatterns = [
     url(r'^devices/(?P<pk>\d+)/power-ports/$', PowerPortListView.as_view(), name='device_powerports'),
     url(r'^devices/(?P<pk>\d+)/power-outlets/$', PowerOutletListView.as_view(), name='device_poweroutlets'),
     url(r'^devices/(?P<pk>\d+)/interfaces/$', InterfaceListView.as_view(), name='device_interfaces'),
+    url(r'^devices/(?P<pk>\d+)/device-bays/$', DeviceBayListView.as_view(), name='device_devicebays'),
 
     # Console ports
     url(r'^console-ports/(?P<pk>\d+)/$', ConsolePortView.as_view(), name='consoleport'),

+ 29 - 2
netbox/dcim/api/views.py

@@ -9,8 +9,8 @@ from django.http import Http404
 from django.shortcuts import get_object_or_404
 
 from dcim.models import (
-    ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface, InterfaceConnection,
-    Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
+    ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface,
+    InterfaceConnection, Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
 )
 from dcim import filters
 from .exceptions import MissingFilterException
@@ -326,6 +326,33 @@ class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView):
     queryset = InterfaceConnection.objects.all()
 
 
+#
+# Device bays
+#
+
+class DeviceBayListView(generics.ListAPIView):
+    """
+    List device bays (by device)
+    """
+    serializer_class = serializers.DeviceBayNestedSerializer
+
+    def get_queryset(self):
+
+        device = get_object_or_404(Device, pk=self.kwargs['pk'])
+        queryset = DeviceBay.objects.filter(device=device).select_related('installed_device')
+
+        # Filter by type (physical or virtual)
+        iface_type = self.request.query_params.get('type')
+        if iface_type == 'physical':
+            queryset = queryset.exclude(form_factor=IFACE_FF_VIRTUAL)
+        elif iface_type == 'virtual':
+            queryset = queryset.filter(form_factor=IFACE_FF_VIRTUAL)
+        elif iface_type is not None:
+            queryset = queryset.empty()
+
+        return queryset
+
+
 #
 # Live queries
 #

+ 44 - 0
netbox/dcim/fields.py

@@ -0,0 +1,44 @@
+from netaddr import EUI, mac_unix_expanded
+
+from django.core.exceptions import ValidationError
+from django.db import models
+
+from .formfields import MACAddressFormField
+
+
+class mac_unix_expanded_uppercase(mac_unix_expanded):
+    word_fmt = '%.2X'
+
+
+class MACAddressField(models.Field):
+    description = "PostgreSQL MAC Address field"
+
+    def python_type(self):
+        return EUI
+
+    def from_db_value(self, value, expression, connection, context):
+        return self.to_python(value)
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return EUI(value, version=48, dialect=mac_unix_expanded_uppercase)
+        except ValueError as e:
+            raise ValidationError(e)
+
+    def db_type(self, connection):
+        return 'macaddr'
+
+    def get_prep_value(self, value):
+        if not value:
+            return None
+        return str(self.to_python(value))
+
+    def form_class(self):
+        return MACAddressFormField
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': self.form_class()}
+        defaults.update(kwargs)
+        return super(MACAddressField, self).formfield(**defaults)

+ 4 - 1
netbox/dcim/fixtures/dcim.json

@@ -3419,6 +3419,7 @@
     "fields": {
         "device": 3,
         "name": "em0",
+        "mac_address": "00-00-00-AA-BB-CC",
         "form_factor": 800,
         "mgmt_only": true,
         "description": ""
@@ -3772,6 +3773,7 @@
         "device": 4,
         "name": "em0",
         "form_factor": 1000,
+        "mac_address": "ff-ee-dd-33-22-11",
         "mgmt_only": true,
         "description": ""
     }
@@ -5686,6 +5688,7 @@
         "device": 9,
         "name": "eth0",
         "form_factor": 1000,
+        "mac_address": "44-55-66-77-88-99",
         "mgmt_only": true,
         "description": ""
     }
@@ -5865,4 +5868,4 @@
         "connection_status": true
     }
 }
-]
+]

+ 26 - 0
netbox/dcim/formfields.py

@@ -0,0 +1,26 @@
+from netaddr import EUI, AddrFormatError
+
+from django import forms
+from django.core.exceptions import ValidationError
+
+
+#
+# Form fields
+#
+
+class MACAddressFormField(forms.Field):
+    default_error_messages = {
+        'invalid': "Enter a valid MAC address.",
+    }
+
+    def to_python(self, value):
+        if not value:
+            return None
+
+        if isinstance(value, EUI):
+            return value
+
+        try:
+            return EUI(value, version=48)
+        except AddrFormatError:
+            raise ValidationError("Please specify a valid MAC address.")

+ 50 - 7
netbox/dcim/forms.py

@@ -10,10 +10,10 @@ from utilities.forms import (
 )
 
 from .models import (
-    CONNECTION_STATUS_CHOICES, CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate,
-    ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, Interface, IFACE_FF_VIRTUAL,
-    InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
-    PowerPortTemplate, Rack, RackGroup, Site, STATUS_CHOICES
+    DeviceBay, DeviceBayTemplate, CONNECTION_STATUS_CHOICES, CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED,
+    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType,
+    Interface, IFACE_FF_VIRTUAL, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet,
+    PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHILD
 )
 
 
@@ -216,7 +216,7 @@ class DeviceTypeForm(forms.ModelForm, BootstrapMixin):
     class Meta:
         model = DeviceType
         fields = ['manufacturer', 'model', 'slug', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
-                  'is_network_device']
+                  'is_network_device', 'subdevice_role']
 
 
 class DeviceTypeBulkEditForm(forms.Form, BootstrapMixin):
@@ -283,6 +283,14 @@ class InterfaceTemplateForm(forms.ModelForm, BootstrapMixin):
         fields = ['name_pattern', 'form_factor', 'mgmt_only']
 
 
+class DeviceBayTemplateForm(forms.ModelForm, BootstrapMixin):
+    name_pattern = ExpandableNameField(label='Name')
+
+    class Meta:
+        model = DeviceBayTemplate
+        fields = ['name_pattern']
+
+
 #
 # Device roles
 #
@@ -917,7 +925,7 @@ class InterfaceForm(forms.ModelForm, BootstrapMixin):
 
     class Meta:
         model = Interface
-        fields = ['device', 'name', 'form_factor', 'mgmt_only', 'description']
+        fields = ['device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description']
         widgets = {
             'device': forms.HiddenInput(),
         }
@@ -928,7 +936,7 @@ class InterfaceCreateForm(forms.ModelForm, BootstrapMixin):
 
     class Meta:
         model = Interface
-        fields = ['name_pattern', 'form_factor', 'mgmt_only', 'description']
+        fields = ['name_pattern', 'form_factor', 'mac_address', 'mgmt_only', 'description']
 
 
 class InterfaceBulkCreateForm(InterfaceCreateForm, BootstrapMixin):
@@ -1080,6 +1088,41 @@ class InterfaceConnectionDeletionForm(forms.Form, BootstrapMixin):
     device = forms.ModelChoiceField(queryset=Device.objects.all(), widget=forms.HiddenInput(), required=False)
 
 
+#
+# Device bays
+#
+
+class DeviceBayForm(forms.ModelForm, BootstrapMixin):
+
+    class Meta:
+        model = DeviceBay
+        fields = ['device', 'name']
+        widgets = {
+            'device': forms.HiddenInput(),
+        }
+
+
+class DeviceBayCreateForm(forms.Form, BootstrapMixin):
+    name_pattern = ExpandableNameField(label='Name')
+
+
+class PopulateDeviceBayForm(forms.Form, BootstrapMixin):
+    installed_device = forms.ModelChoiceField(queryset=Device.objects.all(), label='Child Device',
+                                              help_text="Child devices must first be created within the rack occupied "
+                                                        "by the parent device. Then they can be assigned to a bay.")
+
+    def __init__(self, device_bay, *args, **kwargs):
+
+        super(PopulateDeviceBayForm, self).__init__(*args, **kwargs)
+
+        children_queryset = Device.objects.filter(rack=device_bay.device.rack,
+                                                  parent_bay__isnull=True,
+                                                  device_type__u_height=0,
+                                                  device_type__subdevice_role=SUBDEVICE_ROLE_CHILD)\
+            .exclude(pk=device_bay.device.pk)
+        self.fields['installed_device'].queryset = children_queryset
+
+
 #
 # Connections
 #

+ 56 - 0
netbox/dcim/migrations/0004_auto_20160701_2049.py

@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-07-01 20:49
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0003_auto_20160628_1721'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='DeviceBay',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=50, verbose_name=b'Name')),
+                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='device_bays', to='dcim.Device')),
+                ('installed_device', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_bay', to='dcim.Device')),
+            ],
+            options={
+                'ordering': ['device', 'name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='DeviceBayTemplate',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=30)),
+            ],
+            options={
+                'ordering': ['device_type', 'name'],
+            },
+        ),
+        migrations.AddField(
+            model_name='devicetype',
+            name='subdevice_role',
+            field=models.NullBooleanField(choices=[(None, b'N/A'), (True, b'Parent'), (False, b'Child')], default=None, help_text=b'Parent devices house child devices in device bays. Select "None" if this device type is neither a parent nor a child.', verbose_name=b'Parent/child status'),
+        ),
+        migrations.AddField(
+            model_name='devicebaytemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='device_bay_templates', to='dcim.DeviceType'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='devicebaytemplate',
+            unique_together=set([('device_type', 'name')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='devicebay',
+            unique_together=set([('device', 'name')]),
+        ),
+    ]

+ 26 - 0
netbox/dcim/migrations/0005_auto_20160706_1722.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.7 on 2016-07-06 17:22
+from __future__ import unicode_literals
+
+import dcim.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0004_auto_20160701_2049'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='interface',
+            name='mac_address',
+            field=dcim.fields.MACAddressField(blank=True, null=True, verbose_name=b'MAC Address'),
+        ),
+        migrations.AlterField(
+            model_name='devicetype',
+            name='subdevice_role',
+            field=models.NullBooleanField(choices=[(None, b'None'), (True, b'Parent'), (False, b'Child')], default=None, help_text=b'Parent devices house child devices in device bays. Select "None" if this device type is neither a parent nor a child.', verbose_name=b'Parent/child status'),
+        ),
+    ]

+ 102 - 2
netbox/dcim/models.py

@@ -4,12 +4,13 @@ from django.core.exceptions import ValidationError
 from django.core.urlresolvers import reverse
 from django.core.validators import MinValueValidator
 from django.db import models
-from django.db.models import Q, ObjectDoesNotExist
+from django.db.models import Count, Q, ObjectDoesNotExist
 
 from extras.rpc import RPC_CLIENTS
 from utilities.fields import NullableCharField
 from utilities.models import CreatedUpdatedModel
 
+from .fields import MACAddressField
 
 RACK_FACE_FRONT = 0
 RACK_FACE_REAR = 1
@@ -18,6 +19,14 @@ RACK_FACE_CHOICES = [
     [RACK_FACE_REAR, 'Rear'],
 ]
 
+SUBDEVICE_ROLE_PARENT = True
+SUBDEVICE_ROLE_CHILD = False
+SUBDEVICE_ROLE_CHOICES = (
+    (None, 'None'),
+    (SUBDEVICE_ROLE_PARENT, 'Parent'),
+    (SUBDEVICE_ROLE_CHILD, 'Child'),
+)
+
 COLOR_TEAL = 'teal'
 COLOR_GREEN = 'green'
 COLOR_BLUE = 'blue'
@@ -274,6 +283,7 @@ class Rack(CreatedUpdatedModel):
         # Add devices to rack units list
         if self.pk:
             for device in Device.objects.select_related('device_type__manufacturer', 'device_role')\
+                    .annotate(devicebay_count=Count('device_bays'))\
                     .exclude(pk=exclude)\
                     .filter(rack=self, position__gt=0)\
                     .filter(Q(face=face) | Q(device_type__is_full_depth=True)):
@@ -380,6 +390,10 @@ class DeviceType(models.Model):
                                  help_text="This type of device has power outlets")
     is_network_device = models.BooleanField(default=True, verbose_name='Is a network device',
                                             help_text="This type of device has network interfaces")
+    subdevice_role = models.NullBooleanField(default=None, verbose_name='Parent/child status',
+                                             choices=SUBDEVICE_ROLE_CHOICES,
+                                             help_text="Parent devices house child devices in device bays. Select "
+                                                       "\"None\" if this device type is neither a parent nor a child.")
 
     class Meta:
         ordering = ['manufacturer', 'model']
@@ -389,11 +403,40 @@ class DeviceType(models.Model):
         ]
 
     def __unicode__(self):
-        return "{0} {1}".format(self.manufacturer, self.model)
+        return "{} {}".format(self.manufacturer, self.model)
 
     def get_absolute_url(self):
         return reverse('dcim:devicetype', args=[self.pk])
 
+    def clean(self):
+
+        if not self.is_console_server and self.cs_port_templates.count():
+            raise ValidationError("Must delete all console server port templates associated with this device before "
+                                  "declassifying it as a console server.")
+
+        if not self.is_pdu and self.power_outlet_templates.count():
+            raise ValidationError("Must delete all power outlet templates associated with this device before "
+                                  "declassifying it as a PDU.")
+
+        if not self.is_network_device and self.interface_templates.filter(mgmt_only=False).count():
+            raise ValidationError("Must delete all non-management-only interface templates associated with this device "
+                                  "before declassifying it as a network device.")
+
+        if self.subdevice_role != SUBDEVICE_ROLE_PARENT and self.device_bay_templates.count():
+            raise ValidationError("Must delete all device bay templates associated with this device before "
+                                  "declassifying it as a parent device.")
+
+        if self.u_height and self.subdevice_role == SUBDEVICE_ROLE_CHILD:
+            raise ValidationError("Child device types must be 0U.")
+
+    @property
+    def is_parent_device(self):
+        return bool(self.subdevice_role)
+
+    @property
+    def is_child_device(self):
+        return bool(self.subdevice_role is False)
+
 
 class ConsolePortTemplate(models.Model):
     """
@@ -481,6 +524,21 @@ class InterfaceTemplate(models.Model):
         return self.name
 
 
+class DeviceBayTemplate(models.Model):
+    """
+    A template for a DeviceBay to be created for a new parent Device.
+    """
+    device_type = models.ForeignKey('DeviceType', related_name='device_bay_templates', on_delete=models.CASCADE)
+    name = models.CharField(max_length=30)
+
+    class Meta:
+        ordering = ['device_type', 'name']
+        unique_together = ['device_type', 'name']
+
+    def __unicode__(self):
+        return self.name
+
+
 #
 # Devices
 #
@@ -563,6 +621,10 @@ class Device(CreatedUpdatedModel):
 
     def clean(self):
 
+        # Child devices cannot be assigned to a rack face/unit
+        if self.device_type.is_child_device and (self.face is not None or self.position):
+            raise ValidationError("Child device types cannot be assigned a rack face or position.")
+
         # Validate position/face combination
         if self.position and self.face is None:
             raise ValidationError("Must specify rack face with rack position.")
@@ -610,6 +672,10 @@ class Device(CreatedUpdatedModel):
                 [Interface(device=self, name=template.name, form_factor=template.form_factor,
                            mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()]
             )
+            DeviceBay.objects.bulk_create(
+                [DeviceBay(device=self, name=template.name) for template in
+                 self.device_type.device_bay_templates.all()]
+            )
 
     def to_csv(self):
         return ','.join([
@@ -643,6 +709,12 @@ class Device(CreatedUpdatedModel):
             return self.name
         return '{{{}}}'.format(self.pk)
 
+    def get_children(self):
+        """
+        Return the set of child Devices installed in DeviceBays within this Device.
+        """
+        return Device.objects.filter(parent_bay__device=self.pk)
+
     def get_rpc_client(self):
         """
         Return the appropriate RPC (e.g. NETCONF, ssh, etc.) client for this device's platform, if one is defined.
@@ -785,6 +857,7 @@ class Interface(models.Model):
     device = models.ForeignKey('Device', related_name='interfaces', on_delete=models.CASCADE)
     name = models.CharField(max_length=30)
     form_factor = models.PositiveSmallIntegerField(choices=IFACE_FF_CHOICES, default=IFACE_FF_SFP_PLUS)
+    mac_address = MACAddressField(null=True, blank=True, verbose_name='MAC Address')
     mgmt_only = models.BooleanField(default=False, verbose_name='OOB Management',
                                     help_text="This interface is used only for out-of-band management")
     description = models.CharField(max_length=100, blank=True)
@@ -860,6 +933,33 @@ class InterfaceConnection(models.Model):
         ])
 
 
+class DeviceBay(models.Model):
+    """
+    An empty space within a Device which can house a child device
+    """
+    device = models.ForeignKey('Device', related_name='device_bays', on_delete=models.CASCADE)
+    name = models.CharField(max_length=50, verbose_name='Name')
+    installed_device = models.OneToOneField('Device', related_name='parent_bay', blank=True, null=True)
+
+    class Meta:
+        ordering = ['device', 'name']
+        unique_together = ['device', 'name']
+
+    def __unicode__(self):
+        return '{} - {}'.format(self.device.name, self.name)
+
+    def clean(self):
+
+        # Validate that the parent Device can have DeviceBays
+        if not self.device.device_type.is_parent_device:
+            raise ValidationError("This type of device ({}) does not support device bays."
+                                  .format(self.device.device_type))
+
+        # Cannot install a device into itself, obviously
+        if self.device == self.installed_device:
+            raise ValidationError("Cannot install a device into itself.")
+
+
 class Module(models.Model):
     """
     A Module represents a piece of hardware within a Device, such as a line card or power supply. Modules are used only

+ 17 - 3
netbox/dcim/tables.py

@@ -4,8 +4,9 @@ from django_tables2.utils import Accessor
 from utilities.tables import BaseTable, ToggleColumn
 
 from .models import (
-    ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, InterfaceTemplate,
-    Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
+    ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceBayTemplate, DeviceRole, DeviceType,
+    Interface, InterfaceTemplate, Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
+    RackGroup, Site,
 )
 
 
@@ -201,6 +202,19 @@ class InterfaceTemplateTable(tables.Table):
         }
 
 
+class DeviceBayTemplateTable(tables.Table):
+    pk = ToggleColumn()
+
+    class Meta:
+        model = DeviceBayTemplate
+        fields = ('pk', 'name')
+        empty_text = "None"
+        show_header = False
+        attrs = {
+            'class': 'table table-hover panel-body',
+        }
+
+
 #
 # Device roles
 #
@@ -305,5 +319,5 @@ class InterfaceConnectionTable(BaseTable):
     interface_b = tables.Column(verbose_name='Interface B')
 
     class Meta(BaseTable.Meta):
-        model = PowerPort
+        model = Interface
         fields = ('device_a', 'interface_a', 'device_b', 'interface_b')

+ 4 - 0
netbox/dcim/tests/test_apis.py

@@ -315,6 +315,7 @@ class DeviceTest(APITestCase):
         'rack',
         'position',
         'face',
+        'parent_device',
         'status',
         'primary_ip',
         'comments',
@@ -366,6 +367,7 @@ class DeviceTest(APITestCase):
             'face',
             'id',
             'name',
+            'parent_device',
             'platform_id',
             'platform_name',
             'platform_slug',
@@ -527,6 +529,7 @@ class InterfaceTest(APITestCase):
         'device',
         'name',
         'form_factor',
+        'mac_address',
         'mgmt_only',
         'description',
         'is_connected'
@@ -539,6 +542,7 @@ class InterfaceTest(APITestCase):
         'device',
         'name',
         'form_factor',
+        'mac_address',
         'mgmt_only',
         'description',
         'is_connected',

+ 13 - 1
netbox/dcim/urls.py

@@ -4,7 +4,8 @@ from secrets.views import secret_add
 
 from . import views
 from .models import (
-    ConsolePortTemplate, ConsoleServerPortTemplate, PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate,
+    ConsolePortTemplate, ConsoleServerPortTemplate, DeviceBayTemplate, PowerPortTemplate, PowerOutletTemplate,
+    InterfaceTemplate,
 )
 
 
@@ -70,6 +71,10 @@ urlpatterns = [
         name='devicetype_add_interface'),
     url(r'^device-types/(?P<pk>\d+)/interfaces/delete/$', views.component_template_delete,
         {'model': InterfaceTemplate}, name='devicetype_delete_interface'),
+    url(r'^device-types/(?P<pk>\d+)/device-bays/add/$', views.DeviceBayTemplateAddView.as_view(),
+        name='devicetype_add_devicebay'),
+    url(r'^device-types/(?P<pk>\d+)/device-bays/delete/$', views.component_template_delete,
+        {'model': DeviceBayTemplate}, name='devicetype_delete_devicebay'),
 
     # Device roles
     url(r'^device-roles/$', views.DeviceRoleListView.as_view(), name='devicerole_list'),
@@ -125,6 +130,13 @@ urlpatterns = [
     url(r'^power-outlets/(?P<pk>\d+)/edit/$', views.poweroutlet_edit, name='poweroutlet_edit'),
     url(r'^power-outlets/(?P<pk>\d+)/delete/$', views.poweroutlet_delete, name='poweroutlet_delete'),
 
+    # Device bays
+    url(r'^devices/(?P<pk>\d+)/bays/add/$', views.devicebay_add, name='devicebay_add'),
+    url(r'^device-bays/(?P<pk>\d+)/edit/$', views.devicebay_edit, name='devicebay_edit'),
+    url(r'^device-bays/(?P<pk>\d+)/delete/$', views.devicebay_delete, name='devicebay_delete'),
+    url(r'^device-bays/(?P<pk>\d+)/populate/$', views.devicebay_populate, name='devicebay_populate'),
+    url(r'^device-bays/(?P<pk>\d+)/depopulate/$', views.devicebay_depopulate, name='devicebay_depopulate'),
+
     # Console/power/interface connections
     url(r'^console-connections/$', views.ConsoleConnectionsListView.as_view(), name='console_connections_list'),
     url(r'^console-connections/import/$', views.ConsoleConnectionsBulkImportView.as_view(), name='console_connections_import'),

+ 156 - 5
netbox/dcim/views.py

@@ -24,8 +24,9 @@ from utilities.views import (
 from . import filters, forms, tables
 from .models import (
     CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
-    DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform,
-    PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
+    DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate,
+    Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup,
+    Site,
 )
 
 
@@ -153,7 +154,8 @@ def rack(request, pk):
 
     rack = get_object_or_404(Rack, pk=pk)
 
-    nonracked_devices = Device.objects.filter(rack=rack, position__isnull=True)
+    nonracked_devices = Device.objects.filter(rack=rack, position__isnull=True)\
+        .select_related('device_type__manufacturer')
     next_rack = Rack.objects.filter(site=rack.site, name__gt=rack.name).order_by('name').first()
     prev_rack = Rack.objects.filter(site=rack.site, name__lt=rack.name).order_by('-name').first()
 
@@ -263,12 +265,14 @@ def devicetype(request, pk):
     powerport_table = tables.PowerPortTemplateTable(PowerPortTemplate.objects.filter(device_type=devicetype))
     poweroutlet_table = tables.PowerOutletTemplateTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
     interface_table = tables.InterfaceTemplateTable(InterfaceTemplate.objects.filter(device_type=devicetype))
+    devicebay_table = tables.DeviceBayTemplateTable(DeviceBayTemplate.objects.filter(device_type=devicetype))
     if request.user.has_perm('dcim.change_devicetype'):
         consoleport_table.base_columns['pk'].visible = True
         consoleserverport_table.base_columns['pk'].visible = True
         powerport_table.base_columns['pk'].visible = True
         poweroutlet_table.base_columns['pk'].visible = True
         interface_table.base_columns['pk'].visible = True
+        devicebay_table.base_columns['pk'].visible = True
 
     return render(request, 'dcim/devicetype.html', {
         'devicetype': devicetype,
@@ -277,6 +281,7 @@ def devicetype(request, pk):
         'powerport_table': powerport_table,
         'poweroutlet_table': poweroutlet_table,
         'interface_table': interface_table,
+        'devicebay_table': devicebay_table,
     })
 
 
@@ -395,6 +400,11 @@ class InterfaceTemplateAddView(ComponentTemplateCreateView):
     form = forms.InterfaceTemplateForm
 
 
+class DeviceBayTemplateAddView(ComponentTemplateCreateView):
+    model = DeviceBayTemplate
+    form = forms.DeviceBayTemplateForm
+
+
 def component_template_delete(request, pk, model):
 
     devicetype = get_object_or_404(DeviceType, pk=pk)
@@ -421,7 +431,7 @@ def component_template_delete(request, pk, model):
     else:
         form = ComponentTemplateBulkDeleteForm(initial={'pk': request.POST.getlist('pk')})
 
-    selected_objects = model.objects.filter(pk__in=form.initial.get('pk'))
+    selected_objects = model.objects.filter(pk__in=request.POST.getlist('pk'))
     if not selected_objects:
         messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural))
         return redirect('dcim:devicetype', pk=devicetype.pk)
@@ -510,6 +520,7 @@ def device(request, pk):
         .select_related('connected_as_a', 'connected_as_b', 'circuit')
     mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True)\
         .select_related('connected_as_a', 'connected_as_b', 'circuit')
+    device_bays = DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer')
 
     # Gather any secrets which belong to this device
     secrets = device.secrets.all()
@@ -540,6 +551,7 @@ def device(request, pk):
         'power_outlets': power_outlets,
         'interfaces': interfaces,
         'mgmt_interfaces': mgmt_interfaces,
+        'device_bays': device_bays,
         'ip_addresses': ip_addresses,
         'secrets': secrets,
         'related_devices': related_devices,
@@ -550,7 +562,7 @@ class DeviceEditView(PermissionRequiredMixin, ObjectEditView):
     permission_required = 'dcim.change_device'
     model = Device
     form_class = forms.DeviceForm
-    fields_initial = ['site', 'rack', 'position', 'face']
+    fields_initial = ['site', 'rack', 'position', 'face', 'device_bay']
     template_name = 'dcim/device_edit.html'
     cancel_url = 'dcim:device_list'
 
@@ -1240,6 +1252,7 @@ def interface_add(request, pk):
                     'device': device.pk,
                     'name': name,
                     'form_factor': form.cleaned_data['form_factor'],
+                    'mac_address': form.cleaned_data['mac_address'],
                     'mgmt_only': form.cleaned_data['mgmt_only'],
                     'description': form.cleaned_data['description'],
                 })
@@ -1327,6 +1340,7 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
                 iface_form = forms.InterfaceForm({
                     'device': device.pk,
                     'name': name,
+                    'mac_address': form.cleaned_data['mac_address'],
                     'form_factor': form.cleaned_data['form_factor'],
                     'mgmt_only': form.cleaned_data['mgmt_only'],
                     'description': form.cleaned_data['description'],
@@ -1342,6 +1356,143 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
                                                                                       len(selected_devices)))
 
 
+#
+# Device bays
+#
+
+@permission_required('dcim.add_devicebay')
+def devicebay_add(request, pk):
+
+    device = get_object_or_404(Device, pk=pk)
+
+    if request.method == 'POST':
+        form = forms.DeviceBayCreateForm(request.POST)
+        if form.is_valid():
+
+            device_bays = []
+            for name in form.cleaned_data['name_pattern']:
+                devicebay_form = forms.DeviceBayForm({
+                    'device': device.pk,
+                    'name': name,
+                })
+                if devicebay_form.is_valid():
+                    device_bays.append(devicebay_form.save(commit=False))
+                else:
+                    for err in devicebay_form.errors.get('__all__', []):
+                        form.add_error('name_pattern', err)
+
+            if not form.errors:
+                DeviceBay.objects.bulk_create(device_bays)
+                messages.success(request, "Added {} device bay(s) to {}".format(len(device_bays), device))
+                if '_addanother' in request.POST:
+                    return redirect('dcim:devicebay_add', pk=device.pk)
+                else:
+                    return redirect('dcim:device', pk=device.pk)
+
+    else:
+        form = forms.DeviceBayCreateForm()
+
+    return render(request, 'dcim/devicebay_edit.html', {
+        'device': device,
+        'form': form,
+        'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
+    })
+
+
+@permission_required('dcim.change_devicebay')
+def devicebay_edit(request, pk):
+
+    devicebay = get_object_or_404(DeviceBay, pk=pk)
+
+    if request.method == 'POST':
+        form = forms.DeviceBayForm(request.POST, instance=devicebay)
+        if form.is_valid():
+            devicebay = form.save()
+            messages.success(request, "Modified {} bay {}".format(devicebay.device.name, devicebay.name))
+            return redirect('dcim:device', pk=devicebay.device.pk)
+
+    else:
+        form = forms.DeviceBayForm(instance=devicebay)
+
+    return render(request, 'dcim/devicebay_edit.html', {
+        'devicebay': devicebay,
+        'form': form,
+        'cancel_url': reverse('dcim:device', kwargs={'pk': devicebay.device.pk}),
+    })
+
+
+@permission_required('dcim.delete_devicebay')
+def devicebay_delete(request, pk):
+
+    devicebay = get_object_or_404(DeviceBay, pk=pk)
+
+    if request.method == 'POST':
+        form = ConfirmationForm(request.POST)
+        if form.is_valid():
+            devicebay.delete()
+            messages.success(request, "Device bay {} has been deleted from {}".format(devicebay, devicebay.device))
+            return redirect('dcim:device', pk=devicebay.device.pk)
+
+    else:
+        form = ConfirmationForm()
+
+    return render(request, 'dcim/devicebay_delete.html', {
+        'devicebay': devicebay,
+        'form': form,
+        'cancel_url': reverse('dcim:device', kwargs={'pk': devicebay.device.pk}),
+    })
+
+
+@permission_required('dcim.change_devicebay')
+def devicebay_populate(request, pk):
+
+    device_bay = get_object_or_404(DeviceBay, pk=pk)
+
+    if request.method == 'POST':
+        form = forms.PopulateDeviceBayForm(device_bay, request.POST)
+        if form.is_valid():
+
+            device_bay.installed_device = form.cleaned_data['installed_device']
+            device_bay.save()
+
+            if not form.errors:
+                messages.success(request, "Added {} to {}".format(device_bay.installed_device, device_bay))
+                return redirect('dcim:device', pk=device_bay.device.pk)
+
+    else:
+        form = forms.PopulateDeviceBayForm(device_bay)
+
+    return render(request, 'dcim/devicebay_populate.html', {
+        'device_bay': device_bay,
+        'form': form,
+        'cancel_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}),
+    })
+
+
+@permission_required('dcim.change_devicebay')
+def devicebay_depopulate(request, pk):
+
+    device_bay = get_object_or_404(DeviceBay, pk=pk)
+
+    if request.method == 'POST':
+        form = ConfirmationForm(request.POST)
+        if form.is_valid():
+            removed_device = device_bay.installed_device
+            device_bay.installed_device = None
+            device_bay.save()
+            messages.success(request, "{} has been removed from {}".format(removed_device, device_bay))
+            return redirect('dcim:device', pk=device_bay.device.pk)
+
+    else:
+        form = ConfirmationForm()
+
+    return render(request, 'dcim/devicebay_depopulate.html', {
+        'device_bay': device_bay,
+        'form': form,
+        'cancel_url': reverse('dcim:device', kwargs={'pk': device_bay.device.pk}),
+    })
+
+
 #
 # Interface connections
 #

+ 75 - 0
netbox/netbox/configuration.docker.py

@@ -0,0 +1,75 @@
+import os
+#########################
+#                       #
+#   Required settings   #
+#                       #
+#########################
+
+# This is a list of valid fully-qualified domain names (FQDNs) for the NetBox server. NetBox will not permit write
+# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name.
+#
+# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local']
+ALLOWED_HOSTS = [os.environ.get('ALLOWED_HOSTS', '')]
+
+# PostgreSQL database configuration.
+DATABASE = {
+    'NAME': os.environ.get('DB_NAME', 'netbox'),         # Database name
+    'USER': os.environ.get('DB_USER', ''),               # PostgreSQL username
+    'PASSWORD': os.environ.get('DB_PASSWORD', ''),       # PostgreSQL password
+    'HOST': os.environ.get('DB_HOST', 'localhost'),      # Database server
+    'PORT': os.environ.get('DB_PORT', ''),               # Database port (leave blank for default)
+}
+
+# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file.
+# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and
+# symbols. NetBox will not run without this defined. For more information, see
+# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SECRET_KEY
+SECRET_KEY = os.environ.get('SECRET_KEY', '')
+
+#########################
+#                       #
+#   Optional settings   #
+#                       #
+#########################
+
+# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
+# application errors (assuming correct email settings are provided).
+ADMINS = [
+    # ['John Doe', 'jdoe@example.com'],
+]
+
+# Email settings
+EMAIL = {
+    'SERVER': os.environ.get('EMAIL_SERVER', 'localhost'),
+    'PORT': os.environ.get('EMAIL_PORT', 25),
+    'USERNAME': os.environ.get('EMAIL_USERNAME', ''),
+    'PASSWORD': os.environ.get('EMAIL_PASSWORD', ''),
+    'TIMEOUT': os.environ.get('EMAIL_TIMEOUT', 10),  # seconds
+    'FROM_EMAIL': os.environ.get('EMAIL_FROM', ''),
+}
+
+# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users
+# are permitted to access most data in NetBox (excluding secrets) but not make any changes.
+LOGIN_REQUIRED = os.environ.get('LOGIN_REQUIRED', False)
+
+# Setting this to True will display a "maintenance mode" banner at the top of every page.
+MAINTENANCE_MODE = os.environ.get('MAINTENANCE_MODE', False)
+
+# Credentials that NetBox will use to access live devices.
+NETBOX_USERNAME = os.environ.get('NETBOX_USERNAME', '')
+NETBOX_PASSWORD = os.environ.get('NETBOX_PASSWORD', '')
+
+# Determine how many objects to display per page within a list. (Default: 50)
+PAGINATE_COUNT = os.environ.get('PAGINATE_COUNT', 50)
+
+# Time zone (default: UTC)
+TIME_ZONE = os.environ.get('TIME_ZONE', 'UTC')
+
+# Date/time formatting. See the following link for supported formats:
+# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+DATE_FORMAT = os.environ.get('DATE_FORMAT', 'N j, Y')
+SHORT_DATE_FORMAT = os.environ.get('SHORT_DATE_FORMAT', 'Y-m-d')
+TIME_FORMAT = os.environ.get('TIME_FORMAT', 'g:i a')
+SHORT_TIME_FORMAT = os.environ.get('SHORT_TIME_FORMAT', 'H:i:s')
+DATETIME_FORMAT = os.environ.get('DATETIME_FORMAT', 'N j, Y g:i a')
+SHORT_DATETIME_FORMAT = os.environ.get('SHORT_DATETIME_FORMAT', 'Y-m-d H:i')

+ 1 - 1
netbox/netbox/settings.py

@@ -11,7 +11,7 @@ except ImportError:
                                "the documentation.")
 
 
-VERSION = '1.0.7-r1'
+VERSION = '1.1.0'
 
 # Import local configuration
 for setting in ['ALLOWED_HOSTS', 'DATABASE', 'SECRET_KEY']:

+ 1 - 1
netbox/netbox/views.py

@@ -41,7 +41,7 @@ def home(request):
 
     return render(request, 'home.html', {
         'stats': stats,
-        'recent_activity': UserAction.objects.all()[:15]
+        'recent_activity': UserAction.objects.select_related('user')[:15]
     })
 
 

+ 10 - 8
netbox/secrets/api/views.py

@@ -4,6 +4,7 @@ from django.shortcuts import get_object_or_404
 
 from rest_framework import generics
 from rest_framework import status
+from rest_framework.exceptions import PermissionDenied
 from rest_framework.permissions import IsAuthenticated
 from rest_framework.renderers import JSONRenderer
 from rest_framework.response import Response
@@ -108,14 +109,15 @@ class SecretDetailView(generics.GenericAPIView):
                     {'error': ERR_USERKEY_INACTIVE},
                     status=status.HTTP_400_BAD_REQUEST
                 )
-            if secret.decryptable_by(request.user):
-                master_key = uk.get_master_key(private_key)
-                if master_key is None:
-                    return Response(
-                        {'error': ERR_PRIVKEY_INVALID},
-                        status=status.HTTP_400_BAD_REQUEST
-                    )
-                secret.decrypt(master_key)
+            if not secret.decryptable_by(request.user):
+                raise PermissionDenied(detail="You do not have permission to decrypt this secret.")
+            master_key = uk.get_master_key(private_key)
+            if master_key is None:
+                return Response(
+                    {'error': ERR_PRIVKEY_INVALID},
+                    status=status.HTTP_400_BAD_REQUEST
+                )
+            secret.decrypt(master_key)
 
         serializer = self.get_serializer(secret)
         return Response(serializer.data)

+ 9 - 1
netbox/secrets/models.py

@@ -182,6 +182,14 @@ class SecretRole(models.Model):
     def get_absolute_url(self):
         return "{}?role={}".format(reverse('secrets:secret_list'), self.slug)
 
+    def has_member(self, user):
+        """
+        Check whether the given user has belongs to this SecretRole. Note that superusers belong to all roles.
+        """
+        if user.is_superuser:
+            return True
+        return user in self.users.all() or user.groups.filter(pk__in=self.groups.all()).exists()
+
 
 class Secret(CreatedUpdatedModel):
     """
@@ -304,4 +312,4 @@ class Secret(CreatedUpdatedModel):
         """
         Check whether the given user has permission to decrypt this Secret.
         """
-        return user in self.role.users.all() or user.groups.filter(pk__in=self.role.groups.all()).exists()
+        return self.role.has_member(user)

+ 0 - 0
netbox/secrets/templatetags/__init__.py


+ 12 - 0
netbox/secrets/templatetags/secret_helpers.py

@@ -0,0 +1,12 @@
+from django import template
+
+
+register = template.Library()
+
+
+@register.filter()
+def decryptable_by(secret, user):
+    """
+    Determine whether a given User is permitted to decrypt a Secret.
+    """
+    return secret.decryptable_by(user)

+ 6 - 1
netbox/templates/dcim/_rack_elevation.html

@@ -31,7 +31,12 @@
                 <li class="occupied h{{ u.device.device_type.u_height }}u{% ifequal u.device.face face_id %} {{ u.device.device_role.color }}{% endifequal %}">
                     {% ifequal u.device.face face_id %}
                         <a href="{% url 'dcim:device' pk=u.device.pk %}" data-toggle="popover" data-trigger="hover" data-container="body" data-html="true"
-                           data-content="{{ u.device.device_role }}<br />{{ u.device.device_type }} ({{ u.device.device_type.u_height }}U)">{{ u.device.name|default:u.device.device_role }}</a>
+                           data-content="{{ u.device.device_role }}<br />{{ u.device.device_type }} ({{ u.device.device_type.u_height }}U)">
+                            {{ u.device.name|default:u.device.device_role }}
+                            {% if u.device.devicebay_count %}
+                                ({{ u.device.get_children.count }}/{{ u.device.devicebay_count }})
+                            {% endif %}
+                        </a>
                     {% else %}
                         <span>{{ u.device.name|default:u.device.device_role }}</span>
                     {% endifequal %}

+ 1 - 1
netbox/templates/dcim/component_template_delete.html

@@ -1,7 +1,7 @@
 {% extends 'utilities/confirmation_form.html' %}
 {% load form_helpers %}
 
-{% block title %}Delete devie type components?{% endblock %}
+{% block title %}Delete device type components?{% endblock %}
 
 {% block message %}
     <p>Are you sure you want to delete these components from <strong>{{ devicetype }}</strong>?</p>

+ 58 - 14
netbox/templates/dcim/device.html

@@ -29,7 +29,12 @@
                 <tr>
                     <td>Position</td>
                     <td>
-                        {% if device.position %}
+                        {% if device.parent_bay %}
+                            {% with device.parent_bay.device as parent %}
+                                <span>U{{ parent.position }} / {{ parent.get_face_display }}
+                                (<a href="{{ parent.get_absolute_url }}">{{ parent }}</a> - {{ device.parent_bay.name }})</span>
+                            {% endwith %}
+                        {% elif device.position %}
                             <span>U{{ device.position }} / {{ device.get_face_display }}</span>
                         {% elif device.device_type.u_height %}
                             <span class="label label-warning">Not racked</span>
@@ -160,7 +165,7 @@
                 <div class="panel-footer text-right">
                     <a href="{% url 'dcim:ipaddress_assign' pk=device.pk %}" class="btn btn-xs btn-primary">
                         <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
-                        Assign IP Address
+                        Assign IP address
                     </a>
                 </div>
             {% endif %}
@@ -174,7 +179,7 @@
                     {% include 'dcim/inc/_interface.html' with icon='wrench' %}
                 {% empty %}
                     <tr>
-                        <td colspan="4" class="alert-warning">
+                        <td colspan="5" class="alert-warning">
                             <i class="fa fa-fw fa-warning"></i> No management interfaces defined!
                             {% if perms.dcim.add_interface %}
                                 <a href="{% url 'dcim:interface_add' pk=device.pk %}?mgmt_only=1" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></a>
@@ -186,7 +191,7 @@
                     {% include 'dcim/inc/_consoleport.html' %}
                 {% empty %}
                     <tr>
-                        <td colspan="4" class="alert-warning">
+                        <td colspan="5" class="alert-warning">
                             <i class="fa fa-fw fa-warning"></i> No console ports defined!
                             {% if perms.dcim.add_consoleport %}
                                 <a href="{% url 'dcim:consoleport_add' pk=device.pk %}" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></a>
@@ -199,7 +204,7 @@
                 {% empty %}
                     {% if not device.device_type.is_pdu %}
                         <tr>
-                            <td colspan="4" class="alert-warning">
+                            <td colspan="5" class="alert-warning">
                                 <i class="fa fa-fw fa-warning"></i> No power ports defined!
                                 {% if perms.dcim.add_powerport %}
                                     <a href="{% url 'dcim:powerport_add' pk=device.pk %}" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span></a>
@@ -268,12 +273,33 @@
         </div>
 	</div>
 	<div class="col-md-6">
+        {% if device_bays or device.device_type.is_parent_device %}
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <strong>Device Bays</strong>
+                </div>
+                <table class="table table-hover panel-body">
+                    {% for devicebay in device_bays %}
+                        {% include 'dcim/inc/_devicebay.html' %}
+                    {% empty %}
+                        <tr>
+                            <td colspan="4">No device bays defined</td>
+                        </tr>
+                    {% endfor %}
+                </table>
+                {% if perms.dcim.add_devicebay %}
+                    <div class="panel-footer text-right">
+                        <a href="{% url 'dcim:devicebay_add' pk=device.pk %}" class="btn btn-primary btn-xs">
+                            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                            Add device bays
+                        </a>
+                    </div>
+                {% endif %}
+            </div>
+        {% endif %}
         {% if interfaces or device.device_type.is_network_device %}
             <div class="panel panel-default">
                 <div class="panel-heading">
-                    {% if perms.dcim.add_interface %}
-                        <a href="{% url 'dcim:interface_add' pk=device.pk %}" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Interfaces</a>
-                    {% endif %}
                     <strong>Interfaces</strong>
                 </div>
                 <table class="table table-hover panel-body">
@@ -285,14 +311,19 @@
                         </tr>
                     {% endfor %}
                 </table>
+                {% if perms.dcim.add_interface %}
+                    <div class="panel-footer text-right">
+                        <a href="{% url 'dcim:interface_add' pk=device.pk %}" class="btn btn-primary btn-xs">
+                            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                            Add interface
+                        </a>
+                     </div>
+                {% endif %}
             </div>
         {% endif %}
         {% if cs_ports or device.device_type.is_console_server %}
             <div class="panel panel-default">
                 <div class="panel-heading">
-                    {% if perms.dcim.add_consoleserverport %}
-                        <a href="{% url 'dcim:consoleserverport_add' pk=device.pk %}" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Console Server Ports</a>
-                    {% endif %}
                     <strong>Console Server Ports</strong>
                 </div>
                 <table class="table table-hover panel-body">
@@ -304,14 +335,19 @@
                         </tr>
                     {% endfor %}
                 </table>
+                {% if perms.dcim.add_consoleserverport %}
+                    <div class="panel-footer text-right">
+                        <a href="{% url 'dcim:consoleserverport_add' pk=device.pk %}" class="btn btn-primary btn-xs">
+                            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                            Add console server ports
+                        </a>
+                    </div>
+                {% endif %}
             </div>
         {% endif %}
         {% if power_outlets or device.device_type.is_pdu %}
             <div class="panel panel-default">
                 <div class="panel-heading">
-                    {% if perms.dcim.add_poweroutlet %}
-                        <a href="{% url 'dcim:poweroutlet_add' pk=device.pk %}" class="btn btn-primary btn-xs pull-right"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Power Outlets</a>
-                    {% endif %}
                     <strong>Power Outlets</strong>
                 </div>
                 <table class="table table-hover panel-body">
@@ -323,6 +359,14 @@
                         </tr>
                     {% endfor %}
                 </table>
+                {% if perms.dcim.add_poweroutlet %}
+                    <div class="panel-footer text-right">
+                        <a href="{% url 'dcim:poweroutlet_add' pk=device.pk %}" class="btn btn-primary btn-xs">
+                            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
+                            Add power outlets
+                        </a>
+                    </div>
+                {% endif %}
             </div>
         {% endif %}
 	</div>

+ 8 - 0
netbox/templates/dcim/devicebay_delete.html

@@ -0,0 +1,8 @@
+{% extends 'utilities/confirmation_form.html' %}
+{% load form_helpers %}
+
+{% block title %}Delete device bay {{ devicebay }}?{% endblock %}
+
+{% block message %}
+    <p>Are you sure you want to delete this device bay from <strong>{{ devicebay.device }}</strong>?</p>
+{% endblock %}

+ 8 - 0
netbox/templates/dcim/devicebay_depopulate.html

@@ -0,0 +1,8 @@
+{% extends 'utilities/confirmation_form.html' %}
+{% load form_helpers %}
+
+{% block title %}Remove {{ device_bay.installed_device }} from {{ device_bay }}?{% endblock %}
+
+{% block message %}
+    <p>Are you sure you want to remove <strong>{{ device_bay.installed_device }}</strong> from <strong>{{ device_bay }}</strong>?</p>
+{% endblock %}

+ 51 - 0
netbox/templates/dcim/devicebay_edit.html

@@ -0,0 +1,51 @@
+{% extends '_base.html' %}
+{% load form_helpers %}
+
+{% block title %}{% if devicebay.pk %}Editing {{ devicebay.device }} {{ devicebay }}{% else %}Add a Device Bay ({{ device }}){% endif %}{% endblock %}
+
+{% block content %}
+<form action="." method="post" class="form form-horizontal">
+    {% csrf_token %}
+    <div class="row">
+        <div class="col-md-6 col-md-offset-3">
+            {% if form.non_field_errors %}
+                <div class="panel panel-danger">
+                    <div class="panel-heading"><strong>Errors</strong></div>
+                    <div class="panel-body">
+                        {{ form.non_field_errors }}
+                    </div>
+                </div>
+            {% endif %}
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    {% if poweroutlet.pk %}
+                        <strong>Editing {{ devicebay }}</strong>
+                    {% else %}
+                        <strong>Add a Device Bay</strong>
+                    {% endif %}
+                </div>
+                <div class="panel-body">
+                    <div class="form-group">
+                        <label class="col-md-3 control-label required">Device</label>
+                        <div class="col-md-9">
+                            <p class="form-control-static">{% if devicebay %}{{ devicebay.device }}{% else %}{{ device }}{% endif %}</p>
+                        </div>
+                    </div>
+                    {% render_form form %}
+                </div>
+            </div>
+		    <div class="form-group">
+                <div class="col-md-9 col-md-offset-3">
+                    {% if devicebay.pk %}
+                        <button type="submit" name="_update" class="btn btn-primary">Save</button>
+                    {% else %}
+                        <button type="submit" name="_create" class="btn btn-primary">Create</button>
+                        <button type="submit" name="_addanother" class="btn btn-primary">Create and Add More</button>
+                    {% endif %}
+                    <a href="{{ cancel_url }}" class="btn btn-default">Cancel</a>
+                </div>
+		    </div>
+        </div>
+    </div>
+</form>
+{% endblock %}

+ 46 - 0
netbox/templates/dcim/devicebay_populate.html

@@ -0,0 +1,46 @@
+{% extends '_base.html' %}
+{% load form_helpers %}
+
+{% block title %}Populate {{ device_bay }}{% endblock %}
+
+{% block content %}
+<form action="." method="post" class="form form-horizontal">
+    {% csrf_token %}
+    <div class="row">
+        <div class="col-md-6 col-md-offset-3">
+            {% if form.non_field_errors %}
+                <div class="panel panel-danger">
+                    <div class="panel-heading"><strong>Errors</strong></div>
+                    <div class="panel-body">
+                        {{ form.non_field_errors }}
+                    </div>
+                </div>
+            {% endif %}
+            <div class="panel panel-default">
+                <div class="panel-heading">Populate {{ device_bay }}</div>
+                <div class="panel-body">
+                    <div class="form-group">
+                        <label class="col-md-3 control-label required">Parent Device</label>
+                        <div class="col-md-9">
+                            <p class="form-control-static">{{ device_bay.device }}</p>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-md-3 control-label required">Bay</label>
+                        <div class="col-md-9">
+                            <p class="form-control-static">{{ device_bay.name }}</p>
+                        </div>
+                    </div>
+                    {% render_form form %}
+                </div>
+            </div>
+		    <div class="form-group">
+                <div class="col-md-9 col-md-offset-3">
+                    <button type="submit" name="_update" class="btn btn-primary">Save</button>
+                    <a href="{{ cancel_url }}" class="btn btn-default">Cancel</a>
+                </div>
+		    </div>
+        </div>
+    </div>
+</form>
+{% endblock %}

+ 29 - 16
netbox/templates/dcim/devicetype.html

@@ -14,23 +14,27 @@
         </ol>
     </div>
 </div>
-{% if perms.dcim.change_devicetype %}
+
+{% if perms.dcim.change_devicetype or perms.dcim.delete_devicetype %}
     <div class="pull-right">
-		<a href="{% url 'dcim:devicetype_edit' pk=devicetype.pk %}" class="btn btn-warning">
-			<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-			Edit this device type
-		</a>
-    {% endif %}
-    {% if perms.dcim.delete_devicetype %}
-		<a href="{% url 'dcim:devicetype_delete' pk=devicetype.pk %}" class="btn btn-danger">
-			<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-			Delete this device type
-		</a>
+      {% if perms.dcim.change_devicetype %}
+            <a href="{% url 'dcim:devicetype_edit' pk=devicetype.pk %}" class="btn btn-warning">
+              <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
+              Edit this device type
+            </a>
+      {% endif %}
+      {% if perms.dcim.delete_devicetype %}
+          <a href="{% url 'dcim:devicetype_delete' pk=devicetype.pk %}" class="btn btn-danger">
+          	<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
+          	Delete this device type
+          </a>
+      {% endif %}
     </div>
 {% endif %}
+
 <h1>{{ devicetype }}</h1>
 <div class="row">
-	<div class="col-md-6">
+    <div class="col-md-6">
         <div class="panel panel-default">
             <div class="panel-heading">
                 <strong>Chassis</strong>
@@ -76,10 +80,19 @@
         {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:devicetype_add_consoleport' delete_url='dcim:devicetype_delete_consoleport' %}
         {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:devicetype_add_powerport' delete_url='dcim:devicetype_delete_powerport' %}
     </div>
-	<div class="col-md-6">
-        {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' delete_url='dcim:devicetype_delete_interface' %}
-        {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:devicetype_add_consoleserverport' delete_url='dcim:devicetype_delete_consoleserverport' %}
-        {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:devicetype_delete_poweroutlet' %}
+    <div class="col-md-6">
+        {% if devicetype.is_network_device %}
+            {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicetype_add_devicebay' delete_url='dcim:devicetype_delete_devicebay' %}
+        {% endif %}
+        {% if devicetype.is_network_device %}
+            {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' delete_url='dcim:devicetype_delete_interface' %}
+        {% endif %}
+        {% if devicetype.is_console_server %}
+            {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:devicetype_add_consoleserverport' delete_url='dcim:devicetype_delete_consoleserverport' %}
+        {% endif %}
+        {% if devicetype.is_pdu %}
+            {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:devicetype_delete_poweroutlet' %}
+        {% endif %}
     </div>
 </div>
 {% endblock %}

+ 4 - 1
netbox/templates/dcim/inc/_consoleport.html

@@ -2,6 +2,7 @@
     <td>
         <i class="fa fa-fw fa-keyboard-o"></i> {{ cp.name }}
     </td>
+    <td></td>
     {% if cp.cs_port %}
         <td>
             <a href="{% url 'dcim:device' pk=cp.cs_port.device.pk %}">{{ cp.cs_port.device }}</a>
@@ -10,7 +11,9 @@
             {{ cp.cs_port.name }}
         </td>
     {% else %}
-        <td colspan="2">Not connected</td>
+        <td colspan="2">
+            <span class="text-muted">Not connected</span>
+        </td>
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_consoleport %}

+ 3 - 1
netbox/templates/dcim/inc/_consoleserverport.html

@@ -10,7 +10,9 @@
             {{ csp.connected_console.name }}
         </td>
     {% else %}
-        <td colspan="2">Not connected</td>
+        <td colspan="2">
+            <span class="text-muted">Not connected</span>
+        </td>
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_consoleserverport %}

+ 4 - 0
netbox/templates/dcim/inc/_device_header.html

@@ -5,6 +5,10 @@
             <li><a href="{% url 'dcim:site' slug=device.rack.site.slug %}">{{ device.rack.site }}</a></li>
             <li><a href="{% url 'dcim:rack_list' %}?site={{ device.rack.site.slug }}">Racks</a></li>
             <li><a href="{% url 'dcim:rack' pk=device.rack.pk %}">{{ device.rack }}</a></li>
+            {% if device.parent_bay %}
+                <li><a href="{% url 'dcim:device' pk=device.parent_bay.device.pk %}">{{ device.parent_bay.device }}</a></li>
+                <li>{{ device.parent_bay.name }}</li>
+            {% endif %}
             <li>{{ device }}</li>
         </ol>
     {% endif %}

+ 44 - 0
netbox/templates/dcim/inc/_devicebay.html

@@ -0,0 +1,44 @@
+<tr>
+    <td>
+        <i class="fa fa-fw fa-{% if devicebay.installed_device %}dot-circle-o{% else %}circle-o{% endif %}"></i> {{ devicebay.name }}
+    </td>
+    {% if devicebay.installed_device %}
+        <td>
+            <a href="{% url 'dcim:device' pk=devicebay.installed_device.pk %}">{{ devicebay.installed_device }}</a>
+        </td>
+        <td>
+            <span>{{ devicebay.installed_device.device_type }}</span>
+        </td>
+    {% else %}
+        <td colspan="2">
+            <span class="text-muted">Vacant</span>
+        </td>
+    {% endif %}
+    <td class="text-right">
+        {% if perms.dcim.change_devicebay %}
+            {% if devicebay.installed_device %}
+                <a href="{% url 'dcim:devicebay_depopulate' pk=devicebay.pk %}" class="btn btn-danger btn-xs">
+                    <i class="glyphicon glyphicon-remove" aria-hidden="true" title="Remove device"></i>
+                </a>
+            {% else %}
+                <a href="{% url 'dcim:devicebay_populate' pk=devicebay.pk %}" class="btn btn-success btn-xs">
+                    <i class="glyphicon glyphicon-plus" aria-hidden="true" title="Install device"></i>
+                </a>
+            {% endif %}
+            <a href="{% url 'dcim:devicebay_edit' pk=devicebay.pk %}" class="btn btn-info btn-xs">
+                <i class="glyphicon glyphicon-pencil" aria-hidden="true" title="Edit device bay"></i>
+            </a>
+        {% endif %}
+        {% if perms.dcim.delete_devicebay %}
+            {% if devicebay.installed_device %}
+                <button class="btn btn-danger btn-xs" disabled="disabled">
+                    <i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
+                </button>
+            {% else %}
+                <a href="{% url 'dcim:devicebay_delete' pk=devicebay.pk %}" class="btn btn-danger btn-xs">
+                    <i class="glyphicon glyphicon-trash" aria-hidden="true" title="Delete device bay"></i>
+                </a>
+            {% endif %}
+        {% endif %}
+    </td>
+</tr>

+ 6 - 1
netbox/templates/dcim/inc/_interface.html

@@ -5,6 +5,9 @@
             <i class="fa fa-fw fa-comment-o" title="{{ iface.description }}"></i>
         {% endif %}
     </td>
+    <td>
+        <small>{{ iface.mac_address|default:'' }}</small>
+    </td>
     {% if not iface.is_physical %}
         <td colspan="2">Virtual</td>
     {% elif iface.connection %}
@@ -21,7 +24,9 @@
             <a href="{% url 'circuits:circuit' pk=iface.circuit.pk %}">{{ iface.circuit }}</a>
         </td>
     {% else %}
-        <td colspan="2">Not connected</td>
+        <td colspan="2">
+            <span class="text-muted">Not connected</span>
+        </td>
     {% endif %}
     <td class="text-right">
         {% if iface.circuit or iface.connection %}

+ 3 - 1
netbox/templates/dcim/inc/_poweroutlet.html

@@ -10,7 +10,9 @@
             {{ po.connected_port.name }}
         </td>
     {% else %}
-        <td colspan="2">Not connected</td>
+        <td colspan="2">
+            <span class="text-muted">Not connected</span>
+        </td>
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_poweroutlet %}

+ 4 - 1
netbox/templates/dcim/inc/_powerport.html

@@ -2,6 +2,7 @@
     <td>
         <i class="fa fa-fw fa-bolt"></i> {{ pp.name }}
     </td>
+    <td></td>
     {% if pp.power_outlet %}
         <td>
             <a href="{% url 'dcim:device' pk=pp.power_outlet.device.pk %}">{{ pp.power_outlet.device }}</a>
@@ -10,7 +11,9 @@
             {{ pp.power_outlet.name }}
         </td>
     {% else %}
-        <td colspan="2">Not connected</td>
+        <td colspan="2">
+            <span class="text-muted">Not connected</span>
+        </td>
     {% endif %}
     <td class="text-right">
         {% if perms.dcim.change_powerport %}

+ 7 - 0
netbox/templates/dcim/rack.html

@@ -112,6 +112,12 @@
             </div>
             {% if nonracked_devices %}
                 <table class="table table-hover panel-body">
+                    <tr>
+                        <th>Name</th>
+                        <th>Role</th>
+                        <th>Type</th>
+                        <th>Parent</th>
+                    </tr>
                     {% for device in nonracked_devices %}
                         <tr{% if device.device_type.u_height %} class="warning"{% endif %}>
                             <td>
@@ -119,6 +125,7 @@
                             </td>
                             <td>{{ device.device_role }}</td>
                             <td>{{ device.device_type }}</td>
+                            <td>{% if device.parent_bay %}<a href="{{ device.parent_bay.device.get_absolute_url }}">{{ device.parent_bay }}</a>{% endif %}</td>
                         </tr>
                     {% endfor %}
                 </table>

+ 13 - 6
netbox/templates/secrets/inc/secret_tr.html

@@ -1,13 +1,20 @@
+{% load secret_helpers %}
 <tr>
     <td><a href="{% url 'secrets:secret' pk=secret.pk %}">{{ secret.role }}</a></td>
     <td>{{ secret.name }}</td>
     <td id="secret_{{ secret.pk }}">********</td>
     <td class="text-right">
-        <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
-            <i class="fa fa-lock"></i> Unlock
-        </button>
-        <button class="btn btn-xs btn-danger lock-secret collapse" secret-id="{{ secret.pk }}">
-            <i class="fa fa-unlock-alt"></i> Lock
-        </button>
+        {% if secret|decryptable_by:request.user %}
+            <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
+                <i class="fa fa-lock"></i> Unlock
+            </button>
+            <button class="btn btn-xs btn-danger lock-secret collapse" secret-id="{{ secret.pk }}">
+                <i class="fa fa-unlock-alt"></i> Lock
+            </button>
+        {% else %}
+            <button class="btn btn-xs btn-default" disabled="disabled" title="Permission denied">
+                <i class="fa fa-lock"></i> Unlock
+            </button>
+        {% endif %}
     </td>
 </tr>

+ 27 - 19
netbox/templates/secrets/secret.html

@@ -1,5 +1,6 @@
 {% extends '_base.html' %}
 {% load static from staticfiles %}
+{% load secret_helpers %}
 
 {% block title %}Secret: {{ secret }}{% endblock %}
 
@@ -67,28 +68,35 @@
         </div>
 	</div>
 	<div class="col-md-6">
-        <div class="panel panel-default">
-            <div class="panel-heading">
-                <strong>Secret Data</strong>
-            </div>
-            <div class="panel-body">
-                <form id="secret_form">
-                    {% csrf_token %}
-                </form>
-                <div class="row">
-                    <div class="col-md-2">Secret</div>
-                    <div class="col-md-8" id="secret_{{ secret.pk }}">********</div>
-                    <div class="col-md-2 text-right">
-                        <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
-                            <i class="fa fa-lock"></i> Unlock
-                        </button>
-                        <button class="btn btn-xs btn-danger lock-secret collapse" secret-id="{{ secret.pk }}">
-                            <i class="fa fa-unlock-alt"></i> Lock
-                        </button>
+        {% if secret|decryptable_by:request.user %}
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <strong>Secret Data</strong>
+                </div>
+                <div class="panel-body">
+                    <form id="secret_form">
+                        {% csrf_token %}
+                    </form>
+                    <div class="row">
+                        <div class="col-md-2">Secret</div>
+                        <div class="col-md-8" id="secret_{{ secret.pk }}">********</div>
+                        <div class="col-md-2 text-right">
+                            <button class="btn btn-xs btn-success unlock-secret" secret-id="{{ secret.pk }}">
+                                <i class="fa fa-lock"></i> Unlock
+                            </button>
+                            <button class="btn btn-xs btn-danger lock-secret collapse" secret-id="{{ secret.pk }}">
+                                <i class="fa fa-unlock-alt"></i> Lock
+                            </button>
+                        </div>
                     </div>
                 </div>
             </div>
-        </div>
+        {% else %}
+            <div class="alert alert-warning">
+                <i class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></i>
+                You do not have permission to decrypt this secret.
+            </div>
+        {% endif %}
     </div>
 </div>
 

+ 6 - 6
netbox/utilities/views.py

@@ -120,7 +120,7 @@ class ObjectEditView(View):
             'obj': obj,
             'obj_type': self.model._meta.verbose_name,
             'form': form,
-            'cancel_url': obj.get_absolute_url() if obj else reverse(self.cancel_url),
+            'cancel_url': obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else reverse(self.cancel_url),
         })
 
     def post(self, request, *args, **kwargs):
@@ -157,7 +157,7 @@ class ObjectEditView(View):
             'obj': obj,
             'obj_type': self.model._meta.verbose_name,
             'form': form,
-            'cancel_url': obj.get_absolute_url() if obj else reverse(self.cancel_url),
+            'cancel_url': obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else reverse(self.cancel_url),
         })
 
 
@@ -280,10 +280,10 @@ class BulkEditView(View):
             form = self.form(request.POST)
             if form.is_valid():
                 updated_count = self.update_objects(pk_list, form)
-                msg = 'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural)
-                messages.success(self.request, msg)
-                UserAction.objects.log_bulk_edit(request.user, ContentType.objects.get_for_model(self.cls), msg)
-
+                if updated_count:
+                    msg = 'Updated {} {}'.format(updated_count, self.cls._meta.verbose_name_plural)
+                    messages.success(self.request, msg)
+                    UserAction.objects.log_bulk_edit(request.user, ContentType.objects.get_for_model(self.cls), msg)
                 return redirect(redirect_url)
 
         else:

+ 14 - 3
upgrade.sh

@@ -1,13 +1,24 @@
-#!/bin/sh
+#!/bin/bash
 # This script will prepare NetBox to run after the code has been upgraded to
 # its most recent release.
 #
 # Once the script completes, remember to restart the WSGI service (e.g.
 # gunicorn or uWSGI).
 
+# Optionally use sudo if not already root, and always prompt for password
+# before running the command
+PREFIX="sudo -k "
+if [ "$(whoami)" = "root" ]; then
+	# When running upgrade as root, ask user to confirm if they wish to
+	# continue
+	read -n1 -rsp $'Running NetBox upgrade as root, press any key to continue or ^C to cancel\n'
+	PREFIX=""
+fi
+
 # Install any new Python packages
-echo "Updating required Python packages (pip install -r requirements.txt --upgrade)..."
-sudo pip install -r requirements.txt --upgrade
+COMMAND="${PREFIX}pip install -r requirements.txt --upgrade"
+echo "Updating required Python packages ($COMMAND)..."
+eval $COMMAND
 
 # Apply any database migrations
 ./netbox/manage.py migrate