dagster-cloud 1.11.6__py3-none-any.whl → 1.11.8__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.
@@ -20,6 +20,7 @@ from dagster._core.instance.config import config_field_for_configurable_class
20
20
  from dagster._core.instance.ref import InstanceRef, configurable_class_data
21
21
  from dagster._core.launcher import DefaultRunLauncher, RunLauncher
22
22
  from dagster._core.storage.dagster_run import DagsterRun
23
+ from dagster._core.storage.defs_state.base import DefsStateStorage
23
24
  from dagster._serdes import ConfigurableClassData
24
25
  from dagster_cloud_cli.core.graphql_client import (
25
26
  create_agent_graphql_client,
@@ -64,6 +65,11 @@ class DagsterCloudInstance(DagsterInstance):
64
65
  "run_retries.retry_on_asset_or_op_failure is a deployment setting and can only be accessed by a DeploymentScopedHostInstance"
65
66
  )
66
67
 
68
+ @property
69
+ def defs_state_storage(self) -> Optional[DefsStateStorage]:
70
+ # only DeploymentScopedHostInstance / DagsterCloudAgentInstance have a defs state storage
71
+ return None
72
+
67
73
 
68
74
  class DagsterCloudAgentInstance(DagsterCloudInstance):
69
75
  def __init__(
@@ -144,6 +150,17 @@ class DagsterCloudAgentInstance(DagsterCloudInstance):
144
150
 
145
151
  self._instance_uuid = str(uuid.uuid4())
146
152
 
153
+ @property
154
+ def defs_state_storage(self) -> Optional[DefsStateStorage]:
155
+ # temporary hack to avoid cases where the default BlobStorageStateStorage is used
156
+ from dagster_cloud.storage.defs_state.storage import GraphQLDefsStateStorage
157
+
158
+ return (
159
+ self._defs_state_storage
160
+ if isinstance(self._defs_state_storage, GraphQLDefsStateStorage)
161
+ else None
162
+ )
163
+
147
164
  def _get_processed_config(
148
165
  self, name: str, config: Optional[dict[str, Any]], config_type: dict[str, Any]
149
166
  ):
@@ -578,6 +595,10 @@ instance_class:
578
595
  "dagster_cloud.secrets", "DagsterCloudSecretsLoader", empty_yaml
579
596
  )
580
597
 
598
+ defaults["defs_state_storage"] = ConfigurableClassData( # pyright: ignore[reportIndexIssue]
599
+ "dagster_cloud.storage.defs_state", "GraphQLDefsStateStorage", empty_yaml
600
+ )
601
+
581
602
  return defaults
582
603
 
583
604
  def dispose(self) -> None:
@@ -0,0 +1 @@
1
+ from .storage import GraphQLDefsStateStorage as GraphQLDefsStateStorage
@@ -0,0 +1,15 @@
1
+ GET_LATEST_DEFS_STATE_INFO_QUERY = """
2
+ query getLatestDefsStateInfo {
3
+ latestDefsStateInfo
4
+ }
5
+ """
6
+
7
+ SET_LATEST_VERSION_MUTATION = """
8
+ mutation setLatestDefsStateVersion($key: String!, $version: String!) {
9
+ defsState {
10
+ setLatestDefsStateVersion(key: $key, version: $version) {
11
+ ok
12
+ }
13
+ }
14
+ }
15
+ """
@@ -0,0 +1,90 @@
1
+ from pathlib import Path
2
+ from typing import TYPE_CHECKING, Any, Optional
3
+
4
+ import dagster._check as check
5
+ from dagster._core.storage.defs_state.base import DefsStateStorage
6
+ from dagster._serdes import ConfigurableClass, ConfigurableClassData
7
+ from dagster_cloud_cli.core.artifacts import download_artifact, upload_artifact
8
+ from dagster_shared.serdes import deserialize_value
9
+ from dagster_shared.serdes.objects import DefsStateInfo
10
+ from typing_extensions import Self
11
+
12
+ from dagster_cloud.instance import DagsterCloudInstanceScope
13
+
14
+ from .queries import GET_LATEST_DEFS_STATE_INFO_QUERY, SET_LATEST_VERSION_MUTATION
15
+
16
+ if TYPE_CHECKING:
17
+ from dagster_cloud.instance import DagsterCloudAgentInstance # noqa: F401
18
+
19
+
20
+ class GraphQLDefsStateStorage(DefsStateStorage["DagsterCloudAgentInstance"], ConfigurableClass):
21
+ def __init__(
22
+ self, inst_data: Optional[ConfigurableClassData] = None, override_graphql_client=None
23
+ ):
24
+ """Initialize this class directly only for test (using `override_graphql_client`).
25
+ Use the ConfigurableClass machinery to init from instance yaml.
26
+ """
27
+ self._inst_data = check.opt_inst_param(inst_data, "inst_data", ConfigurableClassData)
28
+ self._override_graphql_client = override_graphql_client
29
+
30
+ @property
31
+ def inst_data(self):
32
+ return self._inst_data
33
+
34
+ @classmethod
35
+ def config_type(cls):
36
+ return {}
37
+
38
+ @classmethod
39
+ def from_config_value(cls, inst_data: ConfigurableClassData, config_value: Any) -> Self:
40
+ return cls(inst_data=inst_data)
41
+
42
+ @property
43
+ def _graphql_client(self):
44
+ return (
45
+ self._override_graphql_client
46
+ if self._override_graphql_client
47
+ else self._instance.graphql_client # pyright: ignore[reportAttributeAccessIssue]
48
+ )
49
+
50
+ @property
51
+ def _url(self) -> str:
52
+ return f"{self._instance.dagster_cloud_url}"
53
+
54
+ def _execute_query(self, query, variables=None, idempotent_mutation=False):
55
+ return self._graphql_client.execute(
56
+ query, variable_values=variables, idempotent_mutation=idempotent_mutation
57
+ )
58
+
59
+ def _get_artifact_key(self, key: str, version: str) -> str:
60
+ return f"__state__/{key}/{version}"
61
+
62
+ def download_state_to_path(self, key: str, version: str, path: Path) -> None:
63
+ download_artifact(
64
+ url=self._url,
65
+ scope=DagsterCloudInstanceScope.DEPLOYMENT,
66
+ api_token=check.not_none(self._instance.dagster_cloud_agent_token),
67
+ key=self._get_artifact_key(key, version),
68
+ path=path,
69
+ )
70
+
71
+ def upload_state_from_path(self, key: str, version: str, path: Path) -> None:
72
+ upload_artifact(
73
+ url=self._url,
74
+ scope=DagsterCloudInstanceScope.DEPLOYMENT,
75
+ api_token=check.not_none(self._instance.dagster_cloud_agent_token),
76
+ key=self._get_artifact_key(key, version),
77
+ path=path,
78
+ )
79
+ self.set_latest_version(key, version)
80
+
81
+ def get_latest_defs_state_info(self) -> Optional[DefsStateInfo]:
82
+ res = self._execute_query(GET_LATEST_DEFS_STATE_INFO_QUERY)
83
+ result = res["data"]["latestDefsStateInfo"]
84
+ if result is not None:
85
+ return deserialize_value(result, DefsStateInfo)
86
+ else:
87
+ return None
88
+
89
+ def set_latest_version(self, key: str, version: str) -> None:
90
+ self._execute_query(SET_LATEST_VERSION_MUTATION, variables={"key": key, "version": version})
dagster_cloud/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.11.6"
1
+ __version__ = "1.11.8"
@@ -276,6 +276,11 @@ CONFIG_SCHEMA_FIELDS = {
276
276
  is_required=False,
277
277
  description="Locations that specify an agent queue will only have their requests handled by agents configured to read from a matching queue. By default, requests are placed on a default queue that's handled by all agents.",
278
278
  ),
279
+ "defs_state_info": Field(
280
+ config=Map(str, Shape(fields={"version": str, "create_timestamp": float})),
281
+ is_required=False,
282
+ description="Defs state info for the code location.",
283
+ ),
279
284
  }
280
285
 
281
286
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster-cloud
3
- Version: 1.11.6
3
+ Version: 1.11.8
4
4
  Author-email: Elementl <support@elementl.com>
5
5
  License: Apache-2.0
6
6
  Project-URL: Homepage, https://dagster.io/cloud
@@ -28,9 +28,9 @@ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
28
28
  Classifier: Operating System :: OS Independent
29
29
  Requires-Python: <3.14,>=3.9
30
30
  Description-Content-Type: text/markdown
31
- Requires-Dist: dagster==1.11.6
32
- Requires-Dist: dagster-shared==1.11.6
33
- Requires-Dist: dagster-cloud-cli==1.11.6
31
+ Requires-Dist: dagster==1.11.8
32
+ Requires-Dist: dagster-shared==1.11.8
33
+ Requires-Dist: dagster-cloud-cli==1.11.8
34
34
  Requires-Dist: opentelemetry-api<2,>=1.27.0
35
35
  Requires-Dist: opentelemetry-sdk<2,>=1.27.0
36
36
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.27.0
@@ -65,12 +65,12 @@ Provides-Extra: insights
65
65
  Requires-Dist: pyarrow; extra == "insights"
66
66
  Provides-Extra: docker
67
67
  Requires-Dist: docker; extra == "docker"
68
- Requires-Dist: dagster-docker==0.27.6; extra == "docker"
68
+ Requires-Dist: dagster-docker==0.27.8; extra == "docker"
69
69
  Provides-Extra: kubernetes
70
70
  Requires-Dist: kubernetes; extra == "kubernetes"
71
- Requires-Dist: dagster-k8s==0.27.6; extra == "kubernetes"
71
+ Requires-Dist: dagster-k8s==0.27.8; extra == "kubernetes"
72
72
  Provides-Extra: ecs
73
- Requires-Dist: dagster-aws==0.27.6; extra == "ecs"
73
+ Requires-Dist: dagster-aws==0.27.8; extra == "ecs"
74
74
  Requires-Dist: boto3; extra == "ecs"
75
75
  Provides-Extra: sandbox
76
76
  Requires-Dist: supervisor; extra == "sandbox"
@@ -1,7 +1,7 @@
1
1
  dagster_cloud/__init__.py,sha256=q3UY5eTfCSqZrr35mmn1b1B_AD1VbfR4Alj8cZ49Xg4,316
2
2
  dagster_cloud/constants.py,sha256=CPAqXJ99SWGMviksdIA2A9894FEvHChNk8UcP4TluYM,455
3
3
  dagster_cloud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- dagster_cloud/version.py,sha256=KQSZqBAP-Pzd26mHXgNrIiDBXJRYDGiUXrNOGzIbFxs,23
4
+ dagster_cloud/version.py,sha256=vZhy1cF0OZEZHiWDrJmoiOSfcjoeLvRH3BnE8L9ET5A,23
5
5
  dagster_cloud/agent/__init__.py,sha256=_erVyIrxuHUiyNerwX8vNZcKZN8NAloTEkPq8vPZ3MI,811
6
6
  dagster_cloud/agent/dagster_cloud_agent.py,sha256=C72rumzRFFX41L2y7j-pJFrTAnvW60ZiS_AQRTUjExg,57013
7
7
  dagster_cloud/agent/queries.py,sha256=iI84GQ1Zxt5ryo6M1ELIaIae-gwUY14QPPMUeiFK97o,1837
@@ -46,7 +46,7 @@ dagster_cloud/execution/cloud_run_launcher/process.py,sha256=eYxvzcaJbqYKjHcXMUU
46
46
  dagster_cloud/execution/monitoring/__init__.py,sha256=2_o2UjeEPvfSpnOb0zky3ZQs-G9VHABAXzjvfMnAh8A,17782
47
47
  dagster_cloud/execution/utils/__init__.py,sha256=EfU-tK5-ScZYLF_zmWqUgIrmLsb9DDHWFN-CSg3BSXY,254
48
48
  dagster_cloud/execution/utils/process.py,sha256=Qz6Vp4d2siT7z_la7n1zybJLXfRG3hvTu9ePFJA4TA0,883
49
- dagster_cloud/instance/__init__.py,sha256=hP0GBUTl_uMhSoUHi0ZXpYV9VJXREvpTbMItS8-f_FU,25874
49
+ dagster_cloud/instance/__init__.py,sha256=9BgD7WSrsx9HbSCLdQ-cwq-kZp7dLrRlGFTRbmhEfBw,26754
50
50
  dagster_cloud/instrumentation/__init__.py,sha256=OKaT4qkwQNmCFdKveVrgB7JIo5sZD1F1rutQKdozK_4,886
51
51
  dagster_cloud/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  dagster_cloud/metadata/source_code.py,sha256=yCUfD6V-wR2s4AUrmVpX_Dd7Gln7SYbtpuEpAH71J1I,5952
@@ -92,6 +92,9 @@ dagster_cloud/storage/client.py,sha256=jsqlQehNImOygYEAq0NoEVlbCn5EbIS0VZJabuVtx
92
92
  dagster_cloud/storage/tags.py,sha256=YeWSWgpguqvpndFGMM0W7gORn0F8P3CDcanElE7n2Vo,2414
93
93
  dagster_cloud/storage/compute_logs/__init__.py,sha256=6O5IqKYrNZ6Yz0cataEa2_8u6kYAIP6PXOoeqh5jvjo,82
94
94
  dagster_cloud/storage/compute_logs/compute_log_manager.py,sha256=tGwHou-Qsa25XMwX6ULLE18PTjZiN9Pqx7bRs6Oym3Q,4878
95
+ dagster_cloud/storage/defs_state/__init__.py,sha256=MCt72laA0K6t7dtZfqxlS9I7MYtFzI6lTR2NN40A9e8,72
96
+ dagster_cloud/storage/defs_state/queries.py,sha256=UICxqqWH1gCpE_YR7TedxanES2gZ_7dR00y6KR8HWQA,365
97
+ dagster_cloud/storage/defs_state/storage.py,sha256=61dQ0xOCPGqd3LBkl2JrQrNHH2x2pU1zWqd-OD8UoKM,3474
95
98
  dagster_cloud/storage/event_logs/__init__.py,sha256=N45uxmVOvMtOSYJFktLE32sJ6Ju9EFcwMH4b8L2DDFk,70
96
99
  dagster_cloud/storage/event_logs/queries.py,sha256=sgkHhHX-0Vr9WukcRjbuGSH8vjC9razSNnwqXBrihX8,19924
97
100
  dagster_cloud/storage/event_logs/storage.py,sha256=bu3GOrPu_RkCr29xic78-rRfI4h_ZTMOVZGWQj8jtSc,56438
@@ -106,7 +109,7 @@ dagster_cloud/util/__init__.py,sha256=-rLWHQVwWr0FHyz5dDA-Ia2BRDKJvUQDm9CX3D3mw2
106
109
  dagster_cloud/util/container_resources.py,sha256=qkFiULrhvqSB4iLlL30bQpO_XjXrm5lNfMx8iFUYiR8,4693
107
110
  dagster_cloud/util/errors.py,sha256=EazIylrZJRbPkpG6SIMqTzXY3fSKBS1pck59wXCrNZE,1638
108
111
  dagster_cloud/workspace/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- dagster_cloud/workspace/config_schema/__init__.py,sha256=tuOI2oosxtQk0xN70B6BD6zsIkViO24U4IF84nKn8To,12088
112
+ dagster_cloud/workspace/config_schema/__init__.py,sha256=mAAkcMoy2zYb2dvvngZeq9yTGOp_eBacLJT0zwUd328,12298
110
113
  dagster_cloud/workspace/config_schema/docker.py,sha256=Xs7FDBVpIOMlWcKXrVWX_lSDgf9qpc9UpYcps1IdQDQ,967
111
114
  dagster_cloud/workspace/config_schema/ecs.py,sha256=NKB08hsYlowORvBHCrTqmKVbF67q1XDb-40s1phI5DE,6575
112
115
  dagster_cloud/workspace/config_schema/kubernetes.py,sha256=JIdZ5hX06hAw1lGT-5AcwZjfoKMnMj3PKjaQ9GDUL-U,5286
@@ -125,7 +128,7 @@ dagster_cloud/workspace/user_code_launcher/__init__.py,sha256=6ib1U47aqB4R9BbzJV
125
128
  dagster_cloud/workspace/user_code_launcher/process.py,sha256=VZMfBf4OmXNwP0H0ckUMpqD-glqsBgACXS-xO6Pn6nM,14274
126
129
  dagster_cloud/workspace/user_code_launcher/user_code_launcher.py,sha256=Lep5P9_0i9hOCZ5oN5C_J4ojRvnNtMdj-yHA_ou5h5g,102845
127
130
  dagster_cloud/workspace/user_code_launcher/utils.py,sha256=t8Epee9MrXtRhWL-b_3avXxgMGrjLScUNWtBUUGpMCg,5285
128
- dagster_cloud-1.11.6.dist-info/METADATA,sha256=2vOtXz7w08Lk5FcQW-FVAqtQ88GsR50ykqs9KQCgyCA,6577
129
- dagster_cloud-1.11.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
130
- dagster_cloud-1.11.6.dist-info/top_level.txt,sha256=2hMt-U33jyCgnywNrDB9Ih0EpaVmiO6dFkYcJ7Iwx4I,14
131
- dagster_cloud-1.11.6.dist-info/RECORD,,
131
+ dagster_cloud-1.11.8.dist-info/METADATA,sha256=3DJDeRBoRdaVvyjCYYNYvhOsF4BYEQfJArMHlMF4jwU,6577
132
+ dagster_cloud-1.11.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
133
+ dagster_cloud-1.11.8.dist-info/top_level.txt,sha256=2hMt-U33jyCgnywNrDB9Ih0EpaVmiO6dFkYcJ7Iwx4I,14
134
+ dagster_cloud-1.11.8.dist-info/RECORD,,