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

Cleanup python sdk api module #204

Merged
merged 1 commit into from
Feb 7, 2022
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
12 changes: 9 additions & 3 deletions extern-sdk/python/ormb/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
from ormb.api import *


__version__ = '0.0.1'

from ormb.api import (
login,
save,
push,
pull,
export,
remove,
)
52 changes: 52 additions & 0 deletions extern-sdk/python/ormb/_api_exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class ORMBLoginError(Exception):
def __init__(self, hostname: str, username: str, stderr: str) -> None:
msg = (
f"Login to {hostname} as '{username}' failed with stderr:\n"
f"{stderr}"
)
super().__init__(msg)


class ORMBSaveError(Exception):
def __init__(self, src: str, reference: str, stderr: str) -> None:
msg = (
f"Packaging and saving artifact from '{src}' to local cache with "
f"reference '{reference}' failed with stderr:\n{stderr}"
)
super().__init__(msg)


class ORMBPushError(Exception):
def __init__(self, reference: str, stderr: str) -> None:
msg = (
"Pushing artifact from local cache to remote registry with "
f"reference '{reference}' failed with stderr:\n{stderr}"
)
super().__init__(msg)


class ORMBPullError(Exception):
def __init__(self, reference: str, stderr: str) -> None:
msg = (
"Pulling artifact from remote registry with reference "
f"'{reference}' failed with stderr:\n{stderr}"
)
super().__init__(msg)


class ORMBExportError(Exception):
def __init__(self, reference: str, destination: str, stderr: str) -> None:
msg = (
f"Exporting artifact with reference '{reference}' from local "
f"cache to '{destination}' failed with stderr:\n{stderr}"
)
super().__init__(msg)


class ORMBRemoveError(Exception):
def __init__(self, reference: str, stderr: str) -> None:
msg = (
f"Removing artifact with reference '{reference}' from local cache "
f"failed with stderr:\n{stderr}"
)
super().__init__(msg)
230 changes: 202 additions & 28 deletions extern-sdk/python/ormb/api.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,215 @@
from subprocess import Popen
from os.path import abspath, join, dirname
import os
import subprocess

BIN_PATH = join(abspath(dirname(__file__)), 'bin')
from . import _api_exceptions


def login(hostname: str, username: str, password: str, insecure_opt: str):
ex = Popen([join(BIN_PATH, "ormb"), "login", hostname, "--username", username, "--password", password, "--insecure",
insecure_opt])
status = ex.wait()
return status
ormb_relpath = os.path.dirname(__file__)
ormb_abspath = os.path.abspath(ormb_relpath)
BIN_PATHNAME = os.path.join(ormb_abspath, "bin/ormb")


def push(ref: str):
ex = Popen([join(BIN_PATH, "ormb"), "push", ref])
status = ex.wait()
return status
def login(
hostname: str,
username: str,
password: str,
insecure: str = "True",
) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `login` command in a subprocess.

Logs in an image registry.

def pull(ref: str):
ex = Popen([join(BIN_PATH, "ormb"), "pull", ref])
status = ex.wait()
return status
Args:
hostname: Remote registry to authenticate to.
username: Username to authenticate with.
password: Password to authenticate with.
insecure: Whether or not to allow connections to TLS registry without
certificates. Either "True" or "False".

Returns:
The completed process.

def export(ref: str, dst: str):
ex = Popen([join(BIN_PATH, "ormb"), "export", ref, "-d", dst])
status = ex.wait()
return status
Raises:
ORMBLoginError: ORMB login command process exited with a non-zero exit
code.
"""
args = [
BIN_PATHNAME,
"login",
hostname,
"--username",
username,
"--password-stdin",
"--insecure",
insecure,
]

try:
return subprocess.run(
args=args,
capture_output=True,
check=True,
input=password,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBLoginError(
hostname=hostname,
username=username,
stderr=e.stderr,
)

def save(src: str, ref: str):
ex = Popen([join(BIN_PATH, "ormb"), "save", src, ref])
status = ex.wait()
return status

def save(src: str, ref: str) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `save` command in a subprocess.

def remove(ref: str):
ex = Popen([join(BIN_PATH, "ormb"), "remove", ref])
status = ex.wait()
return status
Packages an artifact and saves it to cache in the local file system.

Args:
src: ORMB formatted artifact dirname (containing the `model/`
directory and `ormbfile.yaml`).
ref: Image reference of the artifact to save, formatted as
`<registry_address>/<repository>:<tag>`.

Returns:
The completed process.

Raises:
ORMBSaveError: ORMB save command process exited with a non-zero exit
code.
"""
try:
return subprocess.run(
args=[BIN_PATHNAME, "save", src, ref],
capture_output=True,
check=True,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBSaveError(
src=src,
reference=ref,
stderr=e.stderr,
)


def push(ref: str) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `push` command in a subprocess.

Pushes an artifact image to a remote registry.

Args:
ref: Image reference of the artifact to push, formatted as
`<registry_address>/<repository>:<tag>`.

Returns:
The completed process.

Raises:
ORMBPushError: ORMB push command process exited with a non-zero exit
code.
"""
try:
return subprocess.run(
args=[BIN_PATHNAME, "push", ref],
capture_output=True,
check=True,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBPushError(reference=ref, stderr=e.stderr)


def pull(ref: str) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `pull` command in a subprocess.

Pulls an image from a remote registry to the cache of the local file
system.

Args:
ref: Image reference of the artifact to pull, formatted as
`<registry_address>/<repository>:<tag>`.

Returns:
The completed process.

Raises:
ORMBPullError: ORMB pull command process exited with a non-zero exit
code.
"""
try:
return subprocess.run(
args=[BIN_PATHNAME, "pull", ref],
capture_output=True,
check=True,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBPullError(reference=ref, stderr=e.stderr)


def export(ref: str, dst: str) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `export` command in a subprocess.

Exports the artifact from the local cache to the destination directory.

Args:
ref: Image reference of the artifact to export, formatted as
`<registry_address>/<repository>:<tag>`.
dst: Destination directory path to export the `model/` directory
(containing the artifact) and `ormbfile.yaml` to.

Returns:
The completed process.

Raises:
ORMBExportError: ORMB export command process exited with a non-zero
exit code.
"""
try:
return subprocess.run(
args=[BIN_PATHNAME, "export", ref, "-d", dst],
capture_output=True,
check=True,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBExportError(
reference=ref,
destination=dst,
stderr=e.stderr,
)


def remove(ref: str) -> subprocess.CompletedProcess:
"""
Runs ORMB CLI `remove` command in a subprocess.

Args:
ref: Image reference of the artifact to export, formatted as
`<registry_address>/<repository>:<tag>`.

Returns:
The completed process.

Raises:
ORMBRemoveError: ORMB remove command process exited with a non-zero
exit code.
"""
try:
return subprocess.run(
args=[BIN_PATHNAME, "remove", ref],
capture_output=True,
check=True,
text=True,
)
except subprocess.CalledProcessError as e:
raise _api_exceptions.ORMBRemoveError(
reference=ref,
stderr=e.stderr,
)