def create_fsm(self, target, ssid): """ Creates a FSM for SQLstream instance state/transitions. The entry for its SSID must be defined in the target's sqlstreams dict. """ fsm = AsyncFSM(SSStates.S_INIT, None) # extract SSID from kwargs, set up vars needed for install/uninstall sdpport = target.sqlstreams[ssid]['sdpport'] hsqldbport = target.sqlstreams[ssid]['hsqldbport'] dirname = target.sqlstreams[ssid]['dirname'] seismic_jar = resource_filename(__name__, "data/ucsd-seismic.jar") installerbin = resource_filename(__name__, "data/install_sqlstream.sh") log.debug(installerbin) # 1. INIT <-> INSTALLED proc_installer = EnvOSProcess( binary=installerbin, spawnargs=[sdpport, hsqldbport, seismic_jar, dirname]) forward_task = proc_installer.spawn backward_task = lambda: shutil.rmtree(dirname) fsm.add_transition(SSStates.E_INSTALL, SSStates.S_INIT, forward_task, SSStates.S_INSTALLED) fsm.add_transition(SSStates.E_UNINSTALL, SSStates.S_INSTALLED, backward_task, SSStates.S_INIT) # 2. INSTALLED <-> READY proc_server = OSSSServerProcess( binroot=dirname, extraenv={"JAVA_HOME": "/usr/local/JDK1.6"}) proc_server.addCallback(target._sqlstream_ended, sqlstreamid=ssid) proc_server.addReadyCallback(target._sqlstream_started, sqlstreamid=ssid) target.sqlstreams[ssid][ '_serverproc'] = proc_server # store it here, it still runs forward_task = proc_server.spawn backward_task = proc_server.close fsm.add_transition(SSStates.E_RUNDAEMON, SSStates.S_INSTALLED, forward_task, SSStates.S_READY) fsm.add_transition(SSStates.E_STOPDAEMON, SSStates.S_READY, backward_task, SSStates.S_INSTALLED) # 3. READY <-> DEFINED proc_loaddefs = OSSSClientProcess( spawnargs=[sdpport], sqlcommands=target.sqlstreams[ssid]['_sql_defs'], binroot=dirname, extraenv={"JAVA_HOME": "/usr/local/JDK1.6"}) forward_task = proc_loaddefs.spawn # 18 Jan 2011 - Disabled due to lack of ability to turn consumer off - will freeze sqllineClient #proc_unloaddefs = OSSSClientProcess(spawnargs=[sdpport], sqlcommands="DROP SCHEMA UCSD CASCADE;", binroot=dirname, extraenv={"JAVA_HOME": "/usr/local/JDK1.6"}) #backward_task = proc_unloaddefs.spawn backward_task = lambda: False # can't do pass here? fsm.add_transition(SSStates.E_LOADDEFS, SSStates.S_READY, forward_task, SSStates.S_DEFINED) fsm.add_transition(SSStates.E_UNLOADDEFS, SSStates.S_DEFINED, backward_task, SSStates.S_READY) # 4. DEFINED <-> RUNNING proc_pumpson = OSSSClientProcess( spawnargs=[sdpport], sqlcommands=target._get_sql_pumps_on(), binroot=dirname, extraenv={"JAVA_HOME": "/usr/local/JDK1.6"}) forward_task = proc_pumpson.spawn proc_pumpsoff = OSSSClientProcess( spawnargs=[sdpport], sqlcommands=target._get_sql_pumps_off(), binroot=dirname, extraenv={"JAVA_HOME": "/usr/local/JDK1.6"}) backward_task = proc_pumpsoff.spawn fsm.add_transition(SSStates.E_PUMPSON, SSStates.S_DEFINED, forward_task, SSStates.S_RUNNING) fsm.add_transition(SSStates.E_PUMPSOFF, SSStates.S_RUNNING, backward_task, SSStates.S_DEFINED) return fsm