Example #1
0
  def test2(self):
    """
    In this test we want to make sure that when we run "tether_task_runner.py"
    as our main script everything works as expected. We do this by using subprocess to run it
    in a separate thread.
    """
    from word_count_task import WordCountTask
    from avro.tether import TaskRunner, find_port,HTTPRequestor,inputProtocol, TaskType
    from avro.tether import tether_task_runner
    from avro import io as avio
    import mock_tether_parent
    import subprocess
    import StringIO


    proc=None

    runnerproc=None
    try:
      #launch the server in a separate process
      env=dict()
      env["PYTHONPATH"]=':'.join(sys.path)
      parent_port=find_port()

      pyfile=mock_tether_parent.__file__
      proc=subprocess.Popen(["python", pyfile,"start_server","{0}".format(parent_port)])

      #Possible race condition? when we start tether_task_runner it will call
      # open tries to connect to the subprocess before the subprocess is fully started
      #so we give the subprocess time to start up
      time.sleep(1)


      #start the tether_task_runner in a separate process
      env={"AVRO_TETHER_OUTPUT_PORT":"{0}".format(parent_port)}
      env["PYTHONPATH"]=':'.join(sys.path)

      runnerproc=subprocess.Popen(["python",tether_task_runner.__file__,"word_count_task.WordCountTask"],env=env)

      #possible race condition wait for the process to start
      time.sleep(1)



      print "Mock server started process pid={0}".format(proc.pid)
      #Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
      #so we give the subprocess time to start up
      time.sleep(1)


    except Exception as e:
      raise
    finally:
      #close the process
      if not(runnerproc is None):
        runnerproc.kill()

      if not(proc is None):
        proc.kill()
    def test2(self):
        """
    In this test we want to make sure that when we run "tether_task_runner.py"
    as our main script everything works as expected. We do this by using subprocess to run it
    in a separate thread.
    """
        from word_count_task import WordCountTask
        from avro.tether import TaskRunner, find_port, HTTPRequestor, inputProtocol, TaskType
        from avro.tether import tether_task_runner
        from avro import io as avio
        import mock_tether_parent
        import subprocess
        import StringIO

        proc = None

        runnerproc = None
        try:
            #launch the server in a separate process
            env = dict()
            env["PYTHONPATH"] = ':'.join(sys.path)
            parent_port = find_port()

            pyfile = mock_tether_parent.__file__
            proc = subprocess.Popen(
                ["python", pyfile, "start_server", "{0}".format(parent_port)])

            #Possible race condition? when we start tether_task_runner it will call
            # open tries to connect to the subprocess before the subprocess is fully started
            #so we give the subprocess time to start up
            time.sleep(1)

            #start the tether_task_runner in a separate process
            env = {"AVRO_TETHER_OUTPUT_PORT": "{0}".format(parent_port)}
            env["PYTHONPATH"] = ':'.join(sys.path)

            runnerproc = subprocess.Popen([
                "python", tether_task_runner.__file__,
                "word_count_task.WordCountTask"
            ],
                                          env=env)

            #possible race condition wait for the process to start
            time.sleep(1)

            print "Mock server started process pid={0}".format(proc.pid)
            #Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
            #so we give the subprocess time to start up
            time.sleep(1)

        except Exception as e:
            raise
        finally:
            #close the process
            if not (runnerproc is None):
                runnerproc.kill()

            if not (proc is None):
                proc.kill()
    def start(self, outputport=None, join=True):
        """
    Start the server

    Parameters
    -------------------------------------------------------------------
    outputport - (optional) The port on which the parent process is listening
                 for requests from the task.
               - This will typically be supplied by an environment variable
                 we allow it to be supplied as an argument mainly for debugging
    join       - (optional) If set to fault then we don't issue a join to block
                 until the thread excecuting the server terminates.
                This is mainly for debugging. By setting it to false,
                we can resume execution in this thread so that we can do additional
                testing
    """

        port = find_port()
        address = ("localhost", port)

        def thread_run(task_runner=None):
            task_runner.server = HTTPServer(address,
                                            HTTPHandlerGen(task_runner))
            task_runner.server.allow_reuse_address = True
            task_runner.server.serve_forever()

        # create a separate thread for the http server
        sthread = threading.Thread(target=thread_run,
                                   kwargs={"task_runner": self})
        sthread.start()

        self.sthread = sthread
        # This needs to run in a separat thread b\c serve_forever() blocks
        self.task.open(port, clientPort=outputport)

        # wait for the other thread to finish
        if (join):
            self.task.ready_for_shutdown.wait()
            self.server.shutdown()

            # should we do some kind of check to make sure it exits
            self.log.info("Shutdown the logger")
            # shutdown the logging
            logging.shutdown()
Example #4
0
  def start(self,outputport=None,join=True):
    """
    Start the server

    Parameters
    -------------------------------------------------------------------
    outputport - (optional) The port on which the parent process is listening
                 for requests from the task.
               - This will typically be supplied by an environment variable
                 we allow it to be supplied as an argument mainly for debugging
    join       - (optional) If set to fault then we don't issue a join to block
                 until the thread excecuting the server terminates.
                This is mainly for debugging. By setting it to false,
                we can resume execution in this thread so that we can do additional
                testing
    """

    port=find_port()
    address=("localhost",port)


    def thread_run(task_runner=None):
      task_runner.server = HTTPServer(address, HTTPHandlerGen(task_runner))
      task_runner.server.allow_reuse_address = True
      task_runner.server.serve_forever()

    # create a separate thread for the http server
    sthread=threading.Thread(target=thread_run,kwargs={"task_runner":self})
    sthread.start()

    self.sthread=sthread
    # This needs to run in a separat thread b\c serve_forever() blocks
    self.task.open(port,clientPort=outputport)

    # wait for the other thread to finish
    if (join):
      self.task.ready_for_shutdown.wait()
      self.server.shutdown()

      # should we do some kind of check to make sure it exits
      self.log.info("Shutdown the logger")
      # shutdown the logging
      logging.shutdown()
    def test1(self):
        from word_count_task import WordCountTask
        from avro.tether import TaskRunner, find_port, HTTPRequestor, inputProtocol, TaskType
        from avro import io as avio
        import mock_tether_parent
        import subprocess
        import StringIO
        import logging

        # set the logging level to debug so that debug messages are printed
        logging.basicConfig(level=logging.DEBUG)

        proc = None
        try:
            # launch the server in a separate process
            env = dict()
            env["PYTHONPATH"] = ':'.join(sys.path)
            parent_port = find_port()

            pyfile = mock_tether_parent.__file__
            proc = subprocess.Popen(
                ["python", pyfile, "start_server", "{0}".format(parent_port)])
            input_port = find_port()

            print "Mock server started process pid={0}".format(proc.pid)
            # Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
            # so we give the subprocess time to start up
            time.sleep(1)

            runner = TaskRunner(WordCountTask())

            runner.start(outputport=parent_port, join=False)

            # Test sending various messages to the server and ensuring they are
            # processed correctly
            requestor = HTTPRequestor("localhost",
                                      runner.server.server_address[1],
                                      inputProtocol)

            # TODO: We should validate that open worked by grabbing the STDOUT of the subproces
            # and ensuring that it outputted the correct message.

            # Test the mapper
            requestor.request(
                "configure", {
                    "taskType": TaskType.MAP,
                    "inSchema": str(runner.task.inschema),
                    "outSchema": str(runner.task.midschema)
                })

            # Serialize some data so we can send it to the input function
            datum = "This is a line of text"
            writer = StringIO.StringIO()
            encoder = avio.BinaryEncoder(writer)
            datum_writer = avio.DatumWriter(runner.task.inschema)
            datum_writer.write(datum, encoder)

            writer.seek(0)
            data = writer.read()

            # Call input to simulate calling map
            requestor.request("input", {"data": data, "count": 1})

            #Test the reducer
            requestor.request(
                "configure", {
                    "taskType": TaskType.REDUCE,
                    "inSchema": str(runner.task.midschema),
                    "outSchema": str(runner.task.outschema)
                })

            #Serialize some data so we can send it to the input function
            datum = {"key": "word", "value": 2}
            writer = StringIO.StringIO()
            encoder = avio.BinaryEncoder(writer)
            datum_writer = avio.DatumWriter(runner.task.midschema)
            datum_writer.write(datum, encoder)

            writer.seek(0)
            data = writer.read()

            #Call input to simulate calling reduce
            requestor.request("input", {"data": data, "count": 1})

            requestor.request("complete", {})

            runner.task.ready_for_shutdown.wait()
            runner.server.shutdown()
            #time.sleep(2)
            #runner.server.shutdown()

            sthread = runner.sthread

            #Possible race condition?
            time.sleep(1)

            #make sure the other thread terminated
            self.assertFalse(sthread.isAlive())

            #shutdown the logging
            logging.shutdown()

        except Exception as e:
            raise
        finally:
            #close the process
            if not (proc is None):
                proc.kill()
Example #6
0
    def test1(self):
        """
    Test that the thether_task is working. We run the mock_tether_parent in a separate
    subprocess
    """
        from avro import tether
        from avro import io as avio
        from avro import schema
        from avro.tether import HTTPRequestor, inputProtocol, find_port

        import StringIO
        import mock_tether_parent
        from word_count_task import WordCountTask

        task = WordCountTask()

        proc = None
        try:
            # launch the server in a separate process
            # env["AVRO_TETHER_OUTPUT_PORT"]=output_port
            env = dict()
            env["PYTHONPATH"] = ':'.join(sys.path)
            server_port = find_port()

            pyfile = mock_tether_parent.__file__
            proc = subprocess.Popen(
                ["python", pyfile, "start_server", "{0}".format(server_port)])
            input_port = find_port()

            print "Mock server started process pid={0}".format(proc.pid)
            # Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
            # so we give the subprocess time to start up
            time.sleep(1)
            task.open(input_port, clientPort=server_port)

            # TODO: We should validate that open worked by grabbing the STDOUT of the subproces
            # and ensuring that it outputted the correct message.

            #***************************************************************
            # Test the mapper
            task.configure(tether.TaskType.MAP, str(task.inschema),
                           str(task.midschema))

            # Serialize some data so we can send it to the input function
            datum = "This is a line of text"
            writer = StringIO.StringIO()
            encoder = avio.BinaryEncoder(writer)
            datum_writer = avio.DatumWriter(task.inschema)
            datum_writer.write(datum, encoder)

            writer.seek(0)
            data = writer.read()

            # Call input to simulate calling map
            task.input(data, 1)

            # Test the reducer
            task.configure(tether.TaskType.REDUCE, str(task.midschema),
                           str(task.outschema))

            # Serialize some data so we can send it to the input function
            datum = {"key": "word", "value": 2}
            writer = StringIO.StringIO()
            encoder = avio.BinaryEncoder(writer)
            datum_writer = avio.DatumWriter(task.midschema)
            datum_writer.write(datum, encoder)

            writer.seek(0)
            data = writer.read()

            # Call input to simulate calling reduce
            task.input(data, 1)

            task.complete()

            # try a status
            task.status("Status message")

        except Exception as e:
            raise
        finally:
            # close the process
            if not (proc is None):
                proc.kill()

            pass
Example #7
0
  def test1(self):
    """
    Test that the thether_task is working. We run the mock_tether_parent in a separate
    subprocess
    """
    from avro import tether
    from avro import io as avio
    from avro import schema
    from avro.tether import HTTPRequestor,inputProtocol, find_port

    import StringIO
    import mock_tether_parent
    from word_count_task import WordCountTask

    task=WordCountTask()

    proc=None
    try:
      # launch the server in a separate process
      # env["AVRO_TETHER_OUTPUT_PORT"]=output_port
      env=dict()
      env["PYTHONPATH"]=':'.join(sys.path)
      server_port=find_port()

      pyfile=mock_tether_parent.__file__
      proc=subprocess.Popen(["python", pyfile,"start_server","{0}".format(server_port)])
      input_port=find_port()

      print "Mock server started process pid={0}".format(proc.pid)
      # Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
      # so we give the subprocess time to start up
      time.sleep(1)
      task.open(input_port,clientPort=server_port)

      # TODO: We should validate that open worked by grabbing the STDOUT of the subproces
      # and ensuring that it outputted the correct message.

      #***************************************************************
      # Test the mapper
      task.configure(tether.TaskType.MAP,str(task.inschema),str(task.midschema))

      # Serialize some data so we can send it to the input function
      datum="This is a line of text"
      writer = StringIO.StringIO()
      encoder = avio.BinaryEncoder(writer)
      datum_writer = avio.DatumWriter(task.inschema)
      datum_writer.write(datum, encoder)

      writer.seek(0)
      data=writer.read()

      # Call input to simulate calling map
      task.input(data,1)

      # Test the reducer
      task.configure(tether.TaskType.REDUCE,str(task.midschema),str(task.outschema))

      # Serialize some data so we can send it to the input function
      datum={"key":"word","value":2}
      writer = StringIO.StringIO()
      encoder = avio.BinaryEncoder(writer)
      datum_writer = avio.DatumWriter(task.midschema)
      datum_writer.write(datum, encoder)

      writer.seek(0)
      data=writer.read()

      # Call input to simulate calling reduce
      task.input(data,1)

      task.complete()

      # try a status
      task.status("Status message")

    except Exception as e:
      raise
    finally:
      # close the process
      if not(proc is None):
        proc.kill()

      pass
Example #8
0
  def test1(self):
    from word_count_task import WordCountTask
    from avro.tether import TaskRunner, find_port,HTTPRequestor,inputProtocol, TaskType
    from avro import io as avio
    import mock_tether_parent
    import subprocess
    import StringIO
    import logging

    # set the logging level to debug so that debug messages are printed
    logging.basicConfig(level=logging.DEBUG)

    proc=None
    try:
      # launch the server in a separate process
      env=dict()
      env["PYTHONPATH"]=':'.join(sys.path)
      parent_port=find_port()

      pyfile=mock_tether_parent.__file__
      proc=subprocess.Popen(["python", pyfile,"start_server","{0}".format(parent_port)])
      input_port=find_port()

      print "Mock server started process pid={0}".format(proc.pid)
      # Possible race condition? open tries to connect to the subprocess before the subprocess is fully started
      # so we give the subprocess time to start up
      time.sleep(1)

      runner=TaskRunner(WordCountTask())

      runner.start(outputport=parent_port,join=False)

      # Wait for the server to start
      time.sleep(1)

      # Test sending various messages to the server and ensuring they are
      # processed correctly
      requestor=HTTPRequestor("localhost",runner.server.server_address[1],inputProtocol)

      # TODO: We should validate that open worked by grabbing the STDOUT of the subproces
      # and ensuring that it outputted the correct message.

      # Test the mapper
      requestor.request("configure",{"taskType":TaskType.MAP,"inSchema":str(runner.task.inschema),"outSchema":str(runner.task.midschema)})

      # Serialize some data so we can send it to the input function
      datum="This is a line of text"
      writer = StringIO.StringIO()
      encoder = avio.BinaryEncoder(writer)
      datum_writer = avio.DatumWriter(runner.task.inschema)
      datum_writer.write(datum, encoder)

      writer.seek(0)
      data=writer.read()


      # Call input to simulate calling map
      requestor.request("input",{"data":data,"count":1})

      #Test the reducer
      requestor.request("configure",{"taskType":TaskType.REDUCE,"inSchema":str(runner.task.midschema),"outSchema":str(runner.task.outschema)})

      #Serialize some data so we can send it to the input function
      datum={"key":"word","value":2}
      writer = StringIO.StringIO()
      encoder = avio.BinaryEncoder(writer)
      datum_writer = avio.DatumWriter(runner.task.midschema)
      datum_writer.write(datum, encoder)

      writer.seek(0)
      data=writer.read()


      #Call input to simulate calling reduce
      requestor.request("input",{"data":data,"count":1})

      requestor.request("complete",{})


      runner.task.ready_for_shutdown.wait()
      runner.server.shutdown()
      #time.sleep(2)
      #runner.server.shutdown()

      sthread=runner.sthread

      #Possible race condition?
      time.sleep(1)

      #make sure the other thread terminated
      self.assertFalse(sthread.isAlive())

      #shutdown the logging
      logging.shutdown()

    except Exception as e:
      raise
    finally:
      #close the process
      if not(proc is None):
        proc.kill()