f62039a851
psutil 2.x and above has a lot of API changes as described in: https://github.com/giampaolo/psutil/blob/master/HISTORY.rst So we should work correctly with both old and new psutil versions by using a version check and use the correct method/attributes. Note that we cannot remove the g-r cap until all the projects have switched to oslo.reports (OR we fix oslo-incubator GMR code and have sync'ed all the consuming projects). So this review is the first step in a long process of switching all consumers of GMR to use what we have in oslo.reports. Depends-On: I0f07858e96ea3baf46f8a453e253b9ed29c7f7e2 Depends-On: I33bd2d9dff9cb7dc1a50177db7286b7317966784 Closes-Bug: #1430231 Change-Id: I52bc6898d098f599c12204fc6d6eb269e2c884cb
74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
# Copyright 2014 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Provides a process model
|
|
|
|
This module defines a class representing a process,
|
|
potentially with subprocesses.
|
|
"""
|
|
|
|
import psutil
|
|
|
|
import oslo_reports.models.with_default_views as mwdv
|
|
import oslo_reports.views.text.process as text_views
|
|
|
|
PS1 = psutil.version_info[0] == 1
|
|
|
|
|
|
class ProcessModel(mwdv.ModelWithDefaultViews):
|
|
"""A Process Model
|
|
|
|
This model holds data about a process,
|
|
including references to any subprocesses
|
|
|
|
:param process: a :class:`psutil.Process` object
|
|
"""
|
|
|
|
def __init__(self, process):
|
|
super(ProcessModel, self).__init__(
|
|
text_view=text_views.ProcessView())
|
|
|
|
self['pid'] = process.pid
|
|
self['parent_pid'] = (process.ppid if PS1 else process.ppid())
|
|
if hasattr(process, 'uids'):
|
|
self['uids'] = {
|
|
'real': (process.uids.real if PS1 else process.uids().real),
|
|
'effective': (process.uids.effective if PS1
|
|
else process.uids().effective),
|
|
'saved': (process.uids.saved if PS1 else process.uids().saved)
|
|
}
|
|
else:
|
|
self['uids'] = {'real': None,
|
|
'effective': None,
|
|
'saved': None}
|
|
|
|
if hasattr(process, 'gids'):
|
|
self['gids'] = {
|
|
'real': (process.gids.real if PS1 else process.gids().real),
|
|
'effective': (process.gids.effective if PS1
|
|
else process.gids().effective),
|
|
'saved': (process.gids.saved if PS1 else process.gids().saved)
|
|
}
|
|
else:
|
|
self['gids'] = {'real': None,
|
|
'effective': None,
|
|
'saved': None}
|
|
|
|
self['username'] = process.username if PS1 else process.username()
|
|
self['command'] = process.cmdline if PS1 else process.cmdline()
|
|
self['state'] = process.status if PS1 else process.status()
|
|
|
|
children = process.get_children() if PS1 else process.children()
|
|
self['children'] = [ProcessModel(pr) for pr in children]
|