Source code for chaosmonkey.dal.plan_model
from datetime import datetime
from uuid import uuid4
from sqlalchemy.orm import relationship
from flask import request
from chaosmonkey.api.hal import BaseDocument, Link
from chaosmonkey.dal.database import db
from chaosmonkey.dal.executor_model import Executor
[docs]class Plan(db.Model):
"""
Store information about the plan and its executors.
This model is only used by the cme.
"""
__tablename__ = 'cme_plans'
id = db.Column(db.String(80), primary_key=True) #: unique identifier
name = db.Column(db.String(200), unique=False) #: plan name
created = db.Column(db.DateTime, unique=True) #: creation datetime
executed = db.Column(db.Boolean) #: if all the executors in the plan has been executed
next_execution = None #: DateTime for the next executor execution time
executors_count = None #: number of pending executors
jobs = relationship(Executor, cascade='all, delete, delete-orphan')
# pylint: disable=too-many-arguments
def __init__(self, _id=None, name=None, created=None, next_execution=None, executors_count=0, executed=False):
self.id = _id or uuid4().hex
self.name = name
if created:
self.created = datetime.strptime(created, '%Y-%m-%d %H:%M:%S.%f')
else:
self.created = datetime.utcnow()
self.executed = executed
self.next_execution = next_execution
self.executors_count = executors_count
[docs] def to_dict(self):
"""
Returns a :meth:`chaosmonkey.api.hal.document` representation for the Executor
:return: :meth:`chaosmonkey.dal.plan_model.HalPlan`
"""
return HalPlan(data={
'id': self.id,
'name': self.name,
'created': self.created.strftime('%Y-%m-%dT%H:%M:%s'),
'executors_count': self.executors_count,
'next_execution': self.next_execution,
'executed': self.executed
}).to_dict()
def __repr__(self):
return '<Plan %r>' % self.name
[docs]class HalPlan(BaseDocument):
"""
Class to represent a Plan as a :meth:`chaosmonkey.api.hal.document`
"""
def __init__(self, data=None, links=None, embedded=None):
super(HalPlan, self).__init__(data, links, embedded)
self.links.append(Link("self", request.path + data["id"]))
self.links.append(Link("update", request.path + data["id"]))
self.links.append(Link("delete", request.path + data["id"]))