first steps towards multiple hosts -- schema & heartbeat

This commit is contained in:
forest 2020-12-10 20:32:43 -06:00
parent 7f1f5ac976
commit 44738c78a9
4 changed files with 87 additions and 0 deletions

View File

@ -8,6 +8,10 @@ class DBModel:
self.connection = connection
self.cursor = cursor
# ------ LOGIN ---------
def login(self, email):
self.cursor.execute("SELECT * FROM accounts WHERE email = %s", (email, ))
if len(self.cursor.fetchall()) == 0:
@ -33,6 +37,10 @@ class DBModel:
return email
return None
# ------ VM & ACCOUNT MANAGEMENT ---------
def all_non_deleted_vm_ids(self,):
self.cursor.execute("SELECT id FROM vms WHERE deleted IS NULL")
return list(map(lambda x: x[0], self.cursor.fetchall()))
@ -144,6 +152,10 @@ class DBModel:
return vm
# ------ PAYMENTS & ACCOUNT BALANCE ---------
def list_payments_for_account(self, email):
self.cursor.execute("""
SELECT id, dollars, invalidated, created
@ -253,6 +265,15 @@ class DBModel:
return list(map(lambda row: dict(email=row[0], account_balance_warning=row[1]), self.cursor.fetchall()))
# ------ HOSTS ---------
def authorized_for_host(self, id, token):
self.cursor.execute("SELECT id FROM hosts WHERE id = %s token = %s", (id, token))
return self.cursor.fetchone() != None
def host_heartbeat(self, id):
self.cursor.execute("UPDATE hosts SET last_health_check = NOW() WHERE id = %s", (id,))
self.connection.commit()

22
capsulflask/hosts_api.py Normal file
View File

@ -0,0 +1,22 @@
from flask import Blueprint
from flask import current_app
from flask import request
from werkzeug.exceptions import abort
from capsulflask.db import get_model, my_exec_info_message
bp = Blueprint("hosts", __name__, url_prefix="/hosts")
def authorized_for_host(id):
auth_header_value = request.headers.get('Authorization').replace("Bearer ", "")
return get_model().authorized_for_host(id, auth_header_value)
@bp.route("/heartbeat/<string:id>", methods=("POST"))
def heartbeat(id):
if authorized_for_host(id):
get_model().host_heartbeat(id)
else:
current_app.logger.info(f"/hosts/heartbeat/{id} returned 401: invalid token")
return abort(401, "invalid host id or token")

View File

@ -0,0 +1,11 @@
DROP TABLE host_operation;
DROP TABLE operations;
ALTER TABLE vms DROP COLUMN host;
DROP TABLE hosts;
UPDATE schemaversion SET version = 8;

View File

@ -0,0 +1,33 @@
CREATE TABLE hosts (
id TEXT PRIMARY KEY NOT NULL,
last_health_check TIMESTAMP NOT NULL DEFAULT NOW(),
token TEXT NOT NULL
);
INSERT INTO hosts (id, token) VALUES ('baikal', 'changeme');
ALTER TABLE vms
ADD COLUMN host TEXT REFERENCES hosts(id) ON DELETE RESTRICT DEFAULT 'baikal';
CREATE TABLE operations (
id TEXT PRIMARY KEY NOT NULL,
email TEXT REFERENCES accounts(email) ON DELETE RESTRICT,
assigned_host TEXT NULL,
host_status TEXT NULL,
created TIMESTAMP NOT NULL DEFAULT NOW(),
assigned TIMESTAMP NULL,
completed TIMESTAMP NULL,
payload TEXT NOT NULL,
);
CREATE TABLE host_operation (
host TEXT NOT NULL,
operation TEXT NOT NULL,
assignment_status TEXT NULL,
assignment_status_timestamp TIMESTAMP,
PRIMARY KEY (host, operation)
);
UPDATE schemaversion SET version = 9;