Add pylint support
This update adds pylint to tox and zuul for stx-updates and resolves most warnings and errors, with some disabled for future resolution. Change-Id: Ic853202e4793bf89d687b50cbd740d364db85189 Story: 2003371 Task: 24832 Signed-off-by: Don Penney <don.penney@windriver.com>
This commit is contained in:
parent
9554c0609f
commit
2885d09ed2
10
.zuul.yaml
10
.zuul.yaml
@ -4,7 +4,17 @@
|
|||||||
jobs:
|
jobs:
|
||||||
- openstack-tox-linters
|
- openstack-tox-linters
|
||||||
- openstack-tox-pep8
|
- openstack-tox-pep8
|
||||||
|
- stx-updates-pylint
|
||||||
gate:
|
gate:
|
||||||
jobs:
|
jobs:
|
||||||
- openstack-tox-linters
|
- openstack-tox-linters
|
||||||
- openstack-tox-pep8
|
- openstack-tox-pep8
|
||||||
|
- stx-updates-pylint
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: stx-updates-pylint
|
||||||
|
parent: openstack-tox-pylint
|
||||||
|
required-projects:
|
||||||
|
- openstack/stx-config
|
||||||
|
- openstack/stx-fault
|
||||||
|
- openstack/stx-integ
|
||||||
|
@ -1 +1 @@
|
|||||||
TIS_PATCH_VER=25
|
TIS_PATCH_VER=26
|
||||||
|
@ -13,7 +13,6 @@ import glob
|
|||||||
from cgcs_patch.exceptions import PatchError
|
from cgcs_patch.exceptions import PatchError
|
||||||
from cgcs_patch.patch_controller import pc
|
from cgcs_patch.patch_controller import pc
|
||||||
|
|
||||||
import logging
|
|
||||||
from cgcs_patch.patch_functions import LOG
|
from cgcs_patch.patch_functions import LOG
|
||||||
|
|
||||||
|
|
||||||
@ -206,7 +205,7 @@ class PatchAPIController(object):
|
|||||||
force = True
|
force = True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = pc.patch_host_install(list(args)[0], force, async=True)
|
result = pc.patch_host_install(list(args)[0], force, async_req=True)
|
||||||
except PatchError as e:
|
except PatchError as e:
|
||||||
return dict(error="Error: %s" % e.message)
|
return dict(error="Error: %s" % e.message)
|
||||||
|
|
||||||
|
@ -6,13 +6,10 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from pecan import make_app
|
from pecan import make_app
|
||||||
from cgcs_patch import model
|
|
||||||
|
|
||||||
|
|
||||||
def setup_app(config):
|
def setup_app(config):
|
||||||
|
|
||||||
model.init_model()
|
|
||||||
|
|
||||||
return make_app(
|
return make_app(
|
||||||
config.app.root,
|
config.app.root,
|
||||||
static_root=config.app.static_root,
|
static_root=config.app.static_root,
|
||||||
|
@ -32,8 +32,8 @@ def get_pecan_config():
|
|||||||
|
|
||||||
|
|
||||||
def setup_app(pecan_config=None, extra_hooks=None):
|
def setup_app(pecan_config=None, extra_hooks=None):
|
||||||
config = ConfigParser.RawConfigParser()
|
config_parser = ConfigParser.RawConfigParser()
|
||||||
config.read('/etc/patching/patching.conf')
|
config_parser.read('/etc/patching/patching.conf')
|
||||||
|
|
||||||
policy.init()
|
policy.init()
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ def setup_app(pecan_config=None, extra_hooks=None):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if pecan_config.app.enable_acl:
|
if pecan_config.app.enable_acl:
|
||||||
return acl.install(app, config, pecan_config.app.acl_public_routes)
|
return acl.install(app, config_parser, pecan_config.app.acl_public_routes)
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
@ -24,7 +24,10 @@ class AuthTokenMiddleware(auth_token.AuthProtocol):
|
|||||||
for public routes in the API.
|
for public routes in the API.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, app, conf, public_api_routes=[]):
|
def __init__(self, app, conf, public_api_routes=None):
|
||||||
|
if public_api_routes is None:
|
||||||
|
public_api_routes = []
|
||||||
|
|
||||||
self.public_api_routes = set(public_api_routes)
|
self.public_api_routes = set(public_api_routes)
|
||||||
|
|
||||||
super(AuthTokenMiddleware, self).__init__(app, conf)
|
super(AuthTokenMiddleware, self).__init__(app, conf)
|
||||||
@ -33,6 +36,6 @@ class AuthTokenMiddleware(auth_token.AuthProtocol):
|
|||||||
path = utils.safe_rstrip(env.get('PATH_INFO'), '/')
|
path = utils.safe_rstrip(env.get('PATH_INFO'), '/')
|
||||||
|
|
||||||
if path in self.public_api_routes:
|
if path in self.public_api_routes:
|
||||||
return self.app(env, start_response)
|
return self.app(env, start_response) # pylint: disable=no-member
|
||||||
|
|
||||||
return super(AuthTokenMiddleware, self).__call__(env, start_response)
|
return super(AuthTokenMiddleware, self).__call__(env, start_response) # pylint: disable=too-many-function-args
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
import os
|
import os
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
import StringIO
|
import StringIO
|
||||||
import subprocess
|
|
||||||
import logging
|
import logging
|
||||||
import socket
|
import socket
|
||||||
import cgcs_patch.utils as utils
|
import cgcs_patch.utils as utils
|
||||||
|
@ -10,6 +10,7 @@ class PatchError(Exception):
|
|||||||
"""Base class for patching exceptions."""
|
"""Base class for patching exceptions."""
|
||||||
|
|
||||||
def __init__(self, message=None):
|
def __init__(self, message=None):
|
||||||
|
super(PatchError, self).__init__(message)
|
||||||
self.message = message
|
self.message = message
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -19,7 +19,7 @@ import sys
|
|||||||
import yaml
|
import yaml
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from rpmUtils.miscutils import stringToVersion
|
from rpmUtils.miscutils import stringToVersion # pylint: disable=import-error
|
||||||
|
|
||||||
from cgcs_patch.patch_functions import (configure_logging, LOG)
|
from cgcs_patch.patch_functions import (configure_logging, LOG)
|
||||||
import cgcs_patch.config as cfg
|
import cgcs_patch.config as cfg
|
||||||
@ -300,6 +300,7 @@ class PatchAgent(PatchService):
|
|||||||
self.query_id = 0
|
self.query_id = 0
|
||||||
self.state = constants.PATCH_AGENT_STATE_IDLE
|
self.state = constants.PATCH_AGENT_STATE_IDLE
|
||||||
self.last_config_audit = 0
|
self.last_config_audit = 0
|
||||||
|
self.rejection_timestamp = 0
|
||||||
|
|
||||||
# Check state flags
|
# Check state flags
|
||||||
if os.path.exists(patch_installing_file):
|
if os.path.exists(patch_installing_file):
|
||||||
|
@ -503,9 +503,9 @@ def patch_commit_req(debug, args):
|
|||||||
dry_run = True
|
dry_run = True
|
||||||
args.remove(constants.CLI_OPT_DRY_RUN)
|
args.remove(constants.CLI_OPT_DRY_RUN)
|
||||||
|
|
||||||
all = False
|
all_patches = False
|
||||||
if constants.CLI_OPT_ALL in args:
|
if constants.CLI_OPT_ALL in args:
|
||||||
all = True
|
all_patches = True
|
||||||
args.remove(constants.CLI_OPT_ALL)
|
args.remove(constants.CLI_OPT_ALL)
|
||||||
|
|
||||||
# Default to running release
|
# Default to running release
|
||||||
@ -526,11 +526,11 @@ def patch_commit_req(debug, args):
|
|||||||
|
|
||||||
headers = {}
|
headers = {}
|
||||||
append_auth_token_if_required(headers)
|
append_auth_token_if_required(headers)
|
||||||
if release and not all:
|
if release and not all_patches:
|
||||||
# Disallow
|
# Disallow
|
||||||
print "Use of --release option requires --all"
|
print "Use of --release option requires --all"
|
||||||
return 1
|
return 1
|
||||||
elif all:
|
elif all_patches:
|
||||||
# Get a list of all patches
|
# Get a list of all patches
|
||||||
extra_opts = "&release=%s" % relopt
|
extra_opts = "&release=%s" % relopt
|
||||||
url = "http://%s/patch/query?show=all%s" % (api_addr, extra_opts)
|
url = "http://%s/patch/query?show=all%s" % (api_addr, extra_opts)
|
||||||
|
@ -15,7 +15,7 @@ import ConfigParser
|
|||||||
import rpm
|
import rpm
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from rpmUtils.miscutils import stringToVersion
|
from rpmUtils.miscutils import stringToVersion # pylint: disable=import-error
|
||||||
|
|
||||||
from wsgiref import simple_server
|
from wsgiref import simple_server
|
||||||
from cgcs_patch.api import app
|
from cgcs_patch.api import app
|
||||||
@ -25,7 +25,7 @@ from cgcs_patch.patch_functions import \
|
|||||||
avail_dir, applied_dir, committed_dir, \
|
avail_dir, applied_dir, committed_dir, \
|
||||||
PatchFile, parse_rpm_filename, \
|
PatchFile, parse_rpm_filename, \
|
||||||
package_dir, repo_dir, SW_VERSION, root_package_dir
|
package_dir, repo_dir, SW_VERSION, root_package_dir
|
||||||
from cgcs_patch.exceptions import MetadataFail, RpmFail, PatchFail, PatchValidationFailure, PatchMismatchFailure
|
from cgcs_patch.exceptions import MetadataFail, RpmFail, PatchError, PatchFail, PatchValidationFailure, PatchMismatchFailure
|
||||||
from cgcs_patch.patch_functions import LOG
|
from cgcs_patch.patch_functions import LOG
|
||||||
from cgcs_patch.patch_functions import audit_log_info
|
from cgcs_patch.patch_functions import audit_log_info
|
||||||
from cgcs_patch.patch_functions import patch_dir, repo_root_dir
|
from cgcs_patch.patch_functions import patch_dir, repo_root_dir
|
||||||
@ -1733,7 +1733,6 @@ class PatchController(PatchService):
|
|||||||
raise PatchFail(msg)
|
raise PatchFail(msg)
|
||||||
|
|
||||||
release = None
|
release = None
|
||||||
all = False
|
|
||||||
patch_added = False
|
patch_added = False
|
||||||
failure = False
|
failure = False
|
||||||
recursive = True
|
recursive = True
|
||||||
@ -1945,7 +1944,7 @@ class PatchController(PatchService):
|
|||||||
|
|
||||||
return rc
|
return rc
|
||||||
|
|
||||||
def patch_host_install(self, host_ip, force, async=False):
|
def patch_host_install(self, host_ip, force, async_req=False):
|
||||||
msg_info = ""
|
msg_info = ""
|
||||||
msg_warning = ""
|
msg_warning = ""
|
||||||
msg_error = ""
|
msg_error = ""
|
||||||
@ -1960,7 +1959,7 @@ class PatchController(PatchService):
|
|||||||
if ip not in self.hosts:
|
if ip not in self.hosts:
|
||||||
# Translated successfully, but IP isn't in the table.
|
# Translated successfully, but IP isn't in the table.
|
||||||
# Raise an exception to drop out to the failure handling
|
# Raise an exception to drop out to the failure handling
|
||||||
raise
|
raise PatchError("Host IP (%s) not in table" % ip)
|
||||||
except:
|
except:
|
||||||
self.hosts_lock.release()
|
self.hosts_lock.release()
|
||||||
msg = "Unknown host specified: %s" % host_ip
|
msg = "Unknown host specified: %s" % host_ip
|
||||||
@ -1968,7 +1967,7 @@ class PatchController(PatchService):
|
|||||||
LOG.error("Error in host-install: " + msg)
|
LOG.error("Error in host-install: " + msg)
|
||||||
return dict(info=msg_info, warning=msg_warning, error=msg_error)
|
return dict(info=msg_info, warning=msg_warning, error=msg_error)
|
||||||
|
|
||||||
msg = "Running host-install for %s (%s), force=%s, async=%s" % (host_ip, ip, force, async)
|
msg = "Running host-install for %s (%s), force=%s, async_req=%s" % (host_ip, ip, force, async_req)
|
||||||
LOG.info(msg)
|
LOG.info(msg)
|
||||||
audit_log_info(msg)
|
audit_log_info(msg)
|
||||||
|
|
||||||
@ -1989,11 +1988,11 @@ class PatchController(PatchService):
|
|||||||
installreq.send(self.sock_out)
|
installreq.send(self.sock_out)
|
||||||
self.socket_lock.release()
|
self.socket_lock.release()
|
||||||
|
|
||||||
if async:
|
if async_req:
|
||||||
# async install requested, so return now
|
# async_req install requested, so return now
|
||||||
msg = "Patch installation request sent to %s." % self.hosts[ip].hostname
|
msg = "Patch installation request sent to %s." % self.hosts[ip].hostname
|
||||||
msg_info += msg + "\n"
|
msg_info += msg + "\n"
|
||||||
LOG.info("host-install async: " + msg)
|
LOG.info("host-install async_req: " + msg)
|
||||||
return dict(info=msg_info, warning=msg_warning, error=msg_error)
|
return dict(info=msg_info, warning=msg_warning, error=msg_error)
|
||||||
|
|
||||||
# Now we wait, up to ten mins... TODO: Wait on a condition
|
# Now we wait, up to ten mins... TODO: Wait on a condition
|
||||||
@ -2063,7 +2062,7 @@ class PatchController(PatchService):
|
|||||||
if ip not in self.hosts:
|
if ip not in self.hosts:
|
||||||
# Translated successfully, but IP isn't in the table.
|
# Translated successfully, but IP isn't in the table.
|
||||||
# Raise an exception to drop out to the failure handling
|
# Raise an exception to drop out to the failure handling
|
||||||
raise
|
raise PatchError("Host IP (%s) not in table" % ip)
|
||||||
except:
|
except:
|
||||||
self.hosts_lock.release()
|
self.hosts_lock.release()
|
||||||
msg = "Unknown host specified: %s" % host_ip
|
msg = "Unknown host specified: %s" % host_ip
|
||||||
@ -2132,7 +2131,7 @@ def get_handler_cls():
|
|||||||
handler = MyServerHandler(
|
handler = MyServerHandler(
|
||||||
self.rfile, self.wfile, self.get_stderr(), self.get_environ()
|
self.rfile, self.wfile, self.get_stderr(), self.get_environ()
|
||||||
)
|
)
|
||||||
handler.request_handler = self # backpointer for logging
|
handler.request_handler = self # pylint: disable=attribute-defined-outside-init
|
||||||
handler.run(self.server.get_app())
|
handler.run(self.server.get_app())
|
||||||
|
|
||||||
return MyHandler
|
return MyHandler
|
||||||
|
@ -147,7 +147,7 @@ def parse_rpm_filename(filename):
|
|||||||
# RPM name format is:
|
# RPM name format is:
|
||||||
# [<epoch>:]<pkgname>-<version>-<release>.<arch>
|
# [<epoch>:]<pkgname>-<version>-<release>.<arch>
|
||||||
#
|
#
|
||||||
pattern = re.compile('((([^:]):)?)(.*)-([^-]+)-(.*)\.([^\.]*)$')
|
pattern = re.compile(r'((([^:]):)?)(.*)-([^-]+)-(.*)\.([^\.]*)$')
|
||||||
|
|
||||||
m = pattern.match(basename)
|
m = pattern.match(basename)
|
||||||
|
|
||||||
@ -424,25 +424,26 @@ class PatchData:
|
|||||||
tree = ElementTree.parse(filename)
|
tree = ElementTree.parse(filename)
|
||||||
root = tree.getroot()
|
root = tree.getroot()
|
||||||
|
|
||||||
"""
|
#
|
||||||
<patch>
|
# <patch>
|
||||||
<id>PATCH_0001</id>
|
# <id>PATCH_0001</id>
|
||||||
<summary>Brief description</summary>
|
# <summary>Brief description</summary>
|
||||||
<description>Longer description</description>
|
# <description>Longer description</description>
|
||||||
<install_instructions/>
|
# <install_instructions/>
|
||||||
<warnings/>
|
# <warnings/>
|
||||||
<status>Dev</status>
|
# <status>Dev</status>
|
||||||
<unremovable/>
|
# <unremovable/>
|
||||||
<reboot_required/>
|
# <reboot_required/>
|
||||||
<personality type="compute">
|
# <personality type="compute">
|
||||||
<package>pkgA</package>
|
# <package>pkgA</package>
|
||||||
<package>pkgB</package>
|
# <package>pkgB</package>
|
||||||
</personality>
|
# </personality>
|
||||||
<personality type="controller">
|
# <personality type="controller">
|
||||||
<package>pkgB</package>
|
# <package>pkgB</package>
|
||||||
</personality>
|
# </personality>
|
||||||
</patch>
|
# </patch>
|
||||||
"""
|
#
|
||||||
|
|
||||||
patch_id = root.findtext("id")
|
patch_id = root.findtext("id")
|
||||||
if patch_id is None:
|
if patch_id is None:
|
||||||
LOG.error("Patch metadata contains no id tag")
|
LOG.error("Patch metadata contains no id tag")
|
||||||
@ -554,17 +555,17 @@ class PatchData:
|
|||||||
self.load_all_metadata(avail_dir, repostate=constants.AVAILABLE)
|
self.load_all_metadata(avail_dir, repostate=constants.AVAILABLE)
|
||||||
self.load_all_metadata(committed_dir, repostate=constants.COMMITTED)
|
self.load_all_metadata(committed_dir, repostate=constants.COMMITTED)
|
||||||
|
|
||||||
def gen_release_groups_xml(self, sw_version, dir=None):
|
def gen_release_groups_xml(self, sw_version, output_dir=None):
|
||||||
"""
|
"""
|
||||||
Generate the groups configuration file for the patching repo
|
Generate the groups configuration file for the patching repo
|
||||||
"""
|
"""
|
||||||
if dir is None:
|
if output_dir is None:
|
||||||
dir = repo_dir[sw_version]
|
output_dir = repo_dir[sw_version]
|
||||||
|
|
||||||
if not os.path.exists(dir):
|
if not os.path.exists(output_dir):
|
||||||
os.makedirs(dir)
|
os.makedirs(output_dir)
|
||||||
|
|
||||||
fname = "%s/comps.xml" % dir
|
fname = "%s/comps.xml" % output_dir
|
||||||
top = ElementTree.Element('comps')
|
top = ElementTree.Element('comps')
|
||||||
if sw_version in self.groups:
|
if sw_version in self.groups:
|
||||||
for groupname in sorted(self.groups[sw_version].keys()):
|
for groupname in sorted(self.groups[sw_version].keys()):
|
||||||
@ -993,7 +994,8 @@ class PatchFile:
|
|||||||
# Change back to original working dir
|
# Change back to original working dir
|
||||||
os.chdir(orig_wd)
|
os.chdir(orig_wd)
|
||||||
shutil.rmtree(tmpdir)
|
shutil.rmtree(tmpdir)
|
||||||
return r
|
|
||||||
|
return r
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def modify_patch(patch,
|
def modify_patch(patch,
|
||||||
@ -1039,7 +1041,8 @@ class PatchFile:
|
|||||||
# Change back to original working dir
|
# Change back to original working dir
|
||||||
os.chdir(orig_wd)
|
os.chdir(orig_wd)
|
||||||
shutil.rmtree(tmpdir)
|
shutil.rmtree(tmpdir)
|
||||||
return rc
|
|
||||||
|
return rc
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def extract_patch(patch,
|
def extract_patch(patch,
|
||||||
|
@ -8,9 +8,9 @@ SPDX-License-Identifier: Apache-2.0
|
|||||||
import os
|
import os
|
||||||
from Crypto.Signature import PKCS1_PSS
|
from Crypto.Signature import PKCS1_PSS
|
||||||
from Crypto.Hash import SHA256
|
from Crypto.Hash import SHA256
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA # pylint: disable=unused-import
|
||||||
from Crypto.Util.asn1 import DerSequence
|
from Crypto.Util.asn1 import DerSequence # pylint: disable=unused-import
|
||||||
from binascii import a2b_base64
|
from binascii import a2b_base64 # pylint: disable=unused-import
|
||||||
from cgcs_patch.patch_verify import read_RSA_key, cert_type_formal_str, cert_type_dev_str
|
from cgcs_patch.patch_verify import read_RSA_key, cert_type_formal_str, cert_type_dev_str
|
||||||
|
|
||||||
# To save memory, read and hash 1M of files at a time
|
# To save memory, read and hash 1M of files at a time
|
||||||
|
@ -59,7 +59,6 @@ def verify_hash(data_hash, signature_bytes, certificate_list):
|
|||||||
verified = verifier.verify(data_hash, signature_bytes)
|
verified = verifier.verify(data_hash, signature_bytes)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
verified = False
|
verified = False
|
||||||
pass
|
|
||||||
|
|
||||||
if not verified:
|
if not verified:
|
||||||
verifier = PKCS1_v1_5.new(pub_key)
|
verifier = PKCS1_v1_5.new(pub_key)
|
||||||
@ -67,11 +66,11 @@ def verify_hash(data_hash, signature_bytes, certificate_list):
|
|||||||
verified = verifier.verify(data_hash, signature_bytes)
|
verified = verifier.verify(data_hash, signature_bytes)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
verified = False
|
verified = False
|
||||||
pass
|
|
||||||
return verified
|
return verified
|
||||||
|
|
||||||
|
|
||||||
def get_public_certificates_by_type(cert_type=cert_type_all):
|
def get_public_certificates_by_type(cert_type=None):
|
||||||
"""
|
"""
|
||||||
Builds a list of accepted certificates which can be used to validate
|
Builds a list of accepted certificates which can be used to validate
|
||||||
further things. This list may contain multiple certificates depending on
|
further things. This list may contain multiple certificates depending on
|
||||||
@ -83,6 +82,9 @@ def get_public_certificates_by_type(cert_type=cert_type_all):
|
|||||||
:return: A list of certificates in PEM format
|
:return: A list of certificates in PEM format
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if cert_type is None:
|
||||||
|
cert_type = cert_type_all
|
||||||
|
|
||||||
cert_list = []
|
cert_list = []
|
||||||
|
|
||||||
if cert_type_formal_str in cert_type:
|
if cert_type_formal_str in cert_type:
|
||||||
|
@ -12,9 +12,8 @@ import logging
|
|||||||
import time
|
import time
|
||||||
import requests
|
import requests
|
||||||
import json
|
import json
|
||||||
import os
|
|
||||||
|
|
||||||
from daemon import runner
|
from daemon import runner # pylint: disable=no-name-in-module
|
||||||
from fm_api import fm_api
|
from fm_api import fm_api
|
||||||
from fm_api import constants as fm_constants
|
from fm_api import constants as fm_constants
|
||||||
|
|
||||||
|
218
pylint.rc
Executable file
218
pylint.rc
Executable file
@ -0,0 +1,218 @@
|
|||||||
|
[MASTER]
|
||||||
|
# Specify a configuration file.
|
||||||
|
rcfile=pylint.rc
|
||||||
|
|
||||||
|
# Python code to execute, usually for sys.path manipulation such as pygtk.require().
|
||||||
|
#init-hook=
|
||||||
|
|
||||||
|
# Add files or directories to the blacklist. They should be base names, not paths.
|
||||||
|
ignore=unit_test.py
|
||||||
|
|
||||||
|
# Pickle collected data for later comparisons.
|
||||||
|
persistent=yes
|
||||||
|
|
||||||
|
# List of plugins (as comma separated values of python modules names) to load,
|
||||||
|
# usually to register additional checkers.
|
||||||
|
load-plugins=
|
||||||
|
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
# Enable the message, report, category or checker with the given id(s). You can
|
||||||
|
# either give multiple identifier separated by comma (,) or put this option
|
||||||
|
# multiple time.
|
||||||
|
#enable=
|
||||||
|
|
||||||
|
# Disable the message, report, category or checker with the given id(s). You
|
||||||
|
# can either give multiple identifier separated by comma (,) or put this option
|
||||||
|
# multiple time (only on the command line, not in the configuration file where
|
||||||
|
# it should appear only once).
|
||||||
|
# W0603 Using the global statement warning
|
||||||
|
# W0612 Unused variable warning
|
||||||
|
# W0613 Unused argument warning
|
||||||
|
# W0702 bare-except
|
||||||
|
# W0703 broad except warning
|
||||||
|
# W1201 logging-not-lazy
|
||||||
|
disable=C, R, W0603, W0612, W0613, W0702, W0703, W1201
|
||||||
|
|
||||||
|
|
||||||
|
[REPORTS]
|
||||||
|
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||||
|
# (visual studio) and html
|
||||||
|
output-format=text
|
||||||
|
|
||||||
|
# Put messages in a separate file for each module / package specified on the
|
||||||
|
# command line instead of printing them on stdout. Reports (if any) will be
|
||||||
|
# written in a file name "pylint_global.[txt|html]".
|
||||||
|
files-output=no
|
||||||
|
|
||||||
|
# Tells whether to display a full report or only the messages
|
||||||
|
reports=no
|
||||||
|
|
||||||
|
# Python expression which should return a note less than 10 (10 is the highest
|
||||||
|
# note). You have access to the variables errors warning, statement which
|
||||||
|
# respectively contain the number of errors / warnings messages and the total
|
||||||
|
# number of statements analyzed. This is used by the global evaluation report
|
||||||
|
# (RP0004).
|
||||||
|
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||||
|
|
||||||
|
|
||||||
|
[SIMILARITIES]
|
||||||
|
# Minimum lines number of a similarity.
|
||||||
|
min-similarity-lines=4
|
||||||
|
|
||||||
|
# Ignore comments when computing similarities.
|
||||||
|
ignore-comments=yes
|
||||||
|
|
||||||
|
# Ignore docstrings when computing similarities.
|
||||||
|
ignore-docstrings=yes
|
||||||
|
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
# Maximum number of characters on a single line.
|
||||||
|
max-line-length=85
|
||||||
|
|
||||||
|
# Maximum number of lines in a module
|
||||||
|
max-module-lines=1000
|
||||||
|
|
||||||
|
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 tab).
|
||||||
|
indent-string=' '
|
||||||
|
|
||||||
|
|
||||||
|
[TYPECHECK]
|
||||||
|
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||||
|
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||||
|
ignore-mixin-members=yes
|
||||||
|
|
||||||
|
# List of classes names for which member attributes should not be checked
|
||||||
|
# (useful for classes with attributes dynamically set).
|
||||||
|
ignored-classes=rpm
|
||||||
|
|
||||||
|
# List of members which are set dynamically and missed by pylint inference
|
||||||
|
# system, and so shouldn't trigger E0201 when accessed. Python regular
|
||||||
|
# expressions are accepted.
|
||||||
|
generated-members=REQUEST,acl_users,aq_parent
|
||||||
|
|
||||||
|
|
||||||
|
[BASIC]
|
||||||
|
# List of builtins function names that should not be used, separated by a comma
|
||||||
|
bad-functions=map,filter,apply,input
|
||||||
|
|
||||||
|
# Regular expression which should only match correct module names
|
||||||
|
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct module level names
|
||||||
|
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct class names
|
||||||
|
class-rgx=[A-Z_][a-zA-Z0-9]+$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct function names
|
||||||
|
function-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct method names
|
||||||
|
method-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct instance attribute names
|
||||||
|
attr-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct argument names
|
||||||
|
argument-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct variable names
|
||||||
|
variable-rgx=[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match correct list comprehension /
|
||||||
|
# generator expression variable names
|
||||||
|
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
|
||||||
|
|
||||||
|
# Good variable names which should always be accepted, separated by a comma
|
||||||
|
good-names=i,j,k,ex,Run,_
|
||||||
|
|
||||||
|
# Bad variable names which should always be refused, separated by a comma
|
||||||
|
bad-names=foo,bar,baz,toto,tutu,tata
|
||||||
|
|
||||||
|
# Regular expression which should only match functions or classes name which do
|
||||||
|
# not require a docstring
|
||||||
|
no-docstring-rgx=__.*__
|
||||||
|
|
||||||
|
|
||||||
|
[MISCELLANEOUS]
|
||||||
|
# List of note tags to take in consideration, separated by a comma.
|
||||||
|
notes=FIXME,XXX,TODO
|
||||||
|
|
||||||
|
|
||||||
|
[VARIABLES]
|
||||||
|
# Tells whether we should check for unused import in __init__ files.
|
||||||
|
init-import=no
|
||||||
|
|
||||||
|
# A regular expression matching the beginning of the name of dummy variables
|
||||||
|
# (i.e. not used).
|
||||||
|
dummy-variables-rgx=_|dummy
|
||||||
|
|
||||||
|
# List of additional names supposed to be defined in builtins. Remember that
|
||||||
|
# you should avoid to define new builtins when possible.
|
||||||
|
additional-builtins=
|
||||||
|
|
||||||
|
|
||||||
|
[IMPORTS]
|
||||||
|
# Deprecated modules which should not be used, separated by a comma
|
||||||
|
deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
|
||||||
|
|
||||||
|
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||||
|
# given file (report RP0402 must not be disabled)
|
||||||
|
import-graph=
|
||||||
|
|
||||||
|
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
ext-import-graph=
|
||||||
|
|
||||||
|
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||||
|
# not be disabled)
|
||||||
|
int-import-graph=
|
||||||
|
|
||||||
|
|
||||||
|
[DESIGN]
|
||||||
|
# Maximum number of arguments for function / method
|
||||||
|
max-args=5
|
||||||
|
|
||||||
|
# Argument names that match this expression will be ignored. Default to name
|
||||||
|
# with leading underscore
|
||||||
|
ignored-argument-names=_.*
|
||||||
|
|
||||||
|
# Maximum number of locals for function / method body
|
||||||
|
max-locals=15
|
||||||
|
|
||||||
|
# Maximum number of return / yield for function / method body
|
||||||
|
max-returns=6
|
||||||
|
|
||||||
|
# Maximum number of branch for function / method body
|
||||||
|
max-branchs=12
|
||||||
|
|
||||||
|
# Maximum number of statements in function / method body
|
||||||
|
max-statements=50
|
||||||
|
|
||||||
|
# Maximum number of parents for a class (see R0901).
|
||||||
|
max-parents=7
|
||||||
|
|
||||||
|
# Maximum number of attributes for a class (see R0902).
|
||||||
|
max-attributes=7
|
||||||
|
|
||||||
|
# Minimum number of public methods for a class (see R0903).
|
||||||
|
min-public-methods=2
|
||||||
|
|
||||||
|
# Maximum number of public methods for a class (see R0904).
|
||||||
|
max-public-methods=20
|
||||||
|
|
||||||
|
|
||||||
|
[CLASSES]
|
||||||
|
# List of method names used to declare (i.e. assign) instance attributes.
|
||||||
|
defining-attr-methods=__init__,__new__,setUp
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a class method.
|
||||||
|
valid-classmethod-first-arg=cls
|
||||||
|
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
# Exceptions that will emit a warning when being caught. Defaults to
|
||||||
|
# "Exception"
|
||||||
|
overgeneral-exceptions=Exception
|
42
tox.ini
42
tox.ini
@ -1,5 +1,15 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2018 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
# Tox (http://tox.testrun.org/) is a tool for running tests
|
||||||
|
# in multiple virtualenvs. This configuration file will run the
|
||||||
|
# test suite on all supported python versions. To use it, "pip install tox"
|
||||||
|
# and then run "tox" from this directory.
|
||||||
[tox]
|
[tox]
|
||||||
envlist = linters,pep8
|
envlist = linters,pep8,py27,py35,pylint
|
||||||
minversion = 2.3
|
minversion = 2.3
|
||||||
skipsdist = True
|
skipsdist = True
|
||||||
|
|
||||||
@ -11,9 +21,18 @@ setenv = VIRTUAL_ENV={envdir}
|
|||||||
OS_STDERR_CAPTURE=1
|
OS_STDERR_CAPTURE=1
|
||||||
OS_TEST_TIMEOUT=60
|
OS_TEST_TIMEOUT=60
|
||||||
PYTHONDONTWRITEBYTECODE=True
|
PYTHONDONTWRITEBYTECODE=True
|
||||||
|
cgcs_patch_dir = {toxinidir}/cgcs-patch/cgcs-patch
|
||||||
|
cgcs_patch_src_dir = {[testenv]cgcs_patch_dir}/cgcs_patch
|
||||||
|
patch_alarm_dir = {toxinidir}/patch-alarm/patch-alarm
|
||||||
|
patch_alarm_src_dir = {[testenv]patch_alarm_dir}/patch_alarm
|
||||||
|
tsconfig_dir = {toxinidir}/tsconfig/tsconfig
|
||||||
|
tsconfig_src_dir = {[testenv]tsconfig_dir}/tsconfig
|
||||||
commands = find {toxinidir} -type f -not -path '{toxinidir}/.tox/*' -not -path '*/__pycache__/*' -name '*.py[c|o]' -delete
|
commands = find {toxinidir} -type f -not -path '{toxinidir}/.tox/*' -not -path '*/__pycache__/*' -name '*.py[c|o]' -delete
|
||||||
deps = -r{toxinidir}/requirements.txt
|
deps = -r{toxinidir}/requirements.txt
|
||||||
-r{toxinidir}/test-requirements.txt
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
{[testenv]cgcs_patch_dir}
|
||||||
|
{[testenv]patch_alarm_dir}
|
||||||
|
{[testenv]tsconfig_dir}
|
||||||
|
|
||||||
[testenv:linters]
|
[testenv:linters]
|
||||||
whitelist_externals = bash
|
whitelist_externals = bash
|
||||||
@ -66,3 +85,24 @@ whitelist_externals = cp
|
|||||||
recreate = True
|
recreate = True
|
||||||
commands = {[testenv]commands}
|
commands = {[testenv]commands}
|
||||||
|
|
||||||
|
[testenv:pylint]
|
||||||
|
deps = {[testenv]deps}
|
||||||
|
pylint
|
||||||
|
-e{toxinidir}/../stx-config/sysinv/sysinv/sysinv
|
||||||
|
-e{toxinidir}/../stx-fault/fm-api
|
||||||
|
pyCrypto
|
||||||
|
daemon
|
||||||
|
keystoneauth1
|
||||||
|
keystonemiddleware
|
||||||
|
netaddr
|
||||||
|
oslo_config
|
||||||
|
pecan
|
||||||
|
requests
|
||||||
|
requests_toolbelt
|
||||||
|
rpm
|
||||||
|
basepython = python2.7
|
||||||
|
commands = pylint {[testenv]cgcs_patch_src_dir} \
|
||||||
|
{[testenv]patch_alarm_src_dir} \
|
||||||
|
{[testenv]tsconfig_src_dir} \
|
||||||
|
--rcfile=./pylint.rc
|
||||||
|
|
||||||
|
@ -13,8 +13,6 @@ PLATFORM_SIMPLEX_FLAG=${PLATFORM_CONF_PATH}/simplex
|
|||||||
VOLATILE_PATH=/var/run
|
VOLATILE_PATH=/var/run
|
||||||
PLATFORM_PATH=/opt/platform
|
PLATFORM_PATH=/opt/platform
|
||||||
CONFIG_PATH=${PLATFORM_PATH}/config/${SW_VERSION}
|
CONFIG_PATH=${PLATFORM_PATH}/config/${SW_VERSION}
|
||||||
# TODO(mpeters) remove the PACKSTACK_PATH
|
|
||||||
PACKSTACK_PATH=${PLATFORM_PATH}/packstack/${SW_VERSION}
|
|
||||||
PUPPET_PATH=${PLATFORM_PATH}/puppet/${SW_VERSION}
|
PUPPET_PATH=${PLATFORM_PATH}/puppet/${SW_VERSION}
|
||||||
CGCS_PATH=/opt/cgcs
|
CGCS_PATH=/opt/cgcs
|
||||||
|
|
||||||
|
@ -154,17 +154,15 @@ def _load():
|
|||||||
|
|
||||||
_load()
|
_load()
|
||||||
|
|
||||||
''' Keep the following path and flag declarations in sync with the tsconfig
|
# Keep the following path and flag declarations in sync with the tsconfig
|
||||||
bash script.
|
# bash script.
|
||||||
'''
|
#
|
||||||
|
|
||||||
# Platform configuration paths and files
|
# Platform configuration paths and files
|
||||||
|
|
||||||
VOLATILE_PATH = "/var/run"
|
VOLATILE_PATH = "/var/run"
|
||||||
PLATFORM_PATH = "/opt/platform"
|
PLATFORM_PATH = "/opt/platform"
|
||||||
CONFIG_PATH = PLATFORM_PATH + "/config/" + SW_VERSION + "/"
|
CONFIG_PATH = PLATFORM_PATH + "/config/" + SW_VERSION + "/"
|
||||||
# TODO(mpeters) remove the PACKSTACK_PATH
|
|
||||||
PACKSTACK_PATH = PLATFORM_PATH + "/packstack/" + SW_VERSION + "/"
|
|
||||||
PUPPET_PATH = PLATFORM_PATH + "/puppet/" + SW_VERSION + "/"
|
PUPPET_PATH = PLATFORM_PATH + "/puppet/" + SW_VERSION + "/"
|
||||||
CGCS_PATH = "/opt/cgcs"
|
CGCS_PATH = "/opt/cgcs"
|
||||||
KEYRING_PATH = PLATFORM_PATH + "/.keyring/" + SW_VERSION
|
KEYRING_PATH = PLATFORM_PATH + "/.keyring/" + SW_VERSION
|
||||||
|
Loading…
x
Reference in New Issue
Block a user