cornflow 1.2.4__py3-none-any.whl → 1.3.0rc1__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.
- cornflow/cli/service.py +91 -42
- cornflow/commands/dag.py +7 -7
- cornflow/commands/permissions.py +9 -5
- cornflow/config.py +23 -3
- cornflow/endpoints/case.py +37 -21
- cornflow/endpoints/dag.py +5 -5
- cornflow/endpoints/data_check.py +8 -7
- cornflow/endpoints/example_data.py +4 -2
- cornflow/endpoints/execution.py +215 -127
- cornflow/endpoints/health.py +30 -11
- cornflow/endpoints/instance.py +3 -3
- cornflow/endpoints/login.py +9 -2
- cornflow/endpoints/schemas.py +3 -3
- cornflow/migrations/versions/999b98e24225.py +34 -0
- cornflow/migrations/versions/cef1df240b27_.py +34 -0
- cornflow/models/__init__.py +2 -1
- cornflow/models/dag.py +8 -9
- cornflow/models/dag_permissions.py +3 -3
- cornflow/models/execution.py +2 -3
- cornflow/models/permissions.py +1 -0
- cornflow/models/user.py +1 -1
- cornflow/schemas/execution.py +14 -1
- cornflow/schemas/health.py +1 -1
- cornflow/shared/authentication/auth.py +14 -1
- cornflow/shared/authentication/decorators.py +0 -1
- cornflow/shared/const.py +44 -1
- cornflow/shared/exceptions.py +2 -1
- cornflow/tests/base_test_execution.py +798 -0
- cornflow/tests/const.py +1 -0
- cornflow/tests/integration/test_commands.py +2 -2
- cornflow/tests/integration/test_cornflowclient.py +2 -1
- cornflow/tests/unit/test_cases.py +1 -1
- cornflow/tests/unit/test_commands.py +5 -5
- cornflow/tests/unit/test_dags.py +3 -3
- cornflow/tests/unit/test_example_data.py +1 -1
- cornflow/tests/unit/test_executions.py +115 -535
- cornflow/tests/unit/test_health.py +84 -3
- cornflow/tests/unit/test_main_alarms.py +1 -1
- cornflow/tests/unit/test_roles.py +2 -1
- cornflow/tests/unit/test_schema_from_models.py +1 -1
- cornflow/tests/unit/test_schemas.py +1 -1
- cornflow/tests/unit/tools.py +93 -10
- {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/METADATA +2 -2
- {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/RECORD +47 -44
- {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/WHEEL +0 -0
- {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/entry_points.txt +0 -0
- {cornflow-1.2.4.dist-info → cornflow-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,18 @@
|
|
1
1
|
import os
|
2
|
+
from unittest.mock import patch, MagicMock
|
2
3
|
|
3
4
|
from cornflow.shared import db
|
4
5
|
|
5
6
|
from cornflow.app import create_app
|
6
7
|
from cornflow.commands import access_init_command
|
7
|
-
from cornflow.shared.const import
|
8
|
+
from cornflow.shared.const import (
|
9
|
+
STATUS_HEALTHY,
|
10
|
+
STATUS_UNHEALTHY,
|
11
|
+
CORNFLOW_VERSION,
|
12
|
+
DATABRICKS_BACKEND,
|
13
|
+
AIRFLOW_BACKEND,
|
14
|
+
)
|
15
|
+
from cornflow.shared.exceptions import EndpointNotImplemented
|
8
16
|
from cornflow.tests.const import HEALTH_URL
|
9
17
|
from cornflow.tests.custom_test_case import CustomTestCase
|
10
18
|
|
@@ -28,10 +36,83 @@ class TestHealth(CustomTestCase):
|
|
28
36
|
response = self.client.get(HEALTH_URL)
|
29
37
|
self.assertEqual(200, response.status_code)
|
30
38
|
cf_status = response.json["cornflow_status"]
|
31
|
-
|
39
|
+
backend_status = response.json["backend_status"]
|
32
40
|
cf_version = response.json["cornflow_version"]
|
33
41
|
expected_version = CORNFLOW_VERSION
|
34
42
|
self.assertEqual(str, type(cf_status))
|
35
|
-
self.assertEqual(str, type(
|
43
|
+
self.assertEqual(str, type(backend_status))
|
36
44
|
self.assertEqual(cf_status, STATUS_HEALTHY)
|
37
45
|
self.assertEqual(cf_version, expected_version)
|
46
|
+
|
47
|
+
@patch("cornflow.endpoints.health.Databricks")
|
48
|
+
def test_health_databricks_backend_healthy(self, mock_databricks):
|
49
|
+
"""Test health endpoint with Databricks backend when service is healthy"""
|
50
|
+
self.create_service_user()
|
51
|
+
os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
|
52
|
+
|
53
|
+
# Mock Databricks client
|
54
|
+
mock_db_client = MagicMock()
|
55
|
+
mock_db_client.is_alive.return_value = True
|
56
|
+
mock_databricks.from_config.return_value = mock_db_client
|
57
|
+
|
58
|
+
# Set Databricks backend
|
59
|
+
with self.app.app_context():
|
60
|
+
self.app.config["CORNFLOW_BACKEND"] = DATABRICKS_BACKEND
|
61
|
+
|
62
|
+
response = self.client.get(HEALTH_URL)
|
63
|
+
|
64
|
+
self.assertEqual(200, response.status_code)
|
65
|
+
cf_status = response.json["cornflow_status"]
|
66
|
+
backend_status = response.json["backend_status"]
|
67
|
+
cf_version = response.json["cornflow_version"]
|
68
|
+
|
69
|
+
self.assertEqual(cf_status, STATUS_HEALTHY)
|
70
|
+
self.assertEqual(backend_status, STATUS_HEALTHY)
|
71
|
+
self.assertEqual(cf_version, CORNFLOW_VERSION)
|
72
|
+
|
73
|
+
# Verify Databricks client was called
|
74
|
+
mock_databricks.from_config.assert_called_once()
|
75
|
+
mock_db_client.is_alive.assert_called_once()
|
76
|
+
|
77
|
+
@patch("cornflow.endpoints.health.Databricks")
|
78
|
+
def test_health_databricks_backend_unhealthy(self, mock_databricks):
|
79
|
+
"""Test health endpoint with Databricks backend when service is unhealthy"""
|
80
|
+
self.create_service_user()
|
81
|
+
os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
|
82
|
+
|
83
|
+
# Mock Databricks client
|
84
|
+
mock_db_client = MagicMock()
|
85
|
+
mock_db_client.is_alive.return_value = False
|
86
|
+
mock_databricks.from_config.return_value = mock_db_client
|
87
|
+
|
88
|
+
# Set Databricks backend
|
89
|
+
with self.app.app_context():
|
90
|
+
self.app.config["CORNFLOW_BACKEND"] = DATABRICKS_BACKEND
|
91
|
+
|
92
|
+
response = self.client.get(HEALTH_URL)
|
93
|
+
|
94
|
+
self.assertEqual(200, response.status_code)
|
95
|
+
cf_status = response.json["cornflow_status"]
|
96
|
+
backend_status = response.json["backend_status"]
|
97
|
+
|
98
|
+
self.assertEqual(cf_status, STATUS_HEALTHY)
|
99
|
+
self.assertEqual(backend_status, STATUS_UNHEALTHY)
|
100
|
+
|
101
|
+
# Verify Databricks client was called
|
102
|
+
mock_databricks.from_config.assert_called_once()
|
103
|
+
mock_db_client.is_alive.assert_called_once()
|
104
|
+
|
105
|
+
def test_health_unsupported_backend(self):
|
106
|
+
"""Test health endpoint with unsupported backend raises EndpointNotImplemented"""
|
107
|
+
self.create_service_user()
|
108
|
+
os.environ["CORNFLOW_SERVICE_USER"] = "testuser4"
|
109
|
+
|
110
|
+
# Set an unsupported backend value
|
111
|
+
with self.app.app_context():
|
112
|
+
self.app.config["CORNFLOW_BACKEND"] = 999 # Invalid backend value
|
113
|
+
|
114
|
+
response = self.client.get(HEALTH_URL)
|
115
|
+
|
116
|
+
self.assertEqual(501, response.status_code)
|
117
|
+
self.assertIn("error", response.json)
|
118
|
+
self.assertEqual(response.json["error"], "Endpoint not implemented")
|
@@ -5,7 +5,7 @@
|
|
5
5
|
import json
|
6
6
|
|
7
7
|
# Imports from internal modules
|
8
|
-
from cornflow.models import MainAlarmsModel
|
8
|
+
from cornflow.models import MainAlarmsModel
|
9
9
|
from cornflow.tests.const import MAIN_ALARMS_URL, ALARMS_URL
|
10
10
|
from cornflow.tests.custom_test_case import CustomTestCase
|
11
11
|
|
@@ -251,7 +251,8 @@ class TestUserRolesListEndpoint(CustomTestCase):
|
|
251
251
|
},
|
252
252
|
)
|
253
253
|
self.assertEqual(200, response.status_code)
|
254
|
-
self.
|
254
|
+
self.assertCountEqual(self.payload, response.json)
|
255
|
+
|
255
256
|
|
256
257
|
def test_get_user_roles_not_authorized_user(self):
|
257
258
|
for role in ROLES_MAP:
|
@@ -81,7 +81,7 @@
|
|
81
81
|
# }
|
82
82
|
# required_instance = {"id", "name", "data_hash"}
|
83
83
|
# foreign_keys = [
|
84
|
-
# ("permission_dag", "dag_id", "
|
84
|
+
# ("permission_dag", "dag_id", "deployed_workflows.id"),
|
85
85
|
# ("permission_dag", "user_id", "users.id"),
|
86
86
|
# ("permission_view", "action_id", "actions.id"),
|
87
87
|
# ("permission_view", "api_view_id", "api_view.id"),
|
@@ -189,7 +189,7 @@ class TestNewSchemaEndpointOpen(CustomTestCase):
|
|
189
189
|
|
190
190
|
def test_get_all_schemas(self):
|
191
191
|
schemas = self.get_one_row(self.url, {}, 200, False, keys_to_check=["name"])
|
192
|
-
dags = [{"name": dag} for dag in ["solve_model_dag", "gc", "timer"]]
|
192
|
+
dags = [{"name": dag} for dag in ["solve_model_dag", "gc", "timer", "979073949072767"]]
|
193
193
|
|
194
194
|
self.assertEqual(dags, schemas)
|
195
195
|
|
cornflow/tests/unit/tools.py
CHANGED
@@ -1,13 +1,96 @@
|
|
1
|
-
from unittest.mock import Mock
|
1
|
+
from unittest.mock import Mock, patch
|
2
|
+
from flask import Flask
|
3
|
+
import json
|
4
|
+
import os
|
5
|
+
|
6
|
+
from cornflow.shared.const import (
|
7
|
+
DATABRICKS_TERMINATE_STATE,
|
8
|
+
DATABRICKS_FINISH_TO_STATE_MAP,
|
9
|
+
)
|
10
|
+
|
11
|
+
|
12
|
+
def create_test_app():
|
13
|
+
app = Flask(__name__)
|
14
|
+
app.config["CORNFLOW_BACKEND"] = 2
|
15
|
+
return app
|
2
16
|
|
3
17
|
|
4
18
|
def patch_af_client(af_client_class):
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
19
|
+
with patch("cornflow.endpoints.execution.current_app.config") as mock_config:
|
20
|
+
mock_config.__getitem__.side_effect = lambda key: (
|
21
|
+
1 if key == "CORNFLOW_BACKEND" else {}
|
22
|
+
)
|
23
|
+
af_client_mock = Mock()
|
24
|
+
responses_mock = Mock()
|
25
|
+
responses_mock.json.return_value = {
|
26
|
+
"is_paused": False,
|
27
|
+
"dag_run_id": "12345",
|
28
|
+
"state": "success",
|
29
|
+
}
|
30
|
+
af_client_mock.is_alive.return_value = True
|
31
|
+
af_client_mock.get_workflow_info.return_value = responses_mock
|
32
|
+
|
33
|
+
# Configurar get_workflow_info
|
34
|
+
schema_info_mock = Mock()
|
35
|
+
schema_info_mock.json.return_value = {"is_paused": False}
|
36
|
+
af_client_mock.get_workflow_info.return_value = schema_info_mock
|
37
|
+
|
38
|
+
# Configurar run_workflow
|
39
|
+
run_response_mock = Mock()
|
40
|
+
run_response_mock.json.return_value = {"dag_run_id": "12345"}
|
41
|
+
af_client_mock.run_workflow.return_value = run_response_mock
|
42
|
+
|
43
|
+
# Configurar get_run_status
|
44
|
+
status_mock = Mock()
|
45
|
+
status_mock.json.return_value = {"state": "success"}
|
46
|
+
af_client_mock.get_run_status.return_value = status_mock
|
47
|
+
|
48
|
+
af_client_mock.run_dag.return_value = responses_mock
|
49
|
+
af_client_mock.set_dag_run_to_fail.return_value = None
|
50
|
+
af_client_class.from_config.return_value = af_client_mock
|
51
|
+
|
52
|
+
|
53
|
+
def patch_db_client(db_client_class):
|
54
|
+
mock_config = {"CORNFLOW_BACKEND": 2}
|
55
|
+
|
56
|
+
with patch("cornflow.endpoints.execution.current_app.config", mock_config):
|
57
|
+
db_client_mock = Mock()
|
58
|
+
responses_mock = Mock()
|
59
|
+
responses_mock.json.return_value = {
|
60
|
+
"status": {"state": "SUCCESS", "termination_details": {"code": "SUCCESS"}}
|
61
|
+
}
|
62
|
+
response_run_workflow = Mock()
|
63
|
+
response_run_workflow.json.return_value = {
|
64
|
+
"run_id": 350148078719367,
|
65
|
+
"number_in_job": 350148078719367,
|
66
|
+
}
|
67
|
+
response_get_workflow_info = Mock()
|
68
|
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
69
|
+
test_data_dir = os.path.join(os.path.dirname(current_dir), "data")
|
70
|
+
with open(
|
71
|
+
os.path.join(test_data_dir, "patch_databricks_get_orch_info.json")
|
72
|
+
) as f:
|
73
|
+
response_get_workflow_info.json.return_value = json.load(f)
|
74
|
+
response_get_run_status = Mock()
|
75
|
+
with open(
|
76
|
+
os.path.join(test_data_dir, "patch_databricks_get_run_status.json")
|
77
|
+
) as f:
|
78
|
+
response_get_run_status.json.return_value = json.load(f)
|
79
|
+
state = response_get_run_status.json.return_value["status"]["state"]
|
80
|
+
if state == DATABRICKS_TERMINATE_STATE:
|
81
|
+
if (
|
82
|
+
response_get_run_status.json.return_value["status"][
|
83
|
+
"termination_details"
|
84
|
+
]["code"]
|
85
|
+
in DATABRICKS_FINISH_TO_STATE_MAP.keys()
|
86
|
+
):
|
87
|
+
response_get_run_status = response_get_run_status.json.return_value[
|
88
|
+
"status"
|
89
|
+
]["termination_details"]["code"]
|
90
|
+
else:
|
91
|
+
response_get_run_status = "OTHER_FINISH_ERROR"
|
92
|
+
db_client_mock.is_alive.return_value = True
|
93
|
+
db_client_mock.get_workflow_info.return_value = response_get_workflow_info
|
94
|
+
db_client_mock.run_workflow.return_value = response_run_workflow
|
95
|
+
db_client_mock.get_run_status.return_value = response_get_run_status
|
96
|
+
db_client_class.from_config.return_value = db_client_mock
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cornflow
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.3.0rc1
|
4
4
|
Summary: cornflow is an open source multi-solver optimization server with a REST API built using flask.
|
5
5
|
Home-page: https://github.com/baobabsoluciones/cornflow
|
6
6
|
Author: baobab soluciones
|
@@ -14,7 +14,7 @@ Requires-Dist: alembic==1.9.2
|
|
14
14
|
Requires-Dist: apispec<=6.3.0
|
15
15
|
Requires-Dist: cachetools==5.3.3
|
16
16
|
Requires-Dist: click<=8.1.7
|
17
|
-
Requires-Dist: cornflow-client
|
17
|
+
Requires-Dist: cornflow-client==1.3.0rc1
|
18
18
|
Requires-Dist: cryptography<=44.0.1
|
19
19
|
Requires-Dist: disposable-email-domains>=0.0.86
|
20
20
|
Requires-Dist: Flask==2.3.2
|
@@ -6,7 +6,7 @@ airflow_config/plugins/XCom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
6
6
|
airflow_config/plugins/XCom/gce_xcom_backend.py,sha256=vCGvF2jbfZt5bOv-pk5Q_kUR6LomFUojIymimSJmj3o,1795
|
7
7
|
cornflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
cornflow/app.py,sha256=Jov5TS85r_dKYqZ1tZ34JxavoHJbfBt0DdyDxh2V2tI,8008
|
9
|
-
cornflow/config.py,sha256=
|
9
|
+
cornflow/config.py,sha256=AVk10gmw_n_R36LVu2TLRA8Au2Qm2nm_Kd3NuARh7bE,6521
|
10
10
|
cornflow/gunicorn.py,sha256=uO-Yk7w7nvQSWh12iDxsVvlG-_2BiKIIjm2UiTk4P9E,480
|
11
11
|
cornflow/cli/__init__.py,sha256=2QfFLxLcX5zYt3Ok3QKNWQvUvAeEnLsH7xiGN3GjwFU,853
|
12
12
|
cornflow/cli/actions.py,sha256=-vm7hUrRTtJA6y0ZK2cIeTKFQi8Wl2Z6ico2px9Fiuk,524
|
@@ -16,7 +16,7 @@ cornflow/cli/migrations.py,sha256=nJbmulqwFxuaSPmo9hJiTl1pUSojeXfAdd9aGM_g9ic,24
|
|
16
16
|
cornflow/cli/permissions.py,sha256=fyIp5M0ZpJWVf_tGZG0DN0Gnk1geruadkdKK11cmRk8,1116
|
17
17
|
cornflow/cli/roles.py,sha256=1dvAq1Bp1iEAUUfXFeL8kYjI0ZchYlDwIBQpTtwV6vs,529
|
18
18
|
cornflow/cli/schemas.py,sha256=s9IUJWa2G0kpqJaN6PcwbwZtGChTaqq451QqWEyWPBI,6197
|
19
|
-
cornflow/cli/service.py,sha256=
|
19
|
+
cornflow/cli/service.py,sha256=tpITdvfRxzGfpJn09VuvD7jbOxcEj6iBH4iPdm1mzS4,15949
|
20
20
|
cornflow/cli/users.py,sha256=VBUqOrS80qdp9E4XLn4ihocHVNWVhWSt19tp0o8mZII,2324
|
21
21
|
cornflow/cli/utils.py,sha256=p54xJEnYWda6rqSQDoZU2qZrFu9kTs4FoF0y3pJLQvI,1377
|
22
22
|
cornflow/cli/views.py,sha256=BjJRIQ5T3C8zl3-pVVkToVjQ6xdAGwnuT9LVEnn_jqM,746
|
@@ -32,8 +32,8 @@ cornflow/commands/access.py,sha256=4as74PKwcq5VoPnT9Hh2uUEDQLOQo6jAelwmeBIPW3c,1
|
|
32
32
|
cornflow/commands/actions.py,sha256=4AwgAmyI6VeaugkISvTlNGrIzMMU_-ZB3MhwDD_CIEA,1544
|
33
33
|
cornflow/commands/auxiliar.py,sha256=rM_PENCXDKbPSpE5TCvsDFE3riwDwwQiFg019Qms7OU,3764
|
34
34
|
cornflow/commands/cleanup.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
-
cornflow/commands/dag.py,sha256=
|
36
|
-
cornflow/commands/permissions.py,sha256=
|
35
|
+
cornflow/commands/dag.py,sha256=VusWUxYg_q_dMpKY_pN6o06_Mql8d379dIL3zXlJyxY,3835
|
36
|
+
cornflow/commands/permissions.py,sha256=9XRhd914hZp41Wb7PiXjjrr-BWtiXen7yJCTJ4Ku4W0,10654
|
37
37
|
cornflow/commands/roles.py,sha256=MHMn-nNSgvRww5RNblxXvdG9BBCtMvPtc-KD5EMwseg,1605
|
38
38
|
cornflow/commands/schemas.py,sha256=40dZSJ2nEqBa7Crb6DbFmnclT5e8ljAIjscOgHr9lhk,1970
|
39
39
|
cornflow/commands/users.py,sha256=2YTbNYY5kZL6ujxGP4fyYgqtv5uuVGdkLR31n7OFFaE,2477
|
@@ -42,20 +42,20 @@ cornflow/endpoints/__init__.py,sha256=NNKkdqA7NnvqsqiFhEY1ZQ0NRIoAliHJ-Hdf9SottN
|
|
42
42
|
cornflow/endpoints/action.py,sha256=ksHK3F919cjkONLcFV2tUIbG-eZw5XbYkqVjYx9iq5I,1359
|
43
43
|
cornflow/endpoints/alarms.py,sha256=M-fpRAm5ZgYyZXvcgS0NHkeMGnvcbfQh2O5qQJUaeoM,4372
|
44
44
|
cornflow/endpoints/apiview.py,sha256=cpxZFkWy6yrRHiAq2tseyVAK1r8uvjnFuOgJjGT0rKI,1370
|
45
|
-
cornflow/endpoints/case.py,sha256=
|
46
|
-
cornflow/endpoints/dag.py,sha256=
|
47
|
-
cornflow/endpoints/data_check.py,sha256=
|
48
|
-
cornflow/endpoints/example_data.py,sha256=
|
49
|
-
cornflow/endpoints/execution.py,sha256=
|
50
|
-
cornflow/endpoints/health.py,sha256=
|
51
|
-
cornflow/endpoints/instance.py,sha256=
|
45
|
+
cornflow/endpoints/case.py,sha256=Wb5BxMhITrpBSR5aTLsVHLFFB_noHBXkPg62nPSAvsM,18777
|
46
|
+
cornflow/endpoints/dag.py,sha256=m8ymKjftGCToEBYmRp1MFJWrgKvXlovYsD0k3mgUCqA,10112
|
47
|
+
cornflow/endpoints/data_check.py,sha256=G19KaEnR83s8nUZVorKzucadlfBBlSikiMHmmHrwl-k,13589
|
48
|
+
cornflow/endpoints/example_data.py,sha256=TXsYZFF9vycpXxQNP2-YsVaAyeeGyWaei-i7oozV3SU,4509
|
49
|
+
cornflow/endpoints/execution.py,sha256=nWd2TaZaI99ETpa1oiFzJC-d-l_uHuOlSACouzFgywk,31559
|
50
|
+
cornflow/endpoints/health.py,sha256=AuEqNiITm9pJhs3XYH5vJj3fMnapPktC1YV9ays7uVM,2258
|
51
|
+
cornflow/endpoints/instance.py,sha256=1ZvSeNBo9SRnT-yFHSs2nhRVZmihxIWJf3i2K3NM7Hw,12755
|
52
52
|
cornflow/endpoints/licenses.py,sha256=82hHWGYvVIiyw9mlwGtMwJMDJ-ShHOi9rvuM6KvfE4U,873
|
53
|
-
cornflow/endpoints/login.py,sha256=
|
53
|
+
cornflow/endpoints/login.py,sha256=c7SjVvUlUPX1BLCZNYmCGC7bMBsvY_JVkpqmLLF3bxo,11006
|
54
54
|
cornflow/endpoints/main_alarms.py,sha256=GUB-UdnvEFi7n6FGFKO9VtZeZb4Ox3NvBMhB7rdqNyI,2006
|
55
55
|
cornflow/endpoints/meta_resource.py,sha256=hqzOgmYFAzGsXVo0BIb5rjS71uNKVMuyLi-QkAQnb34,8639
|
56
56
|
cornflow/endpoints/permission.py,sha256=qG-NTA1AdkGuGNb3Aqq2PkPT84nj6W1ym9gLQixVOnA,3751
|
57
57
|
cornflow/endpoints/roles.py,sha256=54ra4MQ9JmrHDsiGczDAVqHgAT4zwhdTA1dLBOy66v8,6105
|
58
|
-
cornflow/endpoints/schemas.py,sha256=
|
58
|
+
cornflow/endpoints/schemas.py,sha256=V_QrCCYIkX8lU2fJpG37vVwASzCFEHOO7IPQOgSiOg8,2944
|
59
59
|
cornflow/endpoints/signup.py,sha256=12bziq9qq9BMcrM0XmBrAurucbsHnBe5DbDaHZyw91U,3723
|
60
60
|
cornflow/endpoints/tables.py,sha256=KI4sgkBHdiHbOnIRR_yoZ859ea3rnp_6ji_XvQbwsZ8,3071
|
61
61
|
cornflow/endpoints/token.py,sha256=UEnsNNQAd6lJi2aF972d8uUWNJHT4ZcRr0eYpN458R4,1193
|
@@ -70,30 +70,32 @@ cornflow/migrations/versions/1af47a419bbd_.py,sha256=F6XOkxhojBbOSv3EGiWJvvncSMN
|
|
70
70
|
cornflow/migrations/versions/4aac5e0c6e66_.py,sha256=ecWq38w_1vWpbLqsEkTsPw1tGv88OMt9L8JNZHlu7LI,2200
|
71
71
|
cornflow/migrations/versions/7c3ea5ab5501_.py,sha256=TX9Are_ELRweHeGOo3tV4XAB9cFIVH6LAooCvoNfJxU,1569
|
72
72
|
cornflow/migrations/versions/991b98e24225_.py,sha256=oNDQKQw6SfMdAB9HYV9Vb-haz5dJQo9lp3uJR-K9xYk,834
|
73
|
+
cornflow/migrations/versions/999b98e24225.py,sha256=w8VS-u4ZGZz2hMBqgIXxdM8u07u62IibE5-Hz3oAboY,860
|
73
74
|
cornflow/migrations/versions/a472b5ad50b7_.py,sha256=RpaLV-eTZmOS4BN53F_o0yG6ZGfmfKIJjrn2x2M6THw,1370
|
74
75
|
cornflow/migrations/versions/c2db9409cb5f_.py,sha256=M6udQ0vaIJXEsGpb31ZqAdU_eDwvbHPvWLvNsGQx7yY,1812
|
75
76
|
cornflow/migrations/versions/c8a6c762e818_.py,sha256=6xqEn2860c7HMTZPjgype1bMMFWDQAD2iHZa2KVdtgg,3574
|
76
77
|
cornflow/migrations/versions/ca449af8034c_.py,sha256=wPdZMICTSwHPsgouHdOyNmgVSLPPvP3GCe2ie_7RaYU,2433
|
78
|
+
cornflow/migrations/versions/cef1df240b27_.py,sha256=TAdxyMSGPS2tFKGlkxuTL_vFM_2JgfnW0nyZgwi4P70,723
|
77
79
|
cornflow/migrations/versions/d0e0700dcd8e_.py,sha256=NZ4KFvdcmTLtMvzUdexlowjpQN5D0tf-tS7YMM-VIRg,1624
|
78
80
|
cornflow/migrations/versions/d1b5be1f0549_.py,sha256=FvrRoGE373moGY0VNcUVA1IhZ85CRdj-m9C0UScwYKA,1607
|
79
81
|
cornflow/migrations/versions/e1a50dae1ac9_.py,sha256=NIRKFg1hvo4F-YqMdsYoX9VwzKlQNpsKsK1EgBxjq7I,3555
|
80
82
|
cornflow/migrations/versions/e937a5234ce4_.py,sha256=460JyCKPN6XL5DDcJfC51WKr9V342ovVhuo8F7fwuo0,710
|
81
83
|
cornflow/migrations/versions/ebdd955fcc5e_.py,sha256=MzLbzmiwMWWVkJWJ8EMmmBnCIOzvlwXKGFWxELnOQpE,1848
|
82
84
|
cornflow/migrations/versions/f3bee20314a2_.py,sha256=pgfAeiPvFvPJXhWlFHq6Y7bjYFGvapsfHEFXXX8UJlE,1782
|
83
|
-
cornflow/models/__init__.py,sha256=
|
85
|
+
cornflow/models/__init__.py,sha256=f18GOllEZhjrStcyF-2wDlXwwXx1_AnUQd99kH0b9z0,506
|
84
86
|
cornflow/models/action.py,sha256=8MYzQ2qX5bG0zk28OufypzThkR7AU1J1el-5ABoTurg,1200
|
85
87
|
cornflow/models/alarms.py,sha256=R_g3tkWNSJaAG4gSvthgJlyrueY9VDuIZPoVHk5lDvU,1682
|
86
88
|
cornflow/models/base_data_model.py,sha256=AJY_HUW1bTT6bjLeRl21YuKTisriJByr6DevpZOrny4,4472
|
87
89
|
cornflow/models/case.py,sha256=GEs-xeo0bJ5qJETDnIur-2q2IyR3NSj1K0jP3Arz4Xs,9572
|
88
|
-
cornflow/models/dag.py,sha256=
|
89
|
-
cornflow/models/dag_permissions.py,sha256=
|
90
|
-
cornflow/models/execution.py,sha256=
|
90
|
+
cornflow/models/dag.py,sha256=3Um_Y8T_QdHILR6_x1mvDjVISd6BcNZlmuXmFzMEFmY,2945
|
91
|
+
cornflow/models/dag_permissions.py,sha256=8RWnptmac8V4W9kfrfwf_cARdWSTGhkCEBip_mVMfjk,1731
|
92
|
+
cornflow/models/execution.py,sha256=9ogS9CYuDL0yVHWnabMZVNmjyKvLA-mxWEhvtsh1vGs,6009
|
91
93
|
cornflow/models/instance.py,sha256=2E9kBKv1a8soaEAvG8X4qXQ4BVC-IWYD5WQcPmZQw00,3979
|
92
94
|
cornflow/models/main_alarms.py,sha256=9S-Ohr2kYFFWB0HomrpSdDIoUr85Eu1rt90Om_Pa8VY,1748
|
93
95
|
cornflow/models/meta_models.py,sha256=dW10OCqSPeKsPTHxdEEDM17qW36arPT5pYxIy3vRLKE,12132
|
94
|
-
cornflow/models/permissions.py,sha256=
|
96
|
+
cornflow/models/permissions.py,sha256=Mzp69HkZqvb5eeZlyIwB16zjks5dzSD_-mC9LwvufZA,2805
|
95
97
|
cornflow/models/role.py,sha256=dEASPw8-aLbRRkoyId2zk7lFTq1twpRPMTkwb0zEOIE,2052
|
96
|
-
cornflow/models/user.py,sha256=
|
98
|
+
cornflow/models/user.py,sha256=Bjmw32gQEJMwsZwIqgwXxwkfh2vLMfvHt-QyF8AvQfU,8738
|
97
99
|
cornflow/models/user_role.py,sha256=rr-0S4sV5l6xDQIwd94c3bPepDA50NdStwd3MSzRJbU,4974
|
98
100
|
cornflow/models/view.py,sha256=ajDnvKsm-F1uizk1egaLfZDka3fXF8TXC3zUvkktVIo,2066
|
99
101
|
cornflow/schemas/__init__.py,sha256=ijW3cATETq-SbBCWarRtxLMvU2_oVkaqGbP2gH1KX8o,215
|
@@ -103,8 +105,8 @@ cornflow/schemas/case.py,sha256=OXRsDi_sdB47MQJ59S_1eMjDmLlpUtG7kTFNInV2-cI,2909
|
|
103
105
|
cornflow/schemas/common.py,sha256=QYuxWcOl4smXFZr_vL07OVgH9H50ZywCrXxycVNr1qA,473
|
104
106
|
cornflow/schemas/dag.py,sha256=0ENA75X9L8YqjJW6ZO1Sb4zE8OxB15_O49_nwA6eAVw,901
|
105
107
|
cornflow/schemas/example_data.py,sha256=hbE8TJakFqOweHXiA3mduNETM6FCX6xLTiQuH3EkSTc,281
|
106
|
-
cornflow/schemas/execution.py,sha256=
|
107
|
-
cornflow/schemas/health.py,sha256=
|
108
|
+
cornflow/schemas/execution.py,sha256=xdPh45GF4tA3cDuem9heqlpXLoa8nrMUKa9iYq1I2Qg,5380
|
109
|
+
cornflow/schemas/health.py,sha256=vwIgqa80mvgGEkji4XWPDaiHoLJVQ7iCrPulx1UaqK4,177
|
108
110
|
cornflow/schemas/instance.py,sha256=qr4km0AlAhoNf9G1Il-pfHphT_vAiiLDpv7A9S3FKAw,1870
|
109
111
|
cornflow/schemas/main_alarms.py,sha256=cC1_Vb1dmo_vdZpZQrA7jH-hRCjVtLRy6Z2JFBlTrlo,604
|
110
112
|
cornflow/schemas/model_json.py,sha256=qUsdd1XmxhcsAmb1JB0xAsvucZoAeQhAQD_3wiY-rVo,202
|
@@ -120,9 +122,9 @@ cornflow/schemas/user_role.py,sha256=e5y6RgdZZtLqD-h2B3sa5WokI5-pT78tWw85IG34I74
|
|
120
122
|
cornflow/schemas/view.py,sha256=ctq9Y1TmjrWdyOqgDYeEx7qbbuNLKfSiNOlFTlXmpaw,429
|
121
123
|
cornflow/shared/__init__.py,sha256=1ahcBwWOsSjGI4FEm77JBQjitBdBszOncKcEMjzwGYE,29
|
122
124
|
cornflow/shared/compress.py,sha256=pohQaGs1xbH8CN6URIH6BAHA--pFq7Hmjz8oI3c3B5c,1347
|
123
|
-
cornflow/shared/const.py,sha256=
|
125
|
+
cornflow/shared/const.py,sha256=2WvvQNdvYVsTGJkYktY9lvZM94djYchm8_UHShAeYpQ,4819
|
124
126
|
cornflow/shared/email.py,sha256=QNDDMv86LZObkevSCyUbLQeR2UD3zWScPIr82NDzYHQ,3437
|
125
|
-
cornflow/shared/exceptions.py,sha256=
|
127
|
+
cornflow/shared/exceptions.py,sha256=1Car7ZD9PBdNXpvvASpCqNtN3DihcWcyBeVUc5OKlTQ,7022
|
126
128
|
cornflow/shared/licenses.py,sha256=Lc71Jw2NxVTFWtoXdQ9wJX_o3BDfYg1xVoehDXvnCkQ,1328
|
127
129
|
cornflow/shared/log_config.py,sha256=FM2ajjp2MB4BlFbUHklnWInT7-LLjtrqQ0mo3k_HRmE,621
|
128
130
|
cornflow/shared/query_tools.py,sha256=6yGLCWjv-I2a_ZU4A0IymyJq67fZPZdRcCGOGQQpSXg,1199
|
@@ -130,16 +132,17 @@ cornflow/shared/utils.py,sha256=g2ZsD3SwsqIHXZ7GWVAVB0F9gX7mT9dQkPgR2Ahsh6M,860
|
|
130
132
|
cornflow/shared/utils_tables.py,sha256=JnyaQ-5d1alj230nir-6elC2i0QX-u-_32SAs2eDtC0,3298
|
131
133
|
cornflow/shared/validators.py,sha256=Iy2jaGzS9ojqlTE_-vKH4oQKD89GN5C0EPEZMg6UZgc,4761
|
132
134
|
cornflow/shared/authentication/__init__.py,sha256=cJIChk5X6hbA_16usEvfHr8g4JDFI6WKo0GPVOOiYHA,137
|
133
|
-
cornflow/shared/authentication/auth.py,sha256=
|
134
|
-
cornflow/shared/authentication/decorators.py,sha256=
|
135
|
+
cornflow/shared/authentication/auth.py,sha256=l1vgZWxbPC3jlOqnJQPcwP3L9mP3SrS_HYJqLLbKEzo,18793
|
136
|
+
cornflow/shared/authentication/decorators.py,sha256=DBq0q0trcMIiJp5gY-h8nOMuzci6Sol4Retv1Msb9dY,2624
|
135
137
|
cornflow/shared/authentication/ldap.py,sha256=QfdC2X_ZMcIJabKC5pYWDGMhS5pIOJJvdZXuuiruq-M,4853
|
136
138
|
cornflow/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
137
|
-
cornflow/tests/
|
139
|
+
cornflow/tests/base_test_execution.py,sha256=BhoN2mavMVtI1dGdWyihX2nq44aDeWxDBqWdzMDq-BI,27709
|
140
|
+
cornflow/tests/const.py,sha256=yXCvk1uK8srKQf1hwB_Daz-6WGLql7roRxUtNg4tPWk,2710
|
138
141
|
cornflow/tests/custom_liveServer.py,sha256=I_0YNrcKIwVmRov3zCQMWwcCWkMe5V246Hpa4gS8AZE,3079
|
139
142
|
cornflow/tests/custom_test_case.py,sha256=tu8QS_TMdmoPfKQzr9eHSYNC_7T4cmrOjGxxufZ7U04,37797
|
140
143
|
cornflow/tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
141
|
-
cornflow/tests/integration/test_commands.py,sha256=
|
142
|
-
cornflow/tests/integration/test_cornflowclient.py,sha256=
|
144
|
+
cornflow/tests/integration/test_commands.py,sha256=A_OZgcn1UwRSrWmQHJI2iRNuRcWCRFp9j0KURO0jGvY,705
|
145
|
+
cornflow/tests/integration/test_cornflowclient.py,sha256=mwtlzn4MSjQNRhwV3yzhco3DHCS5BVFimTfmB8lB2Cc,20964
|
143
146
|
cornflow/tests/ldap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
144
147
|
cornflow/tests/ldap/test_ldap_authentication.py,sha256=6Gu1WkF7MQmcV_10IJkpo2qEloZZ9zjpV18ANDD0HRw,4286
|
145
148
|
cornflow/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -147,33 +150,33 @@ cornflow/tests/unit/test_actions.py,sha256=plgnzBJnDiZRdVxt1sNJNL2KbW5ijPZ6MHdIU
|
|
147
150
|
cornflow/tests/unit/test_alarms.py,sha256=P1QsbT09HuRWCDOALsvPFux9UJg2PgWmGX6pb2hmTXA,4529
|
148
151
|
cornflow/tests/unit/test_apiview.py,sha256=F40cO4WSm4vKz7PJww2eK1T601lhmf7iQbewx95rwuc,7885
|
149
152
|
cornflow/tests/unit/test_application.py,sha256=ZVmTQDUOkPRxHqt6mWU9G_lQ3jJNMJR0cx7IkLMFGrU,1715
|
150
|
-
cornflow/tests/unit/test_cases.py,sha256=
|
153
|
+
cornflow/tests/unit/test_cases.py,sha256=x7ivL46gk1rYtLZrPqNnY9uD2zjQiTItX_h5K2CVbzc,37707
|
151
154
|
cornflow/tests/unit/test_cli.py,sha256=18tjj2sNmRsgx6OK8Z-e96iLgsUz2hbJp6UZJfF-PAE,18887
|
152
|
-
cornflow/tests/unit/test_commands.py,sha256=
|
153
|
-
cornflow/tests/unit/test_dags.py,sha256=
|
155
|
+
cornflow/tests/unit/test_commands.py,sha256=KtYsoQnuvsKt_bpVK4LFFIuWeKkf-ew3ttMzcsLn3-E,14772
|
156
|
+
cornflow/tests/unit/test_dags.py,sha256=ifd7-tLgQlQ8SbQDUFLMyAKd0Ug5c8OFD9Al3bHTuDw,13395
|
154
157
|
cornflow/tests/unit/test_data_checks.py,sha256=6s50d1iuRTUcAYn14oEcRS39ZZ6E9ussU4YpkpYhtC4,8612
|
155
|
-
cornflow/tests/unit/test_example_data.py,sha256=
|
156
|
-
cornflow/tests/unit/test_executions.py,sha256=
|
158
|
+
cornflow/tests/unit/test_example_data.py,sha256=1vi9M3vHknh6R3JdFcUHoaFXurbQXltl5AJYm2M18FI,4132
|
159
|
+
cornflow/tests/unit/test_executions.py,sha256=gTWHY2ZBhq7t1ziV2siu6od7CYgld2JpMgCAKUAHmHw,2570
|
157
160
|
cornflow/tests/unit/test_external_role_creation.py,sha256=1YZ2Scj6HeoFxFO-KZr1M7pjyWqzjA77gAICSpiF-2g,31310
|
158
161
|
cornflow/tests/unit/test_generate_from_schema.py,sha256=L1EdnASbDJ8SjrX1V4WnUKKwV0sRTwVnNYnxSpyeSeQ,15376
|
159
162
|
cornflow/tests/unit/test_get_resources.py,sha256=f4SSYjA6W48vQJw9MMqM-srvskzHFTnxnd5-IuUamGo,4231
|
160
|
-
cornflow/tests/unit/test_health.py,sha256=
|
163
|
+
cornflow/tests/unit/test_health.py,sha256=b1hlY8zMejNNiB9FjRKmNHEH8IcRv65mh1PgyBqAqow,4440
|
161
164
|
cornflow/tests/unit/test_instances.py,sha256=Mf9jijQOcDE3ylPfMTnVRocRegcugEdCnoMCqSmKKqQ,11083
|
162
165
|
cornflow/tests/unit/test_instances_file.py,sha256=sbodxnuoT7n7jdELz-wpVXWt76E5UzUrQYyVpvnfbco,1986
|
163
166
|
cornflow/tests/unit/test_licenses.py,sha256=oj1YdqdxzEdRtxyQiFmRyXyvLzNbl6BeiGCCZH_Y42c,1534
|
164
167
|
cornflow/tests/unit/test_log_in.py,sha256=JfAy1GWEL145njCVEf00Eb_MpAzEiyXFwI3H_8prOrw,19289
|
165
|
-
cornflow/tests/unit/test_main_alarms.py,sha256=
|
168
|
+
cornflow/tests/unit/test_main_alarms.py,sha256=A0t9au6R-vrMmE-rw1BurwXX9gcVltDBLimwmBVdEHE,2047
|
166
169
|
cornflow/tests/unit/test_permissions.py,sha256=Jd-4PtqBcWGrSZAuTlJD82qE65D9ZtGWBM6sJY1f_yA,8782
|
167
|
-
cornflow/tests/unit/test_roles.py,sha256=
|
168
|
-
cornflow/tests/unit/test_schema_from_models.py,sha256=
|
169
|
-
cornflow/tests/unit/test_schemas.py,sha256=
|
170
|
+
cornflow/tests/unit/test_roles.py,sha256=mgRBolVEIIPWBRq2Deu4W8Y50kNATcSe67mZJc-UuAg,18172
|
171
|
+
cornflow/tests/unit/test_schema_from_models.py,sha256=P6d-vNj4iifxogCipdoK8tk1r8yNx1gnHmRnblvzSZ0,4426
|
172
|
+
cornflow/tests/unit/test_schemas.py,sha256=Ev5QqT6Im87nE-1xL7QInsjzzglVlSMUd9pPYaWPdUs,7487
|
170
173
|
cornflow/tests/unit/test_sign_up.py,sha256=6LSlME3tB8t9jtvJD-Lut3ia9UVHzqqET_3EQMcZQ7s,9486
|
171
174
|
cornflow/tests/unit/test_tables.py,sha256=SW_K8LRLwR1nB0uH8CPQCjeN8Gei-TasAgkOinnAjLk,8969
|
172
175
|
cornflow/tests/unit/test_token.py,sha256=PZ11b46UCQpCESsRiAPhpgWkGAsAwKCVNxVQai_kxXM,4199
|
173
176
|
cornflow/tests/unit/test_users.py,sha256=N5tcF5nSncD0F_ZlBxGuS87p6kNS4hUzRLr3_AcnK-o,22802
|
174
|
-
cornflow/tests/unit/tools.py,sha256=
|
175
|
-
cornflow-1.
|
176
|
-
cornflow-1.
|
177
|
-
cornflow-1.
|
178
|
-
cornflow-1.
|
179
|
-
cornflow-1.
|
177
|
+
cornflow/tests/unit/tools.py,sha256=7tOV6HKsmPUr07Qbh-kMPirrVuLj0E2oR89owlwX5wo,3781
|
178
|
+
cornflow-1.3.0rc1.dist-info/METADATA,sha256=-B_9UR_ttbBAxQhBxVhq6ZEoiMUa7XFWHi25Oq6sLgQ,9533
|
179
|
+
cornflow-1.3.0rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
180
|
+
cornflow-1.3.0rc1.dist-info/entry_points.txt,sha256=q9cPKAFBsmHkERCqQ2JcOTM-tVBLHTl-DGxwCXowAWM,46
|
181
|
+
cornflow-1.3.0rc1.dist-info/top_level.txt,sha256=Qj9kLFJW1PLb-ZV2s_aCkQ-Wi5W6KC6fFR-LTBrx-rU,24
|
182
|
+
cornflow-1.3.0rc1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|