Skip to content

Commit

Permalink
Merge pull request #2269 from kflynn/flynn/dev/gep-2257-tweaks
Browse files Browse the repository at this point in the history
More GEP-2257 tweaks
  • Loading branch information
k8s-ci-robot authored Aug 23, 2024
2 parents 1bc5b5e + f05c642 commit b3d4b57
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 11 deletions.
39 changes: 39 additions & 0 deletions examples/duration-gep2257.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/usr/bin/python3
# -*- coding:utf-8 -*-

"""
This example uses kubernetes.utils.duration to parse and display
a GEP-2257 duration string (you can find the full specification at
https://gateway-api.sigs.k8s.io/geps/gep-2257/).
Good things to try:
>>> python examples/duration-gep2257.py 1h
Duration: 1h
>>> python examples/duration-gep2257.py 3600s
Duration: 1h
>>> python examples/duration-gep2257.py 90m
Duration: 1h30m
>>> python examples/duration-gep2257.py 30m1h10s5s
Duration: 1h30m15s
>>> python examples/duration-gep2257.py 0h0m0s0ms
Duration: 0s
>>> python examples/duration-gep2257.py -5m
ValueError: Invalid duration format: -5m
>>> python examples/duration-gep2257.py 1.5h
ValueError: Invalid duration format: 1.5h
"""

import sys

from kubernetes.utils import duration

def main():
if len(sys.argv) != 2:
print("Usage: {} <duration>".format(sys.argv[0]))
sys.exit(1)

dur = duration.parse_duration(sys.argv[1])
print("Duration: %s" % duration.format_duration(dur))

if __name__ == "__main__":
main()
32 changes: 21 additions & 11 deletions kubernetes/utils/duration.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
# 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.
from typing import List

import datetime
import re

Expand Down Expand Up @@ -147,18 +149,26 @@ def format_duration(delta: datetime.timedelta) -> str:
.format(delta)
)

# Second short-circuit.
# After that, do the usual div & mod tree to take seconds and get hours,
# minutes, and seconds from it.
secs = int(delta.total_seconds())

output: List[str] = []

hours = secs // 3600
if hours > 0:
output.append(f"{hours}h")
secs -= hours * 3600

delta -= datetime.timedelta(microseconds=delta_us)
delta_ms = delta_us // 1000
delta_str = durationpy.to_str(delta)
minutes = secs // 60
if minutes > 0:
output.append(f"{minutes}m")
secs -= minutes * 60

if delta_ms > 0:
# We have milliseconds to add back in. Make sure to not have a leading
# "0" if we have no other duration components.
if delta == datetime.timedelta(0):
delta_str = ""
if secs > 0:
output.append(f"{secs}s")

delta_str += f"{delta_ms}ms"
if delta_us > 0:
output.append(f"{delta_us // 1000}ms")

return delta_str
return "".join(output)

0 comments on commit b3d4b57

Please sign in to comment.