stoobly-agent 1.9.3__py3-none-any.whl → 1.9.5__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.
- stoobly_agent/__init__.py +1 -1
- stoobly_agent/app/cli/scaffold/app_config.py +13 -1
- stoobly_agent/app/cli/scaffold/app_create_command.py +8 -0
- stoobly_agent/app/cli/scaffold/constants.py +1 -0
- stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py +14 -8
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile +13 -12
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml +1 -1
- stoobly_agent/app/cli/scaffold_cli.py +27 -25
- stoobly_agent/app/cli/snapshot_cli.py +2 -2
- stoobly_agent/cli.py +2 -2
- stoobly_agent/test/app/cli/scaffold/cli_invoker.py +3 -3
- stoobly_agent/test/app/cli/snapshot/snapshot_update_test.py +1 -1
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
- {stoobly_agent-1.9.3.dist-info → stoobly_agent-1.9.5.dist-info}/METADATA +1 -1
- {stoobly_agent-1.9.3.dist-info → stoobly_agent-1.9.5.dist-info}/RECORD +19 -19
- {stoobly_agent-1.9.3.dist-info → stoobly_agent-1.9.5.dist-info}/LICENSE +0 -0
- {stoobly_agent-1.9.3.dist-info → stoobly_agent-1.9.5.dist-info}/WHEEL +0 -0
- {stoobly_agent-1.9.3.dist-info → stoobly_agent-1.9.5.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
COMMAND = 'stoobly-agent'
|
2
|
-
VERSION = '1.9.
|
2
|
+
VERSION = '1.9.5'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from .config import Config
|
2
|
-
from .constants import APP_NAME_ENV, APP_NETWORK_ENV
|
2
|
+
from .constants import APP_NAME_ENV, APP_NETWORK_ENV, APP_UI_PORT_ENV
|
3
3
|
|
4
4
|
class AppConfig(Config):
|
5
5
|
|
@@ -27,11 +27,20 @@ class AppConfig(Config):
|
|
27
27
|
def network(self, v):
|
28
28
|
self.__network = v
|
29
29
|
|
30
|
+
@property
|
31
|
+
def ui_port(self):
|
32
|
+
return self.__ui_port
|
33
|
+
|
34
|
+
@ui_port.setter
|
35
|
+
def ui_port(self, v):
|
36
|
+
self.__ui_port = v
|
37
|
+
|
30
38
|
def load(self, config = None):
|
31
39
|
config = config or self.read()
|
32
40
|
|
33
41
|
self.name = config.get(APP_NAME_ENV)
|
34
42
|
self.network = config.get(APP_NETWORK_ENV)
|
43
|
+
self.ui_port = config.get(APP_UI_PORT_ENV)
|
35
44
|
|
36
45
|
def write(self):
|
37
46
|
config = {}
|
@@ -42,4 +51,7 @@ class AppConfig(Config):
|
|
42
51
|
if self.network:
|
43
52
|
config[APP_NETWORK_ENV] = self.network
|
44
53
|
|
54
|
+
if self.ui_port:
|
55
|
+
config[APP_UI_PORT_ENV] = self.ui_port
|
56
|
+
|
45
57
|
super().write(config)
|
@@ -9,6 +9,7 @@ from .app_command import AppCommand
|
|
9
9
|
class AppCreateOptions(TypedDict):
|
10
10
|
name: str
|
11
11
|
network: str
|
12
|
+
ui_port: int
|
12
13
|
|
13
14
|
class AppCreateCommand(AppCommand):
|
14
15
|
|
@@ -21,6 +22,9 @@ class AppCreateCommand(AppCommand):
|
|
21
22
|
if kwargs.get('network'):
|
22
23
|
self.app_config.network = kwargs['network']
|
23
24
|
|
25
|
+
if kwargs.get('ui_port'):
|
26
|
+
self.app_config.ui_port = kwargs['ui_port']
|
27
|
+
|
24
28
|
@property
|
25
29
|
def app_name(self):
|
26
30
|
return self.app_config.name
|
@@ -29,6 +33,10 @@ class AppCreateCommand(AppCommand):
|
|
29
33
|
def app_network(self):
|
30
34
|
return self.app_config.network
|
31
35
|
|
36
|
+
@property
|
37
|
+
def app_ui_port(self):
|
38
|
+
return self.app_config.ui_port
|
39
|
+
|
32
40
|
def build(self):
|
33
41
|
dest = self.scaffold_namespace_path
|
34
42
|
|
@@ -10,7 +10,7 @@ from stoobly_agent.app.cli.scaffold.service_config import ServiceConfig
|
|
10
10
|
from stoobly_agent.app.cli.scaffold.docker.constants import APP_INGRESS_NETWORK_NAME, APP_EGRESS_NETWORK_NAME, DOCKER_COMPOSE_BASE, DOCKER_COMPOSE_BASE_TEMPLATE
|
11
11
|
from stoobly_agent.app.cli.scaffold.templates.constants import CORE_GATEWAY_SERVICE_NAME
|
12
12
|
|
13
|
-
def configure_gateway(service_paths: List[str], no_publish = False):
|
13
|
+
def configure_gateway(workflow_name, service_paths: List[str], no_publish = False):
|
14
14
|
if len(service_paths) == 0:
|
15
15
|
return
|
16
16
|
|
@@ -36,7 +36,7 @@ def configure_gateway(service_paths: List[str], no_publish = False):
|
|
36
36
|
gateway_base['ports'] = ports
|
37
37
|
|
38
38
|
app_dir_path = os.path.dirname(os.path.dirname(service_dir_path))
|
39
|
-
__with_traefik_config(service_paths,
|
39
|
+
__with_traefik_config(workflow_name, service_paths, app_dir_path, gateway_base)
|
40
40
|
__with_networks(gateway_base, hostnames)
|
41
41
|
|
42
42
|
with open(docker_compose_dest_path, 'w') as fp:
|
@@ -50,7 +50,9 @@ def __with_networks(config: dict, hostnames: List[str]):
|
|
50
50
|
'aliases': hostnames
|
51
51
|
}
|
52
52
|
|
53
|
-
def __with_traefik_config(
|
53
|
+
def __with_traefik_config(workflow_name: str, service_paths: List[str], app_dir_path: str, compose: dict):
|
54
|
+
config_dest = '/etc/traefik/traefik.yml'
|
55
|
+
|
54
56
|
if not compose['volumes']:
|
55
57
|
compose['volumes'] = []
|
56
58
|
|
@@ -68,11 +70,15 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
|
|
68
70
|
'providers': {
|
69
71
|
'docker': {
|
70
72
|
'exposedByDefault': False
|
73
|
+
},
|
74
|
+
'file': {
|
75
|
+
'fileName': config_dest,
|
76
|
+
'watch': False
|
71
77
|
}
|
72
78
|
},
|
73
79
|
'tls': {
|
74
|
-
'certificates': certificates
|
75
|
-
}
|
80
|
+
'certificates': certificates,
|
81
|
+
},
|
76
82
|
}
|
77
83
|
|
78
84
|
for path in service_paths:
|
@@ -88,11 +94,11 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
|
|
88
94
|
if config.scheme == 'https':
|
89
95
|
certificates.append({
|
90
96
|
'certFile': f"/certs/{config.hostname}.crt",
|
91
|
-
'keyFile': f"/certs/{config.hostname}.key"
|
97
|
+
'keyFile': f"/certs/{config.hostname}.key",
|
92
98
|
})
|
93
99
|
|
94
100
|
# Create traefik.yml in .stoobly/tmp
|
95
|
-
traefik_template_relative_path = os.path.join(DATA_DIR_NAME, TMP_DIR_NAME, 'traefik.yml')
|
101
|
+
traefik_template_relative_path = os.path.join(DATA_DIR_NAME, TMP_DIR_NAME, workflow_name, 'traefik.yml')
|
96
102
|
traefik_template_dest_path = os.path.join(app_dir_path, traefik_template_relative_path)
|
97
103
|
|
98
104
|
if not os.path.exists(os.path.dirname(traefik_template_dest_path)):
|
@@ -102,7 +108,7 @@ def __with_traefik_config(service_paths: str, compose: dict, app_dir_path: str):
|
|
102
108
|
fp.write(yaml.dump(traefik_config))
|
103
109
|
|
104
110
|
compose['volumes'].append(
|
105
|
-
f"{os.path.join(APP_DIR, traefik_template_relative_path)}
|
111
|
+
f"{os.path.join(APP_DIR, traefik_template_relative_path)}:{config_dest}:ro"
|
106
112
|
)
|
107
113
|
|
108
114
|
def __find_hosts(service_paths):
|
@@ -33,8 +33,9 @@ app_namespace_dir=$(app_data_dir)/docker
|
|
33
33
|
app_tmp_dir=$(app_data_dir)/tmp
|
34
34
|
dockerfile_path=$(app_namespace_dir)/.Dockerfile.context
|
35
35
|
exec_docker_compose_file_path=$(app_namespace_dir)/stoobly-ui/exec/.docker-compose.exec.yml
|
36
|
-
exec_namespace=$(shell echo $(context_dir) | (md5 2>/dev/null || md5sum 2>/dev/null || shasum 2>/dev/null) | awk '{print $$1}')
|
37
|
-
|
36
|
+
exec_namespace=$(shell echo "$(workflow_namespace).$(context_dir)" | (md5 2>/dev/null || md5sum 2>/dev/null || shasum 2>/dev/null) | awk '{print $$1}')
|
37
|
+
workflow_namespace=$(if $(namespace),$(namespace),$(workflow))
|
38
|
+
workflow_script=.stoobly/tmp/$(workflow)/run.sh
|
38
39
|
|
39
40
|
# Options
|
40
41
|
certs_dir_options=--ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir)
|
@@ -43,7 +44,7 @@ working_dir_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir)
|
|
43
44
|
|
44
45
|
workflow_down_options=--user-id $(USER_ID) $(workflow_down_extra_options)
|
45
46
|
workflow_log_options=$(workflow_log_extra_options)
|
46
|
-
workflow_run_options=--script-path $(workflow_script) $(workflow_service_options)
|
47
|
+
workflow_run_options=--namespace $(workflow_namespace) --script-path $(workflow_script) $(workflow_service_options)
|
47
48
|
workflow_up_options=$(working_dir_options) $(certs_dir_options) --user-id $(USER_ID) $(workflow_up_extra_options)
|
48
49
|
|
49
50
|
# Commands
|
@@ -71,6 +72,10 @@ stoobly_exec_run_env=$(source_env) && $(exec_env) CONTEXT_DIR="$(app_dir)"
|
|
71
72
|
# Workflow run
|
72
73
|
workflow_run=$(source_env) && bash "$(app_dir)/$(workflow_script)"
|
73
74
|
|
75
|
+
action/install:
|
76
|
+
$(eval action=install)
|
77
|
+
action/uninstall:
|
78
|
+
$(eval action=uninstall)
|
74
79
|
ca-cert/install: stoobly/install
|
75
80
|
@if [ -z "$$(ls $(ca_certs_dir) 2> /dev/null)" ]; then \
|
76
81
|
read -p "Installing CA certificate is required for $(workflow)ing requests, continue? (y/N) " confirm && \
|
@@ -84,10 +89,6 @@ ca-cert/install: stoobly/install
|
|
84
89
|
certs:
|
85
90
|
@export EXEC_COMMAND=.mkcert && \
|
86
91
|
$(stoobly_exec)
|
87
|
-
command/install:
|
88
|
-
$(eval COMMAND=install)
|
89
|
-
command/uninstall:
|
90
|
-
$(eval COMMAND=uninstall)
|
91
92
|
exec/down:
|
92
93
|
@$(stoobly_exec_env) EXEC_COMMAND=- EXEC_ARGS=- EXEC_OPTIONS=- $(exec_down)
|
93
94
|
nameservers: tmpdir
|
@@ -179,7 +180,7 @@ workflow/down:
|
|
179
180
|
$(stoobly_exec_run) && \
|
180
181
|
$(workflow_run)
|
181
182
|
workflow/hostname: stoobly/install
|
182
|
-
@read -p "Do you want to $(
|
183
|
+
@read -p "Do you want to $(action) hostname(s) in /etc/hosts? (y/N) " confirm && \
|
183
184
|
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
184
185
|
CURRENT_VERSION=$$(stoobly-agent --version); \
|
185
186
|
REQUIRED_VERSION="1.4.0"; \
|
@@ -187,11 +188,11 @@ workflow/hostname: stoobly/install
|
|
187
188
|
echo "stoobly-agent version $$REQUIRED_VERSION required. Please run: pipx upgrade stoobly-agent"; \
|
188
189
|
exit 1; \
|
189
190
|
fi; \
|
190
|
-
echo "Running stoobly-agent scaffold hostname $(
|
191
|
-
stoobly-agent scaffold hostname $(
|
191
|
+
echo "Running stoobly-agent scaffold hostname $(action) $(workflow_service_options)"; \
|
192
|
+
stoobly-agent scaffold hostname $(action) --app-dir-path $(app_dir) --workflow $(workflow) $(workflow_service_options); \
|
192
193
|
fi
|
193
|
-
workflow/hostname/install:
|
194
|
-
workflow/hostname/uninstall:
|
194
|
+
workflow/hostname/install: action/install workflow/hostname
|
195
|
+
workflow/hostname/uninstall: action/uninstall workflow/hostname
|
195
196
|
workflow/logs:
|
196
197
|
@export EXEC_COMMAND=.logs && \
|
197
198
|
export EXEC_OPTIONS="$(workflow_log_options) $(workflow_run_options) $(options)" && \
|
@@ -87,21 +87,22 @@ def hostname(ctx):
|
|
87
87
|
help="Scaffold application"
|
88
88
|
)
|
89
89
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to create the app scaffold.')
|
90
|
-
@click.option('--force', is_flag=True, help='Overwrite maintained scaffolded app files.')
|
91
90
|
@click.option('--network', help='App default network name. Defaults to app name.')
|
91
|
+
@click.option('--quiet', is_flag=True, help='Disable log output.')
|
92
|
+
@click.option('--ui-port', default=4200, type=click.IntRange(1, 65535), help='UI service port.')
|
92
93
|
@click.argument('app_name')
|
93
94
|
def create(**kwargs):
|
94
95
|
__validate_app_dir(kwargs['app_dir_path'])
|
95
96
|
|
96
97
|
app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
|
97
98
|
|
98
|
-
if kwargs['
|
99
|
-
|
100
|
-
kwargs['network'] = kwargs['app_name']
|
99
|
+
if not kwargs['quiet'] and os.path.exists(app.scaffold_namespace_path):
|
100
|
+
print(f"{kwargs['app_dir_path']} already exists, updating scaffold maintained files...")
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
if not kwargs['network']:
|
103
|
+
kwargs['network'] = kwargs['app_name']
|
104
|
+
|
105
|
+
AppCreateCommand(app, **kwargs).build()
|
105
106
|
|
106
107
|
@app.command(
|
107
108
|
help="Scaffold app service certs"
|
@@ -128,7 +129,6 @@ def mkcert(**kwargs):
|
|
128
129
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
129
130
|
@click.option('--detached', is_flag=True, help='Use isolated and non-persistent context directory.')
|
130
131
|
@click.option('--env', multiple=True, help='Specify an environment variable.')
|
131
|
-
@click.option('--force', is_flag=True, help='Overwrite maintained scaffolded service files.')
|
132
132
|
@click.option('--hostname', help='Service hostname.')
|
133
133
|
@click.option('--port', type=click.IntRange(1, 65535), help='Service port.')
|
134
134
|
@click.option('--priority', default=5, type=click.FloatRange(1.0, 9.0), help='Determines the service run order. Lower values run first.')
|
@@ -138,6 +138,7 @@ def mkcert(**kwargs):
|
|
138
138
|
upstream proxy modes, SPEC is host specification in
|
139
139
|
the form of "http[s]://host[:port]".
|
140
140
|
''')
|
141
|
+
@click.option('--quiet', is_flag=True, help='Disable log output.')
|
141
142
|
@click.option('--scheme', type=click.Choice(['http', 'https']), help='Defaults to https if hostname is set.')
|
142
143
|
@click.option('--workflow', multiple=True, type=click.Choice([WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE]), help='Include pre-defined workflows.')
|
143
144
|
@click.argument('service_name')
|
@@ -155,12 +156,12 @@ def create(**kwargs):
|
|
155
156
|
__validate_proxy_mode(kwargs.get("proxy_mode"))
|
156
157
|
|
157
158
|
app = App(kwargs['app_dir_path'], DOCKER_NAMESPACE)
|
158
|
-
|
159
159
|
service = Service(kwargs['service_name'], app)
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
160
|
+
|
161
|
+
if not kwargs['quiet'] and os.path.exists(service.dir_path):
|
162
|
+
print(f"{service.dir_path} already exists, updating scaffold maintained files...")
|
163
|
+
|
164
|
+
__scaffold_build(app, **kwargs)
|
164
165
|
|
165
166
|
@service.command(
|
166
167
|
help="List services",
|
@@ -271,7 +272,7 @@ def update(**kwargs):
|
|
271
272
|
)
|
272
273
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
273
274
|
@click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
|
274
|
-
@click.option('--
|
275
|
+
@click.option('--quiet', is_flag=True, help='Disable log output.')
|
275
276
|
@click.option('--service', multiple=True, help='Specify the service(s) to create the workflow for.')
|
276
277
|
@click.option('--template', required=True, type=click.Choice([WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE]), help='Select which workflow to use as a template.')
|
277
278
|
@click.argument('workflow_name')
|
@@ -289,10 +290,11 @@ def create(**kwargs):
|
|
289
290
|
__validate_service_dir(service.dir_path)
|
290
291
|
|
291
292
|
workflow_dir_path = service.workflow_dir_path(kwargs['workflow_name'])
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
293
|
+
|
294
|
+
if not kwargs['quiet'] and os.path.exists(workflow_dir_path):
|
295
|
+
print(f"{workflow_dir_path} already exists, updating scaffold maintained files...")
|
296
|
+
|
297
|
+
__workflow_create(app, **config)
|
296
298
|
|
297
299
|
@workflow.command(
|
298
300
|
help="Copy a workflow for service(s)",
|
@@ -508,7 +510,7 @@ def up(**kwargs):
|
|
508
510
|
|
509
511
|
# Gateway ports are dynamically set depending on the workflow run
|
510
512
|
workflow = Workflow(kwargs['workflow_name'], app)
|
511
|
-
configure_gateway(workflow.service_paths_from_services(services), kwargs['no_publish'])
|
513
|
+
configure_gateway(workflow.workflow_name, workflow.service_paths_from_services(services), kwargs['no_publish'])
|
512
514
|
|
513
515
|
commands: List[WorkflowRunCommand] = []
|
514
516
|
for service in services:
|
@@ -674,12 +676,12 @@ scaffold.add_command(hostname)
|
|
674
676
|
def __build_script(**kwargs):
|
675
677
|
script_path = kwargs['script_path']
|
676
678
|
if not script_path:
|
677
|
-
script_file_name =
|
678
|
-
script_path = os.path.join(data_dir.tmp_dir_path, script_file_name)
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
679
|
+
script_file_name = 'run.sh'
|
680
|
+
script_path = os.path.join(data_dir.tmp_dir_path, kwargs['workflow_name'], script_file_name)
|
681
|
+
|
682
|
+
script_dir = os.path.dirname(script_path)
|
683
|
+
if not os.path.exists(script_dir):
|
684
|
+
os.makedirs(script_dir, exist_ok=True)
|
683
685
|
|
684
686
|
# Truncate
|
685
687
|
with open(script_path, 'w'):
|
@@ -161,7 +161,7 @@ def prune(**kwargs):
|
|
161
161
|
)
|
162
162
|
@click.option('--format', type=click.Choice(FORMATS), help='Format output.')
|
163
163
|
@click.option('--select', multiple=True, help='Select column(s) to display.')
|
164
|
-
@click.option('--verify', is_flag=True, default=False)
|
164
|
+
@click.option('--no-verify', is_flag=True, default=False)
|
165
165
|
@click.option('--without-headers', is_flag=True, default=False, help='Disable printing column headers.')
|
166
166
|
@click.argument('uuid')
|
167
167
|
def update(**kwargs):
|
@@ -179,7 +179,7 @@ def update(**kwargs):
|
|
179
179
|
print(f"Error: {kwargs['uuid']} not found", file=sys.stderr)
|
180
180
|
sys.exit(1)
|
181
181
|
|
182
|
-
if kwargs['
|
182
|
+
if not kwargs['no_verify']:
|
183
183
|
if event.is_request():
|
184
184
|
snapshot: RequestSnapshot = event.snapshot()
|
185
185
|
__verify_request(snapshot)
|
stoobly_agent/cli.py
CHANGED
@@ -115,12 +115,12 @@ def init(**kwargs):
|
|
115
115
|
upstream proxy modes, SPEC is host specification in
|
116
116
|
the form of "http[s]://host[:port]".
|
117
117
|
''')
|
118
|
-
@click.option('--proxy-port', default=8080, help='Proxy service port.')
|
118
|
+
@click.option('--proxy-port', default=8080, type=click.IntRange(1, 65535), help='Proxy service port.')
|
119
119
|
@click.option('--public-directory-path', help='Path to public files. Used for mocking requests.')
|
120
120
|
@click.option('--response-fixtures-path', help='Path to response fixtures yaml. Used for mocking requests.')
|
121
121
|
@click.option('--ssl-insecure', is_flag=True, default=False, help='Do not verify upstream server SSL/TLS certificates.')
|
122
122
|
@click.option('--ui-host', default='0.0.0.0', help='Address to bind UI to.')
|
123
|
-
@click.option('--ui-port', default=4200, help='UI service port.')
|
123
|
+
@click.option('--ui-port', default=4200, type=click.IntRange(1, 65535), help='UI service port.')
|
124
124
|
def run(**kwargs):
|
125
125
|
from .app.proxy.run import run as run_proxy
|
126
126
|
|
@@ -15,7 +15,7 @@ class ScaffoldCliInvoker():
|
|
15
15
|
|
16
16
|
result = runner.invoke(scaffold, ['app', 'create',
|
17
17
|
'--app-dir-path', app_dir_path,
|
18
|
-
'--
|
18
|
+
'--quiet',
|
19
19
|
app_name
|
20
20
|
])
|
21
21
|
|
@@ -45,10 +45,10 @@ class ScaffoldCliInvoker():
|
|
45
45
|
result = runner.invoke(scaffold, ['service', 'create',
|
46
46
|
'--app-dir-path', app_dir_path,
|
47
47
|
'--env', 'TEST',
|
48
|
-
'--force',
|
49
48
|
'--hostname', hostname,
|
50
49
|
'--scheme', scheme,
|
51
50
|
'--port', port,
|
51
|
+
'--quiet',
|
52
52
|
'--workflow', 'mock',
|
53
53
|
'--workflow', 'record',
|
54
54
|
'--workflow', 'test',
|
@@ -70,12 +70,12 @@ class ScaffoldCliInvoker():
|
|
70
70
|
|
71
71
|
result = runner.invoke(scaffold, ['service', 'create',
|
72
72
|
'--app-dir-path', app_dir_path,
|
73
|
-
'--force',
|
74
73
|
'--hostname', hostname,
|
75
74
|
'--scheme', scheme,
|
76
75
|
'--port', port,
|
77
76
|
'--proxy-mode', proxy_mode_reverse_spec,
|
78
77
|
'--detached',
|
78
|
+
'--quiet',
|
79
79
|
'--workflow', 'test',
|
80
80
|
service_name
|
81
81
|
])
|
@@ -94,7 +94,7 @@ class TestUpdate():
|
|
94
94
|
def updated_event(self, runner: CliRunner, put_event: LogEvent):
|
95
95
|
time.sleep(1) # Simulate update at different time
|
96
96
|
|
97
|
-
apply_result = runner.invoke(snapshot, ['update',
|
97
|
+
apply_result = runner.invoke(snapshot, ['update', put_event.uuid])
|
98
98
|
assert apply_result.exit_code == 0
|
99
99
|
log = Log()
|
100
100
|
events = log.events
|
@@ -1 +1 @@
|
|
1
|
-
1.9.
|
1
|
+
1.9.4
|
@@ -1,4 +1,4 @@
|
|
1
|
-
stoobly_agent/__init__.py,sha256=
|
1
|
+
stoobly_agent/__init__.py,sha256=IIieB06ghDX3rkbVoznhopSYzZNIgt8A-_fJzdVS7i4,44
|
2
2
|
stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
stoobly_agent/app/api/__init__.py,sha256=ctkB8KR-eXO0SFhj602huHiyvQ3PslFWd8fkcufgrAI,1000
|
4
4
|
stoobly_agent/app/api/application_http_request_handler.py,sha256=Vvz53yB0bR7J-QqMAkLlhcZrA4P64ZEN7w8cMbgl6o0,5261
|
@@ -69,11 +69,11 @@ stoobly_agent/app/cli/request_cli.py,sha256=THNloW111l9MLE0oPg4y7hVXL1U7OXoz760g
|
|
69
69
|
stoobly_agent/app/cli/scaffold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
70
|
stoobly_agent/app/cli/scaffold/app.py,sha256=bgNc_dWZtgkuDAkS9aHSCMxCrjX907Phlfb2bOasswI,3435
|
71
71
|
stoobly_agent/app/cli/scaffold/app_command.py,sha256=sliaYulMNmaxbRXpJIDtBDWEBGEv5Tht4rpErzC_xxw,2368
|
72
|
-
stoobly_agent/app/cli/scaffold/app_config.py,sha256=
|
73
|
-
stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=
|
72
|
+
stoobly_agent/app/cli/scaffold/app_config.py,sha256=UGVJ7DVmXh-o_gYBlAAEjngNIUZPQUiXXk2oMStcsPg,1075
|
73
|
+
stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=0ogYliGbq1PYP5rFs-ML33q_Z4t_rAgPWjhk7rhnGw0,1153
|
74
74
|
stoobly_agent/app/cli/scaffold/command.py,sha256=aoTsdkkBzyu7TkVSMdNQQGk0Gj874jNgFcjR14y3TuM,254
|
75
75
|
stoobly_agent/app/cli/scaffold/config.py,sha256=HZU5tkvr3dkPr4JMXZtrJlu2wxxO-134Em6jReFFcq0,688
|
76
|
-
stoobly_agent/app/cli/scaffold/constants.py,sha256=
|
76
|
+
stoobly_agent/app/cli/scaffold/constants.py,sha256=dpCGvKzNtGQyaZfghfy0F6bJsZNp1KPACX3Z3rd13sw,2416
|
77
77
|
stoobly_agent/app/cli/scaffold/containerized_app.py,sha256=dAjn4RwcZV3aEL0POUmrbF_DC-r9h6s1zx7gT2t45v0,175
|
78
78
|
stoobly_agent/app/cli/scaffold/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
79
79
|
stoobly_agent/app/cli/scaffold/docker/app_builder.py,sha256=7z5pk5JKlRDHx2USxY-WurttLyyUkIVYfl34_u1x9dE,501
|
@@ -82,7 +82,7 @@ stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=1khQdgTaQ89ykGRNdTQh_e
|
|
82
82
|
stoobly_agent/app/cli/scaffold/docker/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
83
83
|
stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py,sha256=ZU7z4bkvdS3OK5O4fJhlA9_PNwnFtZW6t7vNF7V5obQ,1003
|
84
84
|
stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=4cIMSYvgrkGWVuuYymiwlrR829O91qQl9ML8FhaDMj4,5857
|
85
|
-
stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=
|
85
|
+
stoobly_agent/app/cli/scaffold/docker/service/configure_gateway.py,sha256=jtx8lhvKHl0ubSHaQpE8m9lCYnOJ6Qju-SBJPBs0l7I,3921
|
86
86
|
stoobly_agent/app/cli/scaffold/docker/service/types.py,sha256=qB-yYHlu-PZDc0HYgTUvE5bWNpHxaSThC3JUG8okR1k,88
|
87
87
|
stoobly_agent/app/cli/scaffold/docker/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
88
88
|
stoobly_agent/app/cli/scaffold/docker/workflow/build_decorator.py,sha256=VKD9hXbJGRIWHS5IeYXeX0-FQ0F43zG8VmsegL6eYwA,703
|
@@ -104,7 +104,7 @@ stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOW
|
|
104
104
|
stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=xONRUtfC3IBd-Kr4wdUKWgx9ppSsbu2H72pb2VinizQ,11412
|
105
105
|
stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=x8C_a0VoO_vUbosp4_6IC1U7Ge9NnUdVKDPpVMtMkeY,171
|
106
106
|
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=Okk4Q0Fj7Wi5NU58gQfpjpFwAL3RUBJyRe56kteQfcA,158
|
107
|
-
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=
|
107
|
+
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=zifPWDDZ9RPz0p872Kl00pnmFY3jMHulp84tYXhfSwg,9240
|
108
108
|
stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=6tFqXh3ine8vaD0FCL5TMoY5NjKx2wLUR8XpW3tJtew,245
|
109
109
|
stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.networks.yml,sha256=I4PbJpQjFHb5IbAUWNvYM6okDEtmwtKFDQg-yog05WM,141
|
110
110
|
stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=TEmPG7Bf0KZOnmfsgdzza3UdwcVMmM5Lj1YdLc4cgjA,79
|
@@ -144,8 +144,8 @@ stoobly_agent/app/cli/scaffold/templates/app/gateway/test/.docker-compose.test.y
|
|
144
144
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
|
145
145
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bxrtZqf3YtaJCukzScslh5PgWC5q8xkGIP1wKJf33LA,111
|
146
146
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exec.yml,sha256=JN89sU5uRf6YqHvN_O63K8rwQIAPJHbhFDLFmuUjKNM,304
|
147
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=
|
148
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=
|
147
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=2wg-YArlQVjat-bin_PLOnULQJW7mOmZjP7CFp6Knbs,242
|
148
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=yDw8OSX7rFsW6J51K5Qf33qM-isGL8V4xPAYayIfnvQ,245
|
149
149
|
stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.configure,sha256=SKvht2K_3tW08K24rl8_j0jMYOhq1k-GsVwhoHwjxYA,337
|
150
150
|
stoobly_agent/app/cli/scaffold/templates/build/services/build/mock/.init,sha256=ecmyS6EZpa3op0CmO7bvd3pmAwRb0oLwj1qsTkee9_o,247
|
151
151
|
stoobly_agent/app/cli/scaffold/templates/build/services/build/record/.configure,sha256=eXp9eKJ-TORE5B0zLW4-t43ogS3nxtj2SmSeDALbi1U,278
|
@@ -203,9 +203,9 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
|
|
203
203
|
stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
|
204
204
|
stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=eF3aaK4OIZXYuSBEAeBnhAL7EZrS1G4mSYrJbEiXt2o,11082
|
205
205
|
stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=Uo_yo6rVR1ZR7xpvsQvlH48AyMBVLRupd4G-bRjzm_Q,5584
|
206
|
-
stoobly_agent/app/cli/scaffold_cli.py,sha256=
|
206
|
+
stoobly_agent/app/cli/scaffold_cli.py,sha256=NXlLuqAwv9p0dflksswAtgJPTfojvJDDHIdJ71-BCSE,31965
|
207
207
|
stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
|
208
|
-
stoobly_agent/app/cli/snapshot_cli.py,sha256=
|
208
|
+
stoobly_agent/app/cli/snapshot_cli.py,sha256=1Dw5JgDlmG6vctrawIRO7CdB73vAQk_wRBnPG2lVOrQ,11929
|
209
209
|
stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
|
210
210
|
stoobly_agent/app/cli/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
211
211
|
stoobly_agent/app/cli/types/output.py,sha256=2wazv56g5IwLQeJCWfJXXAxTB9Y5WH1cKMHbpjbXNeo,439
|
@@ -415,7 +415,7 @@ stoobly_agent/app/settings/types/remote_settings.py,sha256=4PvEGKULXM0zv29XTDzV7
|
|
415
415
|
stoobly_agent/app/settings/types/ui_settings.py,sha256=BqPy2F32AbODqzi2mp2kRk28QVUydQIwVmvftn46pco,84
|
416
416
|
stoobly_agent/app/settings/ui_settings.py,sha256=YDEUMPuJFh0SLHaGz6O-Gpz8nwsunNzeuc-TzO9OUbM,1170
|
417
417
|
stoobly_agent/app/settings/url_rule.py,sha256=Qx7YrIpVRSC-4LeNiCAfCtE50Jou4423hojMW-4qUYg,954
|
418
|
-
stoobly_agent/cli.py,sha256=
|
418
|
+
stoobly_agent/cli.py,sha256=FS-V4gkzDE4PgXokqvWV7cFzWq5v6WNMro6B5Mi9E-4,10317
|
419
419
|
stoobly_agent/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
420
420
|
stoobly_agent/config/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
421
421
|
stoobly_agent/config/constants/alias_resolve_strategy.py,sha256=_R1tVqFnyGxCraVS5-dhSskaDj_X8-NthsY7i_bEt9M,119
|
@@ -677,7 +677,7 @@ stoobly_agent/test/app/cli/request/request_reset_test.py,sha256=5My6Z452eideAOUu
|
|
677
677
|
stoobly_agent/test/app/cli/request/request_response_test.py,sha256=Fu-A8tIn016DKme4WIaPzo3YeFY-CPtTOpaSFigUVVM,1263
|
678
678
|
stoobly_agent/test/app/cli/request/request_snapshot_test.py,sha256=3kMmv0CuvnMXLgDQA-_u9S1DIiNOdL63L-IptVuOpf8,6308
|
679
679
|
stoobly_agent/test/app/cli/request/request_test_test.py,sha256=-cJNXKjgryVVfVt-7IN5fIhBwe3NjFoPmeavDH8lAjU,5527
|
680
|
-
stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=
|
680
|
+
stoobly_agent/test/app/cli/scaffold/cli_invoker.py,sha256=ZOFeLh9TejJ_k3gQ0KC6iIuqKhwrkqZV5U7CMdRDnwM,3700
|
681
681
|
stoobly_agent/test/app/cli/scaffold/cli_test.py,sha256=sMNvO845MIu5DVGa1HmwXQDmKDcwrfNTdEb3fK5886w,4557
|
682
682
|
stoobly_agent/test/app/cli/scaffold/e2e_test.py,sha256=IGWT0EXrMtB8i8kdLFbN7O8NvLrJYTi-iQ_GRiUoA94,12978
|
683
683
|
stoobly_agent/test/app/cli/scaffold/hosts_file_manager_test.py,sha256=ztcPh1x0ZCW1FWA5YL4ulEVjfbW9TOPgk1bnSDPNmCw,2287
|
@@ -692,7 +692,7 @@ stoobly_agent/test/app/cli/snapshot/snapshot_apply_test.py,sha256=mpkTZx8eaFFZU_
|
|
692
692
|
stoobly_agent/test/app/cli/snapshot/snapshot_copy_test.py,sha256=Yg78-FhSiG_r6Jpm-sN8sn0LjVXTwTOXt6hg8ni2GIY,1953
|
693
693
|
stoobly_agent/test/app/cli/snapshot/snapshot_migrate_test.py,sha256=voEvblK6CMGCrSJDTHVmkUkLXj0auNb78jxlGiiBBQQ,7370
|
694
694
|
stoobly_agent/test/app/cli/snapshot/snapshot_prune_test.py,sha256=bn4yUU7Eb4-6GnwnRaPZPi5Cn7XEaIsrJ_mB7jydgWw,6693
|
695
|
-
stoobly_agent/test/app/cli/snapshot/snapshot_update_test.py,sha256=
|
695
|
+
stoobly_agent/test/app/cli/snapshot/snapshot_update_test.py,sha256=yx_QDPYc5utiqlRhy3hTGBKLafGq9nC_lDV-0k0qWOo,4502
|
696
696
|
stoobly_agent/test/app/models/adapters/joined_rquest_adapter_test.py,sha256=bF7WMrAiASQDNzDTvIXGJhsWLNhfYOmdQpSDo0hyWYY,1098
|
697
697
|
stoobly_agent/test/app/models/adapters/orm/joined_request_string_adapter_test.py,sha256=a2IHTk3l7aiLyYF7vtqissrk0MFTF2wlUBiaKWyJKfU,2667
|
698
698
|
stoobly_agent/test/app/models/adapters/orm/request/orm_mitmproxy_request_adapter_test.py,sha256=PbJsAaxPUEbF9vM7DX4z858biWf4qlGnvE8KBuy8SgY,2763
|
@@ -708,7 +708,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
|
|
708
708
|
stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=a1SFLyEyRRLuADvAw6ckQQKORFXvyK1lyrbkaLWx8oU,3399
|
709
709
|
stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
|
710
710
|
stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
|
711
|
-
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=
|
711
|
+
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=MvlkhO5KUUDkZHqygfa1PgGkfddFw7TZAu1qTt_cq-g,5
|
712
712
|
stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
|
713
713
|
stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
|
714
714
|
stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
|
@@ -749,8 +749,8 @@ stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=1W
|
|
749
749
|
stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
|
750
750
|
stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
|
751
751
|
stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
|
752
|
-
stoobly_agent-1.9.
|
753
|
-
stoobly_agent-1.9.
|
754
|
-
stoobly_agent-1.9.
|
755
|
-
stoobly_agent-1.9.
|
756
|
-
stoobly_agent-1.9.
|
752
|
+
stoobly_agent-1.9.5.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
|
753
|
+
stoobly_agent-1.9.5.dist-info/METADATA,sha256=Ar6dgljQ63YgEG_psjAkNEVUpGuRpudvTxCY4fAebgQ,3087
|
754
|
+
stoobly_agent-1.9.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
755
|
+
stoobly_agent-1.9.5.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
|
756
|
+
stoobly_agent-1.9.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|