|
|
|
'use strict';
|
|
|
|
|
|
|
|
exports.up = function(knex, Promise) {
|
|
|
|
return knex.schema
|
|
|
|
.createTable("users", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.text("username").notNullable();
|
|
|
|
table.text("hash").notNullable();
|
|
|
|
table.text("email_address").notNullable();
|
|
|
|
table.boolean("is_active").notNullable();
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("storage_pools", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.text("type").notNullable(); // lvm, folder
|
|
|
|
table.text("name"); // for lvm VG name
|
|
|
|
table.text("path"); // for folder base path
|
|
|
|
table.boolean("is_local").notNullable(); // to prevent trying to attach a storage volume that lives on the wrong host
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("instance_types", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.text("name").notNullable();
|
|
|
|
table.text("internal_comment");
|
|
|
|
table.integer("default_memory").notNullable(); // in MB
|
|
|
|
table.integer("default_disk_space").notNullable(); // in MB
|
|
|
|
table.integer("default_traffic"); // in MB
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("allowed_storage_pools", (table) => {
|
|
|
|
table.bigInteger("instance_type_id").notNullable().references("instance_types.id");
|
|
|
|
table.bigInteger("storage_pool_id").notNullable().references("storage_pools.id");
|
|
|
|
table.unique([ "instance_type_id", "storage_pool_id" ]);
|
|
|
|
})
|
|
|
|
.createTable("images", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.bigInteger("user_id").notNullable().references("users.id"); // user that added it
|
|
|
|
// table.uuid("file_id").notNullable();
|
|
|
|
table.text("name");
|
|
|
|
table.text("description");
|
|
|
|
table.text("source_type").notNullable(); // local, http, upload
|
|
|
|
table.text("source"); // URL, path, etc.
|
|
|
|
table.boolean("is_public").notNullable(); // whether the image should be visible to everybody, or just its owner
|
|
|
|
table.boolean("is_install_medium").notNullable(); // whether the image is just for installation (if not, it will be directly clonable)
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("instances", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.bigInteger("user_id").notNullable().references("users.id");
|
|
|
|
table.bigInteger("mounted_image_id").references("images.id");
|
|
|
|
table.bigInteger("last_installation_media_id").references("images.id");
|
|
|
|
table.jsonb("boot_order").notNullable(); // array that includes references to storage volumes!
|
|
|
|
// table.uuid("instance_uuid").notNullable();
|
|
|
|
table.text("name");
|
|
|
|
table.text("comment");
|
|
|
|
table.integer("memory").notNullable(); // in MB
|
|
|
|
table.integer("disk_space").notNullable(); // in MB
|
|
|
|
table.integer("traffic"); // in MB
|
|
|
|
table.boolean("is_suspended").notNullable();
|
|
|
|
table.text("suspension_reason");
|
|
|
|
table.boolean("is_terminated").notNullable();
|
|
|
|
table.text("termination_reason");
|
|
|
|
table.boolean("is_running");
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("storage_volumes", (table) => {
|
|
|
|
table.bigIncrements("id").primary();
|
|
|
|
table.bigInteger("user_id").references("users.id");
|
|
|
|
table.bigInteger("storage_pool_id").references("storage_pools.id");
|
|
|
|
// table.uuid("volume_uuid").notNullable();
|
|
|
|
table.text("format").notNullable(); // qcow2
|
|
|
|
table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
|
|
|
|
})
|
|
|
|
.createTable("storage_attachments", (table) => {
|
|
|
|
table.bigInteger("storage_volume_id").notNullable().references("storage_volumes.id").unique();
|
|
|
|
table.bigInteger("instance_id").notNullable().references("storage_volumes.id");
|
|
|
|
table.boolean("is_locked").notNullable(); // whether the user should be prevented from detaching this storage volume
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
exports.down = function(knex, Promise) {
|
|
|
|
return knex.schema
|
|
|
|
.dropTable("storage_attachments")
|
|
|
|
.dropTable("storage_volumes")
|
|
|
|
.dropTable("instances")
|
|
|
|
.dropTable("images")
|
|
|
|
.dropTable("allowed_storage_pools")
|
|
|
|
.dropTable("instance_types")
|
|
|
|
.dropTable("storage_pools")
|
|
|
|
.dropTable("users");
|
|
|
|
};
|