vantage6 4.3.0b3__py3-none-any.whl → 4.3.0b5__py3-none-any.whl

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.

Potentially problematic release.


This version of vantage6 might be problematic. Click here for more details.

Files changed (36) hide show
  1. tests_cli/test_server_cli.py +3 -3
  2. vantage6/cli/__build__ +1 -1
  3. vantage6/cli/algostore/attach.py +2 -2
  4. vantage6/cli/algostore/files.py +17 -0
  5. vantage6/cli/algostore/list.py +15 -0
  6. vantage6/cli/algostore/start.py +2 -2
  7. vantage6/cli/algostore/stop.py +2 -2
  8. vantage6/cli/cli.py +4 -0
  9. vantage6/cli/common/decorator.py +2 -2
  10. vantage6/cli/common/utils.py +116 -0
  11. vantage6/cli/configuration_manager.py +1 -1
  12. vantage6/cli/configuration_wizard.py +13 -1
  13. vantage6/cli/context/__init__.py +1 -0
  14. vantage6/cli/dev/create.py +2 -4
  15. vantage6/cli/dev/remove.py +2 -2
  16. vantage6/cli/dev/start.py +2 -2
  17. vantage6/cli/dev/stop.py +2 -2
  18. vantage6/cli/globals.py +1 -0
  19. vantage6/cli/node/common/__init__.py +1 -0
  20. vantage6/cli/node/start.py +1 -1
  21. vantage6/cli/server/common/__init__.py +10 -85
  22. vantage6/cli/server/files.py +2 -2
  23. vantage6/cli/server/import_.py +3 -2
  24. vantage6/cli/server/list.py +3 -47
  25. vantage6/cli/server/remove.py +2 -2
  26. vantage6/cli/server/shell.py +2 -2
  27. vantage6/cli/server/start.py +3 -2
  28. vantage6/cli/server/stop.py +2 -2
  29. vantage6/cli/server/version.py +6 -19
  30. vantage6/cli/test/feature_tester.py +8 -1
  31. vantage6/cli/utils.py +1 -0
  32. {vantage6-4.3.0b3.dist-info → vantage6-4.3.0b5.dist-info}/METADATA +3 -3
  33. {vantage6-4.3.0b3.dist-info → vantage6-4.3.0b5.dist-info}/RECORD +36 -33
  34. {vantage6-4.3.0b3.dist-info → vantage6-4.3.0b5.dist-info}/WHEEL +0 -0
  35. {vantage6-4.3.0b3.dist-info → vantage6-4.3.0b5.dist-info}/entry_points.txt +0 -0
  36. {vantage6-4.3.0b3.dist-info → vantage6-4.3.0b5.dist-info}/top_level.txt +0 -0
@@ -19,7 +19,7 @@ class ServerCLITest(unittest.TestCase):
19
19
  @patch("vantage6.cli.server.start.docker.types.Mount")
20
20
  @patch("os.makedirs")
21
21
  @patch("vantage6.cli.common.start.pull_if_newer")
22
- @patch("vantage6.cli.server.common.ServerContext")
22
+ @patch("vantage6.cli.common.decorator.get_context")
23
23
  @patch("vantage6.cli.server.start.docker.from_env")
24
24
  @patch("vantage6.cli.common.start.check_docker_running", return_value=True)
25
25
  def test_start(
@@ -73,7 +73,7 @@ class ServerCLITest(unittest.TestCase):
73
73
  self.assertEqual(result.exit_code, 0)
74
74
  self.assertIsNone(result.exception)
75
75
 
76
- @patch("vantage6.cli.server.common.ServerContext")
76
+ @patch("vantage6.cli.common.decorator.get_context")
77
77
  def test_files(self, context):
78
78
  """Configuration files without errors."""
79
79
 
@@ -92,7 +92,7 @@ class ServerCLITest(unittest.TestCase):
92
92
  @patch("vantage6.cli.server.import_.print_log_worker")
93
93
  @patch("vantage6.cli.server.import_.click.Path")
94
94
  @patch("vantage6.cli.server.import_.check_docker_running", return_value=True)
95
- @patch("vantage6.cli.server.common.ServerContext")
95
+ @patch("vantage6.cli.common.decorator.get_context")
96
96
  def test_import(self, context, docker_check, click_path, log, containers):
97
97
  """Import entities without errors."""
98
98
  click_path.return_value = MagicMock()
vantage6/cli/__build__ CHANGED
@@ -1 +1 @@
1
- 3
1
+ 5
@@ -6,13 +6,13 @@ from colorama import Fore, Style
6
6
  from vantage6.common import error
7
7
  from vantage6.common.docker.addons import check_docker_running
8
8
  from vantage6.common.globals import APPNAME, InstanceType
9
- from vantage6.cli.common.decorator import insert_context
9
+ from vantage6.cli.common.decorator import click_insert_context
10
10
  from vantage6.cli.common.start import attach_logs
11
11
  from vantage6.cli.context.algorithm_store import AlgorithmStoreContext
12
12
 
13
13
 
14
14
  @click.command()
15
- @insert_context(InstanceType.ALGORITHM_STORE)
15
+ @click_insert_context(InstanceType.ALGORITHM_STORE)
16
16
  def cli_algo_store_attach(ctx: AlgorithmStoreContext) -> None:
17
17
  """
18
18
  Show the server logs in the current console.
@@ -0,0 +1,17 @@
1
+ import click
2
+
3
+ from vantage6.common import info
4
+ from vantage6.cli.context.server import ServerContext
5
+ from vantage6.cli.common.decorator import click_insert_context
6
+ from vantage6.common.globals import InstanceType
7
+
8
+
9
+ @click.command()
10
+ @click_insert_context(type_=InstanceType.ALGORITHM_STORE)
11
+ def cli_algo_store_files(ctx: ServerContext) -> None:
12
+ """
13
+ List files that belong to a particular server instance.
14
+ """
15
+ info(f"Configuration file = {ctx.config_file}")
16
+ info(f"Log file = {ctx.log_file}")
17
+ info(f"Database = {ctx.get_database_uri()}")
@@ -0,0 +1,15 @@
1
+ import click
2
+
3
+ from vantage6.common.docker.addons import check_docker_running
4
+ from vantage6.common.globals import InstanceType
5
+ from vantage6.cli.common.utils import get_server_configuration_list
6
+
7
+
8
+ @click.command()
9
+ def cli_algo_store_configuration_list() -> None:
10
+ """
11
+ Print the available server configurations.
12
+ """
13
+ check_docker_running()
14
+
15
+ get_server_configuration_list(InstanceType.ALGORITHM_STORE)
@@ -13,7 +13,7 @@ from vantage6.cli.common.start import (
13
13
  )
14
14
  from vantage6.cli.globals import AlgoStoreGlobals
15
15
  from vantage6.cli.context.algorithm_store import AlgorithmStoreContext
16
- from vantage6.cli.common.decorator import insert_context
16
+ from vantage6.cli.common.decorator import click_insert_context
17
17
 
18
18
 
19
19
  @click.command()
@@ -36,7 +36,7 @@ from vantage6.cli.common.decorator import insert_context
36
36
  default=False,
37
37
  help="Print server logs to the console after start",
38
38
  )
39
- @insert_context(InstanceType.ALGORITHM_STORE)
39
+ @click_insert_context(InstanceType.ALGORITHM_STORE)
40
40
  def cli_algo_store_start(
41
41
  ctx: AlgorithmStoreContext,
42
42
  ip: str,
@@ -8,12 +8,12 @@ from vantage6.common.docker.addons import (
8
8
  remove_container_if_exists,
9
9
  )
10
10
  from vantage6.common.globals import APPNAME, InstanceType
11
- from vantage6.cli.common.decorator import insert_context
11
+ from vantage6.cli.common.decorator import click_insert_context
12
12
  from vantage6.cli.context.algorithm_store import AlgorithmStoreContext
13
13
 
14
14
 
15
15
  @click.command()
16
- @insert_context(InstanceType.ALGORITHM_STORE)
16
+ @click_insert_context(InstanceType.ALGORITHM_STORE)
17
17
  @click.option("--all", "all_servers", flag_value=True, help="Stop all servers")
18
18
  def cli_algo_store_stop(ctx: AlgorithmStoreContext, all_servers: bool):
19
19
  """
vantage6/cli/cli.py CHANGED
@@ -33,6 +33,8 @@ from vantage6.cli.algostore.attach import cli_algo_store_attach
33
33
  from vantage6.cli.algostore.new import cli_algo_store_new
34
34
  from vantage6.cli.algostore.start import cli_algo_store_start
35
35
  from vantage6.cli.algostore.stop import cli_algo_store_stop
36
+ from vantage6.cli.algostore.files import cli_algo_store_files
37
+ from vantage6.cli.algostore.list import cli_algo_store_configuration_list
36
38
 
37
39
 
38
40
  # Define the server group
@@ -134,6 +136,8 @@ cli_algo_store.add_command(cli_algo_store_attach, name="attach")
134
136
  cli_algo_store.add_command(cli_algo_store_new, name="new")
135
137
  cli_algo_store.add_command(cli_algo_store_start, name="start")
136
138
  cli_algo_store.add_command(cli_algo_store_stop, name="stop")
139
+ cli_algo_store.add_command(cli_algo_store_files, name="files")
140
+ cli_algo_store.add_command(cli_algo_store_configuration_list, name="list")
137
141
 
138
142
 
139
143
  # Define the overall group
@@ -10,7 +10,7 @@ from vantage6.cli.context import select_context_class, get_context
10
10
 
11
11
  # TODO to make this decorator usable by nodes as well, we should make the
12
12
  # default for --user/--system configurable
13
- def insert_context(type_: InstanceType) -> callable:
13
+ def click_insert_context(type_: InstanceType) -> callable:
14
14
  """
15
15
  Supply the Click function with an additional context parameter. The context
16
16
  is passed to the function as the first argument.
@@ -27,7 +27,7 @@ def insert_context(type_: InstanceType) -> callable:
27
27
 
28
28
  Examples
29
29
  --------
30
- >>> @insert_context(InstanceType.SERVER)
30
+ >>> @click_insert_context(InstanceType.SERVER)
31
31
  >>> def cli_server_start(ctx: ServerContext, *args, **kwargs) -> None:
32
32
  >>> pass
33
33
  """
@@ -0,0 +1,116 @@
1
+ import questionary as q
2
+ import docker
3
+ import click
4
+
5
+ from colorama import Fore, Style
6
+
7
+ from vantage6.common import warning, error
8
+ from vantage6.common.globals import APPNAME, InstanceType
9
+ from vantage6.cli.context import select_context_class
10
+
11
+
12
+ def get_server_name(
13
+ name: str,
14
+ system_folders: bool,
15
+ running_server_names: list[str],
16
+ instance_type: InstanceType,
17
+ ) -> str:
18
+ """
19
+ Get the version of a running server.
20
+
21
+ Parameters
22
+ ----------
23
+ name : str
24
+ Name of the server to get the version from
25
+ system_folders : bool
26
+ Whether to use system folders or not
27
+ running_server_names : list[str]
28
+ The names of the running servers
29
+ instance_type : InstanceType
30
+ The type of instance to get the running servers from
31
+ """
32
+
33
+ if not name:
34
+ if not running_server_names:
35
+ error(
36
+ f"No {instance_type}s are running! You can only check the version for "
37
+ f"{instance_type}s that are running"
38
+ )
39
+ exit(1)
40
+ name = q.select(
41
+ f"Select the {instance_type} you wish to inspect:",
42
+ choices=running_server_names,
43
+ ).ask()
44
+ else:
45
+ post_fix = "system" if system_folders else "user"
46
+ name = f"{APPNAME}-{name}-{post_fix}"
47
+ return name
48
+
49
+
50
+ def get_running_servers(
51
+ client: docker.DockerClient, instance_type: InstanceType
52
+ ) -> list[str]:
53
+ """Get the running servers of a certain type.
54
+
55
+ Parameters
56
+ ----------
57
+ client : docker.DockerClient
58
+ The docker client to use
59
+ instance_type : InstanceType
60
+ The type of instance to get the running servers from
61
+
62
+ Returns
63
+ -------
64
+ list[str]
65
+ The names of the running servers
66
+ """
67
+ running_servers = client.containers.list(
68
+ filters={"label": f"{APPNAME}-type={instance_type}"}
69
+ )
70
+ return [server.name for server in running_servers]
71
+
72
+
73
+ def get_server_configuration_list(instance_type: InstanceType.SERVER) -> None:
74
+ """
75
+ Print list of available server configurations.
76
+
77
+ Parameters
78
+ ----------
79
+ instance_type : InstanceType
80
+ The type of instance to get the configurations for
81
+ """
82
+ client = docker.from_env()
83
+ ctx_class = select_context_class(instance_type)
84
+
85
+ running_server_names = get_running_servers(client, instance_type)
86
+ header = "\nName" + (21 * " ") + "Status" + (10 * " ") + "System/User"
87
+
88
+ click.echo(header)
89
+ click.echo("-" * len(header))
90
+
91
+ running = Fore.GREEN + "Running" + Style.RESET_ALL
92
+ stopped = Fore.RED + "Not running" + Style.RESET_ALL
93
+
94
+ # system folders
95
+ configs, f1 = ctx_class.available_configurations(system_folders=True)
96
+ for config in configs:
97
+ status = (
98
+ running
99
+ if f"{APPNAME}-{config.name}-system-{instance_type}" in running_server_names
100
+ else stopped
101
+ )
102
+ click.echo(f"{config.name:25}" f"{status:25} System ")
103
+
104
+ # user folders
105
+ configs, f2 = ctx_class.available_configurations(system_folders=False)
106
+ for config in configs:
107
+ status = (
108
+ running
109
+ if f"{APPNAME}-{config.name}-user-{instance_type}" in running_server_names
110
+ else stopped
111
+ )
112
+ click.echo(f"{config.name:25}" f"{status:25} User ")
113
+
114
+ click.echo("-" * 85)
115
+ if len(f1) + len(f2):
116
+ warning(f"{Fore.RED}Failed imports: {len(f1)+len(f2)}{Style.RESET_ALL}")
@@ -24,7 +24,7 @@ class ServerConfiguration(Configuration):
24
24
  "description": Use(str),
25
25
  "ip": Use(str),
26
26
  "port": Use(int),
27
- "api_path": Use(str),
27
+ Optional("api_path"): str,
28
28
  "uri": Use(str),
29
29
  "allow_drop_all": Use(bool),
30
30
  "logging": {**LOGGING_VALIDATORS, "file": Use(str)},
@@ -141,7 +141,10 @@ def node_configuration_questionaire(dirs: dict, instance_name: str) -> dict:
141
141
 
142
142
  private_key = "" if not encryption else q.text("Path to private key file:").ask()
143
143
 
144
- config["encryption"] = {"enabled": encryption == "true", "private_key": private_key}
144
+ config["encryption"] = {
145
+ "enabled": encryption is True or encryption == "true",
146
+ "private_key": private_key,
147
+ }
145
148
 
146
149
  return config
147
150
 
@@ -276,6 +279,15 @@ def server_configuration_questionaire(instance_name: str) -> dict:
276
279
  if is_mfa:
277
280
  config["two_factor_auth"] = is_mfa
278
281
 
282
+ current_server_url = f"http://localhost:{config['port']}{config['api_path']}"
283
+ config["server_url"] = q.text(
284
+ "What is the server url exposed to the users? If you are running a"
285
+ " development server running locally, this is the same as the "
286
+ "server url. If you are running a production server, this is the "
287
+ "url that users will connect to.",
288
+ default=current_server_url,
289
+ ).ask()
290
+
279
291
  is_add_vpn = q.confirm("Do you want to add a VPN server?", default=False).ask()
280
292
  if is_add_vpn:
281
293
  vpn_config = q.prompt(
@@ -7,6 +7,7 @@ All classes are derived from the abstract AppContext class and provide the
7
7
  vantage6 applications with naming conventions, standard file locations, and
8
8
  more.
9
9
  """
10
+
10
11
  from colorama import Fore, Style
11
12
 
12
13
  from vantage6.common.globals import InstanceType
@@ -431,12 +431,10 @@ def create_demo_network(
431
431
  f"{Style.RESET_ALL}."
432
432
  )
433
433
  else:
434
- error(
435
- f"Configuration {Fore.RED}{server_name}{Style.RESET_ALL} " "already exists!"
436
- )
434
+ error(f"Configuration {Fore.RED}{server_name}{Style.RESET_ALL} already exists!")
437
435
  exit(1)
438
436
  (node_config, server_import_config, server_config) = demo
439
- ctx = get_server_context(server_name, True)
437
+ ctx = get_server_context(server_name, True, ServerContext)
440
438
  click_ctx.invoke(
441
439
  cli_server_import,
442
440
  ctx=ctx,
@@ -8,14 +8,14 @@ import click
8
8
  from vantage6.common import info
9
9
  from vantage6.cli.context.server import ServerContext
10
10
  from vantage6.cli.context.node import NodeContext
11
- from vantage6.cli.server.common import click_insert_context
11
+ from vantage6.cli.common.decorator import click_insert_context
12
12
  from vantage6.cli.server.remove import cli_server_remove
13
13
  from vantage6.cli.utils import remove_file
14
14
  from vantage6.common.globals import InstanceType
15
15
 
16
16
 
17
17
  @click.command()
18
- @click_insert_context
18
+ @click_insert_context(type_="server")
19
19
  @click.pass_context
20
20
  def remove_demo_network(click_ctx: click.Context, ctx: ServerContext) -> None:
21
21
  """Remove all related demo network files and folders.
vantage6/cli/dev/start.py CHANGED
@@ -3,12 +3,12 @@ import click
3
3
 
4
4
  from vantage6.cli.context.server import ServerContext
5
5
  from vantage6.cli.context.node import NodeContext
6
- from vantage6.cli.server.common import click_insert_context
6
+ from vantage6.cli.common.decorator import click_insert_context
7
7
  from vantage6.cli.server.start import cli_server_start
8
8
 
9
9
 
10
10
  @click.command()
11
- @click_insert_context
11
+ @click_insert_context(type_="server")
12
12
  @click.option(
13
13
  "--server-image", type=str, default=None, help="Server Docker image to use"
14
14
  )
vantage6/cli/dev/stop.py CHANGED
@@ -2,13 +2,13 @@ import click
2
2
 
3
3
  from vantage6.cli.context.server import ServerContext
4
4
  from vantage6.cli.context.node import NodeContext
5
- from vantage6.cli.server.common import click_insert_context
5
+ from vantage6.cli.common.decorator import click_insert_context
6
6
  from vantage6.cli.server.stop import cli_server_stop
7
7
  from vantage6.cli.node.stop import cli_node_stop
8
8
 
9
9
 
10
10
  @click.command()
11
- @click_insert_context
11
+ @click_insert_context(type_="server")
12
12
  @click.pass_context
13
13
  def stop_demo_network(click_ctx: click.Context, ctx: ServerContext) -> None:
14
14
  """Stops a demo network's server and nodes.
vantage6/cli/globals.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  This module contains global variables that are used throughout the CLI.
3
3
  """
4
+
4
5
  from enum import Enum
5
6
  from pathlib import Path
6
7
  from vantage6.common.globals import APPNAME
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Common functions that are used in node CLI commands
3
3
  """
4
+
4
5
  from typing import Iterable
5
6
 
6
7
  import questionary as q
@@ -198,7 +198,7 @@ def cli_node_start(
198
198
  # FIXME: should obtain mount points from DockerNodeContext
199
199
  mounts = [
200
200
  # (target, source)
201
- (f"/mnt/log/{name}", str(ctx.log_dir)),
201
+ ("/mnt/log", str(ctx.log_dir)),
202
202
  ("/mnt/data", data_volume.name),
203
203
  ("/mnt/vpn", vpn_volume.name),
204
204
  ("/mnt/ssh", ssh_volume.name),
@@ -1,96 +1,19 @@
1
1
  from typing import Iterable
2
- from functools import wraps
3
2
 
4
3
  from docker.client import DockerClient
5
- import click
6
4
  from colorama import Fore, Style
7
5
 
8
6
  from vantage6.common import error, info
9
- from vantage6.common.globals import STRING_ENCODING, APPNAME, InstanceType
7
+ from vantage6.common.globals import STRING_ENCODING, APPNAME
10
8
  from vantage6.common.docker.addons import remove_container, get_container
9
+ from vantage6.common.context import AppContext
11
10
 
12
- from vantage6.cli.globals import DEFAULT_SERVER_SYSTEM_FOLDERS
13
11
  from vantage6.cli.context.server import ServerContext
14
- from vantage6.cli.configuration_wizard import select_configuration_questionaire
15
12
 
16
13
 
17
- def click_insert_context(func: callable) -> callable:
18
- """
19
- Supply the Click function with additional context parameters. The context
20
- is then passed to the function as the first argument.
21
-
22
- Parameters
23
- ----------
24
- func : Callable
25
- function you want the context to be passed to
26
-
27
- Returns
28
- -------
29
- Callable
30
- Click function with context
31
- """
32
-
33
- @click.option(
34
- "-n", "--name", default=None, help="Name of the configuration you want to use."
35
- )
36
- @click.option(
37
- "-c",
38
- "--config",
39
- default=None,
40
- help="Absolute path to configuration-file; overrides NAME",
41
- )
42
- @click.option(
43
- "--system",
44
- "system_folders",
45
- flag_value=True,
46
- help="Use system folders instead of user folders. This is " "the default",
47
- )
48
- @click.option(
49
- "--user",
50
- "system_folders",
51
- flag_value=False,
52
- default=DEFAULT_SERVER_SYSTEM_FOLDERS,
53
- help="Use user folders instead of system folders",
54
- )
55
- @wraps(func)
56
- def func_with_context(
57
- name: str, config: str, system_folders: bool, *args, **kwargs
58
- ) -> callable:
59
- """
60
- Decorator function that adds the context to the function.
61
-
62
- Returns
63
- -------
64
- Callable
65
- Decorated function
66
- """
67
- # path to configuration file always overrides name
68
- if config:
69
- ctx = ServerContext.from_external_config_file(config, system_folders)
70
- elif "ctx" in kwargs:
71
- # if ctx is already in kwargs (typically when one click command
72
- # calls another internally), use that existing ctx
73
- ctx = kwargs.pop("ctx")
74
- else:
75
- # in case no name, ctx or config file is supplied, ask the user to
76
- # select an existing config by name
77
- if not name:
78
- try:
79
- # select configuration if none supplied
80
- name = select_configuration_questionaire(
81
- InstanceType.SERVER, system_folders
82
- )
83
- except Exception:
84
- error("No configurations could be found!")
85
- exit(1)
86
-
87
- ctx = get_server_context(name, system_folders)
88
- return func(ctx, *args, **kwargs)
89
-
90
- return func_with_context
91
-
92
-
93
- def get_server_context(name: str, system_folders: bool) -> ServerContext:
14
+ def get_server_context(
15
+ name: str, system_folders: bool, ctx_class: AppContext
16
+ ) -> AppContext:
94
17
  """
95
18
  Load the server context from the configuration file.
96
19
 
@@ -100,13 +23,15 @@ def get_server_context(name: str, system_folders: bool) -> ServerContext:
100
23
  Name of the server to inspect
101
24
  system_folders : bool
102
25
  Wether to use system folders or if False, the user folders
26
+ ctx_class : AppContext
27
+ Context class to be used. Derivative of AppContext class
103
28
 
104
29
  Returns
105
30
  -------
106
31
  ServerContext
107
32
  Server context object
108
33
  """
109
- if not ServerContext.config_exists(name, system_folders):
34
+ if not ctx_class.config_exists(name, system_folders):
110
35
  scope = "system" if system_folders else "user"
111
36
  error(
112
37
  f"Configuration {Fore.RED}{name}{Style.RESET_ALL} does not "
@@ -116,10 +41,10 @@ def get_server_context(name: str, system_folders: bool) -> ServerContext:
116
41
 
117
42
  # We do not want to log this here, we do this in the container and not on
118
43
  # the host. We only want CLI logging here.
119
- ServerContext.LOGGING_ENABLED = False
44
+ ctx_class.LOGGING_ENABLED = False
120
45
 
121
46
  # create server context, and initialize db
122
- ctx = ServerContext(name, system_folders=system_folders)
47
+ ctx = ctx_class(name, system_folders=system_folders)
123
48
 
124
49
  return ctx
125
50
 
@@ -2,11 +2,11 @@ import click
2
2
 
3
3
  from vantage6.common import info
4
4
  from vantage6.cli.context.server import ServerContext
5
- from vantage6.cli.server.common import click_insert_context
5
+ from vantage6.cli.common.decorator import click_insert_context
6
6
 
7
7
 
8
8
  @click.command()
9
- @click_insert_context
9
+ @click_insert_context(type_="server")
10
10
  def cli_server_files(ctx: ServerContext) -> None:
11
11
  """
12
12
  List files that belong to a particular server instance.
@@ -16,7 +16,8 @@ from vantage6.common.globals import (
16
16
  )
17
17
  from vantage6.cli.context.server import ServerContext
18
18
  from vantage6.cli.utils import check_config_name_allowed
19
- from vantage6.cli.server.common import click_insert_context, print_log_worker
19
+ from vantage6.cli.common.decorator import click_insert_context
20
+ from vantage6.cli.server.common import print_log_worker
20
21
 
21
22
 
22
23
  # TODO this method has a lot of duplicated code from `start`
@@ -41,7 +42,7 @@ from vantage6.cli.server.common import click_insert_context, print_log_worker
41
42
  help="Keep image after finishing. Useful for debugging",
42
43
  )
43
44
  @click.option("--wait", default=False, help="Wait for the import to finish")
44
- @click_insert_context
45
+ @click_insert_context(type_="server")
45
46
  def cli_server_import(
46
47
  ctx: ServerContext,
47
48
  file: str,
@@ -1,12 +1,8 @@
1
1
  import click
2
- import docker
3
2
 
4
- from colorama import Fore, Style
5
-
6
- from vantage6.common import warning
7
3
  from vantage6.common.docker.addons import check_docker_running
8
- from vantage6.common.globals import APPNAME, InstanceType
9
- from vantage6.cli.context.server import ServerContext
4
+ from vantage6.common.globals import InstanceType
5
+ from vantage6.cli.common.utils import get_server_configuration_list
10
6
 
11
7
 
12
8
  @click.command()
@@ -15,45 +11,5 @@ def cli_server_configuration_list() -> None:
15
11
  Print the available server configurations.
16
12
  """
17
13
  check_docker_running()
18
- client = docker.from_env()
19
-
20
- running_server = client.containers.list(
21
- filters={"label": f"{APPNAME}-type={InstanceType.SERVER}"}
22
- )
23
- running_node_names = []
24
- for node in running_server:
25
- running_node_names.append(node.name)
26
-
27
- header = "\nName" + (21 * " ") + "Status" + (10 * " ") + "System/User"
28
-
29
- click.echo(header)
30
- click.echo("-" * len(header))
31
-
32
- running = Fore.GREEN + "Running" + Style.RESET_ALL
33
- stopped = Fore.RED + "Not running" + Style.RESET_ALL
34
-
35
- # system folders
36
- configs, f1 = ServerContext.available_configurations(system_folders=True)
37
- for config in configs:
38
- status = (
39
- running
40
- if f"{APPNAME}-{config.name}-system-{InstanceType.SERVER}"
41
- in running_node_names
42
- else stopped
43
- )
44
- click.echo(f"{config.name:25}" f"{status:25} System ")
45
-
46
- # user folders
47
- configs, f2 = ServerContext.available_configurations(system_folders=False)
48
- for config in configs:
49
- status = (
50
- running
51
- if f"{APPNAME}-{config.name}-user-{InstanceType.SERVER}"
52
- in running_node_names
53
- else stopped
54
- )
55
- click.echo(f"{config.name:25}" f"{status:25} User ")
56
14
 
57
- click.echo("-" * 85)
58
- if len(f1) + len(f2):
59
- warning(f"{Fore.RED}Failed imports: {len(f1)+len(f2)}{Style.RESET_ALL}")
15
+ get_server_configuration_list(InstanceType.SERVER)
@@ -4,13 +4,13 @@ import questionary as q
4
4
 
5
5
  from vantage6.common import info
6
6
  from vantage6.common.docker.addons import check_docker_running
7
- from vantage6.cli.server.common import click_insert_context
7
+ from vantage6.cli.common.decorator import click_insert_context
8
8
  from vantage6.cli.context import ServerContext
9
9
  from vantage6.cli.utils import remove_file
10
10
 
11
11
 
12
12
  @click.command()
13
- @click_insert_context
13
+ @click_insert_context(type_="server")
14
14
  @click.option("-f", "--force", "force", flag_value=True)
15
15
  def cli_server_remove(ctx: ServerContext, force: bool) -> None:
16
16
  """
@@ -8,11 +8,11 @@ from vantage6.common import info, error, debug as debug_msg
8
8
  from vantage6.common.docker.addons import check_docker_running
9
9
  from vantage6.common.globals import APPNAME, InstanceType
10
10
  from vantage6.cli.context.server import ServerContext
11
- from vantage6.cli.server.common import click_insert_context
11
+ from vantage6.cli.common.decorator import click_insert_context
12
12
 
13
13
 
14
14
  @click.command()
15
- @click_insert_context
15
+ @click_insert_context(type_="server")
16
16
  def cli_server_shell(ctx: ServerContext) -> None:
17
17
  """
18
18
  Run an iPython shell within a running server. This can be used to modify
@@ -14,7 +14,8 @@ from vantage6.common.globals import (
14
14
  from vantage6.cli.globals import DEFAULT_UI_PORT, ServerGlobals
15
15
  from vantage6.cli.context.server import ServerContext
16
16
  from vantage6.cli.rabbitmq.queue_manager import RabbitMQManager
17
- from vantage6.cli.server.common import click_insert_context, stop_ui
17
+ from vantage6.cli.server.common import stop_ui
18
+ from vantage6.cli.common.decorator import click_insert_context
18
19
  from vantage6.cli.common.start import (
19
20
  attach_logs,
20
21
  check_for_start,
@@ -64,7 +65,7 @@ from vantage6.cli.common.start import (
64
65
  default=False,
65
66
  help="Print server logs to the console after start",
66
67
  )
67
- @click_insert_context
68
+ @click_insert_context(type_="server")
68
69
  def cli_server_start(
69
70
  ctx: ServerContext,
70
71
  ip: str,
@@ -17,7 +17,7 @@ from vantage6.common.docker.addons import (
17
17
  )
18
18
  from vantage6.common.globals import APPNAME, InstanceType
19
19
  from vantage6.cli.rabbitmq import split_rabbitmq_uri
20
-
20
+ from vantage6.cli.context.server import ServerContext
21
21
  from vantage6.cli.globals import DEFAULT_SERVER_SYSTEM_FOLDERS
22
22
  from vantage6.cli.server.common import get_server_context, stop_ui
23
23
 
@@ -91,7 +91,7 @@ def _stop_server_containers(
91
91
  scope = "system" if system_folders else "user"
92
92
  config_name = get_server_config_name(container_name, scope)
93
93
 
94
- ctx = get_server_context(config_name, system_folders)
94
+ ctx = get_server_context(config_name, system_folders, ServerContext)
95
95
 
96
96
  # kill the UI container (if it exists)
97
97
  stop_ui(client, ctx)
@@ -1,10 +1,10 @@
1
1
  import click
2
- import questionary as q
3
2
  import docker
4
3
 
5
4
  from vantage6.common import error
6
5
  from vantage6.common.docker.addons import check_docker_running
7
- from vantage6.common.globals import APPNAME, InstanceType
6
+ from vantage6.common.globals import InstanceType
7
+ from vantage6.cli.common.utils import get_server_name, get_running_servers
8
8
  from vantage6.cli.globals import DEFAULT_SERVER_SYSTEM_FOLDERS
9
9
  from vantage6.cli import __version__
10
10
 
@@ -22,24 +22,11 @@ def cli_server_version(name: str, system_folders: bool) -> None:
22
22
  check_docker_running()
23
23
  client = docker.from_env()
24
24
 
25
- running_servers = client.containers.list(
26
- filters={"label": f"{APPNAME}-type={InstanceType.SERVER}"}
27
- )
28
- running_server_names = [server.name for server in running_servers]
25
+ running_server_names = get_running_servers(client, InstanceType.SERVER)
29
26
 
30
- if not name:
31
- if not running_server_names:
32
- error(
33
- "No servers are running! You can only check the version for "
34
- "servers that are running"
35
- )
36
- exit(1)
37
- name = q.select(
38
- "Select the server you wish to inspect:", choices=running_server_names
39
- ).ask()
40
- else:
41
- post_fix = "system" if system_folders else "user"
42
- name = f"{APPNAME}-{name}-{post_fix}"
27
+ name = get_server_name(
28
+ name, system_folders, running_server_names, InstanceType.SERVER
29
+ )
43
30
 
44
31
  if name in running_server_names:
45
32
  container = client.containers.get(name)
@@ -47,6 +47,12 @@ from vantage6.cli.test.common.diagnostic_runner import DiagnosticRunner
47
47
  help="Run the diagnostic test on only nodes that are online",
48
48
  )
49
49
  @click.option("--no-vpn", is_flag=True, help="Don't execute VPN tests")
50
+ @click.option(
51
+ "--private-key",
52
+ type=str,
53
+ default=None,
54
+ help="Path to the private key for end-to-end encryption",
55
+ )
50
56
  def cli_test_features(
51
57
  host: str,
52
58
  port: int,
@@ -58,6 +64,7 @@ def cli_test_features(
58
64
  all_nodes: bool,
59
65
  online_only: bool,
60
66
  no_vpn: bool,
67
+ private_key: str | None,
61
68
  ) -> list[dict]:
62
69
  """
63
70
  Run diagnostic checks on an existing vantage6 network.
@@ -74,7 +81,7 @@ def cli_test_features(
74
81
 
75
82
  client = UserClient(host=host, port=port, path=api_path, log_level="critical")
76
83
  client.authenticate(username=username, password=password)
77
- client.setup_encryption(None)
84
+ client.setup_encryption(private_key)
78
85
  diagnose = DiagnosticRunner(client, collaboration, organizations, online_only)
79
86
  res = diagnose(base=True, vpn=not no_vpn)
80
87
  return res
vantage6/cli/utils.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Utility functions for the CLI
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import re
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vantage6
3
- Version: 4.3.0b3
3
+ Version: 4.3.0b5
4
4
  Summary: vantage6 command line interface
5
5
  Home-page: https://github.com/vantage6/vantage6
6
6
  Requires-Python: >=3.10
@@ -15,8 +15,8 @@ Requires-Dist: questionary ==1.10.0
15
15
  Requires-Dist: rich ==13.5.2
16
16
  Requires-Dist: schema ==0.7.5
17
17
  Requires-Dist: SQLAlchemy ==1.4.46
18
- Requires-Dist: vantage6-common ==4.3.0b3
19
- Requires-Dist: vantage6-client ==4.3.0b3
18
+ Requires-Dist: vantage6-common ==4.3.0b5
19
+ Requires-Dist: vantage6-client ==4.3.0b5
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: coverage ==6.4.4 ; extra == 'dev'
22
22
  Requires-Dist: black ; extra == 'dev'
@@ -1,33 +1,36 @@
1
1
  tests_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  tests_cli/test_example.py,sha256=0fw_v-lgZEacshWSDwLNyLMA1_xc48bKUGM3ll-n1L0,146
3
3
  tests_cli/test_node_cli.py,sha256=FpK6MXQL_0i42k1hf4enfoLamCZ0Clv2cNLBryS-rEs,15758
4
- tests_cli/test_server_cli.py,sha256=gfbwp_JFsEv0MZlKZuemNhdNkU4sxCARHy4gTDCdZp0,5798
4
+ tests_cli/test_server_cli.py,sha256=eGJx_XHzfcYlJC6ytc8tHu6nxkr9FqKws-lovp2WFks,5801
5
5
  tests_cli/test_wizard.py,sha256=ntYuXm3SWKvPgcE7wGVPM9ReWoPNMu9_UbDL6KAE1wU,3772
6
- vantage6/cli/__build__,sha256=TgdAhWK-24tgzgXB3s_jrRa3IjCWfeAfZAt-Rym0n84,1
6
+ vantage6/cli/__build__,sha256=7y0SfeN7lCuq0GFF5UsMYZofIjJ7LrvPvsePVWSv450,1
7
7
  vantage6/cli/__init__.py,sha256=dEbhLHe9VfU3otY3CQkMVrj39uPGWjqzAvHW2B2Flgs,62
8
8
  vantage6/cli/_version.py,sha256=KQrzTJZVe-_U7oqr-s8Cgd2NFSkskimnkIIKa_7yXcc,695
9
- vantage6/cli/cli.py,sha256=OO--_SGHTFKM_SzuVu2WMfsOpeI5-r3ElM2H2xxVpI8,5630
10
- vantage6/cli/configuration_manager.py,sha256=gN-FINxV74Sj58FeSgwlDX-ZpWoOCw-e2l-1a0Bysu0,3501
11
- vantage6/cli/configuration_wizard.py,sha256=ig8oJumGbSB5PQY1Q8b0zV4R8v2xEzIvkeFqVu1x9PU,13818
12
- vantage6/cli/globals.py,sha256=ioATsNh41iWvupVPxpN85CrCZaasExptDFPfzzxD_MU,1641
13
- vantage6/cli/utils.py,sha256=J-LesedzLquJ5lWe4kOaPe2G6WmBorU-Dj_P_WiqZaU,2364
9
+ vantage6/cli/cli.py,sha256=G7qpHK-LTOjwZOQxVL_BNONekTBSsS9U4ZD1oweGp48,5904
10
+ vantage6/cli/configuration_manager.py,sha256=wxQYhRqjCMgXuk7ycN5AHnD1R6Hi7S2kl7dpCAUHNOc,3506
11
+ vantage6/cli/configuration_wizard.py,sha256=pzKJJvg5idk9kc0sPFTo-Q9VFltm4L5vhSuQDPJV5KM,14295
12
+ vantage6/cli/globals.py,sha256=-d-y-ASioIMhvzVxNATyFOs5cKXGkiWf_75gqiT2B-M,1642
13
+ vantage6/cli/utils.py,sha256=8_PZeihjopYXQU10gMwIKr87yDAq-_z2LKi0BcdhNEc,2365
14
14
  vantage6/cli/algorithm/create.py,sha256=xdQGVhpIdqkOXLaVBB8Jc1Q9SbsWtR8KiYIfqH8ww0I,1453
15
15
  vantage6/cli/algorithm/update.py,sha256=t2JgJZohYBoVRsIx9er2tKO1yQnzanEJkIEm65XaQqc,800
16
- vantage6/cli/algostore/attach.py,sha256=KsoYPE3Ukv8dTs-cNY8kJJJ-xeCQxbOMhjbEukZJ4iU,1123
16
+ vantage6/cli/algostore/attach.py,sha256=Gr5Zb320cMdAOOpNbhx459M1YlI9qaCjt8YlSm-wMOQ,1135
17
+ vantage6/cli/algostore/files.py,sha256=r89VRixK_K-c44qseq58Aa2Dqf1wEf8yompQRN5AVu4,580
18
+ vantage6/cli/algostore/list.py,sha256=owBrU52ANp8oE68Rk1Hhd6yNYqWX-7uREtmCok_wndg,417
17
19
  vantage6/cli/algostore/new.py,sha256=9CMYBjHyXPIhOx7wtkFf99-6EHSTG70MRdg8m8VtMUg,2009
18
- vantage6/cli/algostore/start.py,sha256=iuo6eOvNvRk9SrJUg5X8IdETIXlyWszwgrm0dhDhz4A,3087
19
- vantage6/cli/algostore/stop.py,sha256=M3_nb4f0TZiJODKiBuxGgvfrZEdgRTh5qohDoqZeCQw,1814
20
- vantage6/cli/common/decorator.py,sha256=F0tDTQz6wVH9R-jOfhA1Vx7nJZ1u30V4Sez8NuKV2g4,3222
20
+ vantage6/cli/algostore/start.py,sha256=UTtw6Q8fNXn4x_JtH2cdQ2V78afSxsQxFtAL9EmAVZA,3099
21
+ vantage6/cli/algostore/stop.py,sha256=q1bkATwB8cdNAgWxGBr9C6o4wSUaKKQky4Oa_f-FFj8,1826
22
+ vantage6/cli/common/decorator.py,sha256=vPAJex_8aEAYgv64l34tupQuU31JOwLkL-jLRaQ96Zs,3234
21
23
  vantage6/cli/common/start.py,sha256=P9qXwdEzSL_wPyvsSiF4rcX-aVsO_AwbYPYhXIIh4Cs,7029
22
- vantage6/cli/context/__init__.py,sha256=u3f5LjsIjb_DhAL86jwa5V_9CpJjgbF4wwhxpostLvI,2682
24
+ vantage6/cli/common/utils.py,sha256=EfY0cO2nnM-RLhfb7mVUOMwt8S66ZNAHLV5vxZJWjo0,3408
25
+ vantage6/cli/context/__init__.py,sha256=e8rfY2tCyu6_SLQ-rbVzEHkDtmbnGCZRHFN_HH-2bnA,2683
23
26
  vantage6/cli/context/algorithm_store.py,sha256=IyQ8MaaAPI3V73R0NBp3XMJSqYwc0RF83EeILmvuZhY,4063
24
27
  vantage6/cli/context/base_server.py,sha256=paKSzNrKWD-J6eakHAtGELk2cD05A8NqoCAuQfF7c2s,2972
25
28
  vantage6/cli/context/node.py,sha256=kOSUCEGik4eVIeY2YzUhPI1LwZrmaq1HuXREvBFRFKY,7236
26
29
  vantage6/cli/context/server.py,sha256=f19cAc_rjrNctzllrsozZ2O7k2pTS94_oDqzLMsgPj8,4071
27
- vantage6/cli/dev/create.py,sha256=Arw2KuI9vJ60I96X6ND9n72Ng2lScq4MXb0MvEbwvRM,13408
28
- vantage6/cli/dev/remove.py,sha256=5jPjKaYnStCZkVIrn36A3yM_Hea8f6wtjOSiq865sv4,2204
29
- vantage6/cli/dev/start.py,sha256=eVT2-v_tfzjGuKYbnl2ltZmSQa3KdRl5D1nNB62lfQ4,1648
30
- vantage6/cli/dev/stop.py,sha256=YHsTBRvIWcA7Nmv6tNwpIsxkUeTyieXAPTTQGh_Dj1w,1033
30
+ vantage6/cli/dev/create.py,sha256=65iOMsp3SqHYBwMQhpK3FL2bbf58yPIjd34fO_lexU4,13398
31
+ vantage6/cli/dev/remove.py,sha256=-qPWY9VTpB11QqxznJWhjkobFMP-gxz8EAZyjfZDP5g,2223
32
+ vantage6/cli/dev/start.py,sha256=uIxSJGmqUqOVvMmACaGEO-9q9nAmviyv6g4H-SjdMKk,1667
33
+ vantage6/cli/dev/stop.py,sha256=hZhNXNe4I0Vfq9GFTYZ1vSJCJxSPkpVlud48klmLkwk,1052
31
34
  vantage6/cli/node/attach.py,sha256=uWKoP8N__yJZj1QX_xRWHGnBJnEP0peGAH22SpwVXdo,2167
32
35
  vantage6/cli/node/clean.py,sha256=9W9PaVILx8SnmB2lymw23KJeQmH5nFcX79QHcEOvo0A,1124
33
36
  vantage6/cli/node/create_private_key.py,sha256=ojzwis_EW5AaBHc7gK9LmGhFxZTAkuBUQpEpjYcnC74,4997
@@ -36,33 +39,33 @@ vantage6/cli/node/list.py,sha256=_WZ8EBIEUlzFhVp3cR2MK5FUuQicMEZHhD8npMwKSpM,166
36
39
  vantage6/cli/node/new.py,sha256=C-ZHQOiOtslOy6mF-G-MuR5E_65GKJW7L4FxxrKojUg,1923
37
40
  vantage6/cli/node/remove.py,sha256=9pBWKF1YtvT6j7fDOKAEkGeT57JpJQgHa3uLorA5e4s,3553
38
41
  vantage6/cli/node/set_api_key.py,sha256=IX07QwpTGefRC92lqm34HX9xThRVcXl5DcWSLt1Ro6w,1747
39
- vantage6/cli/node/start.py,sha256=HsoI4Mf_Ue4_an1PMzm2OTgcaD-2YLnpZ4mzX2CnD4Y,13326
42
+ vantage6/cli/node/start.py,sha256=0UxIImtDxcYkjUFz2KzIORhsmsVnE3M2Uz4s-JDZzNs,13318
40
43
  vantage6/cli/node/stop.py,sha256=NfXlSCQ6VcC15iVhgiMklIq-inv6aPnoHrjnvbFpAHc,2678
41
44
  vantage6/cli/node/version.py,sha256=eYJ4ayQsEsHPL00V88UY1LhmlnQCzF-Te4lrw4SFbHQ,1836
42
- vantage6/cli/node/common/__init__.py,sha256=IOHza2H0e-igJg4iWFqE4Pqs8czafq_8GPT_pWYoJD8,3238
45
+ vantage6/cli/node/common/__init__.py,sha256=blcX0xvTnFvWITdt7d250CxtjxrXbA-xmL6m4G0g8GA,3239
43
46
  vantage6/cli/rabbitmq/__init__.py,sha256=Kb8pTiIAoRchbwLznM6-c4j6mkKAKXAparpYbjjajHU,737
44
47
  vantage6/cli/rabbitmq/definitions.py,sha256=CcS9jG7ZGB6LjzHQqZ2FliDurPItUvNSjHrOYptORZg,637
45
48
  vantage6/cli/rabbitmq/queue_manager.py,sha256=QurvkbgtRUUBSv_XggnLEpvi33oeFuwB7abPe_QSRtA,7543
46
49
  vantage6/cli/rabbitmq/rabbitmq.config,sha256=LYAQAEoXaF472XeJDYXc9JfWSETIzPRIR2W-JB2i7fU,136
47
50
  vantage6/cli/server/attach.py,sha256=5FhopXz0b25EnL4Pu8auqFKOrSHsTTuNmrmgZ6HS0xs,2004
48
- vantage6/cli/server/files.py,sha256=lYqr5ZjEPbd6hd2b1_M2AEKgHuNAwDoyDll88Obe33Q,488
49
- vantage6/cli/server/import_.py,sha256=PGG5VLc_NIoXTVlGqCHHCjd4l-aytEWHkr57wDF9nyg,4611
50
- vantage6/cli/server/list.py,sha256=3MlnirengkcWCmSJOfvFNClU5I-OVSXvEQy_-qhHjGU,1797
51
+ vantage6/cli/server/files.py,sha256=LJhFyYHcEnCgFhVAM-lX6_EnfhMJ7YPdN21kVIpmwkc,507
52
+ vantage6/cli/server/import_.py,sha256=CA0Y2VoyCO8Vg9pkPse9tifalh7meTcXi-cS2tEj38Y,4668
53
+ vantage6/cli/server/list.py,sha256=qxBaUFmkP2tNNo9cuZB5OsVg3KD_c9KJDSTC4cxuUOM,404
51
54
  vantage6/cli/server/new.py,sha256=SGOQXQDNg9ihnPpmJCDTQ-Yn2GkDhEu84dtsQ3v5Pq4,1978
52
- vantage6/cli/server/remove.py,sha256=bXT4fk4Chfk1029gc4RiZlxGdpeo7H8Ua3BKYJLlw_4,1195
53
- vantage6/cli/server/shell.py,sha256=NfbBKmzTcA6fLcLO_tj_BecbzMScoAkmC00sDhYa9Sw,1564
54
- vantage6/cli/server/start.py,sha256=T93mEm5T2OiBUifqkizyD5Eu8edZG80mTWgvx1k70oc,7593
55
- vantage6/cli/server/stop.py,sha256=Go94ch1yzjWjwNbDqqobc2koGqVX3bK5My-nQxL17C0,3950
56
- vantage6/cli/server/version.py,sha256=Q6xeXECONdhutMMAsqSvTqSGQm4rObP-gbmP03ugY7I,1738
57
- vantage6/cli/server/common/__init__.py,sha256=TTB7BoOw0YL483Vt5-wseaEUq2Er9DKyNWxJFNBFeko,4835
55
+ vantage6/cli/server/remove.py,sha256=2Zjs8Aq3XYNpeaGr5eSJmPCnxbYlyyEQPKSdPaJnAF4,1214
56
+ vantage6/cli/server/shell.py,sha256=9b_koFmBQRQYIK57usm75hZAaIF4msicLTu55dYHlzM,1583
57
+ vantage6/cli/server/start.py,sha256=1060ZBES8MQwLOsPb664q-wv-wNtWycNtKn-TrO5G54,7650
58
+ vantage6/cli/server/stop.py,sha256=A3io-Gopm4vjOfOZYYFze8LQKFtvZBaHx99C_ULnPRk,4018
59
+ vantage6/cli/server/version.py,sha256=AUYp0CJBnYF8tD3HXqE7kM0RycXipjOYEDkraswUlaA,1306
60
+ vantage6/cli/server/common/__init__.py,sha256=q79uqZ4v-biPJcp4-g4_n_voAdYo1HnTgQJtvkAfqzU,2443
58
61
  vantage6/cli/template/node_config.j2,sha256=ebTifJuRlfUhjtI8jm9A2SWXGpUcg8L-XUBInSwAppA,522
59
62
  vantage6/cli/template/server_config.j2,sha256=rKXMky8rA7Lnf5USlPx0Es9AskwmL4bILWfACPvygv4,394
60
63
  vantage6/cli/template/server_import_config.j2,sha256=PRB0ym_FYjx9vhkmY9C0xzlv_85Y5kBfWdUYs089bNQ,1844
61
- vantage6/cli/test/feature_tester.py,sha256=2fyzcksj2mandORn3j814PXyhWE7huaKuIHyxhlUX0Y,2329
64
+ vantage6/cli/test/feature_tester.py,sha256=vTmJrqjA6J_GFWvZDmin4Nx1AO2Mhy21YacTr2vZi2U,2497
62
65
  vantage6/cli/test/integration_test.py,sha256=DT3qjl1lq7nVBflT5ed1Yu2aNT1cwHCqh8_hafi4e2k,3802
63
66
  vantage6/cli/test/common/diagnostic_runner.py,sha256=x_4ikihgoSTKI914pqlgVziBSg5LpV6MheO6O_GBCeA,6657
64
- vantage6-4.3.0b3.dist-info/METADATA,sha256=nUUf7FkPF13CyWBWNL2QiPD-Cy-duMnSNTz0GxoYZtg,9845
65
- vantage6-4.3.0b3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
66
- vantage6-4.3.0b3.dist-info/entry_points.txt,sha256=YFBvwjxoeAGxYyPC-YevEgOBBYRGaXkS6jiOGGCLNy0,157
67
- vantage6-4.3.0b3.dist-info/top_level.txt,sha256=CYDIBS8jEfFq5YCs_Fuit54K9-3wdosZppTrsymIoUk,19
68
- vantage6-4.3.0b3.dist-info/RECORD,,
67
+ vantage6-4.3.0b5.dist-info/METADATA,sha256=5eXTgHfu7EM1-pN3CHeb8iHeckzhV5_Etxaq3LOJ4Yk,9845
68
+ vantage6-4.3.0b5.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
69
+ vantage6-4.3.0b5.dist-info/entry_points.txt,sha256=YFBvwjxoeAGxYyPC-YevEgOBBYRGaXkS6jiOGGCLNy0,157
70
+ vantage6-4.3.0b5.dist-info/top_level.txt,sha256=CYDIBS8jEfFq5YCs_Fuit54K9-3wdosZppTrsymIoUk,19
71
+ vantage6-4.3.0b5.dist-info/RECORD,,