Exemplo n.º 1
0
class User(db.Model):
    """
    User accounts are used mainly to set up TrafficLights agents for now.
    """

    __tablename__ = 'users'
    id            = db.Column(db.Integer, primary_key=True)
    username      = db.Column(db.String(80))
    password_hash = db.Column(db.String(156))
    displayname   = db.Column(db.String(80))

    def __init__(self, username):
        self.username = username

    def __repr__(self):
        return '<User %s>' % self.id

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password, method='pbkdf2:sha512', salt_length=8)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    def to_json(self):
        return {
            'id':          self.id,
            'username':    self.username,
            'displayname': self.realname
        }
Exemplo n.º 2
0
class Check(db.Model):
    """
    Healthcheck configurations.
    """

    __tablename__ = 'checks'
    id    = db.Column(db.Integer, primary_key=True)
    service_id = db.Column(db.Integer, db.ForeignKey('services.id'))
    service    = db.relationship("Service", back_populates="checks")
    node_id    = db.Column(db.Integer, db.ForeignKey('nodes.id'))
    node       = db.relationship("Node", back_populates="checks")
    name  = db.Column(db.String(80))
    check = db.Column(db.String(120))
    # results    = db.relationship("Result", back_populates="check")

    def __init__(self, name, check, service):
        self.name       = name
        self.check      = check
        self.service_id = service

    def __repr__(self):
        return '<Check %s>' % self.id

    def to_json(self):
        return {
            'id':    self.id,
            'name':  self.name,
            'check': self.check,
            'url':   url_for('api.get_check', id=self.id, _external=True),
            'service': {
                'id':  self.service_id,
                'url': url_for('api.get_service', id=self.service_id, _external=True)
            }
        }
Exemplo n.º 3
0
class Node(db.Model):
    __tablename__ = 'nodes'
    id = db.Column(db.Integer, primary_key=True)
    checks = db.relationship("Check", back_populates="node")
    results = db.relationship("Result", back_populates="node")
    name = db.Column(db.String(80))
    token = db.Column(db.String(80))

    def __init__(self, name):
        self.name = name
        self.token = '1234567890'
Exemplo n.º 4
0
class Service(db.Model):
    """
    Logical grouping of checks.
    """

    __tablename__ = 'services'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    checks = db.relationship("Check", back_populates="service")

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Service "%s">' % self.name
Exemplo n.º 5
0
class User(db.Model):
    """
    User account details.
    """

    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(48))
    password_hash = db.Column(db.String(64))

    def __init__(self, username, password_hash):
        self.username = username
        self.password_hash = password_hash

    def __repr__(self):
        return '<User %s>' % self.username
Exemplo n.º 6
0
class Node(db.Model):
    """
    Node objects are TrafficLights agents, responsible for running healthchecks
    and submitting results back to the TrafficLights server.
    """

    __tablename__ = 'nodes'
    id     = db.Column(db.Integer, primary_key=True)
    name   = db.Column(db.String(80))
    checks = db.relationship("Check", back_populates="node")

    def __init__(self, name):
        self.name  = name

    def __repr__(self):
        return '<Node %s>' % self.id

    def generate_auth_token(self, expiration):
        """Generate authentication token."""
        s = Serializer(current_app.config['SECRET_KEY'], expires_in = expiration)
        return s.dumps({'id': self.id})

    @staticmethod
    def verify_auth_token(token):
        """Return Node object which matches authentication token"""
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token)
        except:
            raise
            return None
        return Node.query.get(data['id'])

    def to_json(self):
        return {
            'id':     self.id,
            'name':   self.name,
            'url':    url_for('api.get_node', id=self.id, _external=True),
            'checks': url_for('api.get_checks_for_node', id=self.id, _external=True)
        }
Exemplo n.º 7
0
class Check(db.Model):
    """
    Healthcheck configurations.
    """

    __tablename__ = 'checks'
    id = db.Column(db.Integer, primary_key=True)
    service_id = db.Column(db.Integer, db.ForeignKey('services.id'))
    node_id = db.Column(db.Integer, db.ForeignKey('nodes.id'))
    service = db.relationship("Service", back_populates="checks")
    node = db.relationship("Node", back_populates="checks")
    results = db.relationship("Result", back_populates="check")
    name = db.Column(db.String(80))
    url = db.Column(db.String(80))

    def __init__(self, name, url, service, node):
        self.name = name
        self.url = url
        self.service_id = service
        self.node_id = node

    def __repr__(self):
        return '<Check "%s - %s">' % (self.service.name, self.name)
Exemplo n.º 8
0
class Service(db.Model):
    """
    Logical grouping of checks.
    """

    __tablename__ = 'services'
    id     = db.Column(db.Integer, primary_key=True)
    name   = db.Column(db.String(80))
    checks = db.relationship("Check", back_populates="service")

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Service "%s">' % self.id

    def to_json(self):
        return {
            'id':     self.id,
            'name':   self.name,
            'url':    url_for('api.get_service', id=self.id, _external=True),
            'checks': url_for('api.get_checks_for_service', id=self.id, _external=True)
        }
Exemplo n.º 9
0
class Result(db.Model):
    """
    Results from Healthchecks.
    """
    # So I'm really not sure how best to manage the result objects. For now
    # it seems best to just create them using the entire dictionary, populating
    # the relevant fields...
    __tablename__ = 'results'
    id = db.Column(db.Integer, primary_key=True)
    check_id = db.Column(db.Integer, db.ForeignKey('checks.id'))
    check = db.relationship("Check", back_populates="results")
    node_id = db.Column(db.Integer, db.ForeignKey('nodes.id'))
    node = db.relationship("Node", back_populates="results")

    code = db.Column(db.Integer)
    status = db.Column(db.Text)
    time = db.Column(db.Integer)
    headers = db.Column(db.Text)
    content = db.Column(db.Text)
    timestamp = db.Column(db.DateTime)
    success = db.Column(db.Boolean)
    url = db.Column(db.Text)

    def __init__(self, node, data):
        self.node_id = node
        self.check_id = data['id']

        self.code = data['metadata']['code']
        self.status = data['metadata']['status']
        self.time = data['metadata']['time']
        self.headers = str(data['metadata']['headers'])
        self.content = data['metadata']['content']
        self.timestamp = datetime.strptime(data['metadata']['timestamp'],
                                           '%Y-%m-%d %H:%M:%S')
        self.success = data['success']
        self.url = data['url']

    def __repr__(self):
        return '<Result %i>' % id