--
-- Copyright (C) 2006 The Trustees of Princeton University
--
--- $Id: planetlab4.sql,v 1.60 2007/01/09 16:23:47 mlhuang Exp $
+-- $Id$
--
+SET client_encoding = 'UNICODE';
+
--------------------------------------------------------------------------------
-- Aggregates and store procedures
--------------------------------------------------------------------------------
-- Database version
CREATE TABLE plc_db_version (
- version integer NOT NULL
+ version integer NOT NULL,
+ subversion integer NOT NULL DEFAULT 0
) WITH OIDS;
-INSERT INTO plc_db_version (version) VALUES (4);
+INSERT INTO plc_db_version (version, subversion) VALUES (4, 9);
--------------------------------------------------------------------------------
-- Accounts
login_base text NOT NULL, -- Site slice prefix
name text NOT NULL, -- Site name
abbreviated_name text NOT NULL, -- Site abbreviated name
+ enabled boolean NOT NULL Default true, -- Is this site enabled
deleted boolean NOT NULL DEFAULT false, -- Has been deleted
is_public boolean NOT NULL DEFAULT true, -- Shows up in public lists
max_slices integer NOT NULL DEFAULT 0, -- Maximum number of slices
latitude real,
longitude real,
url text,
+ ext_consortium_id integer, -- external consortium id
-- Timestamps
date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
) WITH OIDS;
INSERT INTO boot_states (boot_state) VALUES ('boot');
INSERT INTO boot_states (boot_state) VALUES ('dbg');
+INSERT INTO boot_states (boot_state) VALUES ('diag');
+INSERT INTO boot_states (boot_state) VALUES ('disable');
INSERT INTO boot_states (boot_state) VALUES ('inst');
INSERT INTO boot_states (boot_state) VALUES ('rins');
-INSERT INTO boot_states (boot_state) VALUES ('rcnf');
INSERT INTO boot_states (boot_state) VALUES ('new');
-- Nodes
-- Timestamps
date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
- last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
+ last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ last_contact timestamp without time zone
) WITH OIDS;
CREATE INDEX nodes_hostname_idx ON nodes (hostname) WHERE deleted IS false;
CREATE INDEX nodes_site_id_idx ON nodes (site_id) WHERE deleted IS false;
SELECT site_id,
array_accum(node_id) AS node_ids
FROM nodes
+WHERE deleted IS false
GROUP BY site_id;
--------------------------------------------------------------------------------
error_cmd text, -- Shell command to execute if any error occurs
ignore_cmd_errors bool NOT NULL DEFAULT false, -- Install file anyway even if an error occurs
always_update bool NOT NULL DEFAULT false -- Always attempt to install file even if unchanged
-);
+) WITH OIDS;
CREATE TABLE conf_file_node (
conf_file_id integer REFERENCES conf_files NOT NULL, -- Configuration file identifier
FROM nodenetworks_ordered
GROUP BY node_id;
+--------------------------------------------------------------------------------
+-- Nodenetwork setting types and nodenetworks settings
+--------------------------------------------------------------------------------
+
+CREATE TABLE nodenetwork_setting_types (
+ nodenetwork_setting_type_id serial PRIMARY KEY,
+ -- Setting Type Identifier
+ name text UNIQUE NOT NULL, -- Setting Name
+ description text, -- Optional Description
+ category text NOT NULL, -- Category, e.g. Wifi, or whatever
+ min_role_id integer references roles -- If set, minimal role required
+) WITH OIDS;
+
+CREATE TABLE nodenetwork_setting (
+ nodenetwork_setting_id serial PRIMARY KEY, -- Nodenetwork Setting Identifier
+ nodenetwork_id integer REFERENCES nodenetworks NOT NULL,
+ -- the nodenetwork this applies to
+ nodenetwork_setting_type_id integer REFERENCES nodenetwork_setting_types NOT NULL,
+ -- the setting type
+ value text
+) WITH OIDS;
+
+CREATE OR REPLACE VIEW nodenetwork_settings AS
+SELECT nodenetwork_id,
+array_accum(nodenetwork_setting_id) AS nodenetwork_setting_ids
+FROM nodenetwork_setting
+GROUP BY nodenetwork_id;
+
+CREATE OR REPLACE VIEW view_nodenetwork_settings AS
+SELECT
+nodenetwork_setting.nodenetwork_setting_id,
+nodenetwork_setting.nodenetwork_id,
+nodenetwork_setting_types.nodenetwork_setting_type_id,
+nodenetwork_setting_types.name,
+nodenetwork_setting_types.description,
+nodenetwork_setting_types.category,
+nodenetwork_setting_types.min_role_id,
+nodenetwork_setting.value
+FROM nodenetwork_setting
+INNER JOIN nodenetwork_setting_types USING (nodenetwork_setting_type_id);
+
+CREATE OR REPLACE VIEW view_nodenetworks AS
+SELECT
+nodenetworks.nodenetwork_id,
+nodenetworks.node_id,
+nodenetworks.is_primary,
+nodenetworks.type,
+nodenetworks.method,
+nodenetworks.ip,
+nodenetworks.mac,
+nodenetworks.gateway,
+nodenetworks.network,
+nodenetworks.broadcast,
+nodenetworks.netmask,
+nodenetworks.dns1,
+nodenetworks.dns2,
+nodenetworks.bwlimit,
+nodenetworks.hostname,
+COALESCE((SELECT nodenetwork_setting_ids FROM nodenetwork_settings WHERE nodenetwork_settings.nodenetwork_id = nodenetworks.nodenetwork_id), '{}') AS nodenetwork_setting_ids
+FROM nodenetworks;
+
--------------------------------------------------------------------------------
-- Power control units (PCUs)
--------------------------------------------------------------------------------
INSERT INTO slice_instantiations (instantiation) VALUES ('not-instantiated'); -- Placeholder slice
INSERT INTO slice_instantiations (instantiation) VALUES ('plc-instantiated'); -- Instantiated by Node Manager
INSERT INTO slice_instantiations (instantiation) VALUES ('delegated'); -- Manually instantiated
+INSERT INTO slice_instantiations (instantiation) VALUES ('nm-controller'); -- NM Controller
-- Slices
CREATE TABLE slices (
max_nodes integer NOT NULL DEFAULT 100, -- Maximum number of nodes that can be assigned to this slice
- creator_person_id integer REFERENCES persons NOT NULL, -- Creator
+ creator_person_id integer REFERENCES persons, -- Creator
created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, -- Creation date
expires timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP + '2 weeks', -- Expiration date
FROM slice_person
GROUP BY person_id;
+--------------------------------------------------------------------------------
+-- Slice whitelist
+--------------------------------------------------------------------------------
+-- slice whitelist on nodes
+CREATE TABLE node_slice_whitelist (
+ node_id integer REFERENCES nodes NOT NULL, -- Node id of whitelist
+ slice_id integer REFERENCES slices NOT NULL, -- Slice id thats allowd on this node
+ PRIMARY KEY (node_id, slice_id)
+) WITH OIDS;
+CREATE INDEX node_slice_whitelist_node_id_idx ON node_slice_whitelist (node_id);
+CREATE INDEX node_slice_whitelist_slice_id_idx ON node_slice_whitelist (slice_id);
+
+-- Slices on each node
+CREATE VIEW node_slices_whitelist AS
+SELECT node_id,
+array_accum(slice_id) AS slice_ids_whitelist
+FROM node_slice_whitelist
+GROUP BY node_id;
+
--------------------------------------------------------------------------------
-- Slice attributes
--------------------------------------------------------------------------------
slice_attribute_id serial PRIMARY KEY, -- Slice attribute identifier
slice_id integer REFERENCES slices NOT NULL, -- Slice identifier
node_id integer REFERENCES nodes, -- Sliver attribute if set
+ nodegroup_id integer REFERENCES nodegroups, -- Node group attribute if set
attribute_type_id integer REFERENCES slice_attribute_types NOT NULL, -- Attribute type identifier
value text
) WITH OIDS;
CREATE INDEX slice_attribute_slice_id_idx ON slice_attribute (slice_id);
CREATE INDEX slice_attribute_node_id_idx ON slice_attribute (node_id);
+CREATE INDEX slice_attribute_nodegroup_id_idx ON slice_attribute (nodegroup_id);
CREATE VIEW slice_attributes AS
SELECT slice_id,
FROM slice_attribute
GROUP BY slice_id;
+--------------------------------------------------------------------------------
+-- Initscripts
+--------------------------------------------------------------------------------
+
+-- Initscripts
+CREATE TABLE initscripts (
+ initscript_id serial PRIMARY KEY, -- Initscript identifier
+ name text NOT NULL, -- Initscript name
+ enabled bool NOT NULL DEFAULT true, -- Initscript is active
+ script text NOT NULL, -- Initscript
+ UNIQUE (name)
+) WITH OIDS;
+CREATE INDEX initscripts_name_idx ON initscripts (name);
+
+
--------------------------------------------------------------------------------
-- Peers
--------------------------------------------------------------------------------
UNIQUE (session_id) -- Sessions are unique
) WITH OIDS;
+
+
+-------------------------------------------------------------------------------
+-- PCU Types
+------------------------------------------------------------------------------
+CREATE TABLE pcu_types (
+ pcu_type_id serial PRIMARY KEY,
+ model text NOT NULL , -- PCU model name
+ name text -- Full PCU model name
+) WITH OIDS;
+CREATE INDEX pcu_types_model_idx ON pcu_types (model);
+
+CREATE TABLE pcu_protocol_type (
+ pcu_protocol_type_id serial PRIMARY KEY,
+ pcu_type_id integer REFERENCES pcu_types NOT NULL, -- PCU type identifier
+ port integer NOT NULL, -- PCU port
+ protocol text NOT NULL, -- Protocol
+ supported boolean NOT NULL DEFAULT True -- Does PLC support
+) WITH OIDS;
+CREATE INDEX pcu_protocol_type_pcu_type_id ON pcu_protocol_type (pcu_type_id);
+
+
+CREATE OR REPLACE VIEW pcu_protocol_types AS
+SELECT pcu_type_id,
+array_accum(pcu_protocol_type_id) as pcu_protocol_type_ids
+FROM pcu_protocol_type
+GROUP BY pcu_type_id;
+
--------------------------------------------------------------------------------
-- Message templates
--------------------------------------------------------------------------------
event_id serial PRIMARY KEY, -- Event identifier
person_id integer REFERENCES persons, -- Person responsible for event, if any
node_id integer REFERENCES nodes, -- Node responsible for event, if any
+ auth_type text, -- Type of auth used. i.e. AuthMethod
fault_code integer NOT NULL DEFAULT 0, -- Did this event result in error
call_name text NOT NULL, -- Call responsible for this event
call text NOT NULL, -- Call responsible for this event, including parameters
-- Database object(s) that may have been affected by a particular event
CREATE TABLE event_object (
event_id integer REFERENCES events NOT NULL, -- Event identifier
- object_id integer NOT NULL -- Object identifier
+ object_id integer NOT NULL, -- Object identifier
+ object_type text NOT NULL Default 'Unknown' -- What type of object is this event affecting
) WITH OIDS;
CREATE INDEX event_object_event_id_idx ON event_object (event_id);
CREATE INDEX event_object_object_id_idx ON event_object (object_id);
+CREATE INDEX event_object_object_type_idx ON event_object (object_type);
-CREATE VIEW event_objects AS
+CREATE OR REPLACE VIEW event_objects AS
SELECT event_id,
-array_accum(object_id) AS object_ids
+array_accum(object_id) AS object_ids,
+array_accum(object_type) AS object_types
FROM event_object
GROUP BY event_id;
--------------------------------------------------------------------------------
-- Useful views
--------------------------------------------------------------------------------
+CREATE OR REPLACE VIEW view_pcu_types AS
+SELECT
+pcu_types.pcu_type_id,
+pcu_types.model,
+pcu_types.name,
+COALESCE((SELECT pcu_protocol_type_ids FROM pcu_protocol_types WHERE pcu_protocol_types.pcu_type_id = pcu_types.pcu_type_id), '{}') AS pcu_protocol_type_ids
+FROM pcu_types;
-CREATE VIEW view_events AS
+CREATE OR REPLACE VIEW view_events AS
SELECT
events.event_id,
events.person_id,
events.node_id,
+events.auth_type,
events.fault_code,
events.call_name,
events.call,
events.message,
events.runtime,
CAST(date_part('epoch', events.time) AS bigint) AS time,
-COALESCE(event_objects.object_ids, '{}') AS object_ids
-FROM events
-LEFT JOIN event_objects USING (event_id);
+COALESCE((SELECT object_ids FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_ids,
+COALESCE((SELECT object_types FROM event_objects WHERE event_objects.event_id = events.event_id), '{}') AS object_types
+FROM events;
-CREATE VIEW view_persons AS
+CREATE OR REPLACE VIEW view_event_objects AS
+SELECT
+events.event_id,
+events.person_id,
+events.node_id,
+events.fault_code,
+events.call_name,
+events.call,
+events.message,
+events.runtime,
+CAST(date_part('epoch', events.time) AS bigint) AS time,
+event_object.object_id,
+event_object.object_type
+FROM events LEFT JOIN event_object USING (event_id);
+
+CREATE OR REPLACE VIEW view_persons AS
SELECT
persons.person_id,
persons.email,
persons.enabled,
persons.password,
persons.verification_key,
-persons.verification_expires,
+CAST(date_part('epoch', persons.verification_expires) AS bigint) AS verification_expires,
persons.title,
persons.phone,
persons.url,
CAST(date_part('epoch', persons.last_updated) AS bigint) AS last_updated,
peer_person.peer_id,
peer_person.peer_person_id,
-COALESCE(person_roles.role_ids, '{}') AS role_ids,
-COALESCE(person_roles.roles, '{}') AS roles,
-COALESCE(person_sites.site_ids, '{}') AS site_ids,
-COALESCE(person_keys.key_ids, '{}') AS key_ids,
-COALESCE(person_slices.slice_ids, '{}') AS slice_ids
+COALESCE((SELECT role_ids FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS role_ids,
+COALESCE((SELECT roles FROM person_roles WHERE person_roles.person_id = persons.person_id), '{}') AS roles,
+COALESCE((SELECT site_ids FROM person_sites WHERE person_sites.person_id = persons.person_id), '{}') AS site_ids,
+COALESCE((SELECT key_ids FROM person_keys WHERE person_keys.person_id = persons.person_id), '{}') AS key_ids,
+COALESCE((SELECT slice_ids FROM person_slices WHERE person_slices.person_id = persons.person_id), '{}') AS slice_ids
FROM persons
-LEFT JOIN peer_person USING (person_id)
-LEFT JOIN person_roles USING (person_id)
-LEFT JOIN person_sites USING (person_id)
-LEFT JOIN person_keys USING (person_id)
-LEFT JOIN person_slices USING (person_id);
+LEFT JOIN peer_person USING (person_id);
-CREATE VIEW view_peers AS
+CREATE OR REPLACE VIEW view_peers AS
SELECT
peers.*,
-COALESCE(peer_sites.site_ids, '{}') AS site_ids,
-COALESCE(peer_sites.peer_site_ids, '{}') AS peer_site_ids,
-COALESCE(peer_persons.person_ids, '{}') AS person_ids,
-COALESCE(peer_persons.peer_person_ids, '{}') AS peer_person_ids,
-COALESCE(peer_keys.key_ids, '{}') AS key_ids,
-COALESCE(peer_keys.peer_key_ids, '{}') AS peer_key_ids,
-COALESCE(peer_nodes.node_ids, '{}') AS node_ids,
-COALESCE(peer_nodes.peer_node_ids, '{}') AS peer_node_ids,
-COALESCE(peer_slices.slice_ids, '{}') AS slice_ids,
-COALESCE(peer_slices.peer_slice_ids, '{}') AS peer_slice_ids
-FROM peers
-LEFT JOIN peer_sites USING (peer_id)
-LEFT JOIN peer_persons USING (peer_id)
-LEFT JOIN peer_keys USING (peer_id)
-LEFT JOIN peer_nodes USING (peer_id)
-LEFT JOIN peer_slices USING (peer_id);
-
-CREATE VIEW view_nodes AS
+COALESCE((SELECT site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS site_ids,
+COALESCE((SELECT peer_site_ids FROM peer_sites WHERE peer_sites.peer_id = peers.peer_id), '{}') AS peer_site_ids,
+COALESCE((SELECT person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS person_ids,
+COALESCE((SELECT peer_person_ids FROM peer_persons WHERE peer_persons.peer_id = peers.peer_id), '{}') AS peer_person_ids,
+COALESCE((SELECT key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS key_ids,
+COALESCE((SELECT peer_key_ids FROM peer_keys WHERE peer_keys.peer_id = peers.peer_id), '{}') AS peer_key_ids,
+COALESCE((SELECT node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS node_ids,
+COALESCE((SELECT peer_node_ids FROM peer_nodes WHERE peer_nodes.peer_id = peers.peer_id), '{}') AS peer_node_ids,
+COALESCE((SELECT slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS slice_ids,
+COALESCE((SELECT peer_slice_ids FROM peer_slices WHERE peer_slices.peer_id = peers.peer_id), '{}') AS peer_slice_ids
+FROM peers;
+
+CREATE OR REPLACE VIEW view_nodes AS
SELECT
nodes.node_id,
nodes.hostname,
nodes.key,
CAST(date_part('epoch', nodes.date_created) AS bigint) AS date_created,
CAST(date_part('epoch', nodes.last_updated) AS bigint) AS last_updated,
+CAST(date_part('epoch', nodes.last_contact) AS bigint) AS last_contact,
peer_node.peer_id,
peer_node.peer_node_id,
-COALESCE(node_nodenetworks.nodenetwork_ids, '{}') AS nodenetwork_ids,
-COALESCE(node_nodegroups.nodegroup_ids, '{}') AS nodegroup_ids,
-COALESCE(node_slices.slice_ids, '{}') AS slice_ids,
-COALESCE(node_pcus.pcu_ids, '{}') AS pcu_ids,
-COALESCE(node_pcus.ports, '{}') AS ports,
-COALESCE(node_conf_files.conf_file_ids, '{}') AS conf_file_ids,
+COALESCE((SELECT nodenetwork_ids FROM node_nodenetworks WHERE node_nodenetworks.node_id = nodes.node_id), '{}') AS nodenetwork_ids,
+COALESCE((SELECT nodegroup_ids FROM node_nodegroups WHERE node_nodegroups.node_id = nodes.node_id), '{}') AS nodegroup_ids,
+COALESCE((SELECT slice_ids FROM node_slices WHERE node_slices.node_id = nodes.node_id), '{}') AS slice_ids,
+COALESCE((SELECT slice_ids_whitelist FROM node_slices_whitelist WHERE node_slices_whitelist.node_id = nodes.node_id), '{}') AS slice_ids_whitelist,
+COALESCE((SELECT pcu_ids FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS pcu_ids,
+COALESCE((SELECT ports FROM node_pcus WHERE node_pcus.node_id = nodes.node_id), '{}') AS ports,
+COALESCE((SELECT conf_file_ids FROM node_conf_files WHERE node_conf_files.node_id = nodes.node_id), '{}') AS conf_file_ids,
node_session.session_id AS session
FROM nodes
LEFT JOIN peer_node USING (node_id)
-LEFT JOIN node_nodenetworks USING (node_id)
-LEFT JOIN node_nodegroups USING (node_id)
-LEFT JOIN node_slices USING (node_id)
-LEFT JOIN node_pcus USING (node_id)
-LEFT JOIN node_conf_files USING (node_id)
LEFT JOIN node_session USING (node_id);
-CREATE VIEW view_nodegroups AS
+CREATE OR REPLACE VIEW view_nodegroups AS
SELECT
nodegroups.*,
-COALESCE(nodegroup_nodes.node_ids, '{}') AS node_ids,
-COALESCE(nodegroup_conf_files.conf_file_ids, '{}') AS conf_file_ids
-FROM nodegroups
-LEFT JOIN nodegroup_nodes USING (nodegroup_id)
-LEFT JOIN nodegroup_conf_files USING (nodegroup_id);
+COALESCE((SELECT node_ids FROM nodegroup_nodes WHERE nodegroup_nodes.nodegroup_id = nodegroups.nodegroup_id), '{}') AS node_ids,
+COALESCE((SELECT conf_file_ids FROM nodegroup_conf_files WHERE nodegroup_conf_files.nodegroup_id = nodegroups.nodegroup_id), '{}') AS conf_file_ids
+FROM nodegroups;
-CREATE VIEW view_conf_files AS
+CREATE OR REPLACE VIEW view_conf_files AS
SELECT
conf_files.*,
-COALESCE(conf_file_nodes.node_ids, '{}') AS node_ids,
-COALESCE(conf_file_nodegroups.nodegroup_ids, '{}') AS nodegroup_ids
-FROM conf_files
-LEFT JOIN conf_file_nodes USING (conf_file_id)
-LEFT JOIN conf_file_nodegroups USING (conf_file_id);
+COALESCE((SELECT node_ids FROM conf_file_nodes WHERE conf_file_nodes.conf_file_id = conf_files.conf_file_id), '{}') AS node_ids,
+COALESCE((SELECT nodegroup_ids FROM conf_file_nodegroups WHERE conf_file_nodegroups.conf_file_id = conf_files.conf_file_id), '{}') AS nodegroup_ids
+FROM conf_files;
-CREATE VIEW view_pcus AS
+CREATE OR REPLACE VIEW view_pcus AS
SELECT
pcus.*,
-COALESCE(pcu_nodes.node_ids, '{}') AS node_ids,
-COALESCE(pcu_nodes.ports, '{}') AS ports
-FROM pcus
-LEFT JOIN pcu_nodes USING (pcu_id);
+COALESCE((SELECT node_ids FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS node_ids,
+COALESCE((SELECT ports FROM pcu_nodes WHERE pcu_nodes.pcu_id = pcus.pcu_id), '{}') AS ports
+FROM pcus;
-CREATE VIEW view_sites AS
+CREATE OR REPLACE VIEW view_sites AS
SELECT
sites.site_id,
sites.login_base,
sites.name,
sites.abbreviated_name,
sites.deleted,
+sites.enabled,
sites.is_public,
sites.max_slices,
sites.max_slivers,
sites.latitude,
sites.longitude,
sites.url,
+sites.ext_consortium_id,
CAST(date_part('epoch', sites.date_created) AS bigint) AS date_created,
CAST(date_part('epoch', sites.last_updated) AS bigint) AS last_updated,
peer_site.peer_id,
peer_site.peer_site_id,
-COALESCE(site_persons.person_ids, '{}') AS person_ids,
-COALESCE(site_nodes.node_ids, '{}') AS node_ids,
-COALESCE(site_addresses.address_ids, '{}') AS address_ids,
-COALESCE(site_slices.slice_ids, '{}') AS slice_ids,
-COALESCE(site_pcus.pcu_ids, '{}') AS pcu_ids
+COALESCE((SELECT person_ids FROM site_persons WHERE site_persons.site_id = sites.site_id), '{}') AS person_ids,
+COALESCE((SELECT node_ids FROM site_nodes WHERE site_nodes.site_id = sites.site_id), '{}') AS node_ids,
+COALESCE((SELECT address_ids FROM site_addresses WHERE site_addresses.site_id = sites.site_id), '{}') AS address_ids,
+COALESCE((SELECT slice_ids FROM site_slices WHERE site_slices.site_id = sites.site_id), '{}') AS slice_ids,
+COALESCE((SELECT pcu_ids FROM site_pcus WHERE site_pcus.site_id = sites.site_id), '{}') AS pcu_ids
FROM sites
-LEFT JOIN peer_site USING (site_id)
-LEFT JOIN site_persons USING (site_id)
-LEFT JOIN site_nodes USING (site_id)
-LEFT JOIN site_addresses USING (site_id)
-LEFT JOIN site_slices USING (site_id)
-LEFT JOIN site_pcus USING (site_id);
-
-CREATE VIEW view_addresses AS
+LEFT JOIN peer_site USING (site_id);
+
+CREATE OR REPLACE VIEW view_addresses AS
SELECT
addresses.*,
-COALESCE(address_address_types.address_type_ids, '{}') AS address_type_ids,
-COALESCE(address_address_types.address_types, '{}') AS address_types
-FROM addresses
-LEFT JOIN address_address_types USING (address_id);
+COALESCE((SELECT address_type_ids FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_type_ids,
+COALESCE((SELECT address_types FROM address_address_types WHERE address_address_types.address_id = addresses.address_id), '{}') AS address_types
+FROM addresses;
-CREATE VIEW view_keys AS
+CREATE OR REPLACE VIEW view_keys AS
SELECT
keys.*,
person_key.person_id,
LEFT JOIN person_key USING (key_id)
LEFT JOIN peer_key USING (key_id);
-CREATE VIEW view_slices AS
+CREATE OR REPLACE VIEW view_slices AS
SELECT
slices.slice_id,
slices.site_id,
CAST(date_part('epoch', slices.expires) AS bigint) AS expires,
peer_slice.peer_id,
peer_slice.peer_slice_id,
-COALESCE(slice_nodes.node_ids, '{}') AS node_ids,
-COALESCE(slice_persons.person_ids, '{}') AS person_ids,
-COALESCE(slice_attributes.slice_attribute_ids, '{}') AS slice_attribute_ids
+COALESCE((SELECT node_ids FROM slice_nodes WHERE slice_nodes.slice_id = slices.slice_id), '{}') AS node_ids,
+COALESCE((SELECT person_ids FROM slice_persons WHERE slice_persons.slice_id = slices.slice_id), '{}') AS person_ids,
+COALESCE((SELECT slice_attribute_ids FROM slice_attributes WHERE slice_attributes.slice_id = slices.slice_id), '{}') AS slice_attribute_ids
FROM slices
-LEFT JOIN peer_slice USING (slice_id)
-LEFT JOIN slice_nodes USING (slice_id)
-LEFT JOIN slice_persons USING (slice_id)
-LEFT JOIN slice_attributes USING (slice_id);
+LEFT JOIN peer_slice USING (slice_id);
-CREATE VIEW view_slice_attributes AS
+CREATE OR REPLACE VIEW view_slice_attributes AS
SELECT
slice_attribute.slice_attribute_id,
slice_attribute.slice_id,
slice_attribute.node_id,
+slice_attribute.nodegroup_id,
slice_attribute_types.attribute_type_id,
slice_attribute_types.name,
slice_attribute_types.description,
FROM slice_attribute
INNER JOIN slice_attribute_types USING (attribute_type_id);
-CREATE VIEW view_sessions AS
+CREATE OR REPLACE VIEW view_sessions AS
SELECT
sessions.session_id,
CAST(date_part('epoch', sessions.expires) AS bigint) AS expires,