|
3 | 3 | from __future__ import annotations |
4 | 4 |
|
5 | 5 | import logging |
| 6 | +import sys |
6 | 7 | import warnings |
7 | 8 |
|
| 9 | +if sys.version_info >= (3, 11): |
| 10 | + from enum import StrEnum |
| 11 | +else: |
| 12 | + from backports.strenum import StrEnum |
| 13 | + |
8 | 14 | from .client import client |
9 | 15 |
|
10 | 16 | log = logging.getLogger(__name__) |
11 | 17 |
|
12 | 18 |
|
13 | | -def derive_status(statuses: list[str]): |
| 19 | +class StatusStr(StrEnum): |
| 20 | + """Recognised status values. |
| 21 | +
|
| 22 | + Please keep this set exact same as the severity map below. |
| 23 | + """ |
| 24 | + |
| 25 | + error = "error" |
| 26 | + blocked = "blocked" |
| 27 | + waiting = "waiting" |
| 28 | + maintenance = "maintenance" |
| 29 | + active = "active" |
| 30 | + terminated = "terminated" |
| 31 | + unknown = "unknown" |
| 32 | + |
| 33 | + |
| 34 | +""" severity_map holds status values with a severity measure. |
| 35 | +Status values with higher severity are used in preference to others. |
| 36 | +""" |
| 37 | +severity_map: dict[StatusStr, int] = { |
| 38 | + # FIXME: Juju defines a lot more status values #1204 |
| 39 | + StatusStr.error: 100, |
| 40 | + StatusStr.blocked: 90, |
| 41 | + StatusStr.waiting: 80, |
| 42 | + StatusStr.maintenance: 70, |
| 43 | + StatusStr.active: 60, |
| 44 | + StatusStr.terminated: 50, |
| 45 | + StatusStr.unknown: 40, |
| 46 | +} |
| 47 | + |
| 48 | + |
| 49 | +def derive_status(statuses: list[str | StatusStr]) -> StatusStr: |
14 | 50 | """Derive status from a set. |
15 | 51 |
|
16 | 52 | derive_status is used to determine the application status from a set of unit |
17 | 53 | status values. |
18 | 54 |
|
19 | 55 | :param statuses: list of known unit workload statuses |
20 | 56 | """ |
21 | | - current = "unknown" |
| 57 | + current: StatusStr = StatusStr.unknown |
22 | 58 | for status in statuses: |
23 | | - if status in severity_map and severity_map[status] > severity_map[current]: |
| 59 | + try: |
| 60 | + status = StatusStr(status) |
| 61 | + except ValueError: |
| 62 | + continue |
| 63 | + if (new_level := severity_map.get(status)) and new_level > severity_map[ |
| 64 | + current |
| 65 | + ]: |
24 | 66 | current = status |
25 | 67 | return current |
26 | 68 |
|
27 | 69 |
|
28 | | -""" severity_map holds status values with a severity measure. |
29 | | -Status values with higher severity are used in preference to others. |
30 | | -""" |
31 | | -severity_map = { |
32 | | - "error": 100, |
33 | | - "blocked": 90, |
34 | | - "waiting": 80, |
35 | | - "maintenance": 70, |
36 | | - "active": 60, |
37 | | - "terminated": 50, |
38 | | - "unknown": 40, |
39 | | -} |
40 | | - |
41 | | - |
42 | 70 | async def formatted_status(model, target=None, raw=False, filters=None): |
43 | 71 | """Returns a string that mimics the content of the information |
44 | 72 | returned in the juju status command. If the raw parameter is |
|
0 commit comments