[Kimchi-devel] [PATCH V2] [Wok] Implement Asynchronous Notifications backend

Lucio Correia luciojhc at linux.vnet.ibm.com
Wed Mar 30 18:37:10 UTC 2016


On 30-03-2016 11:14, Paulo Ricardo Paz Vital wrote:
> Few comments and questions...
>
> On Mar 29 05:02PM, Lucio Correia wrote:
>> * There is no POST method: a notification is
>> added through add_notification() method.
>> * Notifications are always stored in Wok object store under
>> 'notification' type, even if added by a plugin.
>> * Every time Wok is started, all notifications are erased,
>> since this is a UI feature, intended to be showed to the
>> user asynchronously, independent of which tab is opened.
>>
>> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
>> ---
>>   docs/API/notifications.md        | 34 ++++++++++++++++++++++++
>>   src/wok/control/notifications.py | 37 ++++++++++++++++++++++++++
>>   src/wok/i18n.py                  |  3 +++
>>   src/wok/model/notifications.py   | 56 ++++++++++++++++++++++++++++++++++++++++
>>   src/wok/objectstore.py           | 39 ++++++++++++++++++++++++++++
>>   src/wok/server.py                |  4 +++
>>   6 files changed, 173 insertions(+)
>>   create mode 100644 docs/API/notifications.md
>>   create mode 100644 src/wok/control/notifications.py
>>   create mode 100644 src/wok/model/notifications.py
>>
>> Changes in V2:
>>   - added timestamp
>>   - code as required parameter in add_notification
>>   - added DELETE api for notification
>>
>> This patch depends on WokMessage V3 patch
>>
>> diff --git a/docs/API/notifications.md b/docs/API/notifications.md
>
> Why a new file here? Is it not part of the Kimchi API?

The API dir have separated files per API.


>
>> new file mode 100644
>> index 0000000..851352f
>> --- /dev/null
>> +++ b/docs/API/notifications.md
>> @@ -0,0 +1,34 @@
>> +## REST API Specification for Notifications
>> +
>> +### Collection: Notifications
>> +
>> +**URI:** /notifications
>> +
>> +**Methods:**
>> +
>> +* **GET**: Retrieve a summarized list of current Notifications
>> +
>> +#### Examples
>> +GET /notifications
>> +[{Notification1}, {Notification2}, ...]
>> +
>> +### Resource: Notification
>> +
>> +**URI:** /notifications/*:id*
>> +
>> +A task represents an asynchronous operation that is being performed by the
>> +server.
>> +
>> +**Methods:**
>> +
>> +* **GET**: Retrieve the full description of the Notification
>> +    * code: message ID
>> +    * message: message text already translated
>> +
>> +#### Examples
>> +GET /notifications/KCHLIBVIRT0001W
>> +{
>> + id: "KCHLIBVIRT0001W",
>> + message: "KCHLIBVIRT0001W: Lack of storage space in guest vm-1",
>> + timestamp: first time notification was emitted
>> +}
>> diff --git a/src/wok/control/notifications.py b/src/wok/control/notifications.py
>> new file mode 100644
>> index 0000000..37d45f2
>> --- /dev/null
>> +++ b/src/wok/control/notifications.py
>> @@ -0,0 +1,37 @@
>> +#
>> +# Project Wok
>> +#
>> +# Copyright IBM Corp, 2016
>> +#
>> +# This library is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU Lesser General Public
>> +# License as published by the Free Software Foundation; either
>> +# version 2.1 of the License, or (at your option) any later version.
>> +#
>> +# This library is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +# Lesser General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU Lesser General Public
>> +# License along with this library; if not, write to the Free Software
>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
>> +
>> +from wok.control.base import Collection, Resource
>> +from wok.control.utils import UrlSubNode
>> +
>> +
>> + at UrlSubNode('notifications', True)
>> +class Notifications(Collection):
>> +    def __init__(self, model):
>> +        super(Notifications, self).__init__(model)
>> +        self.resource = Notification
>> +
>> +
>> +class Notification(Resource):
>> +    def __init__(self, model, id):
>> +        super(Notification, self).__init__(model, id)
>> +
>> +    @property
>> +    def data(self):
>> +        return self.info
>> diff --git a/src/wok/i18n.py b/src/wok/i18n.py
>> index e6087f4..5a2876f 100644
>> --- a/src/wok/i18n.py
>> +++ b/src/wok/i18n.py
>> @@ -45,6 +45,9 @@ messages = {
>>       "WOKLOG0001E": _("Invalid filter parameter. Filter parameters allowed: %(filters)s"),
>>       "WOKLOG0002E": _("Creation of log file failed: %(err)s"),
>>
>> +    "WOKNOT0001E": _("Unable to find notification %(id)s"),
>> +    "WOKNOT0002E": _("Unable to delete notification %(id)s: %(message)s"),
>> +
>>       "WOKOBJST0001E": _("Unable to find %(item)s in datastore"),
>>
>>       "WOKUTILS0001E": _("Unable to reach %(url)s. Make sure it is accessible and try again."),
>> diff --git a/src/wok/model/notifications.py b/src/wok/model/notifications.py
>> new file mode 100644
>> index 0000000..77184db
>> --- /dev/null
>> +++ b/src/wok/model/notifications.py
>> @@ -0,0 +1,56 @@
>> +#
>> +# Project Wok
>> +#
>> +# Copyright IBM Corp, 2016
>> +#
>> +# This library is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU Lesser General Public
>> +# License as published by the Free Software Foundation; either
>> +# version 2.1 of the License, or (at your option) any later version.
>> +#
>> +# This library is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +# Lesser General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU Lesser General Public
>> +# License along with this library; if not, write to the Free Software
>> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
>> +
>> +from wok.exception import NotFoundError, OperationFailed
>> +from wok.message import WokMessage
>> +
>> +
>> +class NotificationsModel(object):
>> +    def __init__(self, **kargs):
>> +        self.objstore = kargs['objstore']
>> +
>> +    def get_list(self):
>> +        with self.objstore as session:
>> +            return session.get_list('notification')
>> +
>> +
>> +class NotificationModel(object):
>> +    def __init__(self, **kargs):
>> +        self.objstore = kargs['objstore']
>> +
>> +    def lookup(self, id):
>> +        with self.objstore as session:
>> +            notification = session.get('notification', str(id))
>> +
>> +            # use WokMessage to translate the notification
>> +            if notification:
>> +                timestamp = notification['timestamp']
>> +                plugin = notification.pop('_plugin_name', None)
>> +                message = WokMessage(id, notification, plugin).get_text()
>> +                return {"code": id, "message": message, "timestamp": timestamp}
>> +
>> +        raise NotFoundError("WOKNOT0001E", {'id': str(id)})
>> +
>> +    def delete(self, id):
>> +        try:
>> +            with self.objstore as session:
>> +                session.delete('notification', str(id))
>> +        except Exception as e:
>> +            raise OperationFailed("WOKNOT0002E", {'id': str(id),
>> +                                                  'msg': e.msg()})
>> diff --git a/src/wok/objectstore.py b/src/wok/objectstore.py
>> index 59354f3..dbc3ee3 100644
>> --- a/src/wok/objectstore.py
>> +++ b/src/wok/objectstore.py
>> @@ -23,6 +23,8 @@ import sqlite3
>>   import threading
>>   import traceback
>>
>> +from datetime import datetime
>> +
>>   try:
>>       from collections import OrderedDict
>>   except ImportError:
>> @@ -144,3 +146,40 @@ class ObjectStore(object):
>>                   # exception again
>>                   wok_log.error(traceback.format_exc())
>>                   return False
>> +
>> +
>> +def add_notification(code, args={}, plugin_name=None):
>> +    if not code:
>> +        wok_log.error("Unable to add notification: invalide code '%(code)s'" %
>
> s/invalide/invalid

OK will fix.


-- 
Lucio Correia
Software Engineer
IBM LTC Brazil




More information about the Kimchi-devel mailing list