Fix migration script to include external stores
This commit is contained in:
@@ -721,6 +721,8 @@ class Converter:
|
|||||||
blob_store = self._build_blob_store()
|
blob_store = self._build_blob_store()
|
||||||
in_memory_store = self._build_in_memory_store()
|
in_memory_store = self._build_in_memory_store()
|
||||||
search_store = self._build_search_store()
|
search_store = self._build_search_store()
|
||||||
|
metrics_store = self._build_metrics_store()
|
||||||
|
tracing_store = self._build_tracing_store()
|
||||||
enterprise = self._build_enterprise()
|
enterprise = self._build_enterprise()
|
||||||
system_settings = self._build_system_settings()
|
system_settings = self._build_system_settings()
|
||||||
|
|
||||||
@@ -737,6 +739,10 @@ class Converter:
|
|||||||
out["InMemoryStore"] = in_memory_store
|
out["InMemoryStore"] = in_memory_store
|
||||||
if search_store is not None:
|
if search_store is not None:
|
||||||
out["SearchStore"] = search_store
|
out["SearchStore"] = search_store
|
||||||
|
if metrics_store is not None:
|
||||||
|
out["MetricsStore"] = metrics_store
|
||||||
|
if tracing_store is not None:
|
||||||
|
out["TracingStore"] = tracing_store
|
||||||
if tenants:
|
if tenants:
|
||||||
out["Tenant"] = tenants
|
out["Tenant"] = tenants
|
||||||
if domains:
|
if domains:
|
||||||
@@ -1175,6 +1181,19 @@ class Converter:
|
|||||||
f"(DataStore requires rocksdb/sqlite/foundationdb/postgresql/mysql)"
|
f"(DataStore requires rocksdb/sqlite/foundationdb/postgresql/mysql)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _is_same_kv_store_as_data(self, sub: dict[str, str]) -> bool:
|
||||||
|
data_sid = self._referenced_store_id("storage.data")
|
||||||
|
if data_sid is None:
|
||||||
|
return False
|
||||||
|
data_sub = self._stores().get(data_sid)
|
||||||
|
if data_sub is None:
|
||||||
|
return False
|
||||||
|
if data_sub.get("type", "").strip().lower() != sub.get("type", "").strip().lower():
|
||||||
|
return False
|
||||||
|
data_path = data_sub.get("path", "").strip()
|
||||||
|
sub_path = sub.get("path", "").strip()
|
||||||
|
return bool(data_path) and data_path == sub_path
|
||||||
|
|
||||||
def _build_blob_store(self) -> dict[str, Any] | None:
|
def _build_blob_store(self) -> dict[str, Any] | None:
|
||||||
sid = self._referenced_store_id("storage.blob")
|
sid = self._referenced_store_id("storage.blob")
|
||||||
if sid is None:
|
if sid is None:
|
||||||
@@ -1201,8 +1220,21 @@ class Converter:
|
|||||||
return self._build_postgresql(sub, for_blob=True)
|
return self._build_postgresql(sub, for_blob=True)
|
||||||
if stype == "mysql":
|
if stype == "mysql":
|
||||||
return self._build_mysql(sub, for_blob=True)
|
return self._build_mysql(sub, for_blob=True)
|
||||||
|
if stype in ("rocksdb", "sqlite"):
|
||||||
return {"@type": "Default"}
|
if self._is_same_kv_store_as_data(sub):
|
||||||
|
return {"@type": "Default"}
|
||||||
|
raise ConvertError(
|
||||||
|
f"storage.blob points at store {sid!r} of type {stype!r}, "
|
||||||
|
f"but v0.16 does not support a separate {stype} blob store. "
|
||||||
|
"Consolidate blob data into the data store, or configure a "
|
||||||
|
"filesystem/s3/azure/foundationdb/postgresql/mysql blob "
|
||||||
|
"store and migrate the blobs before running this script."
|
||||||
|
)
|
||||||
|
raise ConvertError(
|
||||||
|
f"storage.blob points at store {sid!r} of unsupported type "
|
||||||
|
f"{stype!r} (BlobStore requires s3/azure/fs/foundationdb/"
|
||||||
|
"postgresql/mysql, or rocksdb/sqlite sharing the data store path)"
|
||||||
|
)
|
||||||
|
|
||||||
def _build_in_memory_store(self) -> dict[str, Any] | None:
|
def _build_in_memory_store(self) -> dict[str, Any] | None:
|
||||||
sid = self._referenced_store_id("storage.lookup")
|
sid = self._referenced_store_id("storage.lookup")
|
||||||
@@ -1249,7 +1281,74 @@ class Converter:
|
|||||||
return self._build_postgresql(sub, for_search=True)
|
return self._build_postgresql(sub, for_search=True)
|
||||||
if stype == "mysql":
|
if stype == "mysql":
|
||||||
return self._build_mysql(sub, for_search=True)
|
return self._build_mysql(sub, for_search=True)
|
||||||
return {"@type": "Default"}
|
if stype in ("rocksdb", "sqlite"):
|
||||||
|
if self._is_same_kv_store_as_data(sub):
|
||||||
|
return {"@type": "Default"}
|
||||||
|
raise ConvertError(
|
||||||
|
f"storage.fts points at store {sid!r} of type {stype!r}, "
|
||||||
|
f"but v0.16 does not support a separate {stype} search "
|
||||||
|
"store. Consolidate the full-text index into the data store, "
|
||||||
|
"or configure an elasticsearch/meilisearch/foundationdb/"
|
||||||
|
"postgresql/mysql search store before running this script."
|
||||||
|
)
|
||||||
|
raise ConvertError(
|
||||||
|
f"storage.fts points at store {sid!r} of unsupported type "
|
||||||
|
f"{stype!r} (SearchStore requires elasticsearch/meilisearch/"
|
||||||
|
"foundationdb/postgresql/mysql, or rocksdb/sqlite sharing the "
|
||||||
|
"data store path)"
|
||||||
|
)
|
||||||
|
|
||||||
|
def _build_history_store(
|
||||||
|
self, store_key: str, enable_key: str, role: str
|
||||||
|
) -> dict[str, Any] | None:
|
||||||
|
enable = parse_bool(self.settings.get(enable_key))
|
||||||
|
sid = self._referenced_store_id(store_key)
|
||||||
|
if enable is False:
|
||||||
|
return {"@type": "Disabled"}
|
||||||
|
if sid is None:
|
||||||
|
if enable is True:
|
||||||
|
return {"@type": "Default"}
|
||||||
|
return None
|
||||||
|
data_sid = self._referenced_store_id("storage.data")
|
||||||
|
if sid == data_sid:
|
||||||
|
return {"@type": "Default"}
|
||||||
|
stores = self._stores()
|
||||||
|
if sid not in stores:
|
||||||
|
raise ConvertError(
|
||||||
|
f"{store_key} = {sid!r} but no store.{sid}.type is defined"
|
||||||
|
)
|
||||||
|
sub = stores[sid]
|
||||||
|
stype = sub.get("type", "").strip().lower()
|
||||||
|
if stype == "foundationdb":
|
||||||
|
return self._build_foundationdb(sub)
|
||||||
|
if stype == "postgresql":
|
||||||
|
return self._build_postgresql(sub)
|
||||||
|
if stype == "mysql":
|
||||||
|
return self._build_mysql(sub)
|
||||||
|
if stype in ("rocksdb", "sqlite"):
|
||||||
|
if self._is_same_kv_store_as_data(sub):
|
||||||
|
return {"@type": "Default"}
|
||||||
|
raise ConvertError(
|
||||||
|
f"{store_key} points at store {sid!r} of type {stype!r}, "
|
||||||
|
f"but v0.16 does not support a separate {stype} {role} "
|
||||||
|
"store. Point this setting at the data store, or configure "
|
||||||
|
"a foundationdb/postgresql/mysql store."
|
||||||
|
)
|
||||||
|
raise ConvertError(
|
||||||
|
f"{store_key} points at store {sid!r} of unsupported type "
|
||||||
|
f"{stype!r} ({role} store requires foundationdb/postgresql/"
|
||||||
|
"mysql, or rocksdb/sqlite sharing the data store path)"
|
||||||
|
)
|
||||||
|
|
||||||
|
def _build_metrics_store(self) -> dict[str, Any] | None:
|
||||||
|
return self._build_history_store(
|
||||||
|
"metrics.history.store", "metrics.history.enable", "metrics"
|
||||||
|
)
|
||||||
|
|
||||||
|
def _build_tracing_store(self) -> dict[str, Any] | None:
|
||||||
|
return self._build_history_store(
|
||||||
|
"tracing.history.store", "tracing.history.enable", "tracing"
|
||||||
|
)
|
||||||
|
|
||||||
def _build_rocksdb(self, sub: dict[str, str]) -> dict[str, Any]:
|
def _build_rocksdb(self, sub: dict[str, str]) -> dict[str, Any]:
|
||||||
path = sub.get("path", "").strip()
|
path = sub.get("path", "").strip()
|
||||||
@@ -1766,6 +1865,8 @@ SINGLETON_ORDER = [
|
|||||||
"BlobStore",
|
"BlobStore",
|
||||||
"InMemoryStore",
|
"InMemoryStore",
|
||||||
"SearchStore",
|
"SearchStore",
|
||||||
|
"MetricsStore",
|
||||||
|
"TracingStore",
|
||||||
]
|
]
|
||||||
|
|
||||||
COLLECTION_ORDER = [
|
COLLECTION_ORDER = [
|
||||||
|
|||||||
Reference in New Issue
Block a user