diff --git a/.gitignore b/.gitignore index e769694ea..954607b60 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ configuration.py /*.sh !upgrade.sh fabfile.py +*.swp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f437d2516..ec5b48801 100644 --- a/CONTRIBUTING.md +++ b/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. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..c2e2c38ab --- /dev/null +++ b/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/"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..860022707 --- /dev/null +++ b/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 diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 000000000..53e52ef04 --- /dev/null +++ b/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 diff --git a/docker/gunicorn_config.py b/docker/gunicorn_config.py new file mode 100644 index 000000000..878841ac0 --- /dev/null +++ b/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' diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 000000000..2a794f314 --- /dev/null +++ b/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"'; + } + } +} diff --git a/docs/dcim.md b/docs/dcim.md index 0b42cc6d9..cc2cf5073 100644 --- a/docs/dcim.md +++ b/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. diff --git a/docs/getting-started-docker.md b/docs/getting-started-docker.md new file mode 100644 index 000000000..c5de5bbf1 --- /dev/null +++ b/docs/getting-started-docker.md @@ -0,0 +1,54 @@ +

Getting Started with NetBox and Docker

+ +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 + diff --git a/docs/schema.sql b/docs/schema.sql deleted file mode 100644 index feff17e0b..000000000 --- a/docs/schema.sql +++ /dev/null @@ -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 --- - diff --git a/docs/secrets.md b/docs/secrets.md index 551083034..9b7519fba 100644 --- a/docs/secrets.md +++ b/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 diff --git a/netbox/dcim/admin.py b/netbox/dcim/admin.py index 9975a3ba0..4dae1d998 100644 --- a/netbox/dcim/admin.py +++ b/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'] diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 44fdc2d72..dd3de9baf 100644 --- a/netbox/dcim/api/serializers.py +++ b/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 DeviceNestedSerializer(serializers.ModelSerializer): - class Meta(DeviceSerializer.Meta): + 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 # diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index a1947397a..724e244a2 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -49,6 +49,7 @@ urlpatterns = [ url(r'^devices/(?P\d+)/power-ports/$', PowerPortListView.as_view(), name='device_powerports'), url(r'^devices/(?P\d+)/power-outlets/$', PowerOutletListView.as_view(), name='device_poweroutlets'), url(r'^devices/(?P\d+)/interfaces/$', InterfaceListView.as_view(), name='device_interfaces'), + url(r'^devices/(?P\d+)/device-bays/$', DeviceBayListView.as_view(), name='device_devicebays'), # Console ports url(r'^console-ports/(?P\d+)/$', ConsolePortView.as_view(), name='consoleport'), diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a576a04a2..243d92e36 100644 --- a/netbox/dcim/api/views.py +++ b/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 # diff --git a/netbox/dcim/fields.py b/netbox/dcim/fields.py new file mode 100644 index 000000000..e00b1115f --- /dev/null +++ b/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) diff --git a/netbox/dcim/fixtures/dcim.json b/netbox/dcim/fixtures/dcim.json index ecea8eb86..89c889b65 100644 --- a/netbox/dcim/fixtures/dcim.json +++ b/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 } } -] \ No newline at end of file +] diff --git a/netbox/dcim/formfields.py b/netbox/dcim/formfields.py new file mode 100644 index 000000000..4e568c2e6 --- /dev/null +++ b/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.") diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 65b6e77cb..8a0008696 100644 --- a/netbox/dcim/forms.py +++ b/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 # diff --git a/netbox/dcim/migrations/0004_auto_20160701_2049.py b/netbox/dcim/migrations/0004_auto_20160701_2049.py new file mode 100644 index 000000000..e051daded --- /dev/null +++ b/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')]), + ), + ] diff --git a/netbox/dcim/migrations/0005_auto_20160706_1722.py b/netbox/dcim/migrations/0005_auto_20160706_1722.py new file mode 100644 index 000000000..83a5cf7cb --- /dev/null +++ b/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'), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index aeee10ee5..2f1a62d36 100644 --- a/netbox/dcim/models.py +++ b/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 diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 3a8f364ef..dc66c3ab1 100644 --- a/netbox/dcim/tables.py +++ b/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') diff --git a/netbox/dcim/tests/test_apis.py b/netbox/dcim/tests/test_apis.py index f36fc4e84..1f31fac14 100644 --- a/netbox/dcim/tests/test_apis.py +++ b/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', diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 1665927a2..1c76e63d2 100644 --- a/netbox/dcim/urls.py +++ b/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\d+)/interfaces/delete/$', views.component_template_delete, {'model': InterfaceTemplate}, name='devicetype_delete_interface'), + url(r'^device-types/(?P\d+)/device-bays/add/$', views.DeviceBayTemplateAddView.as_view(), + name='devicetype_add_devicebay'), + url(r'^device-types/(?P\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\d+)/edit/$', views.poweroutlet_edit, name='poweroutlet_edit'), url(r'^power-outlets/(?P\d+)/delete/$', views.poweroutlet_delete, name='poweroutlet_delete'), + # Device bays + url(r'^devices/(?P\d+)/bays/add/$', views.devicebay_add, name='devicebay_add'), + url(r'^device-bays/(?P\d+)/edit/$', views.devicebay_edit, name='devicebay_edit'), + url(r'^device-bays/(?P\d+)/delete/$', views.devicebay_delete, name='devicebay_delete'), + url(r'^device-bays/(?P\d+)/populate/$', views.devicebay_populate, name='devicebay_populate'), + url(r'^device-bays/(?P\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'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 3cf157c7d..4f0d7ec29 100644 --- a/netbox/dcim/views.py +++ b/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 # diff --git a/netbox/netbox/configuration.docker.py b/netbox/netbox/configuration.docker.py new file mode 100644 index 000000000..6906ab1b4 --- /dev/null +++ b/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') diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index e9928b850..b4e0c24bd 100644 --- a/netbox/netbox/settings.py +++ b/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']: diff --git a/netbox/netbox/views.py b/netbox/netbox/views.py index 63169f920..fa7e21312 100644 --- a/netbox/netbox/views.py +++ b/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] }) diff --git a/netbox/secrets/api/views.py b/netbox/secrets/api/views.py index 08d1be8f4..869739e32 100644 --- a/netbox/secrets/api/views.py +++ b/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) diff --git a/netbox/secrets/models.py b/netbox/secrets/models.py index 337f2e252..f6f4353c2 100644 --- a/netbox/secrets/models.py +++ b/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) diff --git a/netbox/secrets/templatetags/__init__.py b/netbox/secrets/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/secrets/templatetags/secret_helpers.py b/netbox/secrets/templatetags/secret_helpers.py new file mode 100644 index 000000000..142c0d2cb --- /dev/null +++ b/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) diff --git a/netbox/templates/dcim/_rack_elevation.html b/netbox/templates/dcim/_rack_elevation.html index 002b9dd38..1313df8ea 100644 --- a/netbox/templates/dcim/_rack_elevation.html +++ b/netbox/templates/dcim/_rack_elevation.html @@ -31,7 +31,12 @@
  • {% ifequal u.device.face face_id %} {{ u.device.name|default:u.device.device_role }} + data-content="{{ u.device.device_role }}
    {{ 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 %} + {% else %} {{ u.device.name|default:u.device.device_role }} {% endifequal %} diff --git a/netbox/templates/dcim/component_template_delete.html b/netbox/templates/dcim/component_template_delete.html index caeab2962..a1302feb7 100644 --- a/netbox/templates/dcim/component_template_delete.html +++ b/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 %}

    Are you sure you want to delete these components from {{ devicetype }}?

    diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 9d9da6a18..3f03fcee9 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -29,7 +29,12 @@ Position - {% if device.position %} + {% if device.parent_bay %} + {% with device.parent_bay.device as parent %} + U{{ parent.position }} / {{ parent.get_face_display }} + ({{ parent }} - {{ device.parent_bay.name }}) + {% endwith %} + {% elif device.position %} U{{ device.position }} / {{ device.get_face_display }} {% elif device.device_type.u_height %} Not racked @@ -160,7 +165,7 @@ {% endif %} @@ -174,7 +179,7 @@ {% include 'dcim/inc/_interface.html' with icon='wrench' %} {% empty %} - + No management interfaces defined! {% if perms.dcim.add_interface %} @@ -186,7 +191,7 @@ {% include 'dcim/inc/_consoleport.html' %} {% empty %} - + No console ports defined! {% if perms.dcim.add_consoleport %} @@ -199,7 +204,7 @@ {% empty %} {% if not device.device_type.is_pdu %} - + No power ports defined! {% if perms.dcim.add_powerport %} @@ -268,12 +273,33 @@
    + {% if device_bays or device.device_type.is_parent_device %} +
    +
    + Device Bays +
    + + {% for devicebay in device_bays %} + {% include 'dcim/inc/_devicebay.html' %} + {% empty %} + + + + {% endfor %} +
    No device bays defined
    + {% if perms.dcim.add_devicebay %} + + {% endif %} +
    + {% endif %} {% if interfaces or device.device_type.is_network_device %}
    - {% if perms.dcim.add_interface %} - Add Interfaces - {% endif %} Interfaces
    @@ -285,14 +311,19 @@ {% endfor %}
    + {% if perms.dcim.add_interface %} + + {% endif %}
    {% endif %} {% if cs_ports or device.device_type.is_console_server %}
    - {% if perms.dcim.add_consoleserverport %} - Add Console Server Ports - {% endif %} Console Server Ports
    @@ -304,14 +335,19 @@ {% endfor %}
    + {% if perms.dcim.add_consoleserverport %} + + {% endif %}
    {% endif %} {% if power_outlets or device.device_type.is_pdu %}
    - {% if perms.dcim.add_poweroutlet %} - Add Power Outlets - {% endif %} Power Outlets
    @@ -323,6 +359,14 @@ {% endfor %}
    + {% if perms.dcim.add_poweroutlet %} + + {% endif %}
    {% endif %}
    diff --git a/netbox/templates/dcim/devicebay_delete.html b/netbox/templates/dcim/devicebay_delete.html new file mode 100644 index 000000000..dbd43b824 --- /dev/null +++ b/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 %} +

    Are you sure you want to delete this device bay from {{ devicebay.device }}?

    +{% endblock %} diff --git a/netbox/templates/dcim/devicebay_depopulate.html b/netbox/templates/dcim/devicebay_depopulate.html new file mode 100644 index 000000000..e8a3c344d --- /dev/null +++ b/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 %} +

    Are you sure you want to remove {{ device_bay.installed_device }} from {{ device_bay }}?

    +{% endblock %} diff --git a/netbox/templates/dcim/devicebay_edit.html b/netbox/templates/dcim/devicebay_edit.html new file mode 100644 index 000000000..507cf0eaf --- /dev/null +++ b/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 %} +
    + {% csrf_token %} +
    +
    + {% if form.non_field_errors %} +
    +
    Errors
    +
    + {{ form.non_field_errors }} +
    +
    + {% endif %} +
    +
    + {% if poweroutlet.pk %} + Editing {{ devicebay }} + {% else %} + Add a Device Bay + {% endif %} +
    +
    +
    + +
    +

    {% if devicebay %}{{ devicebay.device }}{% else %}{{ device }}{% endif %}

    +
    +
    + {% render_form form %} +
    +
    +
    +
    + {% if devicebay.pk %} + + {% else %} + + + {% endif %} + Cancel +
    +
    +
    +
    +
    +{% endblock %} diff --git a/netbox/templates/dcim/devicebay_populate.html b/netbox/templates/dcim/devicebay_populate.html new file mode 100644 index 000000000..a9d84c5e7 --- /dev/null +++ b/netbox/templates/dcim/devicebay_populate.html @@ -0,0 +1,46 @@ +{% extends '_base.html' %} +{% load form_helpers %} + +{% block title %}Populate {{ device_bay }}{% endblock %} + +{% block content %} +
    + {% csrf_token %} +
    +
    + {% if form.non_field_errors %} +
    +
    Errors
    +
    + {{ form.non_field_errors }} +
    +
    + {% endif %} +
    +
    Populate {{ device_bay }}
    +
    +
    + +
    +

    {{ device_bay.device }}

    +
    +
    +
    + +
    +

    {{ device_bay.name }}

    +
    +
    + {% render_form form %} +
    +
    +
    +
    + + Cancel +
    +
    +
    +
    +
    +{% endblock %} diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 4510e6e43..79246046c 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -14,23 +14,27 @@ -{% if perms.dcim.change_devicetype %} + +{% if perms.dcim.change_devicetype or perms.dcim.delete_devicetype %}
    - - - Edit this device type - - {% endif %} - {% if perms.dcim.delete_devicetype %} - - - Delete this device type - + {% if perms.dcim.change_devicetype %} + + + Edit this device type + + {% endif %} + {% if perms.dcim.delete_devicetype %} + + + Delete this device type + + {% endif %}
    {% endif %} +

    {{ devicetype }}

    -
    +
    Chassis @@ -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' %}
    -
    - {% 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' %} +
    + {% 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 %}
    {% endblock %} diff --git a/netbox/templates/dcim/inc/_consoleport.html b/netbox/templates/dcim/inc/_consoleport.html index 21eb39b18..373d41204 100644 --- a/netbox/templates/dcim/inc/_consoleport.html +++ b/netbox/templates/dcim/inc/_consoleport.html @@ -2,6 +2,7 @@ {{ cp.name }} + {% if cp.cs_port %} {{ cp.cs_port.device }} @@ -10,7 +11,9 @@ {{ cp.cs_port.name }} {% else %} - Not connected + + Not connected + {% endif %} {% if perms.dcim.change_consoleport %} diff --git a/netbox/templates/dcim/inc/_consoleserverport.html b/netbox/templates/dcim/inc/_consoleserverport.html index 6c950f172..3d6308e2b 100644 --- a/netbox/templates/dcim/inc/_consoleserverport.html +++ b/netbox/templates/dcim/inc/_consoleserverport.html @@ -10,7 +10,9 @@ {{ csp.connected_console.name }} {% else %} - Not connected + + Not connected + {% endif %} {% if perms.dcim.change_consoleserverport %} diff --git a/netbox/templates/dcim/inc/_device_header.html b/netbox/templates/dcim/inc/_device_header.html index d147fb0d5..a038b96b2 100644 --- a/netbox/templates/dcim/inc/_device_header.html +++ b/netbox/templates/dcim/inc/_device_header.html @@ -5,6 +5,10 @@
  • {{ device.rack.site }}
  • Racks
  • {{ device.rack }}
  • + {% if device.parent_bay %} +
  • {{ device.parent_bay.device }}
  • +
  • {{ device.parent_bay.name }}
  • + {% endif %}
  • {{ device }}
  • {% endif %} diff --git a/netbox/templates/dcim/inc/_devicebay.html b/netbox/templates/dcim/inc/_devicebay.html new file mode 100644 index 000000000..b9fbf1395 --- /dev/null +++ b/netbox/templates/dcim/inc/_devicebay.html @@ -0,0 +1,44 @@ + + + {{ devicebay.name }} + + {% if devicebay.installed_device %} + + {{ devicebay.installed_device }} + + + {{ devicebay.installed_device.device_type }} + + {% else %} + + Vacant + + {% endif %} + + {% if perms.dcim.change_devicebay %} + {% if devicebay.installed_device %} + + + + {% else %} + + + + {% endif %} + + + + {% endif %} + {% if perms.dcim.delete_devicebay %} + {% if devicebay.installed_device %} + + {% else %} + + + + {% endif %} + {% endif %} + + diff --git a/netbox/templates/dcim/inc/_interface.html b/netbox/templates/dcim/inc/_interface.html index 84af875e4..fc435ce98 100644 --- a/netbox/templates/dcim/inc/_interface.html +++ b/netbox/templates/dcim/inc/_interface.html @@ -5,6 +5,9 @@ {% endif %} + + {{ iface.mac_address|default:'' }} + {% if not iface.is_physical %} Virtual {% elif iface.connection %} @@ -21,7 +24,9 @@ {{ iface.circuit }} {% else %} - Not connected + + Not connected + {% endif %} {% if iface.circuit or iface.connection %} diff --git a/netbox/templates/dcim/inc/_poweroutlet.html b/netbox/templates/dcim/inc/_poweroutlet.html index 5ab4ccf95..b77252cc1 100644 --- a/netbox/templates/dcim/inc/_poweroutlet.html +++ b/netbox/templates/dcim/inc/_poweroutlet.html @@ -10,7 +10,9 @@ {{ po.connected_port.name }} {% else %} - Not connected + + Not connected + {% endif %} {% if perms.dcim.change_poweroutlet %} diff --git a/netbox/templates/dcim/inc/_powerport.html b/netbox/templates/dcim/inc/_powerport.html index 1ef505530..077cc7aa6 100644 --- a/netbox/templates/dcim/inc/_powerport.html +++ b/netbox/templates/dcim/inc/_powerport.html @@ -2,6 +2,7 @@ {{ pp.name }} + {% if pp.power_outlet %} {{ pp.power_outlet.device }} @@ -10,7 +11,9 @@ {{ pp.power_outlet.name }} {% else %} - Not connected + + Not connected + {% endif %} {% if perms.dcim.change_powerport %} diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 20b86dc85..70d8b3b9c 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -112,6 +112,12 @@ {% if nonracked_devices %} + + + + + + {% for device in nonracked_devices %} + {% endfor %}
    NameRoleTypeParent
    @@ -119,6 +125,7 @@ {{ device.device_role }} {{ device.device_type }}{% if device.parent_bay %}{{ device.parent_bay }}{% endif %}
    diff --git a/netbox/templates/secrets/inc/secret_tr.html b/netbox/templates/secrets/inc/secret_tr.html index cc97a6eb0..b64b334e8 100644 --- a/netbox/templates/secrets/inc/secret_tr.html +++ b/netbox/templates/secrets/inc/secret_tr.html @@ -1,13 +1,20 @@ +{% load secret_helpers %} {{ secret.role }} {{ secret.name }} ******** - - + {% if secret|decryptable_by:request.user %} + + + {% else %} + + {% endif %} diff --git a/netbox/templates/secrets/secret.html b/netbox/templates/secrets/secret.html index 950ce3120..e98030c9a 100644 --- a/netbox/templates/secrets/secret.html +++ b/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 @@
    -
    -
    - Secret Data -
    -
    -
    - {% csrf_token %} -
    -
    -
    Secret
    -
    ********
    -
    - - + {% if secret|decryptable_by:request.user %} +
    +
    + Secret Data +
    +
    +
    + {% csrf_token %} +
    +
    +
    Secret
    +
    ********
    +
    + + +
    -
    + {% else %} +
    + + You do not have permission to decrypt this secret. +
    + {% endif %}
    diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 49b2bce21..9b93301b0 100644 --- a/netbox/utilities/views.py +++ b/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: diff --git a/upgrade.sh b/upgrade.sh index 6d30019d9..f0d17e61b 100755 --- a/upgrade.sh +++ b/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