Source code for changes.models.node

import uuid

from datetime import datetime
from sqlalchemy import Column, DateTime, ForeignKey, String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import backref, relationship

from changes.config import db
from changes.db.types.guid import GUID
from changes.db.types.json import JSONEncodedDict
from changes.db.utils import model_repr


[docs]class Cluster(db.Model): """ A group of nodes. We refer to clusters in the step configurations (where should we run our tests?) Clusters are automatically added when we see them from jenkins results. Apparently, clusters are only used in jenkins (not lxc, although nodes are used for both.) A cluster does not correspond to one master """ __tablename__ = 'cluster' id = Column(GUID, primary_key=True, default=uuid.uuid4) label = Column(String(128), unique=True) date_created = Column(DateTime, default=datetime.utcnow) plans = association_proxy('cluster_nodes', 'node') __repr__ = model_repr('label')
[docs]class ClusterNode(db.Model): """ Which cluster does each node belong to? This is populated at the same time as cluster. """ __tablename__ = 'cluster_node' cluster_id = Column(GUID, ForeignKey('cluster.id', ondelete="CASCADE"), nullable=False, primary_key=True) node_id = Column(GUID, ForeignKey('node.id', ondelete="CASCADE"), nullable=False, primary_key=True) date_created = Column(DateTime, default=datetime.utcnow) cluster = relationship('Cluster', backref=backref( "cluster_nodes", cascade="all, delete-orphan")) node = relationship('Node', backref=backref( "node_clusters", cascade="all, delete-orphan")) def __init__(self, cluster=None, node=None, **kwargs): kwargs.setdefault('cluster', cluster) kwargs.setdefault('node', node) super(ClusterNode, self).__init__(**kwargs)
[docs]class Node(db.Model): """ A machine that runs jobsteps. This is populated by observing the machines picked by the jenkins masters (which themselves are configured by BuildStep params in the changes UI) when they're asked to run task, and is not configured manually. Node machines have tags (not stored in the changes db) """ __tablename__ = 'node' id = Column(GUID, primary_key=True, default=uuid.uuid4) label = Column(String(128), unique=True) data = Column(JSONEncodedDict) date_created = Column(DateTime, default=datetime.utcnow) clusters = association_proxy('node_clusters', 'cluster') __repr__ = model_repr('label') def __init__(self, *args, **kwargs): super(Node, self).__init__(*args, **kwargs) if not self.id: self.id = uuid.uuid4()