Esempio n. 1
0
    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