129 lines
4.9 KiB
Go
129 lines
4.9 KiB
Go
|
// Copyright 2016 clair authors
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
package migrations
|
||
|
|
||
|
import "github.com/remind101/migrate"
|
||
|
|
||
|
func init() {
|
||
|
// This migration creates the initial Clair's schema.
|
||
|
RegisterMigration(migrate.Migration{
|
||
|
ID: 2,
|
||
|
Up: migrate.Queries([]string{
|
||
|
`CREATE TABLE IF NOT EXISTS Namespace (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
name VARCHAR(128) NULL);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Layer (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
name VARCHAR(128) NOT NULL UNIQUE,
|
||
|
engineversion SMALLINT NOT NULL,
|
||
|
parent_id INT NULL REFERENCES Layer ON DELETE CASCADE,
|
||
|
namespace_id INT NULL REFERENCES Namespace,
|
||
|
created_at TIMESTAMP WITH TIME ZONE);`,
|
||
|
`CREATE INDEX ON Layer (parent_id);`,
|
||
|
`CREATE INDEX ON Layer (namespace_id);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Feature (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
namespace_id INT NOT NULL REFERENCES Namespace,
|
||
|
name VARCHAR(128) NOT NULL,
|
||
|
UNIQUE (namespace_id, name));`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS FeatureVersion (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
feature_id INT NOT NULL REFERENCES Feature,
|
||
|
version VARCHAR(128) NOT NULL);`,
|
||
|
`CREATE INDEX ON FeatureVersion (feature_id);`,
|
||
|
|
||
|
`CREATE TYPE modification AS ENUM ('add', 'del');`,
|
||
|
`CREATE TABLE IF NOT EXISTS Layer_diff_FeatureVersion (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
layer_id INT NOT NULL REFERENCES Layer ON DELETE CASCADE,
|
||
|
featureversion_id INT NOT NULL REFERENCES FeatureVersion,
|
||
|
modification modification NOT NULL,
|
||
|
UNIQUE (layer_id, featureversion_id));`,
|
||
|
`CREATE INDEX ON Layer_diff_FeatureVersion (layer_id);`,
|
||
|
`CREATE INDEX ON Layer_diff_FeatureVersion (featureversion_id);`,
|
||
|
`CREATE INDEX ON Layer_diff_FeatureVersion (featureversion_id, layer_id);`,
|
||
|
|
||
|
`CREATE TYPE severity AS ENUM ('Unknown', 'Negligible', 'Low', 'Medium', 'High', 'Critical', 'Defcon1');`,
|
||
|
`CREATE TABLE IF NOT EXISTS Vulnerability (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
namespace_id INT NOT NULL REFERENCES Namespace,
|
||
|
name VARCHAR(128) NOT NULL,
|
||
|
description TEXT NULL,
|
||
|
link VARCHAR(128) NULL,
|
||
|
severity severity NOT NULL,
|
||
|
metadata TEXT NULL,
|
||
|
created_at TIMESTAMP WITH TIME ZONE,
|
||
|
deleted_at TIMESTAMP WITH TIME ZONE NULL);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Vulnerability_FixedIn_Feature (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
vulnerability_id INT NOT NULL REFERENCES Vulnerability ON DELETE CASCADE,
|
||
|
feature_id INT NOT NULL REFERENCES Feature,
|
||
|
version VARCHAR(128) NOT NULL,
|
||
|
UNIQUE (vulnerability_id, feature_id));`,
|
||
|
`CREATE INDEX ON Vulnerability_FixedIn_Feature (feature_id, vulnerability_id);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Vulnerability_Affects_FeatureVersion (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
vulnerability_id INT NOT NULL REFERENCES Vulnerability ON DELETE CASCADE,
|
||
|
featureversion_id INT NOT NULL REFERENCES FeatureVersion,
|
||
|
fixedin_id INT NOT NULL REFERENCES Vulnerability_FixedIn_Feature ON DELETE CASCADE,
|
||
|
UNIQUE (vulnerability_id, featureversion_id));`,
|
||
|
`CREATE INDEX ON Vulnerability_Affects_FeatureVersion (fixedin_id);`,
|
||
|
`CREATE INDEX ON Vulnerability_Affects_FeatureVersion (featureversion_id, vulnerability_id);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS KeyValue (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
key VARCHAR(128) NOT NULL UNIQUE,
|
||
|
value TEXT);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Lock (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
name VARCHAR(64) NOT NULL UNIQUE,
|
||
|
owner VARCHAR(64) NOT NULL,
|
||
|
until TIMESTAMP WITH TIME ZONE);`,
|
||
|
`CREATE INDEX ON Lock (owner);`,
|
||
|
|
||
|
`CREATE TABLE IF NOT EXISTS Vulnerability_Notification (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
name VARCHAR(64) NOT NULL UNIQUE,
|
||
|
created_at TIMESTAMP WITH TIME ZONE,
|
||
|
notified_at TIMESTAMP WITH TIME ZONE NULL,
|
||
|
deleted_at TIMESTAMP WITH TIME ZONE NULL,
|
||
|
old_vulnerability_id INT NULL REFERENCES Vulnerability ON DELETE CASCADE,
|
||
|
new_vulnerability_id INT NULL REFERENCES Vulnerability ON DELETE CASCADE);`,
|
||
|
`CREATE INDEX ON Vulnerability_Notification (notified_at);`,
|
||
|
}),
|
||
|
Down: migrate.Queries([]string{
|
||
|
`DROP TABLE IF EXISTS
|
||
|
Namespace,
|
||
|
Layer,
|
||
|
Feature,
|
||
|
FeatureVersion,
|
||
|
Layer_diff_FeatureVersion,
|
||
|
Vulnerability,
|
||
|
Vulnerability_FixedIn_Feature,
|
||
|
Vulnerability_Affects_FeatureVersion,
|
||
|
Vulnerability_Notification,
|
||
|
KeyValue,
|
||
|
Lock
|
||
|
CASCADE;`,
|
||
|
}),
|
||
|
})
|
||
|
}
|