1- import sys
1+ import json
22from collections import Iterable , Sized , Mapping
33import os
4- import platform
54import re
65import shutil
76from datetime import datetime
1110from octoprint_mrbeam .software_update_information import BEAMOS_LEGACY_DATE
1211from octoprint_mrbeam .mrb_logger import mrb_logger
1312from octoprint_mrbeam .util .cmd_exec import exec_cmd , exec_cmd_output
14- from octoprint_mrbeam .util import logExceptions , dict_get
13+ from octoprint_mrbeam .util import logExceptions
1514from octoprint_mrbeam .printing .profile import laserCutterProfileManager
1615from octoprint_mrbeam .printing .comm_acc2 import MachineCom
1716from octoprint_mrbeam .__version import __version__
1817from octoprint_mrbeam .materials import materials
18+ from octoprint_mrbeam .migration import (
19+ MIGRATION_STATE ,
20+ MigrationBaseClass ,
21+ list_of_migrations ,
22+ )
1923
2024
2125def migrate (plugin ):
@@ -70,6 +74,7 @@ def __init__(self, plugin):
7074 self .plugin ._settings .get (["dev" , "suppress_migrations" ]) or IS_X86
7175 )
7276 beamos_tier , self .beamos_date = self .plugin ._device_info .get_beamos_version ()
77+ self .beamos_version = self .plugin ._device_info .get_beamos_version_number ()
7378
7479 def run (self ):
7580 try :
@@ -249,6 +254,7 @@ def run(self):
249254 equal_ok = False ,
250255 ):
251256 self .fix_octoprint_prerelease_setting ()
257+
252258 # migrations end
253259
254260 self ._logger .info (
@@ -262,14 +268,86 @@ def run(self):
262268 "No migration done because 'suppress_migrations' is set to true in settings."
263269 )
264270 else :
265- self ._logger .debug ( " No migration required." )
271+ self ._logger .info ( "old migration - No migration required." )
266272
273+ self ._run_migration ()
267274 self .save_current_version ()
268275 except MigrationException as e :
269276 self ._logger .exception ("Error while migration: {}" .format (e ))
270277 except Exception as e :
271278 self ._logger .exception ("Unhandled exception during migration: {}" .format (e ))
272279
280+ def _run_migration (self ):
281+ """
282+ run the new migrations
283+ @return:
284+ """
285+ self ._logger .debug ("beamos_version: {}" .format (self .beamos_version ))
286+
287+ list_of_migrations_obj_available_to_run = [
288+ MigrationBaseClass .return_obj (migration , self .plugin )
289+ for migration in list_of_migrations
290+ if migration .shouldrun (migration , self .beamos_version )
291+ ]
292+ self ._logger .debug (list_of_migrations_obj_available_to_run )
293+
294+ if not len (list_of_migrations_obj_available_to_run ):
295+ self ._logger .info ("new migration - no migration needed" )
296+ return
297+
298+ migrations_json_file_path = os .path .join (
299+ self .plugin ._settings .getBaseFolder ("base" ), "migrations.json"
300+ )
301+
302+ # if file is not there create it
303+ if not os .path .exists (migrations_json_file_path ):
304+ self ._logger .info ("create " + migrations_json_file_path + " file" )
305+ with open (migrations_json_file_path , "w" ) as f :
306+ json .dump ({}, f )
307+
308+ try :
309+ with open (migrations_json_file_path , "r" ) as f :
310+ try :
311+ migration_executed = json .load (f )
312+ except ValueError :
313+ raise MigrationException (
314+ "couldn't read migrations json file content filepath:"
315+ + migrations_json_file_path
316+ )
317+
318+ list_of_migrations_to_run = list (
319+ list_of_migrations_obj_available_to_run
320+ )
321+ for migration in list_of_migrations_obj_available_to_run :
322+ if migration .id in migration_executed :
323+ if migration_executed [migration .id ]:
324+ list_of_migrations_to_run .remove (migration )
325+ else :
326+ # migration failed, should stay in execution queue and the following too
327+ break
328+
329+ if not len (list_of_migrations_to_run ):
330+ self ._logger .info ("new migration - all migrations already done" )
331+ return
332+
333+ for migration in list_of_migrations_to_run :
334+ migration .run ()
335+
336+ # if migration sucessfull append to executed successfull
337+ if migration .state == MIGRATION_STATE .migration_done :
338+ migration_executed [migration .id ] = True
339+ else :
340+ # mark migration as failed and skipp the following ones
341+ migration_executed [migration .id ] = False
342+ break
343+
344+ with open (migrations_json_file_path , "w" ) as f :
345+ f .write (json .dumps (migration_executed ))
346+ except IOError :
347+ self ._logger .error ("migration execution file IO error" )
348+ except MigrationException as e :
349+ self ._logger .exception ("error during migration {}" .format (e ))
350+
273351 def is_migration_required (self ):
274352 self ._logger .debug (
275353 "beomosdate %s version %s" ,
0 commit comments