Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More GEP-2257 tweaks #2269

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)