Skip to content

Commit a778bfb

Browse files
authored
Merge pull request #46 from rnetser/align_code
4.11 - Align code to main
2 parents 5a3a7aa + ed056e9 commit a778bfb

File tree

11 files changed

+148
-262
lines changed

11 files changed

+148
-262
lines changed

.flake8

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
[flake8]
2-
max-line-length = 120
32
exclude =
43
doc,
54
.tox,
@@ -10,9 +9,9 @@ exclude =
109
.cache/*
1110

1211
enable-extensions =
13-
FCFN,
12+
FCN,
1413

15-
fcfn_exclude_functions =
14+
fcn_exclude_functions =
1615
LOGGER,
1716
os,
1817
fd,

.github/workflows/create-auto-pr-for-merge-pr-in-main.yml.xxx

Lines changed: 0 additions & 19 deletions
This file was deleted.

.github/workflows/upload-to-pypi.yml.xxxx

Lines changed: 0 additions & 21 deletions
This file was deleted.

.pre-commit-config.yaml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ repos:
1212
- --remove-all-unused-imports
1313

1414
- repo: https://github.com/hadialqattan/pycln
15-
rev: "v1.2.5"
15+
rev: "v2.1.1"
1616
hooks:
1717
- id: pycln
1818

@@ -22,12 +22,12 @@ repos:
2222
- id: isort
2323

2424
- repo: https://github.com/psf/black
25-
rev: "22.3.0"
25+
rev: "22.6.0"
2626
hooks:
2727
- id: black
2828

2929
- repo: https://github.com/pre-commit/pre-commit-hooks
30-
rev: "v4.1.0"
30+
rev: "v4.3.0"
3131
hooks:
3232
- id: check-merge-conflict
3333
- id: debug-statements
@@ -38,16 +38,17 @@ repos:
3838
- id: check-builtin-literals
3939

4040
- repo: https://github.com/PyCQA/flake8
41-
rev: "4.0.1"
41+
rev: "5.0.4"
4242
hooks:
4343
- id: flake8
44+
args: [--max-line-length=120]
4445
additional_dependencies: [
4546
"git+https://github.com/RedHatQE/flake8-plugins.git",
4647
"pep8-naming",
4748
"flake8-mutable",
4849
]
4950

5051
- repo: https://github.com/Yelp/detect-secrets
51-
rev: v1.2.0
52+
rev: v1.3.0
5253
hooks:
5354
- id: detect-secrets

ocp_utilities/exceptions.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
class ClusterSanityError(Exception):
2-
def __init__(self, err_str):
3-
self.err_str = err_str
1+
class NodeNotReadyError(Exception):
2+
pass
43

5-
def __str__(self):
6-
return self.err_str
4+
5+
class NodeUnschedulableError(Exception):
6+
pass

ocp_utilities/file_utils.py

Lines changed: 0 additions & 59 deletions
This file was deleted.

ocp_utilities/infra.py

Lines changed: 11 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,43 @@
1-
import logging
2-
import subprocess
1+
from ocp_utilities.exceptions import NodeNotReadyError, NodeUnschedulableError
2+
from ocp_utilities.logger import get_logger
33

4-
import kubernetes as kubernetes
5-
from kubernetes.dynamic import DynamicClient
64

7-
from ocp_utilities.exceptions import ClusterSanityError
5+
LOGGER = get_logger(name=__name__)
86

97

10-
LOGGER = logging.getLogger(__name__)
11-
12-
13-
def validate_nodes_ready(nodes):
8+
def assert_nodes_ready(nodes):
149
"""
1510
Validates all nodes are in ready
1611
1712
Args:
1813
nodes(list): List of Node objects
1914
2015
Raises:
21-
AssertionError: Assert on node(s) in not ready state
16+
NodeNotReadyError: Assert on node(s) in not ready state
2217
"""
2318
LOGGER.info("Verify all nodes are ready.")
2419
not_ready_nodes = [node.name for node in nodes if not node.kubelet_ready]
2520
if not_ready_nodes:
26-
raise ClusterSanityError(
27-
err_str=f"Following nodes are not in ready state: {not_ready_nodes}",
21+
raise NodeNotReadyError(
22+
f"Following nodes are not in ready state: {not_ready_nodes}"
2823
)
2924

3025

31-
def validate_nodes_schedulable(nodes):
26+
def assert_nodes_schedulable(nodes):
3227
"""
3328
Validates all nodes are in schedulable state
3429
3530
Args:
3631
nodes(list): List of Node objects
3732
3833
Raises:
39-
AssertionError: Asserts on node(s) not schedulable
34+
NodeUnschedulableError: Asserts on node(s) not schedulable
4035
"""
4136
LOGGER.info("Verify all nodes are schedulable.")
4237
unschedulable_nodes = [
4338
node.name for node in nodes if node.instance.spec.unschedulable
4439
]
4540
if unschedulable_nodes:
46-
raise ClusterSanityError(
47-
err_str=f"Following nodes are in unschedulable state: {unschedulable_nodes}",
41+
raise NodeUnschedulableError(
42+
f"Following nodes are in unscheduled state: {unschedulable_nodes}"
4843
)
49-
50-
51-
def get_admin_client():
52-
return DynamicClient(client=kubernetes.config.new_client_from_config())
53-
54-
55-
def run_command(command, verify_stderr=True, shell=False):
56-
"""
57-
Run command locally.
58-
59-
Args:
60-
command (list): Command to run
61-
verify_stderr (bool, default True): Check command stderr
62-
shell (bool, default False): run subprocess with shell toggle
63-
64-
Returns:
65-
tuple: True, out if command succeeded, False, err otherwise.
66-
"""
67-
sub_process = subprocess.Popen(
68-
command,
69-
stdout=subprocess.PIPE,
70-
stderr=subprocess.PIPE,
71-
shell=shell,
72-
)
73-
out, err = sub_process.communicate()
74-
out_decoded = out.decode("utf-8")
75-
err_decoded = err.decode("utf-8")
76-
77-
error_msg = f"Failed to run {command}. rc: {sub_process.returncode}, out: {out_decoded}, error: {err_decoded}"
78-
if sub_process.returncode != 0:
79-
LOGGER.error(error_msg)
80-
return False, out_decoded, err_decoded
81-
82-
# From this point and onwards we are guaranteed that sub_process.returncode == 0
83-
if err_decoded and verify_stderr:
84-
LOGGER.error(error_msg)
85-
return False, out_decoded, err_decoded
86-
87-
return True, out_decoded, err_decoded

ocp_utilities/logger.py

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
2-
import shutil
2+
import os
3+
from datetime import datetime
34
from logging.handlers import RotatingFileHandler
45

56
from colorlog import ColoredFormatter
@@ -26,23 +27,20 @@ def filter(self, record):
2627
return False
2728

2829

29-
def separator(symbol_, val=None):
30-
terminal_width = shutil.get_terminal_size(fallback=(120, 40))[0]
31-
if not val:
32-
return f"{symbol_ * terminal_width}"
30+
class BaseLogFormatter(ColoredFormatter):
31+
def formatTime(self, record, datefmt=None): # noqa: N802
32+
return datetime.fromtimestamp(record.created).isoformat()
3333

34-
sepa = int((terminal_width - len(val) - 2) // 2)
35-
return f"{symbol_ * sepa} {val} {symbol_ * sepa}"
3634

35+
def get_logger(name):
36+
log_level = os.environ.get("OPENSHIFT_PYTHON_UTILITIES_LOG_LEVEL", "INFO")
37+
log_file = os.environ.get("OPENSHIFT_PYTHON_UTILITIES_LOG_FILE", "")
38+
if log_level not in ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]:
39+
raise ValueError(f"Invalid log level: {log_level}")
3740

38-
def setup_logging(log_level, log_file="/tmp/pytest-tests.log"):
39-
logger_obj = logging.getLogger()
40-
basic_logger = logging.getLogger("basic")
41-
42-
root_log_formatter = logging.Formatter(fmt="%(message)s")
43-
log_formatter = ColoredFormatter(
44-
fmt="%(name)s %(asctime)s %(log_color)s%(levelname) s%(reset)s %(message)s",
45-
datefmt="%Y-%m-%d %H:%M:%S",
41+
logger_obj = logging.getLogger(name)
42+
log_formatter = BaseLogFormatter(
43+
fmt="%(asctime)s %(name)s %(log_color)s%(levelname)s%(reset)s %(message)s",
4644
log_colors={
4745
"DEBUG": "cyan",
4846
"INFO": "green",
@@ -54,29 +52,20 @@ def setup_logging(log_level, log_file="/tmp/pytest-tests.log"):
5452
)
5553

5654
console_handler = logging.StreamHandler()
57-
log_handler = RotatingFileHandler(
58-
filename=log_file, maxBytes=100 * 1024 * 1024, backupCount=20
59-
)
60-
basic_console_handler = logging.StreamHandler()
61-
basic_log_handler = RotatingFileHandler(
62-
filename=log_file, maxBytes=100 * 1024 * 1024, backupCount=20
63-
)
64-
65-
basic_log_handler.setFormatter(fmt=root_log_formatter)
66-
basic_console_handler.setFormatter(fmt=root_log_formatter)
67-
basic_logger.addHandler(hdlr=basic_log_handler)
68-
basic_logger.addHandler(hdlr=basic_console_handler)
69-
basic_logger.setLevel(level=log_level)
70-
71-
log_handler.setFormatter(fmt=log_formatter)
7255
console_handler.setFormatter(fmt=log_formatter)
56+
console_handler.addFilter(filter=DuplicateFilter())
7357

7458
logger_obj.addHandler(hdlr=console_handler)
75-
logger_obj.addHandler(hdlr=log_handler)
7659
logger_obj.setLevel(level=log_level)
77-
7860
logger_obj.addFilter(filter=DuplicateFilter())
79-
console_handler.addFilter(filter=DuplicateFilter())
61+
62+
if log_file:
63+
log_handler = RotatingFileHandler(
64+
filename=log_file, maxBytes=100 * 1024 * 1024, backupCount=20
65+
)
66+
log_handler.setFormatter(fmt=log_formatter)
67+
log_handler.setLevel(level=log_level)
68+
logger_obj.addHandler(hdlr=log_handler)
8069

8170
logger_obj.propagate = False
82-
basic_logger.propagate = False
71+
return logger_obj

0 commit comments

Comments
 (0)