def setUp(self): super(BaseTestWeb, self).setUp() self.zuul_ini_config = FakeConfig(self.config_ini_data) # Start the web server self.web = self.useFixture( ZuulWebFixture( self.gearman_server.port, self.config, info=zuul.model.WebInfo.fromConfig(self.zuul_ini_config))) self.executor_server.hold_jobs_in_build = True if self.tenant_config_file != 'config/broken/main.yaml': A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') A.addApproval('Code-Review', 2) self.fake_gerrit.addEvent(A.addApproval('Approved', 1)) B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B') B.addApproval('Code-Review', 2) self.fake_gerrit.addEvent(B.addApproval('Approved', 1)) self.waitUntilSettled() self.host = 'localhost' self.port = self.web.port # Wait until web server is started while True: try: with socket.create_connection((self.host, self.port)): break except ConnectionRefusedError: pass self.base_url = "http://{host}:{port}".format( host=self.host, port=self.port)
def setUp(self): super(BaseTestWeb, self).setUp() self.zuul_ini_config = FakeConfig(self.config_ini_data) # Start the web server self.web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config, info=zuul.model.WebInfo.fromConfig( self.zuul_ini_config), zk_hosts=self.zk_config)) self.executor_server.hold_jobs_in_build = True self.host = 'localhost' self.port = self.web.port # Wait until web server is started while True: try: with socket.create_connection((self.host, self.port)): break except ConnectionRefusedError: pass self.base_url = "http://{host}:{port}".format(host=self.host, port=self.port)
def setUp(self): super(TestWebURLs, self).setUp() self.web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.changes, self.config, self.additional_event_queues, self.upstream_root, self.rpcclient, self.poller_events, self.git_url_with_auth, self.addCleanup, self.test_root))
def setUp(self): super(TestGithubWebhook, self).setUp() # Start the web server self.web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config)) host = '127.0.0.1' # Wait until web server is started while True: port = self.web.port try: with socket.create_connection((host, port)): break except ConnectionRefusedError: pass self.fake_github.setZuulWebPort(port)
def setUp(self): super(TestPagureWebhookWhitelist, self).setUp() # Start the web server self.web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.changes, self.config, self.additional_event_queues, self.upstream_root, self.rpcclient, self.poller_events, self.git_url_with_auth, self.addCleanup, self.test_root)) host = '127.0.0.1' # Wait until web server is started while True: port = self.web.port try: with socket.create_connection((host, port)): break except ConnectionRefusedError: pass self.fake_pagure.setZuulWebPort(port)
def setUp(self): super(TestWebURLs, self).setUp() self.web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config))
def test_websocket_hangup(self): # Start the web server web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config)) # Start the finger streamer daemon streamer = zuul.lib.log_streamer.LogStreamer( self.host, 0, self.executor_server.jobdir_root) self.addCleanup(streamer.stop) # Need to set the streaming port before submitting the job finger_port = streamer.server.socket.getsockname()[1] self.executor_server.log_streaming_port = finger_port A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) # We don't have any real synchronization for the ansible jobs, so # just wait until we get our running build. for x in iterate_timeout(30, "build"): if len(self.builds): break build = self.builds[0] self.assertEqual(build.name, 'python27') build_dir = os.path.join(self.executor_server.jobdir_root, build.uuid) for x in iterate_timeout(30, "build dir"): if os.path.exists(build_dir): break # Need to wait to make sure that jobdir gets set for x in iterate_timeout(30, "jobdir"): if build.jobdir is not None: break build = self.builds[0] # Wait for the job to begin running and create the ansible log file. # The job waits to complete until the flag file exists, so we can # safely access the log here. ansible_log = os.path.join(build.jobdir.log_root, 'job-output.txt') for x in iterate_timeout(30, "ansible log"): if os.path.exists(ansible_log): break # Start a thread with the websocket client client1 = self.runWSClient(web.port, build.uuid) client1.event.wait() # Wait until we've streamed everything so far for x in iterate_timeout(30, "streamer is caught up"): with open(ansible_log, 'r') as logfile: if client1.results == logfile.read(): break # This is intensive, give it some time time.sleep(1) self.assertNotEqual(len(web.web.stream_manager.streamers.keys()), 0) # Hangup the client side client1.close(1000, 'test close') client1.thread.join() # The client should be de-registered shortly for x in iterate_timeout(30, "client cleanup"): if len(web.web.stream_manager.streamers.keys()) == 0: break # Allow the job to complete flag_file = os.path.join(build_dir, 'test_wait') open(flag_file, 'w').close() self.waitUntilSettled()
def test_websocket_streaming(self): # Start the web server web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config)) # Start the finger streamer daemon streamer = zuul.lib.log_streamer.LogStreamer( self.host, 0, self.executor_server.jobdir_root) self.addCleanup(streamer.stop) # Need to set the streaming port before submitting the job finger_port = streamer.server.socket.getsockname()[1] self.executor_server.log_streaming_port = finger_port A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) # We don't have any real synchronization for the ansible jobs, so # just wait until we get our running build. for x in iterate_timeout(30, "build"): if len(self.builds): break build = self.builds[0] self.assertEqual(build.name, 'python27') build_dir = os.path.join(self.executor_server.jobdir_root, build.uuid) for x in iterate_timeout(30, "build dir"): if os.path.exists(build_dir): break # Need to wait to make sure that jobdir gets set for x in iterate_timeout(30, "jobdir"): if build.jobdir is not None: break build = self.builds[0] # Wait for the job to begin running and create the ansible log file. # The job waits to complete until the flag file exists, so we can # safely access the log here. We only open it (to force a file handle # to be kept open for it after the job finishes) but wait to read the # contents until the job is done. ansible_log = os.path.join(build.jobdir.log_root, 'job-output.txt') for x in iterate_timeout(30, "ansible log"): if os.path.exists(ansible_log): break logfile = open(ansible_log, 'r') self.addCleanup(logfile.close) # Start a thread with the websocket client client1 = self.runWSClient(web.port, build.uuid) client1.event.wait() client2 = self.runWSClient(web.port, build.uuid) client2.event.wait() # Allow the job to complete flag_file = os.path.join(build_dir, 'test_wait') open(flag_file, 'w').close() # Wait for the websocket client to complete, which it should when # it's received the full log. client1.thread.join() client2.thread.join() self.waitUntilSettled() file_contents = logfile.read() self.log.debug("\n\nFile contents: %s\n\n", file_contents) self.log.debug("\n\nStreamed: %s\n\n", client1.results) self.assertEqual(file_contents, client1.results) self.log.debug("\n\nStreamed: %s\n\n", client2.results) self.assertEqual(file_contents, client2.results)
def test_decode_boundaries(self): ''' Test multi-byte characters crossing read buffer boundaries. The finger client used by ZuulWeb reads in increments of 1024 bytes. If the last byte is a multi-byte character, we end up with an error similar to: 'utf-8' codec can't decode byte 0xe2 in position 1023: \ unexpected end of data By making the 1024th character in the log file a multi-byte character (here, the Euro character), we can test this. ''' # Start the web server web = self.useFixture( ZuulWebFixture(self.gearman_server.port, self.config)) # Start the finger streamer daemon streamer = zuul.lib.log_streamer.LogStreamer( self.host, 0, self.executor_server.jobdir_root) self.addCleanup(streamer.stop) # Need to set the streaming port before submitting the job finger_port = streamer.server.socket.getsockname()[1] self.executor_server.log_streaming_port = finger_port A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) # We don't have any real synchronization for the ansible jobs, so # just wait until we get our running build. for x in iterate_timeout(30, "builds"): if len(self.builds): break build = self.builds[0] self.assertEqual(build.name, 'python27') build_dir = os.path.join(self.executor_server.jobdir_root, build.uuid) for x in iterate_timeout(30, "build dir"): if os.path.exists(build_dir): break # Need to wait to make sure that jobdir gets set for x in iterate_timeout(30, "jobdir"): if build.jobdir is not None: break build = self.builds[0] # Wait for the job to begin running and create the ansible log file. # The job waits to complete until the flag file exists, so we can # safely access the log here. We only open it (to force a file handle # to be kept open for it after the job finishes) but wait to read the # contents until the job is done. ansible_log = os.path.join(build.jobdir.log_root, 'job-output.txt') for x in iterate_timeout(30, "ansible log"): if os.path.exists(ansible_log): break # Replace log file contents with the 1024th character being a # multi-byte character. with io.open(ansible_log, 'w', encoding='utf8') as f: f.write("a" * 1023) f.write(u"\u20AC") logfile = open(ansible_log, 'r') self.addCleanup(logfile.close) # Start a thread with the websocket client client1 = self.runWSClient(web.port, build.uuid) client1.event.wait() # Allow the job to complete flag_file = os.path.join(build_dir, 'test_wait') open(flag_file, 'w').close() # Wait for the websocket client to complete, which it should when # it's received the full log. client1.thread.join() self.waitUntilSettled() file_contents = logfile.read() logfile.close() self.log.debug("\n\nFile contents: %s\n\n", file_contents) self.log.debug("\n\nStreamed: %s\n\n", client1.results) self.assertEqual(file_contents, client1.results)