Migrating the ModelInfo
If you modify the ModelInfo of a model algorithm that's been published before, it is then your responsibility to make sure it is consistent between different versions. To ensure this, you need to write a migration script.
Creating a migration script
poetry run python scripts/make_migration_script.py [SCRIPT NAME]
Let's say the name is foo, this is what would happen:
❯ poetry run python scripts/make_migration_script.py foo
Created: exodus_model_template/migrations/Migration_1646728080972_foo.py
Updated: exodus_model_template/migrations/all_migrations.py
A migration script called exodus_model_template/migrations/Migration_1646728080972_foo.py has been generated.
Implementing the migration script
Suppose your old ModelInfo is defined like this:
class ModelInfo(BaseModel):
foo: str
bar: int
And you want to change it to this:
class ModelInfo(BaseModel):
foo: str
bar: int
baz: str
where baz should be foo concatenated with a stringified bar.
In the migration script, there are mainly two methods: up and down:
class Migration(BaseMigration):
def __init__(self, timestamp: int = 1646728080972, name: str = "foo") -> None:
super().__init__(timestamp, name)
def up(self, collection: Collection) -> None:
# TODO implement this method
pass
def down(self, collection: Collection) -> None:
# TODO implement this method
pass
For up, you want to find all the ModelInfo instances that don't have a field called baz. An examplary implementation might be this:
def up(self, collection: Collection) -> None:
for doc in collection.find({"baz": {"$exists": False}}):
collection.update_one(filter={"_id": doc["_id"]}, update={"$set": {"baz": doc["foo"] + str(doc["bar"])}})
As for down, you do the exact opposite and unset the baz field:
def down(self, collection: Collection) -> None:
for doc in collection.find({"baz": {"$exists": True}}):
collection.update_one(filter={"_id": doc["_id"]}, update={"$unset": {"baz": ""}})
Invoking the migration scripts
It is Exodus main that will be in charge of migrating, however if you want to test your script manually, do this:
curl -X POST "http://{MODEL ALGORITHM IP}/migrate" -d '{"action":"up"}' -H "Content-Type: application/json"
Change "up" to "down" if that's what you want to test.