コード例 #1
0
    def post(self):
        if self.arguments:
            # Parse each param
            data = self.arguments
            if 'name' not in list(data.keys()) or 'xml' not in list(
                    data.keys()) or 'reload' not in list(data.keys()):
                self.finish(
                    '{"result":"error","description":"Error requests params"}')
            else:
                try:
                    t_name = data['name']
                    t_xml = data['xml']
                    t_reload = data['reload']
                except Exception as e:
                    api_logger.error("Error requests params: " + str(e))
                    self.write(
                        '{"result":"error","description":"Error requests params","debug":"'
                        + str(e) + '"}')

            ## STOP TOPOLOGY

            topo_info = stormuiapi.getTopologySummaryByName(t_name)
            api_logger.debug("Stopping topology " + t_name)
            if topo_info:
                topo_id = topo_info["id"]

                response = stormuiapi.killTopology(topo_id, "0")
                if response["status"] == "KILLED":

                    ## Topology Killed
                    # Change state on mongo
                    moncon = MongoHandler()
                    moncon.mongoStartCon()
                    moncon.updateState(t_name, "hold")

                    for i in range(4):
                        response = stormuiapi.getTopologySummaryByName(t_name)
                        if not response:
                            api_logger.info("Topology " + t_name + " killed.")
                            break
                        time.sleep(5)
                    else:
                        api_logger.debug(
                            "Topology " + t_name +
                            " couldn't be stopped on time. Waiting 5 sec more..."
                        )
                        time.sleep(5)

                    if t_reload == "true":
                        # Use global jar /var/storm/lastjar/file.jar
                        jar_path = options.storm_global_jar_path + options.storm_global_jar_bin
                    else:
                        # Use last jar /var/storm/topologies/{name}/jar/file.jar
                        jar_path = options.storm_topology_data_path + str(
                            t_name
                        ) + options.storm_topology_jar_path + storm_global_jar_bin
                    #
                    # Create xml file
                    # 		/var/storm/{topologyname}/config/
                    try:
                        with open(
                                options.storm_topology_path + str(t_name) +
                                options.storm_topology_config_path +
                                str(t_name) + ".xml", "w") as builder_file:
                            builder_file.write(str(t_xml))
                    except Exception:
                        self.finish(
                            '{"result":"error","description":"Internal error"}'
                        )

                    # Launch topology
                    #	/opt/sinfonier/storm/bin/storm
                    #				jar /var/storm/lastjar/sinfonier-community-1.0.0.jar com.sinfonier.DynamicTopology
                    #							/var/storm/{topologyname}/config/TOPOLOGY_NAME.xml TOPOLOGY_NAME
                    api_logger.debug("Restarting topology " + t_name + ".")
                    cmd_launch = options.storm_binary + " jar " + jar_path + " com.sinfonier.DynamicTopology " + \
                                 options.storm_topology_path + str(
                     t_name) + options.storm_topology_config_path + str(t_name) + ".xml " + str(t_name)
                    cmd = execCommand(cmd_launch)
                    # Get output and error
                    (output, err) = cmd.execute()
                    if err:
                        # Change state on mongo
                        moncon = MongoHandler()
                        moncon.mongoStartCon()
                        moncon.updateStoppedState(t_name)
                        moncon.mongoStopCon()
                        self.finish(
                            '{"result":"error","description":"Error launching topology","detail":"'
                            + str(err) + '"}')
                    else:
                        api_logger.info("Topology " + t_name +
                                        " updated successfully")
                        # Change state on mongo
                        moncon = MongoHandler()
                        moncon.mongoStartCon()
                        moncon.updateRunningState(t_name)
                        moncon.mongoStopCon()
                        self.write(
                            '{"result":"success","description":"Topology restarted."}'
                        )
                else:
                    # TOPOLOGY NOT KILLED
                    self.finish(
                        '{"result":"error","description":"Error stopping topology","detail":"Not killed"}'
                    )
        else:
            self.finish(
                '{"result":"error","description":"Content-Type:application/json missing"}'
            )
コード例 #2
0
    def post(self):
        if self.arguments:
            api_logger.info("HEADERS: " + str(self.request))
            # Parse each param
            data = self.arguments
            if 'name' not in list(data.keys()) or 'xml' not in list(
                    data.keys()) or 'reload' not in list(data.keys()):
                api_logger.error("Error requests params")
                self.finish(
                    '{"result":"error","description":"Error requests params"}')
            else:
                try:
                    t_name = data['name']
                    t_xml = data['xml']
                    api_logger.info("XML: " + str(t_xml))
                    t_reload = data['reload']
                except Exception as e:
                    api_logger.error("Error requests params" + str(e))
                    self.write(
                        '{"result":"error","description":"Error requests params","debug":"'
                        + str(e) + '"}')

            u = Utils()

            try:
                # Create folder (named as topology name) if not exists
                u.checkAndcreate(options.storm_topology_path + str(t_name),
                                 "storm", "storm")
                try:
                    # Create folder /var/storm/topologies/{name}/config if not exists
                    u.checkAndcreate(
                        options.storm_topology_path + str(t_name) +
                        options.storm_topology_config_path, "storm", "storm")
                    try:
                        # Create folder /data/storm/topologies/{name}/jar if not exists
                        u.checkAndcreate(
                            options.storm_topology_data_path + str(t_name) +
                            options.storm_topology_jar_path, "storm", "storm")
                    except Exception as e:
                        api_logger.error("Error on Create folder " +
                                         options.storm_topology_data_path +
                                         str(t_name) +
                                         options.storm_topology_jar_path +
                                         " if not exists. " + str(e))
                except Exception as e:
                    api_logger.error("Error on Create folder " +
                                     options.storm_topology_path +
                                     str(t_name) +
                                     options.storm_topology_config_path +
                                     " if not exists. " + str(e))
            except Exception as e:
                api_logger.error(
                    "Error on Create folder (named as topology name) if not exists. "
                    + str(e))

            if t_reload:
                # Use global jar /var/storm/lastjar/file.jar
                jar_path = options.storm_global_jar_path + options.storm_global_jar_bin
            else:
                # Use last jar /var/storm/topologies/{name}/jar/file.jar
                jar_path = options.storm_topology_data_path + str(
                    t_name
                ) + options.storm_topology_jar_path + storm_global_jar_bin
            #
            # Create xml file
            # 		/var/storm/{topologyname}/config/
            try:
                with open(
                        options.storm_topology_path + str(t_name) +
                        options.storm_topology_config_path + str(t_name) +
                        ".xml", "w") as builder_file:
                    builder_file.write(str(t_xml))
            except Exception as e:
                api_logger.error("Error creating config file. " + str(e))
                self.finish(
                    '{"result":"error","description":"Error creating config file."}'
                )

            # Launch topology
            #	<STORM_BINARY_PATH>/storm
            #				jar /var/storm/lastjar/sinfonier-community-1.0.0.jar com.sinfonier.DynamicTopology
            #							/var/storm/{topologyname}/config/TOPOLOGY_NAME.xml TOPOLOGY_NAME
            cmd_launch = options.storm_binary + " jar " + jar_path + " com.sinfonier.DynamicTopology " + \
                         options.storm_topology_path + str(t_name) + options.storm_topology_config_path + str(t_name) + ".xml " + str(t_name)
            cmd = execCommand(cmd_launch)
            # Get output and error
            (output, err) = cmd.execute()
            if err:
                try:
                    error = err.split("\n")[0].replace('"', '#')
                    error = error.split("\n")[0].replace('`', '#')
                except Exception as e:
                    api_logger.error("Error getting exception from JAVA.")
                    error = "Unkown error"
                api_logger.error(
                    "Error executing launching topology command. " + str(err))
                self.finish(
                    '{"result":"error","description":"Error launching topology", "detail":"'
                    + str(error) + '"}')
            else:
                api_logger.debug("Command output: " + str(output))
                errorDebug = False
                warDebug = False
                dedugStack = ""
                warStack = ""
                fDate = ""
                for line in output.splitlines():
                    if "ERROR" in line:
                        errorDebug = True
                        api_logger.error(
                            "Found ERROR TAG: Error launching topology. " +
                            str(dedugStack))
                        dedugStack = line
                        break
                if errorDebug:
                    self.finish(
                        '{"result":"error","description":"Error launching topology", "detail":"'
                        + str(dedugStack) + '"}')
                else:
                    # Change state on mongo
                    moncon = MongoHandler()
                    moncon.mongoStartCon()
                    moncon.updateRunningState(t_name)
                    moncon.mongoStopCon()
                    self.finish(
                        '{"result":"success","description":"Topology running"}'
                    )
        else:
            api_logger.error("Content-Type:application/json missing")
            self.finish(
                '{"result":"error","description":"Content-Type:application/json missing"}'
            )
コード例 #3
0
    def post(self):
        if self.arguments:
            # Parse each param
            data = self.arguments
            if 'name' not in list(data.keys()):
                self.finish(
                    '{"result":"error","description":"Error requests params"}')
            else:
                t_name = ""
                try:
                    t_name = data['name']
                except Exception as e:
                    api_logger.error("Error requests params: " + str(e))
                    self.write(
                        '{"result":"error","description":"Error requests params","debug":"'
                        + str(e) + '"}')

                ## Get Topology ID

                topo_info = stormuiapi.getTopologySummaryByName(t_name)
                if topo_info:
                    topo_id = topo_info["id"]
                    api_logger.debug("Stopping topology " + t_name)
                    response = stormuiapi.killTopology(topo_id, "0")
                    if response["status"] == "KILLED":

                        # Change state on mongo
                        moncon = MongoHandler()
                        moncon.mongoStartCon()
                        moncon.updateStoppedState(t_name)
                        moncon.mongoStopCon()
                        # Delete worker file
                        try:
                            os.remove(options.storm_topology_path + t_name +
                                      "/worker")
                        except:
                            api_logger.debug(
                                "Error removing worker file of topology " +
                                t_name + ". Continuing...")
                        self.finish(
                            '{"result":"success","description":"Topology stopped"}'
                        )

                    else:
                        api_logger.error("Topology '" + t_name +
                                         "' couldn't be stopped")
                        api_logger.error(json.dumps(response))
                        self.write(
                            '{"result":"error","description":"Topology "' +
                            t_name + '" could not be stopped",'
                            '"debug":""}')

                else:
                    api_logger.error("Topology '" + t_name + "' not found")
                    self.write('{"result":"error","description":"Topology '
                               "+t_name+"
                               ' not found","debug":""}')

        else:
            self.finish(
                '{"result":"error","description":"Content-Type:application/json missing"}'
            )