Revision 9c0c8aa9

b/snf-pithos-app/pithos/api/management/commands/pithos-usage.py
89 89
        s = s.group_by(table['versions'].c.cluster)
90 90
        s = s.where(table['nodes'].c.node == table['versions'].c.node)
91 91
        s = s.where(table['nodes'].c.node.in_(select_descendants))
92
        s = s.where(table['versions'].c.cluster == CLUSTER_NORMAL)
92 93
        d2 = dict(conn.execute(s).fetchall())
93 94

  
94
        for cluster in clusters:
95
            try:
96
                size = d2[cluster]
97
            except KeyError:
98
                size = 0
99
            append(Statistics(
100
                node=node,
101
                path=path,
102
                size=size,
103
                cluster=cluster))
95
        try:
96
            size = d2[CLUSTER_NORMAL]
97
        except KeyError:
98
            size = 0
99
        append(Statistics(
100
            node=node,
101
            path=path,
102
            size=size,
103
            cluster=CLUSTER_NORMAL))
104 104
    return statistics
105 105

  
106

  
107
def _get_verified_usage(statistics):
106
def _verify_statistics(item):
107
    """Verify statistics"""
108
    s = select([table['statistics'].c.size])
109
    s = s.where(table['statistics'].c.node == item.node)
110
    s = s.where(table['statistics'].c.cluster == item.cluster)
111
    db_item = conn.execute(s).fetchone()
112
    if not db_item:
113
        return
114
    try:
115
        assert item.size == db_item.size, \
116
                '%d[%s][%d], size: %d != %d' % (
117
                        item.node, item.path, item.cluster,
118
                        item.size, db_item.size)
119
    except AssertionError, e:
120
        print e
121

  
122
def _prepare_reset_holding(statistics, verify=False):
108 123
    """Verify statistics and set quotaholder user usage"""
109 124
    reset_holding = []
110 125
    append = reset_holding.append
111 126
    for item in statistics:
112
        s = select([table['statistics'].c.size])
113
        s = s.where(table['statistics'].c.node == item.node)
114
        s = s.where(table['statistics'].c.cluster == item.cluster)
115
        db_item = conn.execute(s).fetchone()
116
        if not db_item:
117
            continue
118
        try:
119
            assert item.size == db_item.size, \
120
                    '%d[%s][%d], size: %d != %d' % (
121
                            item.node, item.path, item.cluster,
122
                            item.size, db_item.size)
123
        except AssertionError, e:
124
            print e
127
        if verify:
128
            _verify_statistics(item)
125 129
        if item.cluster == CLUSTER_NORMAL:
126 130
            append(ResetHoldingPayload(
127 131
                    entity=item.path,
......
148 152
                    action="store_true",
149 153
                    default=False,
150 154
                    help="Reset usage for all or specified users"),
155
        make_option('--verify',
156
                    dest='verify',
157
                    action="store_true",
158
                    default=False,
159
                    help=("Verify statistics consistency for all "
160
                          "or specified users")),
151 161
        make_option('--user',
152 162
                    dest='users',
153 163
                    action='append',
......
162 172
                if not user_nodes:
163 173
                    raise CommandError('No users found.')
164 174
                statistics = _compute_statistics(user_nodes)
165
                reset_holding = _get_verified_usage(statistics)
175
                reset_holding = _prepare_reset_holding(
176
                        statistics, verify=options['verify']
177
                )
166 178
                print '\n'.join([str(i) for i in reset_holding])
167 179

  
168 180
            if options['reset']:

Also available in: Unified diff