Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / endpoints / aquarium / producer.py @ fc1e2f02

History | View | Annotate | Download (3.2 kB)

1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
import logging
35

    
36
from functools import wraps
37
from urlparse import urlparse
38

    
39
from astakos.im.settings import QUEUE_CONNECTION
40

    
41
if QUEUE_CONNECTION:
42
    from synnefo.lib.queue import (exchange_connect, exchange_send,
43
            exchange_close, UserEvent, Receipt
44
    )
45

    
46
QUEUE_CLIENT_ID = 3 # Astakos.
47
INSTANCE_ID = '1'
48
RESOURCE = 'addcredits'
49
DEFAULT_CREDITS = 1000
50

    
51
logging.basicConfig(format='%(asctime)s [%(levelname)s] %(name)s %(message)s',
52
        datefmt='%Y-%m-%d %H:%M:%S'
53
)
54
logger = logging.getLogger('endpoint.aquarium')
55

    
56
def wrapper(func):
57
    @wraps(func)
58
    def wrapper(*args, **kwargs):
59
        if not QUEUE_CONNECTION:
60
            return
61
        
62
        try:
63
            body, key = func(*args, **kwargs)
64
            conn = exchange_connect(QUEUE_CONNECTION)
65
            parts = urlparse(QUEUE_CONNECTION)
66
            exchange = parts.path[1:]
67
            routing_key = key % exchange
68
            exchange_send(conn, routing_key, body)
69
            exchange_close(conn)
70
        except BaseException, e:
71
            logger.exception(e)
72
    return wrapper
73

    
74
@wrapper
75
def report_user_event(user, create=False):
76
    eventType = 'create' if not create else 'modify'
77
    body = UserEvent(QUEUE_CLIENT_ID, user.email, user.is_active, eventType, {}
78
    ).format()
79
    routing_key = '%s.user'
80
    return body, routing_key
81

    
82
@wrapper
83
def report_user_credits_event(user):
84
    body = Receipt(QUEUE_CLIENT_ID, user.email, INSTANCE_ID, RESOURCE,
85
        DEFAULT_CREDITS, details={}
86
    ).format()
87
    routing_key = '%s.resource'
88
    return body, routing_key
89

    
90
def report_credits_event():
91
    # better approach?
92
    from astakos.im.models import AstakosUser
93
    map(report_user_credits_event, AstakosUser.objects.all())