class NotificationBase(base.SenlinObject): """Base class for versioned notifications. Every subclass shall define a 'payload' field. """ VERSION = '1.0' fields = { 'priority': fields.NotificationPriorityField(), 'event_type': fields.ObjectField('EventType'), 'publisher': fields.ObjectField('NotificationPublisher'), } def _emit(self, context, event_type, publisher_id, payload): notifier = messaging.get_notifier(publisher_id) notify = getattr(notifier, self.priority) notify(context, event_type=event_type, payload=payload) def emit(self, context): """Send the notification.""" assert self.payload.populated # Note(gibi): notification payload will be a newly populated object # therefore every field of it will look changed so this does not carry # any extra information so we drop this from the payload. self.payload.obj_reset_changes(recursive=False) self._emit(context, event_type=self.event_type.to_notification_field(), publisher_id='%s:%s' % (self.publisher.binary, self.publisher.host), payload=self.payload.obj_to_primitive())
class NotificationBase(NotificationObject): """Base class for versioned notifications. Every subclass shall define a 'payload' field. """ VERSION = '1.0' fields = { 'priority': fields.NotificationPriorityField(), 'event_type': fields.ObjectField('EventType'), 'publisher': fields.ObjectField('NotificationPublisher'), } def _emit(self, context, event_type, publisher_id, payload): notifier = messaging.get_notifier(publisher_id) notify = getattr(notifier, self.priority) notify(context, event_type, payload) def emit(self, context): """Send the notification.""" self.payload.obj_reset_changes(recursive=False) self._emit(context, self.event_type.to_notification_field(), self.publisher.publisher_id, self.payload.obj_to_primitive())
class NodeActionNotification(NotificationBase): VERSION = '1.0' fields = { 'payload': fields.ObjectField('NodeActionPayload') }
class NodeActionPayload(NotificationObject): VERSION = '1.0' fields = { 'node': fields.ObjectField('NodePayload'), 'action': fields.ObjectField('ActionPayload'), 'exception': fields.ObjectField('ExceptionPayload', nullable=True), } def __init__(self, node, action, **kwargs): ex = kwargs.pop('exception', None) super(NodeActionPayload, self).__init__( node=NodePayload.from_node(node), action=ActionPayload.from_action(action), exception=ex, **kwargs)
class ClusterActionPayload(NotificationObject): VERSION = '1.0' fields = { 'cluster': fields.ObjectField('ClusterPayload'), 'action': fields.ObjectField('ActionPayload'), 'exception': fields.ObjectField('ExceptionPayload', nullable=True), } def __init__(self, cluster, action, **kwargs): ex = kwargs.pop('exception', None) super(ClusterActionPayload, self).__init__( cluster=ClusterPayload.from_cluster(cluster), action=ActionPayload.from_action(action), exception=ex, **kwargs)
class ProfileValidateRequest(base.SenlinObject): fields = { 'profile': fields.ObjectField('ProfileValidateRequestBody') }
class ProfileUpdateRequest(base.SenlinObject): fields = { 'identity': fields.StringField(), 'profile': fields.ObjectField('ProfileUpdateRequestBody'), }
class NodeCreateRequest(base.SenlinObject): fields = {'node': fields.ObjectField('NodeCreateRequestBody')}
class WebhookTriggerRequest(base.SenlinObject): fields = { 'identity': fields.StringField(), 'body': fields.ObjectField('WebhookTriggerRequestBody') }
class ClusterCreateRequest(base.SenlinObject): fields = { 'cluster': fields.ObjectField('ClusterCreateRequestBody') }
class TestNotification(notification.NotificationBase): VERSION = '1.0' fields = {'payload': fields.ObjectField('TestPayload')}
class PolicyValidateRequest(base.SenlinObject): fields = {'policy': fields.ObjectField('PolicyValidateRequestBody')}
class PolicyUpdateRequest(base.SenlinObject): fields = { 'identity': fields.StringField(), 'policy': fields.ObjectField('PolicyUpdateRequestBody'), }
class ReceiverCreateRequest(base.SenlinObject): fields = {'receiver': fields.ObjectField('ReceiverCreateRequestBody')}
class ClusterPolicy(base.SenlinObject, base.VersionedObjectDictCompat): """Senlin cluster-policy binding object.""" fields = { 'id': fields.UUIDField(), 'cluster_id': fields.UUIDField(), 'policy_id': fields.UUIDField(), 'cluster': fields.ObjectField('Cluster', nullable=True), 'policy': fields.ObjectField('Policy', nullable=True), 'enabled': fields.BooleanField(), 'priority': fields.IntegerField(), 'data': fields.JsonField(nullable=True), 'last_op': fields.DateTimeField(nullable=True), } @staticmethod def _from_db_object(context, binding, db_obj): if db_obj is None: return None for field in binding.fields: if field == 'cluster': c = cluster_obj.Cluster.get(context, db_obj['cluster_id']) binding['cluster'] = c elif field == 'policy': p = policy_obj.Policy.get(context, db_obj['policy_id']) binding['policy'] = p else: binding[field] = db_obj[field] binding._context = context binding.obj_reset_changes() return binding @classmethod def create(cls, context, cluster_id, policy_id, values): obj = db_api.cluster_policy_attach(context, cluster_id, policy_id, values) return cls._from_db_object(context, cls(context), obj) @classmethod def get(cls, context, cluster_id, policy_id): obj = db_api.cluster_policy_get(context, cluster_id, policy_id) return cls._from_db_object(context, cls(), obj) @classmethod def get_by_type(cls, context, cluster_id, policy_type, filters=None): objs = db_api.cluster_policy_get_by_type(context, cluster_id, policy_type, filters=filters) return [cls._from_db_object(context, cls(), obj) for obj in objs] @classmethod def get_all(cls, context, cluster_id, **kwargs): objs = db_api.cluster_policy_get_all(context, cluster_id, **kwargs) return [cls._from_db_object(context, cls(), obj) for obj in objs] @classmethod def update(cls, context, cluster_id, policy_id, values): db_api.cluster_policy_update(context, cluster_id, policy_id, values) @classmethod def delete(cls, context, cluster_id, policy_id): db_api.cluster_policy_detach(context, cluster_id, policy_id) def cooldown_inprogress(self, cooldown): last_op = self.last_op if last_op and not timeutils.is_older_than(last_op, cooldown): return True return False def to_dict(self): binding_dict = { 'id': self.id, 'cluster_id': self.cluster.id, 'policy_id': self.policy.id, 'enabled': self.enabled, 'data': self.data, 'last_op': self.last_op, 'priority': self.priority, # below are derived data for user's convenience 'cluster_name': self.cluster.name, 'policy_name': self.policy.name, 'policy_type': self.policy.type, } return binding_dict
class ActionCreateRequest(base.SenlinObject): fields = {'action': fields.ObjectField('ActionCreateRequestBody')}
class TestNotificationEmptySchema(base.NotificationBase): VERSION = '1.0' fields = { 'payload': fields.ObjectField('TestPayloadEmptySchema') }
class ClusterPolicy(base.SenlinObject, base.VersionedObjectDictCompat): """Senlin cluster-policy binding object.""" fields = { 'id': fields.UUIDField(), 'cluster_id': fields.UUIDField(), 'policy_id': fields.UUIDField(), 'cluster': fields.ObjectField('Cluster', nullable=True), 'policy': fields.ObjectField('Policy', nullable=True), 'enabled': fields.BooleanField(), 'priority': fields.IntegerField(), 'data': fields.JsonField(nullable=True), 'last_op': fields.DateTimeField(nullable=True), } @staticmethod def _from_db_object(context, binding, db_obj): if db_obj is None: return None for field in binding.fields: if field == 'cluster': c = cluster_obj.Cluster.get(context, db_obj['cluster_id']) binding['cluster'] = c elif field == 'policy': p = policy_obj.Policy.get(context, db_obj['policy_id']) binding['policy'] = p else: binding[field] = db_obj[field] binding._context = context binding.obj_reset_changes() return binding @classmethod def create(cls, context, cluster_id, policy_id, values): obj = db_api.cluster_policy_attach(context, cluster_id, policy_id, values) return cls._from_db_object(context, cls(context), obj) @classmethod def get(cls, context, cluster_id, policy_id): obj = db_api.cluster_policy_get(context, cluster_id, policy_id) return cls._from_db_object(context, cls(), obj) @classmethod def get_by_type(cls, context, cluster_id, policy_type, filters=None): objs = db_api.cluster_policy_get_by_type(context, cluster_id, policy_type, filters=filters) return [cls._from_db_object(context, cls(), obj) for obj in objs] @classmethod def get_all(cls, context, cluster_id, **kwargs): objs = db_api.cluster_policy_get_all(context, cluster_id, **kwargs) return [cls._from_db_object(context, cls(), obj) for obj in objs] @classmethod def update(cls, context, cluster_id, policy_id, values): db_api.cluster_policy_update(context, cluster_id, policy_id, values) @classmethod def delete(cls, context, cluster_id, policy_id): db_api.cluster_policy_detach(context, cluster_id, policy_id)