stoobly-agent 1.10.1__py3-none-any.whl → 1.10.2__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.
Files changed (155) hide show
  1. stoobly_agent/__init__.py +1 -1
  2. stoobly_agent/__main__.py +10 -0
  3. stoobly_agent/app/cli/ca_cert_cli.py +9 -5
  4. stoobly_agent/app/cli/helpers/replay_facade.py +2 -2
  5. stoobly_agent/app/cli/intercept_cli.py +5 -5
  6. stoobly_agent/app/cli/request_cli.py +2 -2
  7. stoobly_agent/app/cli/scaffold/app.py +14 -5
  8. stoobly_agent/app/cli/scaffold/app_command.py +0 -4
  9. stoobly_agent/app/cli/scaffold/app_config.py +49 -2
  10. stoobly_agent/app/cli/scaffold/app_create_command.py +145 -76
  11. stoobly_agent/app/cli/scaffold/constants.py +8 -1
  12. stoobly_agent/app/cli/scaffold/docker/constants.py +3 -1
  13. stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py +2 -2
  14. stoobly_agent/app/cli/scaffold/docker/service/builder.py +15 -49
  15. stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py +3 -0
  16. stoobly_agent/app/cli/scaffold/docker/template_files.py +112 -0
  17. stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py +1 -1
  18. stoobly_agent/app/cli/scaffold/docker/workflow/builder.py +31 -39
  19. stoobly_agent/app/cli/scaffold/docker/workflow/command_decorator.py +1 -1
  20. stoobly_agent/app/cli/scaffold/docker/workflow/detached_decorator.py +1 -1
  21. stoobly_agent/app/cli/scaffold/docker/workflow/dns_decorator.py +2 -3
  22. stoobly_agent/app/cli/scaffold/docker/workflow/local_decorator.py +1 -1
  23. stoobly_agent/app/cli/scaffold/docker/workflow/mock_decorator.py +1 -1
  24. stoobly_agent/app/cli/scaffold/docker/workflow/reverse_proxy_decorator.py +1 -1
  25. stoobly_agent/app/cli/scaffold/docker/workflow/run_command.py +423 -0
  26. stoobly_agent/app/cli/scaffold/local/__init__.py +0 -0
  27. stoobly_agent/app/cli/scaffold/local/service/__init__.py +0 -0
  28. stoobly_agent/app/cli/scaffold/local/service/builder.py +72 -0
  29. stoobly_agent/app/cli/scaffold/local/workflow/__init__.py +0 -0
  30. stoobly_agent/app/cli/scaffold/local/workflow/builder.py +35 -0
  31. stoobly_agent/app/cli/scaffold/local/workflow/run_command.py +339 -0
  32. stoobly_agent/app/cli/scaffold/service_command.py +9 -1
  33. stoobly_agent/app/cli/scaffold/service_config.py +8 -0
  34. stoobly_agent/app/cli/scaffold/service_create_command.py +18 -6
  35. stoobly_agent/app/cli/scaffold/service_docker_compose.py +1 -1
  36. stoobly_agent/app/cli/scaffold/templates/app/.Makefile +2 -2
  37. stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml +2 -2
  38. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml +2 -2
  39. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/run +3 -0
  40. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/run +3 -0
  41. stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/run +3 -0
  42. stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure +5 -1
  43. stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init +5 -1
  44. stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.run +14 -0
  45. stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.configure +5 -1
  46. stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.init +5 -1
  47. stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.run +14 -0
  48. stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.configure +5 -1
  49. stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.init +5 -1
  50. stoobly_agent/app/cli/scaffold/templates/build/services/build/test/.run +14 -0
  51. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.configure +5 -1
  52. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.init +5 -1
  53. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/mock/.run +19 -0
  54. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.configure +5 -1
  55. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.init +5 -1
  56. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/record/.run +19 -0
  57. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.configure +5 -1
  58. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.init +5 -1
  59. stoobly_agent/app/cli/scaffold/templates/build/services/entrypoint/test/.run +19 -0
  60. stoobly_agent/app/cli/scaffold/templates/build/workflows/exec/scaffold/.up +0 -1
  61. stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.configure +5 -1
  62. stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.init +5 -1
  63. stoobly_agent/app/cli/scaffold/templates/build/workflows/mock/.run +14 -0
  64. stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.configure +5 -1
  65. stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.init +5 -1
  66. stoobly_agent/app/cli/scaffold/templates/build/workflows/record/.run +14 -0
  67. stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.configure +5 -1
  68. stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.init +5 -1
  69. stoobly_agent/app/cli/scaffold/templates/build/workflows/test/.run +14 -0
  70. stoobly_agent/app/cli/scaffold/templates/constants.py +35 -19
  71. stoobly_agent/app/cli/scaffold/templates/factory.py +34 -18
  72. stoobly_agent/app/cli/scaffold/templates/plugins/cypress/test/.run +21 -0
  73. stoobly_agent/app/cli/scaffold/templates/plugins/playwright/test/.run +21 -0
  74. stoobly_agent/app/cli/scaffold/templates/workflow/mock/run +3 -0
  75. stoobly_agent/app/cli/scaffold/templates/workflow/record/run +3 -0
  76. stoobly_agent/app/cli/scaffold/templates/workflow/test/run +3 -0
  77. stoobly_agent/app/cli/scaffold/workflow_command.py +18 -4
  78. stoobly_agent/app/cli/scaffold/workflow_copy_command.py +5 -4
  79. stoobly_agent/app/cli/scaffold/workflow_create_command.py +31 -29
  80. stoobly_agent/app/cli/scaffold/workflow_run_command.py +18 -151
  81. stoobly_agent/app/cli/scaffold_cli.py +115 -161
  82. stoobly_agent/app/cli/scenario_cli.py +2 -2
  83. stoobly_agent/app/cli/types/test.py +2 -2
  84. stoobly_agent/app/cli/types/workflow_run_command.py +52 -3
  85. stoobly_agent/app/proxy/handle_mock_service.py +1 -1
  86. stoobly_agent/app/proxy/intercept_settings.py +5 -25
  87. stoobly_agent/app/proxy/mock/eval_fixtures_service.py +177 -27
  88. stoobly_agent/app/proxy/mock/types/__init__.py +22 -1
  89. stoobly_agent/app/proxy/replay/body_parser_service.py +8 -5
  90. stoobly_agent/app/proxy/replay/multipart.py +15 -13
  91. stoobly_agent/app/proxy/replay/replay_request_service.py +2 -2
  92. stoobly_agent/app/proxy/run.py +3 -0
  93. stoobly_agent/app/proxy/test/context.py +0 -4
  94. stoobly_agent/app/proxy/test/context_abc.py +0 -5
  95. stoobly_agent/cli.py +61 -16
  96. stoobly_agent/config/data_dir.py +0 -8
  97. stoobly_agent/public/12-es2015.618ecfd5f735b801b50f.js +1 -0
  98. stoobly_agent/public/12-es5.618ecfd5f735b801b50f.js +1 -0
  99. stoobly_agent/public/index.html +1 -1
  100. stoobly_agent/public/runtime-es2015.77bcd31efed9e5d5d431.js +1 -0
  101. stoobly_agent/public/runtime-es5.77bcd31efed9e5d5d431.js +1 -0
  102. stoobly_agent/test/app/cli/intercept/intercept_configure_test.py +17 -6
  103. stoobly_agent/test/app/cli/scaffold/docker/cli_invoker.py +177 -0
  104. stoobly_agent/test/app/cli/scaffold/{cli_test.py → docker/cli_test.py} +1 -8
  105. stoobly_agent/test/app/cli/scaffold/{e2e_test.py → docker/e2e_test.py} +31 -16
  106. stoobly_agent/test/app/cli/scaffold/local/__init__.py +0 -0
  107. stoobly_agent/test/app/cli/scaffold/{cli_invoker.py → local/cli_invoker.py} +38 -32
  108. stoobly_agent/test/app/cli/scaffold/local/e2e_test.py +342 -0
  109. stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
  110. stoobly_agent/test/app/proxy/mock/eval_fixtures_service_test.py +903 -2
  111. stoobly_agent/test/app/proxy/replay/body_parser_service_test.py +95 -3
  112. stoobly_agent/test/config/data_dir_test.py +2 -7
  113. stoobly_agent/test/test_helper.py +16 -5
  114. {stoobly_agent-1.10.1.dist-info → stoobly_agent-1.10.2.dist-info}/METADATA +4 -2
  115. {stoobly_agent-1.10.1.dist-info → stoobly_agent-1.10.2.dist-info}/RECORD +150 -122
  116. {stoobly_agent-1.10.1.dist-info → stoobly_agent-1.10.2.dist-info}/WHEEL +1 -1
  117. stoobly_agent/app/cli/helpers/shell.py +0 -26
  118. stoobly_agent/public/12-es2015.be58ed0ef449008b932e.js +0 -1
  119. stoobly_agent/public/12-es5.be58ed0ef449008b932e.js +0 -1
  120. stoobly_agent/public/runtime-es2015.f8c814b38b27708e91c1.js +0 -1
  121. stoobly_agent/public/runtime-es5.f8c814b38b27708e91c1.js +0 -1
  122. /stoobly_agent/app/cli/scaffold/templates/app/build/mock/{.docker-compose.mock.yml → .docker-compose.yml} +0 -0
  123. /stoobly_agent/app/cli/scaffold/templates/app/build/mock/{bin/configure → configure} +0 -0
  124. /stoobly_agent/app/cli/scaffold/templates/app/build/mock/{bin/init → init} +0 -0
  125. /stoobly_agent/app/cli/scaffold/templates/app/build/record/{.docker-compose.record.yml → .docker-compose.yml} +0 -0
  126. /stoobly_agent/app/cli/scaffold/templates/app/build/record/{bin/configure → configure} +0 -0
  127. /stoobly_agent/app/cli/scaffold/templates/app/build/record/{bin/init → init} +0 -0
  128. /stoobly_agent/app/cli/scaffold/templates/app/build/test/{.docker-compose.test.yml → .docker-compose.yml} +0 -0
  129. /stoobly_agent/app/cli/scaffold/templates/app/build/test/{bin/configure → configure} +0 -0
  130. /stoobly_agent/app/cli/scaffold/templates/app/build/test/{bin/init → init} +0 -0
  131. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/{.docker-compose.mock.yml → .docker-compose.yml} +0 -0
  132. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/{bin/configure → configure} +0 -0
  133. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/{bin/init → init} +0 -0
  134. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/{.docker-compose.record.yml → .docker-compose.yml} +0 -0
  135. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/{bin/configure → configure} +0 -0
  136. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/{bin/init → init} +0 -0
  137. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/{.docker-compose.test.yml → .docker-compose.yml} +0 -0
  138. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/{bin/configure → configure} +0 -0
  139. /stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/{bin/init → init} +0 -0
  140. /stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/{.docker-compose.mock.yml → .docker-compose.yml} +0 -0
  141. /stoobly_agent/app/cli/scaffold/templates/app/gateway/record/{.docker-compose.record.yml → .docker-compose.yml} +0 -0
  142. /stoobly_agent/app/cli/scaffold/templates/app/gateway/test/{.docker-compose.test.yml → .docker-compose.yml} +0 -0
  143. /stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/{.docker-compose.exec.yml → .docker-compose.yml} +0 -0
  144. /stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/{.docker-compose.mock.yml → .docker-compose.yml} +0 -0
  145. /stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/{.docker-compose.record.yml → .docker-compose.yml} +0 -0
  146. /stoobly_agent/app/cli/scaffold/templates/plugins/cypress/test/{.docker-compose.test.yml → .docker-compose.yml} +0 -0
  147. /stoobly_agent/app/cli/scaffold/templates/plugins/playwright/test/{.docker-compose.test.yml → .docker-compose.yml} +0 -0
  148. /stoobly_agent/app/cli/scaffold/templates/workflow/mock/{bin/configure → configure} +0 -0
  149. /stoobly_agent/app/cli/scaffold/templates/workflow/mock/{bin/init → init} +0 -0
  150. /stoobly_agent/app/cli/scaffold/templates/workflow/record/{bin/configure → configure} +0 -0
  151. /stoobly_agent/app/cli/scaffold/templates/workflow/record/{bin/init → init} +0 -0
  152. /stoobly_agent/app/cli/scaffold/templates/workflow/test/{bin/configure → configure} +0 -0
  153. /stoobly_agent/app/cli/scaffold/templates/workflow/test/{bin/init → init} +0 -0
  154. {stoobly_agent-1.10.1.dist-info → stoobly_agent-1.10.2.dist-info}/entry_points.txt +0 -0
  155. {stoobly_agent-1.10.1.dist-info → stoobly_agent-1.10.2.dist-info/licenses}/LICENSE +0 -0
@@ -4,21 +4,21 @@ import shutil
4
4
 
5
5
  from typing import List, TypedDict, Union
6
6
 
7
+ from stoobly_agent.app.cli.scaffold.local.service.builder import ServiceBuilder
8
+
7
9
  from .app import App
8
- from .constants import WORKFLOW_TEMPLATE_OPTION
9
- from .docker.service.builder import ServiceBuilder
10
- from .docker.workflow.mock_decorator import MockDecorator
11
- from .docker.workflow.reverse_proxy_decorator import ReverseProxyDecorator
12
- from .docker.workflow.builder import WorkflowBuilder
10
+ from .constants import RUN_ON_DOCKER, WORKFLOW_TEMPLATE_OPTION
11
+ from .docker.service.builder import DockerServiceBuilder
12
+
13
+ from .docker.workflow.builder import DockerWorkflowBuilder
13
14
  from .templates.factory import custom_files, maintained_files
15
+ from .local.workflow.builder import WorkflowBuilder
14
16
  from .workflow_command import WorkflowCommand
15
17
 
16
-
17
18
  class BuildOptions(TypedDict):
18
- builder_class: type
19
- service_builder: ServiceBuilder
19
+ service_builder: DockerServiceBuilder
20
20
  template: WORKFLOW_TEMPLATE_OPTION
21
- workflow_decorators: List[Union[MockDecorator, ReverseProxyDecorator]]
21
+ workflow_decorators: list
22
22
 
23
23
  class WorkflowCreateCommand(WorkflowCommand):
24
24
 
@@ -40,6 +40,11 @@ class WorkflowCreateCommand(WorkflowCommand):
40
40
  def force(self):
41
41
  return self.__force
42
42
 
43
+ @property
44
+ def create_docker_files(self):
45
+ """Determine if Docker files should be created based on app config run-on setting."""
46
+ return RUN_ON_DOCKER in self.app_config.run_on
47
+
43
48
  def build(self, **kwargs: BuildOptions):
44
49
  # Create workflow folder
45
50
  dest = os.path.join(self.workflow_path)
@@ -49,8 +54,23 @@ class WorkflowCreateCommand(WorkflowCommand):
49
54
  if not os.path.exists(dest):
50
55
  os.makedirs(dest)
51
56
 
52
- # Create workflow maintained compose file
53
- workflow_builder = self.__write_docker_compose_file(**kwargs)
57
+ service_builder = kwargs.get('service_builder')
58
+ workflow_builder = None
59
+
60
+ # Create workflow maintained compose file only if Docker files are enabled
61
+ if self.create_docker_files:
62
+ if not service_builder:
63
+ service_builder = DockerServiceBuilder(self.service_config)
64
+ service_builder.load()
65
+
66
+ workflow_builder = DockerWorkflowBuilder(self.workflow_path, service_builder)
67
+ workflow_builder.build(kwargs.get('workflow_decorators'))
68
+ else:
69
+ if not service_builder:
70
+ service_builder = ServiceBuilder(self.service_config)
71
+
72
+ workflow_builder = WorkflowBuilder(self.workflow_path, service_builder)
73
+
54
74
  self.__copy_templates(workflow_builder, kwargs.get('template'))
55
75
 
56
76
  if not self.workflow_config.empty:
@@ -76,21 +96,3 @@ class WorkflowCreateCommand(WorkflowCommand):
76
96
  custom_workflow_files = custom_files(template or self.workflow_name, workflow_builder)
77
97
  self.copy_files_no_replace(templates_path, custom_workflow_files, self.workflow_path)
78
98
 
79
- def __write_docker_compose_file(self, **kwargs: BuildOptions):
80
- builder_class = kwargs.get('builder_class') or WorkflowBuilder
81
- service_builder = kwargs.get('service_builder')
82
- if not service_builder:
83
- service_builder = ServiceBuilder(self.service_config)
84
- service_builder.load()
85
- workflow_decorators: List[Union[MockDecorator, ReverseProxyDecorator]] = kwargs.get('workflow_decorators')
86
-
87
- workflow_builder = builder_class(self.workflow_path, service_builder)
88
- workflow_builder.build_all()
89
-
90
- if isinstance(workflow_decorators, list):
91
- for workflow_decorator in workflow_decorators:
92
- workflow_decorator(workflow_builder).decorate()
93
-
94
- workflow_builder.write()
95
-
96
- return workflow_builder
@@ -4,9 +4,7 @@ import pdb
4
4
  import subprocess
5
5
  import re
6
6
 
7
-
8
7
  from stoobly_agent.config.data_dir import DataDir
9
- from stoobly_agent.lib.logger import Logger
10
8
 
11
9
  from .app import App
12
10
  from .constants import (
@@ -14,11 +12,11 @@ from .constants import (
14
12
  SERVICE_DNS_ENV, SERVICE_NAME_ENV, SERVICE_SCRIPTS_DIR, SERVICE_SCRIPTS_ENV, USER_ID_ENV,
15
13
  WORKFLOW_NAME_ENV, WORKFLOW_NAMESPACE_ENV, WORKFLOW_SCRIPTS_DIR, WORKFLOW_SCRIPTS_ENV, WORKFLOW_TEMPLATE_ENV
16
14
  )
17
- from .docker.constants import APP_EGRESS_NETWORK_TEMPLATE, APP_INGRESS_NETWORK_TEMPLATE, DOCKERFILE_CONTEXT
15
+
18
16
  from .workflow_command import WorkflowCommand
19
17
  from .workflow_env import WorkflowEnv
20
18
  from .workflow_namesapce import WorkflowNamespace
21
- from ..types.workflow_run_command import BuildOptions, ComposeOptions, DownOptions, UpOptions
19
+ from ..types.workflow_run_command import ComposeOptions
22
20
 
23
21
  LOG_ID = 'WorkflowRunCommand'
24
22
 
@@ -31,8 +29,12 @@ class WorkflowRunCommand(WorkflowCommand):
31
29
  self.__ca_certs_dir_path = kwargs.get('ca_certs_dir_path') or app.ca_certs_dir_path
32
30
  self.__certs_dir_path = kwargs.get('certs_dir_path') or app.certs_dir_path
33
31
  self.__context_dir_path = kwargs.get('context_dir_path') or app.context_dir_path
32
+ self.__dry_run = kwargs.get('dry_run', False)
34
33
  self.__namespace = kwargs.get('namespace') or self.workflow_name
35
- self.__network = f"{self.__namespace}.{kwargs.get('network') or app.network}"
34
+ self.__network = f"{self.__namespace}.{app.network}"
35
+ self.__workflow_namespace = kwargs.get('workflow_namespace') or WorkflowNamespace(app, self.__namespace)
36
+
37
+ self.__workflow_namespace.copy_dotenv()
36
38
 
37
39
  @property
38
40
  def app_dir_path(self):
@@ -49,7 +51,7 @@ class WorkflowRunCommand(WorkflowCommand):
49
51
  @property
50
52
  def context_dir_path(self):
51
53
  if not self.__context_dir_path:
52
- data_dir = DataDir.instance()
54
+ data_dir: DataDir = DataDir.instance()
53
55
  return os.path.dirname(data_dir.path)
54
56
 
55
57
  return self.__context_dir_path
@@ -64,7 +66,11 @@ class WorkflowRunCommand(WorkflowCommand):
64
66
 
65
67
  @property
66
68
  def dotenv_path(self):
67
- return WorkflowNamespace(self.app, self.namespace).dotenv_path
69
+ return self.__workflow_namespace.dotenv_path
70
+
71
+ @property
72
+ def dry_run(self):
73
+ return self.__dry_run
68
74
 
69
75
  @property
70
76
  def nameservers(self):
@@ -78,7 +84,7 @@ class WorkflowRunCommand(WorkflowCommand):
78
84
 
79
85
  @property
80
86
  def nameservers_path(self):
81
- return WorkflowNamespace(self.app, self.namespace).nameservers_path
87
+ return self.__workflow_namespace.nameservers_path
82
88
 
83
89
  @property
84
90
  def namespace(self):
@@ -88,149 +94,6 @@ class WorkflowRunCommand(WorkflowCommand):
88
94
  def network(self):
89
95
  return self.__network
90
96
 
91
- def create_image(self, **options: BuildOptions):
92
- relative_namespace_path = os.path.relpath(self.scaffold_namespace_path, self.__current_working_dir)
93
- dockerfile_path = os.path.join(relative_namespace_path, DOCKERFILE_CONTEXT)
94
- user_id = options['user_id'] or os.getuid()
95
-
96
- command = ['docker', 'build']
97
- command.append(f"-f {dockerfile_path}")
98
- command.append(f"-t stoobly.{user_id}")
99
- command.append(f"--build-arg USER_ID={user_id}")
100
-
101
- if not os.environ.get('STOOBLY_IMAGE_USE_LOCAL'):
102
- command.append('--pull')
103
-
104
- if not options.get('verbose'):
105
- command.append('--quiet')
106
-
107
- # To avoid large context transfer times, should be a folder with relatively low number of files
108
- command.append(relative_namespace_path)
109
-
110
- return ' '.join(command)
111
-
112
- def remove_image(self, user_id: str = None):
113
- user_id = user_id or os.getuid()
114
- command = ['docker', 'rmi', f"stoobly.{user_id}", '&>', '/dev/null']
115
- command.append('|| true')
116
- return ' '.join(command)
117
-
118
- def create_egress_network(self):
119
- return f"docker network create {APP_EGRESS_NETWORK_TEMPLATE.format(network=self.network)} &> /dev/null"
120
-
121
- def create_ingress_network(self):
122
- return f"docker network create {APP_INGRESS_NETWORK_TEMPLATE.format(network=self.network)} &> /dev/null"
123
-
124
- def remove_egress_network(self):
125
- return f"docker network rm {APP_EGRESS_NETWORK_TEMPLATE.format(network=self.network)} &> /dev/null || true"
126
-
127
- def remove_ingress_network(self):
128
- return f"docker network rm {APP_INGRESS_NETWORK_TEMPLATE.format(network=self.network)} &> /dev/null || true"
129
-
130
- def up(self, **options: UpOptions):
131
- if not os.path.exists(self.compose_path):
132
- return ''
133
-
134
- command = ['COMPOSE_IGNORE_ORPHANS=true', 'docker', 'compose']
135
- command_options = []
136
-
137
- # Add docker compose file
138
- command_options.append(f"-f {os.path.relpath(self.compose_path, self.__current_working_dir)}")
139
-
140
- # Add docker compose networks file
141
- command_options.append(f"-f {os.path.relpath(self.networks_compose_path, os.getcwd())}")
142
-
143
- # Add custom docker compose file
144
- custom_services = self.custom_services
145
- if custom_services:
146
- uses_profile = False
147
- for service_name in custom_services:
148
- service = custom_services[service_name]
149
- profiles = service.get('profiles')
150
- if isinstance(profiles, list):
151
- if self.workflow_name in profiles:
152
- uses_profile = True
153
- break
154
- if not uses_profile:
155
- # TODO: looking into why warning does not print in docker
156
- Logger.instance(LOG_ID).error(f"Missing {self.workflow_name} profile in custom compose file")
157
-
158
- compose_file_path = os.path.relpath(self.custom_compose_path, self.__current_working_dir)
159
- command_options.append(f"-f {compose_file_path}")
160
-
161
- if options.get('extra_compose_path'):
162
- compose_file_path = os.path.relpath(options['extra_compose_path'], self.__current_working_dir)
163
- command_options.append(f"-f {compose_file_path}")
164
-
165
- command_options.append(f"--profile {self.workflow_name}")
166
-
167
- if not options.get('namespace'):
168
- options['namespace'] = self.workflow_name
169
- command_options.append(f"-p {options['namespace']}")
170
-
171
- command += command_options
172
- command.append('up')
173
-
174
- if not options.get('no_build'):
175
- command.append('--build')
176
-
177
- if options.get('pull'):
178
- command.append('--pull missing')
179
-
180
- if not options.get('attached'):
181
- command.append('-d')
182
- else:
183
- major_version = 2
184
- minor_version = 27
185
- patch_version = 0
186
- min_version = major_version * 10000 + minor_version * 100 + patch_version
187
- formula = "'{print $1*10000 + $2*100 + $3}'"
188
- option = f"$(test $(echo $(docker compose version --short) | awk -F. {formula}) -ge {min_version} && echo '--abort-on-container-failure')"
189
-
190
- # This option enables docker compose to return exit code 1
191
- # when one of the services exits with a non-zero exit code
192
- # Otherwise, even if a service exits with a non-zero exit code, exit code 0 is returned
193
- command.append(option)
194
-
195
- self.write_env(**options)
196
-
197
- return ' '.join(command)
198
-
199
- def down(self, **options: DownOptions):
200
- if not os.path.exists(self.compose_path):
201
- return ''
202
-
203
- command = ['docker', 'compose']
204
-
205
- # Add docker compose file
206
- command.append(f"-f {os.path.relpath(self.compose_path, os.getcwd())}")
207
-
208
- # Add docker compose networks file
209
- command.append(f"-f {os.path.relpath(self.networks_compose_path, os.getcwd())}")
210
-
211
- # Add custom docker compose file
212
- if self.custom_services:
213
- command.append(f"-f {os.path.relpath(self.custom_compose_path, self.__current_working_dir)}")
214
-
215
- if options.get('extra_compose_path'):
216
- command.append(f"-f {os.path.relpath(options['extra_compose_path'], self.__current_working_dir)}")
217
-
218
- command.append(f"--profile {self.workflow_name}")
219
-
220
- if not options.get('namespace'):
221
- options['namespace'] = self.workflow_name
222
- command.append(f"-p {options['namespace']}")
223
-
224
- command.append('down')
225
- command.append('--volumes')
226
-
227
- if options.get('rmi'):
228
- command.append('--rmi local')
229
-
230
- self.write_env(**options)
231
-
232
- return ' '.join(command)
233
-
234
97
  def write_nameservers(self):
235
98
  # If hostname is set then the service is external and we will need to configure the container's DNS.
236
99
  # If we don't configure the container's DNS, then Docker's embedded DNS will potentially
@@ -252,6 +115,10 @@ class WorkflowRunCommand(WorkflowCommand):
252
115
  if nameservers:
253
116
  fp.write("\n".join(nameservers))
254
117
 
118
+ @property
119
+ def workflow_namespace(self):
120
+ return self.__workflow_namespace
121
+
255
122
  def write_env(self, **options: ComposeOptions):
256
123
  namespace = options.get('namespace')
257
124
  user_id = options.get('user_id')