oak-cli 0.2.6__tar.gz → 0.2.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. {oak_cli-0.2.6 → oak_cli-0.2.9}/PKG-INFO +6 -4
  2. {oak_cli-0.2.6 → oak_cli-0.2.9}/README.md +3 -3
  3. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/apps/delete.py +4 -6
  4. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/apps/status.py +1 -3
  5. oak_cli-0.2.9/oak_cli/args_parser/docker/main.py +25 -0
  6. oak_cli-0.2.9/oak_cli/args_parser/docker/rebuild.py +66 -0
  7. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/main.py +5 -0
  8. oak_cli-0.2.9/oak_cli/args_parser/plugins/flops/create.py +16 -0
  9. oak_cli-0.2.9/oak_cli/args_parser/plugins/flops/main.py +25 -0
  10. oak_cli-0.2.9/oak_cli/args_parser/plugins/main.py +25 -0
  11. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/services/deployment.py +1 -3
  12. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/services/status.py +1 -4
  13. oak_cli-0.2.9/oak_cli/commands/apps/main.py +86 -0
  14. oak_cli-0.2.9/oak_cli/commands/apps/status.py +11 -0
  15. oak_cli-0.2.9/oak_cli/commands/docker/aux_dockers/node_engine_log_observer.docker-compose.yml +18 -0
  16. oak_cli-0.2.9/oak_cli/commands/docker/common.py +29 -0
  17. oak_cli-0.2.9/oak_cli/commands/docker/enums.py +30 -0
  18. oak_cli-0.2.9/oak_cli/commands/docker/rebuild.py +38 -0
  19. oak_cli-0.2.9/oak_cli/commands/docker/restart.py +17 -0
  20. oak_cli-0.2.9/oak_cli/commands/plugins/__init__.py +0 -0
  21. oak_cli-0.2.9/oak_cli/commands/plugins/flops/__init__.py +0 -0
  22. oak_cli-0.2.9/oak_cli/commands/plugins/flops/flops.SLA.json +13 -0
  23. oak_cli-0.2.9/oak_cli/commands/plugins/flops/main.py +31 -0
  24. oak_cli-0.2.9/oak_cli/commands/services/__init__.py +0 -0
  25. oak_cli-0.2.9/oak_cli/commands/services/deployment.py +42 -0
  26. oak_cli-0.2.9/oak_cli/commands/services/get.py +41 -0
  27. oak_cli-0.2.9/oak_cli/commands/services/status.py +41 -0
  28. oak_cli-0.2.9/oak_cli/main.py +28 -0
  29. oak_cli-0.2.9/oak_cli/utils/SLAs/__init__.py +0 -0
  30. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/SLAs/default_app_with_services.SLA.json +1 -1
  31. oak_cli-0.2.9/oak_cli/utils/__init__.py +0 -0
  32. oak_cli-0.2.9/oak_cli/utils/api/__init__.py +0 -0
  33. oak_cli-0.2.9/oak_cli/utils/api/common.py +3 -0
  34. oak_cli-0.2.6/oak_cli/utils/api/common.py → oak_cli-0.2.9/oak_cli/utils/api/custom_http.py +0 -5
  35. oak_cli-0.2.9/oak_cli/utils/api/custom_requests.py +102 -0
  36. oak_cli-0.2.9/oak_cli/utils/api/login.py +36 -0
  37. oak_cli-0.2.9/oak_cli/utils/exceptions/__init__.py +0 -0
  38. oak_cli-0.2.9/oak_cli/utils/exceptions/main.py +17 -0
  39. oak_cli-0.2.9/oak_cli/utils/exceptions/types.py +12 -0
  40. oak_cli-0.2.9/oak_cli/utils/exceptions.py +23 -0
  41. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/logging.py +0 -1
  42. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/types.py +0 -2
  43. {oak_cli-0.2.6 → oak_cli-0.2.9}/pyproject.toml +6 -1
  44. oak_cli-0.2.6/oak_cli/commands/apps/main.py +0 -60
  45. oak_cli-0.2.6/oak_cli/commands/apps/status.py +0 -21
  46. oak_cli-0.2.6/oak_cli/commands/services/deployment.py +0 -30
  47. oak_cli-0.2.6/oak_cli/commands/services/get.py +0 -29
  48. oak_cli-0.2.6/oak_cli/commands/services/status.py +0 -75
  49. oak_cli-0.2.6/oak_cli/main.py +0 -14
  50. oak_cli-0.2.6/oak_cli/utils/api/login.py +0 -33
  51. oak_cli-0.2.6/oak_cli/utils/api/main.py +0 -108
  52. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/__init__.py +0 -0
  53. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/__init__.py +0 -0
  54. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/apps/__init__.py +0 -0
  55. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/apps/create.py +0 -0
  56. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/apps/main.py +0 -0
  57. {oak_cli-0.2.6/oak_cli/args_parser/services → oak_cli-0.2.9/oak_cli/args_parser/docker}/__init__.py +0 -0
  58. {oak_cli-0.2.6/oak_cli/commands/apps → oak_cli-0.2.9/oak_cli/args_parser/plugins}/__init__.py +0 -0
  59. {oak_cli-0.2.6/oak_cli/commands/services → oak_cli-0.2.9/oak_cli/args_parser/plugins/flops}/__init__.py +0 -0
  60. {oak_cli-0.2.6/oak_cli/utils/SLAs → oak_cli-0.2.9/oak_cli/args_parser/services}/__init__.py +0 -0
  61. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/args_parser/services/main.py +0 -0
  62. {oak_cli-0.2.6/oak_cli/utils → oak_cli-0.2.9/oak_cli/commands/apps}/__init__.py +0 -0
  63. {oak_cli-0.2.6/oak_cli/utils/api → oak_cli-0.2.9/oak_cli/commands/docker}/__init__.py +0 -0
  64. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/SLAs/blank_app_without_services.SLA.json +0 -0
  65. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/SLAs/common.py +0 -0
  66. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/argcomplete.py +0 -0
  67. {oak_cli-0.2.6 → oak_cli-0.2.9}/oak_cli/utils/common.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oak_cli
3
- Version: 0.2.6
3
+ Version: 0.2.9
4
4
  Summary:
5
5
  Author: Alexander Malyuk
6
6
  Author-email: malyuk.alexander1999@gmail.com
@@ -10,20 +10,22 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Requires-Dist: argcomplete (>=3.2.3,<4.0.0)
13
+ Requires-Dist: icecream (>=2.1.3,<3.0.0)
14
+ Requires-Dist: pydantic (>=2.6.4,<3.0.0)
13
15
  Description-Content-Type: text/markdown
14
16
 
15
17
  # [Oakestra CLI](https://github.com/oakestra/oakestra-cli)
16
18
 
17
19
  **oakestra-cli** is a very basic command line tool for controlling your [Oakestra](https://github.com/oakestra/oakestra) setup.
18
20
 
19
- It is intended to be a interface for the API as well as a development tool.
21
+ It is intended to be an interface for the API as well as a development tool.
20
22
 
21
23
  The CLI supports command (tab) autocompletion.
22
24
 
23
25
  ## Usage
24
26
  The package can be called via `oak`.
25
27
 
26
- Currently it supports the creation, deletion, inspection, and (un)deployment of applications and services.
28
+ Currently, it supports the creation, deletion, inspection, and (un)deployment of applications and services.
27
29
 
28
30
  E.g. To deploy a default application with two services:
29
31
  ```
@@ -81,7 +83,7 @@ All current services: '2'
81
83
  instances: '1'
82
84
  ```
83
85
 
84
- For a more detailed explanation have a try out the CLI and use the `-h` flag.
86
+ For a more detailed explanation try out the CLI and use the `-h` flag.
85
87
 
86
88
  ## [Installation](https://pypi.org/project/oak-cli/)
87
89
  ```
@@ -2,14 +2,14 @@
2
2
 
3
3
  **oakestra-cli** is a very basic command line tool for controlling your [Oakestra](https://github.com/oakestra/oakestra) setup.
4
4
 
5
- It is intended to be a interface for the API as well as a development tool.
5
+ It is intended to be an interface for the API as well as a development tool.
6
6
 
7
7
  The CLI supports command (tab) autocompletion.
8
8
 
9
9
  ## Usage
10
10
  The package can be called via `oak`.
11
11
 
12
- Currently it supports the creation, deletion, inspection, and (un)deployment of applications and services.
12
+ Currently, it supports the creation, deletion, inspection, and (un)deployment of applications and services.
13
13
 
14
14
  E.g. To deploy a default application with two services:
15
15
  ```
@@ -67,7 +67,7 @@ All current services: '2'
67
67
  instances: '1'
68
68
  ```
69
69
 
70
- For a more detailed explanation have a try out the CLI and use the `-h` flag.
70
+ For a more detailed explanation try out the CLI and use the `-h` flag.
71
71
 
72
72
  ## [Installation](https://pypi.org/project/oak-cli/)
73
73
  ```
@@ -14,8 +14,8 @@ _DELETION_HELP_TEXT = "deletes one or all applications" + _APP_ID_HELP_TEXT
14
14
  def prepare_applications_deletion_argparser(
15
15
  applications_subparsers: Subparsers,
16
16
  ) -> None:
17
- def aux_delete_appliacations(args: Any):
18
- if args.all:
17
+ def aux_delete_applications(args: Any):
18
+ if args.all or not args.app_id:
19
19
  delete_all_applications()
20
20
  else:
21
21
  delete_application(args.app_id)
@@ -30,7 +30,5 @@ def prepare_applications_deletion_argparser(
30
30
  applications_deletion_parser.add_argument(
31
31
  "-a", "--all", action="store_true", help="delete all applications"
32
32
  )
33
- applications_deletion_parser.add_argument(
34
- "app_id", nargs="?", type=str, help=_APP_ID_HELP_TEXT
35
- )
36
- applications_deletion_parser.set_defaults(func=aux_delete_appliacations)
33
+ applications_deletion_parser.add_argument("app_id", nargs="?", type=str, help=_APP_ID_HELP_TEXT)
34
+ applications_deletion_parser.set_defaults(func=aux_delete_applications)
@@ -13,6 +13,4 @@ def prepare_applications_display_argparser(applications_subparsers: Subparsers)
13
13
  description=HELP_TEXT,
14
14
  formatter_class=argparse.RawTextHelpFormatter,
15
15
  )
16
- applications_status_parser.set_defaults(
17
- func=lambda _: display_current_applications()
18
- )
16
+ applications_status_parser.set_defaults(func=lambda _: display_current_applications())
@@ -0,0 +1,25 @@
1
+ import argparse
2
+ from typing import Any
3
+
4
+ from oak_cli.args_parser.docker.rebuild import prepare_docker_rebuild_argparser
5
+ from oak_cli.utils.types import Subparsers
6
+
7
+
8
+ def prepare_docker_argparsers(subparsers: Subparsers) -> None:
9
+ docker_parser = subparsers.add_parser(
10
+ "docker",
11
+ aliases=["d"],
12
+ help="command for docker(compose) related activities",
13
+ formatter_class=argparse.RawTextHelpFormatter,
14
+ )
15
+
16
+ def docker_parser_print_help(_: Any) -> None:
17
+ docker_parser.print_help()
18
+
19
+ docker_parser.set_defaults(func=docker_parser_print_help)
20
+
21
+ docker_subparsers = docker_parser.add_subparsers(
22
+ dest="services commands",
23
+ )
24
+
25
+ prepare_docker_rebuild_argparser(docker_subparsers)
@@ -0,0 +1,66 @@
1
+ import argparse
2
+ from typing import Any
3
+
4
+ from oak_cli.commands.docker.enums import ClusterOrchestratorService, RootOrchestratorService
5
+ from oak_cli.commands.docker.rebuild import rebuild_docker_service
6
+ from oak_cli.commands.docker.restart import restart_docker_service
7
+ from oak_cli.utils.types import Subparsers
8
+
9
+
10
+ def aux_rebuild_docker_service(args: Any):
11
+ if args.only_restart:
12
+ restart_docker_service(args.service)
13
+ else:
14
+ rebuild_docker_service(args.service)
15
+
16
+
17
+ def prepare_docker_rebuild_root_orchestrator_service_parser(
18
+ docker_rebuild_subparser: Subparsers,
19
+ ) -> None:
20
+ docker_rebuild_root_orchestrator_service_parser = docker_rebuild_subparser.add_parser(
21
+ "root_orchestrator",
22
+ aliases=["ro"],
23
+ )
24
+ docker_rebuild_root_orchestrator_service_parser.add_argument(
25
+ "service",
26
+ help="testing",
27
+ type=RootOrchestratorService,
28
+ choices=RootOrchestratorService,
29
+ )
30
+ docker_rebuild_root_orchestrator_service_parser.set_defaults(func=aux_rebuild_docker_service)
31
+
32
+
33
+ def prepare_docker_rebuild_cluster_orchestrator_service_parser(
34
+ docker_rebuild_subparser: Subparsers,
35
+ ) -> None:
36
+ docker_rebuild_cluster_orchestrator_service_parser = docker_rebuild_subparser.add_parser(
37
+ "cluster_orchestrator",
38
+ aliases=["co"],
39
+ )
40
+ docker_rebuild_cluster_orchestrator_service_parser.add_argument(
41
+ "service",
42
+ help="testing",
43
+ type=ClusterOrchestratorService,
44
+ choices=ClusterOrchestratorService,
45
+ )
46
+ docker_rebuild_cluster_orchestrator_service_parser.set_defaults(func=aux_rebuild_docker_service)
47
+
48
+
49
+ def prepare_docker_rebuild_argparser(docker_subparsers: Subparsers) -> None:
50
+ HELP_TEXT = "rebuilds a docker compose service"
51
+ docker_restart_parser = docker_subparsers.add_parser(
52
+ "rebuilds",
53
+ aliases=["r"],
54
+ help=HELP_TEXT,
55
+ description=HELP_TEXT,
56
+ formatter_class=argparse.RawTextHelpFormatter,
57
+ )
58
+ docker_restart_parser.add_argument(
59
+ "-o",
60
+ "--only-restart",
61
+ help="only restart without rebuilding the service",
62
+ action="store_true",
63
+ )
64
+ docker_restart_subparsers = docker_restart_parser.add_subparsers()
65
+ prepare_docker_rebuild_root_orchestrator_service_parser(docker_restart_subparsers)
66
+ prepare_docker_rebuild_cluster_orchestrator_service_parser(docker_restart_subparsers)
@@ -5,6 +5,9 @@ import argparse
5
5
  import argcomplete
6
6
 
7
7
  from oak_cli.args_parser.apps.main import prepare_applications_argparsers
8
+
9
+ # from oak_cli.args_parser.docker.main import prepare_docker_argparsers
10
+ from oak_cli.args_parser.plugins.main import prepare_plugins_argparsers
8
11
  from oak_cli.args_parser.services.main import prepare_services_argparsers
9
12
 
10
13
 
@@ -19,6 +22,8 @@ def parse_arguments_and_execute() -> None:
19
22
 
20
23
  prepare_applications_argparsers(subparsers)
21
24
  prepare_services_argparsers(subparsers)
25
+ prepare_plugins_argparsers(subparsers)
26
+ # prepare_docker_argparsers(subparsers) # WIP
22
27
 
23
28
  argcomplete.autocomplete(parser)
24
29
  args = parser.parse_args()
@@ -0,0 +1,16 @@
1
+ import argparse
2
+
3
+ from oak_cli.commands.plugins.flops.main import create_new_fl_service
4
+ from oak_cli.utils.types import Subparsers
5
+
6
+
7
+ def prepare_flops_create_argparser(flops_subparser: Subparsers) -> None:
8
+ HELP_TEXT = "creates a new FLOps project - i.e. triggers the init FLOps API"
9
+ flops_create_parser = flops_subparser.add_parser(
10
+ "create",
11
+ aliases=["c"],
12
+ help=HELP_TEXT,
13
+ description=HELP_TEXT,
14
+ formatter_class=argparse.RawTextHelpFormatter,
15
+ )
16
+ flops_create_parser.set_defaults(func=lambda _: create_new_fl_service())
@@ -0,0 +1,25 @@
1
+ import argparse
2
+ from typing import Any
3
+
4
+ from oak_cli.args_parser.plugins.flops.create import prepare_flops_create_argparser
5
+ from oak_cli.utils.types import Subparsers
6
+
7
+
8
+ def prepare_flops_argparsers(subparsers: Subparsers) -> None:
9
+ flops_parser = subparsers.add_parser(
10
+ "flops",
11
+ aliases=["fl"],
12
+ help="command for FLOps related activities",
13
+ formatter_class=argparse.RawTextHelpFormatter,
14
+ )
15
+
16
+ def flops_parser_print_help(_: Any) -> None:
17
+ flops_parser.print_help()
18
+
19
+ flops_parser.set_defaults(func=flops_parser_print_help)
20
+
21
+ flops_subparser = flops_parser.add_subparsers(
22
+ dest="FLOps commands",
23
+ )
24
+
25
+ prepare_flops_create_argparser(flops_subparser)
@@ -0,0 +1,25 @@
1
+ import argparse
2
+ from typing import Any
3
+
4
+ from oak_cli.args_parser.plugins.flops.main import prepare_flops_argparsers
5
+ from oak_cli.utils.types import Subparsers
6
+
7
+
8
+ def prepare_plugins_argparsers(subparsers: Subparsers) -> None:
9
+ plugins_parser = subparsers.add_parser(
10
+ "plugins",
11
+ aliases=["p"],
12
+ help="command for plugin related activities",
13
+ formatter_class=argparse.RawTextHelpFormatter,
14
+ )
15
+
16
+ def plugins_parser_print_help(_: Any) -> None:
17
+ plugins_parser.print_help()
18
+
19
+ plugins_parser.set_defaults(func=plugins_parser_print_help)
20
+
21
+ plugins_subparsers = plugins_parser.add_subparsers(
22
+ dest="plugins commands",
23
+ )
24
+
25
+ prepare_flops_argparsers(plugins_subparsers)
@@ -19,9 +19,7 @@ def prepare_services_deployment_argparser(services_subparsers: Subparsers) -> No
19
19
  formatter_class=argparse.RawTextHelpFormatter,
20
20
  )
21
21
  services_deployment_parser.add_argument("service_id", type=str)
22
- services_deployment_parser.set_defaults(
23
- func=lambda args: deploy_new_instance(args.service_id)
24
- )
22
+ services_deployment_parser.set_defaults(func=lambda args: deploy_new_instance(args.service_id))
25
23
 
26
24
 
27
25
  def prepare_services_undeployment_argparser(services_subparsers: Subparsers) -> None:
@@ -2,10 +2,7 @@ import argparse
2
2
  from typing import Any
3
3
 
4
4
  from oak_cli.commands.services.get import get_single_service
5
- from oak_cli.commands.services.status import (
6
- display_all_current_services,
7
- display_single_service,
8
- )
5
+ from oak_cli.commands.services.status import display_all_current_services, display_single_service
9
6
  from oak_cli.utils.types import Subparsers
10
7
 
11
8
 
@@ -0,0 +1,86 @@
1
+ import enum
2
+ import json
3
+ from typing import List
4
+
5
+ import oak_cli.utils.api.custom_requests as custom_requests
6
+ from oak_cli.utils.api.common import SYSTEM_MANAGER_URL
7
+ from oak_cli.utils.api.custom_http import HttpMethod
8
+ from oak_cli.utils.exceptions.types import OakCLIExceptionTypes
9
+ from oak_cli.utils.logging import logger
10
+ from oak_cli.utils.SLAs.common import get_SLAs_path
11
+ from oak_cli.utils.types import Application, ApplicationId
12
+
13
+
14
+ def get_application(app_id: ApplicationId) -> Application:
15
+ return custom_requests.CustomRequest(
16
+ custom_requests.RequestCore(
17
+ base_url=SYSTEM_MANAGER_URL,
18
+ api_endpoint=f"/api/application/{app_id}",
19
+ ),
20
+ custom_requests.RequestAuxiliaries(
21
+ what_should_happen=f"Get application '{app_id}'",
22
+ oak_cli_exception_type=OakCLIExceptionTypes.APP_GET,
23
+ ),
24
+ ).execute()
25
+
26
+
27
+ def get_applications() -> List[Application]:
28
+ apps = custom_requests.CustomRequest(
29
+ custom_requests.RequestCore(
30
+ base_url=SYSTEM_MANAGER_URL,
31
+ api_endpoint="/api/applications",
32
+ ),
33
+ custom_requests.RequestAuxiliaries(
34
+ what_should_happen="Get all applications",
35
+ oak_cli_exception_type=OakCLIExceptionTypes.APP_GET,
36
+ ),
37
+ ).execute()
38
+ if not apps:
39
+ logger.info("No applications exist yet")
40
+ return apps
41
+
42
+
43
+ def send_sla(sla_enum: enum) -> List[Application]:
44
+ sla_file_name = f"{sla_enum}.SLA.json"
45
+ SLA = ""
46
+ with open(get_SLAs_path() / sla_file_name, "r") as f:
47
+ SLA = json.load(f)
48
+ sla_apps = SLA["applications"]
49
+ sla_app_names = [app["application_name"] for app in sla_apps]
50
+ # Note: The API endpoint returns all user apps and not just the newly posted ones.
51
+ all_user_apps = custom_requests.CustomRequest(
52
+ custom_requests.RequestCore(
53
+ http_method=HttpMethod.POST,
54
+ base_url=SYSTEM_MANAGER_URL,
55
+ api_endpoint="/api/application",
56
+ data=SLA,
57
+ ),
58
+ custom_requests.RequestAuxiliaries(
59
+ what_should_happen=f"Create new application based on '{sla_enum}'",
60
+ show_msg_on_success=True,
61
+ oak_cli_exception_type=OakCLIExceptionTypes.APP_CREATE,
62
+ ),
63
+ ).execute()
64
+
65
+ newly_added_apps = [app for app in all_user_apps if (app["application_name"] in sla_app_names)]
66
+ return newly_added_apps
67
+
68
+
69
+ def delete_application(app_id: ApplicationId) -> None:
70
+ custom_requests.CustomRequest(
71
+ custom_requests.RequestCore(
72
+ http_method=HttpMethod.DELETE,
73
+ base_url=SYSTEM_MANAGER_URL,
74
+ api_endpoint=f"/api/application/{app_id}",
75
+ ),
76
+ custom_requests.RequestAuxiliaries(
77
+ what_should_happen=f"Delete application '{app_id}'",
78
+ show_msg_on_success=True,
79
+ oak_cli_exception_type=OakCLIExceptionTypes.APP_DELETE,
80
+ ),
81
+ ).execute()
82
+
83
+
84
+ def delete_all_applications() -> None:
85
+ for app in get_applications():
86
+ delete_application(app["applicationID"])
@@ -0,0 +1,11 @@
1
+ from icecream import ic
2
+
3
+ from oak_cli.commands.apps.main import get_applications
4
+
5
+ ic.configureOutput(prefix="")
6
+
7
+
8
+ def display_current_applications() -> None:
9
+ current_applications = get_applications()
10
+ for i, application in enumerate(current_applications):
11
+ ic(i, application)
@@ -0,0 +1,18 @@
1
+ version: "3.3"
2
+
3
+ services:
4
+
5
+ node_engine_log_observer:
6
+ image: node_engine_log_observer
7
+ build:
8
+ context: .
9
+ dockerfile_inline: |
10
+ FROM alpine
11
+ CMD tail -f node_engine_logs
12
+ hostname: node_engine_log_observer
13
+ container_name: node_engine_log_observer
14
+ volumes:
15
+ - /tmp/node_engine_logs:/node_engine_logs
16
+
17
+ volumes:
18
+ node_engine_logs:
@@ -0,0 +1,29 @@
1
+ import json
2
+ import shlex
3
+ import subprocess
4
+
5
+ from oak_cli.commands.docker.enums import OakestraDockerComposeService
6
+ from oak_cli.utils.logging import logger
7
+
8
+
9
+ def check_docker_service_status(
10
+ docker_service: OakestraDockerComposeService, docker_operation: str
11
+ ):
12
+ inspect_cmd = 'docker inspect -f "{{ json .State }}" ' + str(docker_service)
13
+ result = subprocess.run(
14
+ shlex.split(inspect_cmd),
15
+ check=True,
16
+ stderr=subprocess.PIPE,
17
+ stdout=subprocess.PIPE,
18
+ text=True,
19
+ )
20
+ result_output = json.loads(result.stdout)
21
+ service_status = result_output["Status"]
22
+ if service_status == "running":
23
+ logger.info(
24
+ f"'{docker_service}' successfully '{docker_operation}' - status: '{service_status}'"
25
+ )
26
+ else:
27
+ logger.error(
28
+ f"'{docker_service}' failed to '{docker_operation}' - status: '{service_status}'"
29
+ )
@@ -0,0 +1,30 @@
1
+ from enum import EnumMeta
2
+
3
+ from oak_cli.utils.types import CustomEnum
4
+
5
+
6
+ class OakestraDockerComposeService(CustomEnum, metaclass=EnumMeta):
7
+ pass
8
+
9
+
10
+ class RootOrchestratorService(OakestraDockerComposeService):
11
+ SYSTEM_MANAGER = "system_manager"
12
+ MONGO_ROOT = "mongo_root"
13
+ MONGO_ROOTNET = "mongo_rootnet"
14
+ ROOT_SERVICE_MANAGER = "root_service_manager"
15
+ REDIS = "redis"
16
+ GRAFANA = "grafana"
17
+ DASHBOARD = "dashboard"
18
+ CLOUD_SCHEDULER = "cloud_scheduler"
19
+ RESOURCE_ABSTRACTOR = "resource_abstractor"
20
+
21
+
22
+ class ClusterOrchestratorService(OakestraDockerComposeService):
23
+ MQTT = "mqtt"
24
+ MONGO_CLUSTER = "mongo_cluster"
25
+ MONGO_CLUSTERNET = "mongo_clusternet"
26
+ CLUSTER_SERVICE_MANAGER = "cluster_service_manager"
27
+ CLUSTER_MANAGER = "cluster_manager"
28
+ CLUSTER_SCHEDULER = "cluster_scheduler"
29
+ CLUSTER_REDIS = "cluster_redis"
30
+ PROMETHEUS = "prometheus"
@@ -0,0 +1,38 @@
1
+ import pathlib
2
+ import shlex
3
+ import subprocess
4
+ import sys
5
+
6
+ from oak_cli.commands.docker.common import check_docker_service_status
7
+ from oak_cli.commands.docker.enums import OakestraDockerComposeService, RootOrchestratorService
8
+ from oak_cli.utils.logging import logger
9
+
10
+ ROOT_ORCHESTRATOR_DOCKER_COMPOSE_FILE_PATH = pathlib.Path(
11
+ "/home/alex/oakestra/root_orchestrator/docker-compose.yml"
12
+ )
13
+ CLUSTER_ORCHESTRATOR_DOCKER_COMPOSE_FILE_PATH = pathlib.Path(
14
+ "/home/alex/oakestra/cluster_orchestrator/docker-compose.yml"
15
+ )
16
+
17
+
18
+ def rebuild_docker_service(docker_service: OakestraDockerComposeService) -> None:
19
+ rebuild_flags = "-d --build --no-deps --force-recreate"
20
+ if isinstance(docker_service, RootOrchestratorService):
21
+ compose_path = ROOT_ORCHESTRATOR_DOCKER_COMPOSE_FILE_PATH
22
+ else:
23
+ compose_path = CLUSTER_ORCHESTRATOR_DOCKER_COMPOSE_FILE_PATH
24
+
25
+ final_cmd = f"docker compose -f {compose_path} up {rebuild_flags} {docker_service}"
26
+
27
+ result = subprocess.run(
28
+ shlex.split(final_cmd),
29
+ check=False,
30
+ stderr=subprocess.PIPE,
31
+ stdout=subprocess.PIPE,
32
+ text=True,
33
+ )
34
+ if result.returncode != 0:
35
+ logger.critical(f"Docker service '{docker_service}' rebuild failed due to: '{result}")
36
+ sys.exit(1)
37
+
38
+ check_docker_service_status(docker_service, "rebuild")
@@ -0,0 +1,17 @@
1
+ import shlex
2
+ import subprocess
3
+
4
+ from oak_cli.commands.docker.common import check_docker_service_status
5
+ from oak_cli.commands.docker.enums import OakestraDockerComposeService
6
+
7
+
8
+ def restart_docker_service(docker_service: OakestraDockerComposeService) -> None:
9
+ docker_cmd = f"docker restart {docker_service}"
10
+ subprocess.run(
11
+ shlex.split(docker_cmd),
12
+ check=True,
13
+ stderr=subprocess.PIPE,
14
+ stdout=subprocess.PIPE,
15
+ text=True,
16
+ )
17
+ check_docker_service_status(docker_service, "restarted")
File without changes
@@ -0,0 +1,13 @@
1
+ {
2
+ "verbose": true,
3
+ "customerID": "Admin",
4
+ "applicationID": "",
5
+ "code": "https://github.com/Malyuk-A/mlflower-test-a",
6
+ "memory": 100,
7
+ "vcpus": 1,
8
+ "vgpus": 0,
9
+ "vtpus": 0,
10
+ "bandwidth_in": 0,
11
+ "bandwidth_out": 0,
12
+ "storage": 0
13
+ }
@@ -0,0 +1,31 @@
1
+ import json
2
+ import os
3
+ import pathlib
4
+
5
+ import oak_cli.utils.api.custom_requests as custom_requests
6
+ from oak_cli.utils.api.custom_http import HttpMethod
7
+ from oak_cli.utils.exceptions.types import OakCLIExceptionTypes
8
+
9
+ ROOT_FL_MANAGER_URL = f"http://{os.environ.get('SYSTEM_MANAGER_URL')}:5072"
10
+
11
+
12
+ def create_new_fl_service() -> None:
13
+ sla_file_name = "flops.SLA.json"
14
+ current_file_path = pathlib.Path(__file__).resolve()
15
+ sla_file_path = current_file_path.parent / sla_file_name
16
+ with open(sla_file_path, "r") as f:
17
+ SLA = json.load(f)
18
+
19
+ custom_requests.CustomRequest(
20
+ custom_requests.RequestCore(
21
+ http_method=HttpMethod.POST,
22
+ base_url=ROOT_FL_MANAGER_URL,
23
+ api_endpoint="/api/flops",
24
+ data=SLA,
25
+ ),
26
+ custom_requests.RequestAuxiliaries(
27
+ what_should_happen="Init new FLOps project",
28
+ show_msg_on_success=True,
29
+ oak_cli_exception_type=OakCLIExceptionTypes.FLOPS_PLUGIN,
30
+ ),
31
+ ).execute()
File without changes
@@ -0,0 +1,42 @@
1
+ import oak_cli.utils.api.custom_requests as custom_requests
2
+ from oak_cli.commands.services.get import get_single_service
3
+ from oak_cli.utils.api.common import SYSTEM_MANAGER_URL
4
+ from oak_cli.utils.api.custom_http import HttpMethod
5
+ from oak_cli.utils.exceptions.types import OakCLIExceptionTypes
6
+ from oak_cli.utils.types import Id, ServiceId
7
+
8
+
9
+ def deploy_new_instance(service_id: ServiceId) -> None:
10
+ custom_requests.CustomRequest(
11
+ custom_requests.RequestCore(
12
+ http_method=HttpMethod.POST,
13
+ base_url=SYSTEM_MANAGER_URL,
14
+ api_endpoint=f"/api/service/{service_id}/instance",
15
+ ),
16
+ custom_requests.RequestAuxiliaries(
17
+ what_should_happen=f"Deploy a new instance for the service '{service_id}'",
18
+ show_msg_on_success=True,
19
+ oak_cli_exception_type=OakCLIExceptionTypes.SERVICE_DEPLOYMENT,
20
+ ),
21
+ ).execute()
22
+
23
+
24
+ def undeploy_instance(service_id: ServiceId, instance_id: Id = None) -> None:
25
+ custom_requests.CustomRequest(
26
+ custom_requests.RequestCore(
27
+ http_method=HttpMethod.DELETE,
28
+ base_url=SYSTEM_MANAGER_URL,
29
+ api_endpoint=f"/api/service/{service_id}/instance/{instance_id or 0}",
30
+ ),
31
+ custom_requests.RequestAuxiliaries(
32
+ what_should_happen=f"Undeploy instance '{instance_id or 0}' for service '{service_id}'",
33
+ show_msg_on_success=True,
34
+ oak_cli_exception_type=OakCLIExceptionTypes.SERVICE_UNDEPLOYMENT,
35
+ ),
36
+ ).execute()
37
+
38
+
39
+ def undeploy_all_instances_of_service(service_id: ServiceId) -> None:
40
+ service = get_single_service(service_id)
41
+ for instance in service["instance_list"]:
42
+ undeploy_instance(service_id, instance["instance_number"])