Revision 38aff106

b/snf-astakos-app/README
133 133
                                            'unit': 'bytes',
134 134
                                            'uplimit': 5368709120}],
135 135
                                            'url': 'https://node2.example.com/ui/'}}
136
ASTAKOS_AQUARIUM_URL                        ''                                                                              The billing (aquarium) URI
137
                                                                                                                            e.g. ``http://localhost:8888/user``
138 136
ASTAKOS_PAGINATE_BY                         8                                                                               Number of object to be displayed per page
139 137
ASTAKOS_PAGINATE_BY_ALL                     15                                                                              Number of object to be displayed per pagein show all projects page
140 138

  
......
180 178
showuser         Show user info
181 179
===============  ===========================
182 180

  
183
To update user credibility from the billing system (Aquarium), enable the queue, install snf-pithos-tools and use ``pithos-dispatcher``::
184

  
185
    pithos-dispatcher --exchange=aquarium --callback=astakos.im.endpoints.aquarium.consumer.on_creditevent
/dev/null
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 requests
35

  
36
from django.utils import simplejson as json
37

  
38
from astakos.im.settings import AQUARIUM_URL
39

  
40

  
41
class AquariumClient():
42
    def get_billing(self, user, start, end):
43
        if not AQUARIUM_URL:
44
            return
45

  
46
        url = AQUARIUM_URL.rstrip('/')
47
        url = '%s/%s/bill/%d/%d' % (url, user, start, end)
48
        r = requests.get(url)
49
        try:
50
            return r.status_code, json.loads(r.text)
51
        except ValueError:
52
            pass
53
        return r.status_code, None
/dev/null
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
logging.basicConfig(format='%(asctime)s [%(levelname)s] %(name)s %(message)s',
37
                    datefmt='%Y-%m-%d %H:%M:%S'
38
                    )
39
logger = logging.getLogger('endpoint.aquarium')
40

  
41
from astakos.im.models import AstakosUser
42

  
43

  
44
def on_creditevent(msg):
45
    """
46
    Queue handler for updating AstakosUser has_credits
47
    """
48
    try:
49
        email = msg.get('userid')
50
        has_credits = msg.get('status') == 'on' or False
51
        user = AstakosUser.objects.get(email=email, is_active=True)
52
        user.has_credits = has_credits
53
        user.save()
54
    except BaseException, e:
55
        logger.exception(e)
/dev/null
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

  
57
def call(func):
58
    @wraps(func)
59
    def wrapper(*args, **kwargs):
60
        if not QUEUE_CONNECTION:
61
            return
62

  
63
        try:
64
            body, key = func(*args, **kwargs)
65
            conn = exchange_connect(QUEUE_CONNECTION)
66
            parts = urlparse(QUEUE_CONNECTION)
67
            exchange = parts.path[1:]
68
            routing_key = key % exchange
69
            exchange_send(conn, routing_key, body)
70
            exchange_close(conn)
71
        except BaseException, e:
72
            logger.exception(e)
73
    return wrapper
74

  
75

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

  
84

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

  
93

  
94
def report_credits_event():
95
    # better approach?
96
    from astakos.im.models import AstakosUser
97
    map(report_user_credits_event, AstakosUser.objects.all())
/dev/null
1
# Copyright 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
from optparse import make_option
35
from django.core.management.base import BaseCommand, CommandError
36
from django.db import transaction
37

  
38
from astakos.im.models import sync_projects
39

  
40
import logging
41
logger = logging.getLogger(__name__)
42

  
43
class Command(BaseCommand):
44
    help = """
45
    Check for and perform pending project synchronization.
46

  
47
    Synchronization is automatic when Astakos is running.
48
    This command provides manual access to the synchronization.
49

  
50
    Details:
51

  
52
    Changes in project resources and memberships (such as approving
53
    a project or accepting a member into it) are changes in policy
54
    that are recorded in Astakos. These changes have to be synchronized
55
    with the quota system so that they come in effect.
56

  
57
    The quotaholder service must be running.
58
    Astakos is not required, but there should be no harm if it is
59
    running, even if under online traffic.
60

  
61
    """
62
    option_list = BaseCommand.option_list + (
63
        make_option('--check',
64
                    action='store_true',
65
                    dest='check',
66
                    default=True,
67
                    help="Check if projects are in sync with quotaholder (default)"),
68
        make_option('--trigger',
69
                    action='store_true',
70
                    dest='trigger',
71
                    default=False,
72
                    help="Sync projects to quotaholder"),
73
    )
74

  
75
    @transaction.commit_on_success
76
    def handle(self, *args, **options):
77
        trigger = options['trigger']
78

  
79
        try:
80
            log = sync_projects(sync=trigger)
81
            pending, (modified, reactivating, deactivating) = log
82

  
83
            if pending:
84
                self.stdout.write("Memberships pending sync:\n")
85
                for m in pending:
86
                    self.stdout.write("%s\n" % (m))
87
                self.stdout.write("\n")
88

  
89
            if modified:
90
                self.stdout.write("Modified projects:\n")
91
                for p in modified:
92
                    self.stdout.write("%s\n" % (p))
93
                self.stdout.write("\n")
94

  
95
            if reactivating:
96
                self.stdout.write("Reactivating projects:\n")
97
                for p in reactivating:
98
                    self.stdout.write("%s\n" % (p))
99
                self.stdout.write("\n")
100

  
101
            if deactivating:
102
                self.stdout.write("Deactivating projects:\n")
103
                for p in deactivating:
104
                    self.stdout.write("%s\n" % (p))
105
                self.stdout.write("\n")
106

  
107
        except BaseException, e:
108
            logger.exception(e)
109
            raise CommandError("Syncing failed.")
b/snf-astakos-app/astakos/im/settings.py
162 162
QUOTAHOLDER_TOKEN = getattr(settings, 'ASTAKOS_QUOTAHOLDER_TOKEN', '')
163 163
QUOTAHOLDER_POOLSIZE = getattr(settings, 'ASTAKOS_QUOTAHOLDER_POOLSIZE', 50)
164 164

  
165
# Set the billing URI
166
AQUARIUM_URL = getattr(settings, 'ASTAKOS_AQUARIUM_URL', '')
167

  
168 165
# Set how many objects should be displayed per page
169 166
PAGINATE_BY = getattr(settings, 'ASTAKOS_PAGINATE_BY', 8)
170 167

  

Also available in: Unified diff