docker/models/recommendation_history.py (68 lines of code) (raw):
import datetime
from mongoengine import StringField, DateTimeField, FloatField, \
ListField, DictField, EnumField
from commons.enum import ListEnum
from models.base_model import BaseModel
class FeedbackStatusEnum(ListEnum):
APPLIED = 'APPLIED'
DONT_RECOMMEND = 'DONT_RECOMMEND'
NO_ANSWER = 'NO_ANSWER'
WRONG = 'WRONG'
TOO_LARGE = 'TOO_LARGE'
TOO_SMALL = 'TOO_SMALL'
TOO_SHORT = 'TOO_SHORT'
TOO_LONG = 'TOO_LONG'
@classmethod
def common(cls):
return [cls.APPLIED, cls.DONT_RECOMMEND, cls.NO_ANSWER, cls.WRONG]
@classmethod
def resize(cls):
return [cls.TOO_LARGE, cls.TOO_SMALL]
@classmethod
def schedule(cls):
return [cls.TOO_LONG, cls.TOO_SHORT]
class RecommendationTypeEnum(ListEnum):
ACTION_SCHEDULE = 'SCHEDULE'
ACTION_SHUTDOWN = 'SHUTDOWN'
ACTION_SCALE_UP = 'SCALE_UP'
ACTION_SCALE_DOWN = 'SCALE_DOWN'
ACTION_CHANGE_SHAPE = 'CHANGE_SHAPE'
ACTION_SPLIT = 'SPLIT'
@classmethod
def resize(cls):
return [cls.ACTION_CHANGE_SHAPE,
cls.ACTION_SCALE_UP,
cls.ACTION_SCALE_DOWN,
cls.ACTION_SPLIT]
class RecommendationHistory(BaseModel):
instance_id = StringField(null=True)
job_id = StringField(null=True)
customer = StringField(null=True)
tenant = StringField(null=True)
region = StringField(null=True)
added_at = DateTimeField(null=False, default=datetime.datetime.utcnow)
current_instance_type = StringField(null=True)
current_month_price_usd = FloatField(null=True)
recommendation_type = EnumField(RecommendationTypeEnum, null=True)
recommendation = ListField(null=True, field=DictField(null=True))
savings = ListField(field=FloatField(null=True))
instance_meta = DictField(null=True)
feedback_dt = DateTimeField(null=True)
feedback_status = EnumField(FeedbackStatusEnum, null=True)
meta = {
'indexes': [
'instance_id',
'customer',
('instance_id', 'job_id'),
{
'fields': ['instance_id', 'added_at', 'recommendation_type'],
'unique': True
},
{
'fields': ['added_at'],
'expireAfterSeconds': 3600 * 24 * 30 * 3 # 3 months
},
],
'auto_create_index': True,
'auto_create_index_on_save': False,
}