Revision f600b74e snf-cyclades-app/synnefo/quotas/management/commands/enforce-resources-cyclades.py

b/snf-cyclades-app/synnefo/quotas/management/commands/enforce-resources-cyclades.py
60 60
                          "of users, e.g uuid1,uuid2")),
61 61
        make_option("--exclude-users",
62 62
                    help=("Exclude list of users from resource enforcement")),
63
        make_option("--projects",
64
                    help=("Enforce resources only for the specified list "
65
                          "of projects, e.g uuid1,uuid2")),
66
        make_option("--exclude-projects",
67
                    help=("Exclude list of projects from resource enforcement")
68
                    ),
63 69
        make_option("--resources",
64 70
                    help="Specify resources to check, default: %s" %
65 71
                    ",".join(DEFAULT_RESOURCES)),
......
110 116
        write = self.stderr.write
111 117
        fix = options["fix"]
112 118
        force = options["force"]
119
        handlers = self.get_handlers(options["resources"])
113 120
        maxops = options["max_operations"]
114 121
        if maxops is not None:
115 122
            try:
......
126 133
                m = "Expected integer shutdown timeout."
127 134
                raise CommandError(m)
128 135

  
129
        users = options['users']
130
        if users is not None:
131
            users = users.split(',')
136
        excluded_users = options['exclude_users']
137
        excluded_users = set(excluded_users.split(',')
138
                             if excluded_users is not None else [])
132 139

  
133
        excluded = options['exclude_users']
134
        excluded = set(excluded.split(',') if excluded is not None else [])
140
        users_to_check = options['users']
141
        if users_to_check is not None:
142
            users_to_check = set(users_to_check.split(',')) - excluded_users
143

  
144
        try:
145
            qh_holdings = util.get_qh_users_holdings(users_to_check)
146
        except errors.AstakosClientException as e:
147
            raise CommandError(e)
148

  
149
        excluded_projects = options["exclude_projects"]
150
        excluded_projects = set(excluded_projects.split(',')
151
                                if excluded_projects is not None else [])
152

  
153
        projects_to_check = options["projects"]
154
        if projects_to_check is not None:
155
            projects_to_check = set(projects_to_check.split(',')) - \
156
                excluded_projects
135 157

  
136
        handlers = self.get_handlers(options["resources"])
137 158
        try:
138
            qh_holdings = util.get_qh_users_holdings(users)
159
            qh_project_holdings = util.get_qh_project_holdings(
160
                projects_to_check)
139 161
        except errors.AstakosClientException as e:
140 162
            raise CommandError(e)
141 163

  
164
        qh_project_holdings = sorted(qh_project_holdings.items())
142 165
        qh_holdings = sorted(qh_holdings.items())
143 166
        resources = set(h[0] for h in handlers)
144 167
        dangerous = bool(resources.difference(DEFAULT_RESOURCES))
......
147 170
        actions = {}
148 171
        overlimit = []
149 172
        viol_id = 0
173

  
174
        for resource, handle_resource, resource_type in handlers:
175
            if resource_type not in actions:
176
                actions[resource_type] = OrderedDict()
177
            actual_resources = enforce.get_actual_resources(
178
                resource_type, projects=projects_to_check)
179
            for project, project_quota in qh_project_holdings:
180
                if enforce.skip_check(project, projects_to_check,
181
                                      excluded_projects):
182
                    continue
183
                try:
184
                    qh = util.transform_project_quotas(project_quota)
185
                    qh_value, qh_limit, qh_pending = qh[resource]
186
                except KeyError:
187
                    write("Resource '%s' does not exist in Quotaholder"
188
                          " for project '%s'!\n" %
189
                          (resource, project))
190
                    continue
191
                if qh_pending:
192
                    write("Pending commission for project '%s', "
193
                          "resource '%s'. Skipping\n" %
194
                          (project, resource))
195
                    continue
196
                diff = qh_value - qh_limit
197
                if diff > 0:
198
                    viol_id += 1
199
                    overlimit.append((viol_id, "project", project, "",
200
                                      resource, qh_limit, qh_value))
201
                    relevant_resources = enforce.pick_project_resources(
202
                        actual_resources[project], users=users_to_check,
203
                        excluded_users=excluded_users)
204
                    handle_resource(viol_id, resource, relevant_resources,
205
                                    diff, actions)
206

  
150 207
        for resource, handle_resource, resource_type in handlers:
151 208
            if resource_type not in actions:
152 209
                actions[resource_type] = OrderedDict()
153 210
            actual_resources = enforce.get_actual_resources(resource_type,
154
                                                            users)
211
                                                            users_to_check)
155 212
            for user, user_quota in qh_holdings:
156
                if user in excluded:
213
                if enforce.skip_check(user, users_to_check, excluded_users):
157 214
                    continue
158 215
                for source, source_quota in user_quota.iteritems():
216
                    if enforce.skip_check(source, projects_to_check,
217
                                          excluded_projects):
218
                        continue
159 219
                    try:
160 220
                        qh = util.transform_quotas(source_quota)
161 221
                        qh_value, qh_limit, qh_pending = qh[resource]
......
172 232
                    diff = qh_value - qh_limit
173 233
                    if diff > 0:
174 234
                        viol_id += 1
175
                        overlimit.append((viol_id, user, source, resource,
176
                                          qh_limit, qh_value))
177
                        relevant_resources = actual_resources[user]
235
                        overlimit.append((viol_id, "user", user, source,
236
                                          resource, qh_limit, qh_value))
237
                        relevant_resources = actual_resources[source][user]
178 238
                        handle_resource(viol_id, resource, relevant_resources,
179 239
                                        diff, actions)
180 240

  
......
182 242
            write("No violations.\n")
183 243
            return
184 244

  
185
        headers = ("#", "User", "Source", "Resource", "Limit", "Usage")
245
        headers = ("#", "Type", "Holder", "Source", "Resource", "Limit",
246
                   "Usage")
186 247
        pprint_table(self.stdout, overlimit, headers,
187 248
                     options["output_format"], title="Violations")
188 249

  

Also available in: Unified diff