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

The command to install/start/stop BrainFrame Kits (Mgmt/Simulator/Marketplace) #34

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
17 changes: 6 additions & 11 deletions brainframe/cli/brainframe_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,21 @@
import subprocess
import sys
from pathlib import Path
from typing import List
from typing import Optional
from typing import Tuple
from typing import List, Optional, Tuple

import i18n
import requests
import yaml

from . import config
from . import frozen_utils
from . import os_utils
from . import print_utils
from . import config, frozen_utils, os_utils, print_utils

# The URL to the docker-compose.yml
BRAINFRAME_DOCKER_COMPOSE_URL = "https://{subdomain}aotu.ai/releases/brainframe/{version}/docker-compose.yml"
BRAINFRAME_DOCKER_COMPOSE_URL = (
"https://{subdomain}aotu.ai/releases/brainframe/{version}/docker-compose.yml"
)
# The URL to the latest tag, which is just a file containing the latest version
# as a string
BRAINFRAME_LATEST_TAG_URL = (
"https://{subdomain}aotu.ai/releases/brainframe/latest"
)
BRAINFRAME_LATEST_TAG_URL = "https://{subdomain}aotu.ai/releases/brainframe/latest"


def assert_installed(install_path: Path) -> None:
Expand Down
135 changes: 135 additions & 0 deletions brainframe/cli/brainframe_kits.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import getpass
import os
import shutil
import subprocess
import sys
from argparse import ArgumentParser
from pathlib import Path
from typing import List

import i18n

from brainframe.cli import brainframe_compose, dependencies, frozen_utils

from . import config, os_utils, print_utils
from .brainframe_compose import assert_has_docker_permissions

install_path = Path("/usr/local/share/brainframe-kits")
data_path = Path("/var/local/brainframe-kits")


def install(commands: List[str]):
args = _parse_args()
print(args)

# Check all dependencies
dependencies.docker.ensure(args.noninteractive, args.install_docker)
# We only require the Docker Compose command in frozen distributions
if frozen_utils.is_frozen() and shutil.which("docker-compose") is None:
print_utils.fail_translate(
"install.install-dependency-manually",
dependency="docker-compose",
)

if not os_utils.added_to_group("docker"):
if args.noninteractive:
add_to_group = args.add_to_docker_group
else:
add_to_group = print_utils.ask_yes_no("install.ask-add-to-docker-group")

if add_to_group:
os_utils.add_to_group("docker")

install_path.mkdir(parents=True, exist_ok=True)
data_path.mkdir(parents=True, exist_ok=True)

# Set up permissions with the 'brainframe' group
print_utils.translate("install.create-group-justification")
os_utils.create_group("brainframe", os_utils.BRAINFRAME_GROUP_ID)
os_utils.give_brainframe_group_rw_access([data_path, install_path])

# Optionally add the user to the "brainframe" group
if not os_utils.added_to_group("brainframe"):
if args.noninteractive:
add_to_group = args.add_to_group
else:
add_to_group = print_utils.ask_yes_no("install.ask-add-to-group")

if add_to_group:
os_utils.add_to_group("brainframe")

script_dir = os.path.dirname(os.path.abspath(__file__))
docker_compose_mgmt = os.path.join(script_dir, "docker-compose-kits.yml")
install_file = install_path.joinpath("docker-compose.yml")
shutil.copy(docker_compose_mgmt, install_file)

print_utils.translate("install.downloading-images")
brainframe_compose.run(install_path, ["pull"])

print(f"The BrainFrame Kits was installed:")
print(f"\t\t\t\t1) deployment path: {install_path}")
print(f"\t\t\t\t2) data path: {data_path}")

print_utils.translate("kits.description")
print_utils.translate("kits.usage")


def start(commands: List[str]):
brainframe_compose.run(install_path, commands)


def stop(commands: List[str]):
brainframe_compose.run(install_path, ["up", "-d"])


def run(commands: List[str]) -> None:
assert_has_docker_permissions()

if "install" in commands:
install(commands)
else:
assert_has_docker_permissions()
brainframe_compose.run(install_path, commands)


def _parse_args():
parser = ArgumentParser(
description=i18n.t("kits.description"),
usage=i18n.t("kits.usage"),
)

parser.add_argument(
"--noninteractive",
action="store_true",
help=i18n.t("general.noninteractive-help"),
)
parser.add_argument(
"--install-docker",
action="store_true",
help=i18n.t("install.install-docker-help"),
)
parser.add_argument(
"--add-to-group",
action="store_true",
help=i18n.t("install.add-to-group-help"),
)
parser.add_argument(
"--add-to-docker-group",
action="store_true",
help=i18n.t("install.add-to-docker-group-help"),
)
parser.add_argument(
"--version",
type=str,
default="latest",
help=i18n.t("install.version-help"),
)

arg_list = sys.argv[3:]
args = parser.parse_args(arg_list)

# Run in non-interactive mode if any flags were provided
if len(arg_list) > 0:
args.noninteractive = True

return args
3 changes: 1 addition & 2 deletions brainframe/cli/brainframe_shell.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
import requests
import yaml

from . import os_utils
from . import print_utils
from . import os_utils, print_utils
from .brainframe_compose import assert_has_docker_permissions


Expand Down
1 change: 1 addition & 0 deletions brainframe/cli/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .compose import compose
from .info import info
from .install import install
from .kits import kits
from .self_update import self_update
from .shell import shell
from .uninstall import uninstall
Expand Down
16 changes: 5 additions & 11 deletions brainframe/cli/commands/backup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,11 @@
from pathlib import Path

import i18n
from brainframe.cli import brainframe_compose
from brainframe.cli import config
from brainframe.cli import dependencies
from brainframe.cli import os_utils
from brainframe.cli import print_utils

from .utils import command
from .utils import requires_root
from .utils import subcommand_parse_args
from brainframe.cli import (brainframe_compose, config, dependencies, os_utils,
print_utils)

from .utils import command, requires_root, subcommand_parse_args

BACKUP_DIR_FORMAT = "%Y-%m-%d_%H-%M-%S"

Expand Down Expand Up @@ -79,9 +75,7 @@ def _parse_args(data_path: Path):
parser.add_argument(
"--destination",
type=Path,
help=i18n.t(
"backup.destination-help", backup_dir=data_path / "backups"
),
help=i18n.t("backup.destination-help", backup_dir=data_path / "backups"),
)

parser.add_argument(
Expand Down
3 changes: 1 addition & 2 deletions brainframe/cli/commands/compose.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import sys

from brainframe.cli import brainframe_compose
from brainframe.cli import config
from brainframe.cli import brainframe_compose, config

from .utils import command

Expand Down
8 changes: 3 additions & 5 deletions brainframe/cli/commands/info.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from argparse import ArgumentParser

import i18n
from brainframe.cli import brainframe_compose
from brainframe.cli import config
from brainframe.cli import print_utils

from .utils import command
from .utils import subcommand_parse_args
from brainframe.cli import brainframe_compose, config, print_utils

from .utils import command, subcommand_parse_args


@command("info")
Expand Down
17 changes: 5 additions & 12 deletions brainframe/cli/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,11 @@
from pathlib import Path

import i18n
from brainframe.cli import brainframe_compose
from brainframe.cli import config
from brainframe.cli import dependencies
from brainframe.cli import frozen_utils
from brainframe.cli import os_utils
from brainframe.cli import print_utils

from .utils import command
from .utils import requires_root
from .utils import subcommand_parse_args
from brainframe.cli import (brainframe_compose, config, dependencies,
frozen_utils, os_utils, print_utils)

from .utils import command, requires_root, subcommand_parse_args


@command("install")
Expand Down Expand Up @@ -45,9 +40,7 @@ def install():
if args.noninteractive:
add_to_group = args.add_to_docker_group
else:
add_to_group = print_utils.ask_yes_no(
"install.ask-add-to-docker-group"
)
add_to_group = print_utils.ask_yes_no("install.ask-add-to-docker-group")

if add_to_group:
os_utils.add_to_group("docker")
Expand Down
24 changes: 24 additions & 0 deletions brainframe/cli/commands/kits.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import sys
from argparse import ArgumentParser

import i18n

from brainframe.cli import brainframe_kits

from .utils import command, subcommand_parse_args


@command("kits")
def kits():
if "-h" in sys.argv[2:]:
args = _parse_args()
else:
brainframe_kits.run(sys.argv[2:])


def _parse_args():
parser = ArgumentParser(
description=i18n.t("kits.description"), usage=i18n.t("kits.usage")
)

return subcommand_parse_args(parser)
14 changes: 4 additions & 10 deletions brainframe/cli/commands/self_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,14 @@
from argparse import ArgumentParser
from pathlib import Path
from tempfile import NamedTemporaryFile
from typing import Optional
from typing import Tuple
from typing import Union
from typing import Optional, Tuple, Union

import i18n
import requests
from brainframe.cli import __version__
from brainframe.cli import config
from brainframe.cli import frozen_utils
from brainframe.cli import print_utils
from packaging import version

from brainframe.cli import __version__, config, frozen_utils, print_utils

from .utils import command

_RELEASES_URL_PREFIX = "https://{subdomain}aotu.ai"
Expand Down Expand Up @@ -86,9 +82,7 @@ def self_update():
shutil.copy2(new_executable.name, executable_path)

print()
print_utils.translate(
"self-update.complete", color=print_utils.Color.GREEN
)
print_utils.translate("self-update.complete", color=print_utils.Color.GREEN)


def _latest_version(
Expand Down
4 changes: 2 additions & 2 deletions brainframe/cli/commands/shell.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from argparse import ArgumentParser

import i18n

from brainframe.cli import brainframe_shell

from .utils import command
from .utils import subcommand_parse_args
from .utils import command, subcommand_parse_args


@command("shell")
Expand Down
12 changes: 4 additions & 8 deletions brainframe/cli/commands/uninstall.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,10 @@
from argparse import ArgumentParser

import i18n
from brainframe.cli import brainframe_compose
from brainframe.cli import config
from brainframe.cli import os_utils
from brainframe.cli import print_utils

from .utils import command
from .utils import requires_root
from .utils import subcommand_parse_args

from brainframe.cli import brainframe_compose, config, os_utils, print_utils

from .utils import command, requires_root, subcommand_parse_args


@command("uninstall")
Expand Down
Loading