Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Improve exec api - #858

Merged
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api
Dec 3, 2015
Merged

Improve exec api#858
dnephin merged 3 commits into
docker:masterfrom
TomasTomecek:improve-exec-api

Conversation

@TomasTomecek

Copy link
Copy Markdown
Contributor

I'm sorry for creating new PR but git/GitHub went absolutely bananas: gh closed old PR itself (new UI glitch?), messed up commits and refused to do valid rebase.

Old PR: #853

Needed for: d11wtq/dockerpty#30
Transitively for: docker/compose#2023

I have addressed all comments:

  • correctly configured garbage collection during integration test
  • created new interface for stream/socket response (chose decorator instead of Client method) -- can rewrite if you don't like this (the reason I did it this way is that I didn't like the solution with partial b/c you need to supply more arguments to _get_result_tty than to _get_raw_response_socket)

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is longer than 80 characters :(

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Regarding the integration test, it works fine for me locally:

platform linux2 -- Python 2.7.10, pytest-2.8.2, py-1.4.30, pluggy-0.3.1
plugins: capturelog-0.7
collected 8 items tests/integration/exec_test.py .
docker 1.9.0

Is this a regression between 1.8 and 1.9?

@shin-

Copy link
Copy Markdown
Contributor

The integration tests on Jenkins use Docker 1.9.0 as well (see the integration-dind task in Makefile). I also get successes testing outside of dind. I'll take a closer look at the test.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

I think that the issue could be with terminal allocation, since test runner probably doesn't allocate tty in kernel.

Edit: ^ that doesn't make any sense, right? tty is allocated in container and exec api call just attaches to container so client doesn't need to allocate tty in test runner afaik

@TomasTomecek
TomasTomecekforce-pushed the improve-exec-api branch 2 times, most recently from ce60d28 to 704dbe8CompareNovember 24, 2015 08:16
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

After doing some brief testing the issue with integration test seems like race:

First run:

tests/integration/exec_test.py:141: in test_exec_start_socket
self.assertEqual(next_size, len(line))
E AssertionError: 0 != 22
connectionpool.py 383 DEBUG "POST /v1.20/containers/create HTTP/1.1" 201 90
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/start HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/exec HTTP/1.1" 201 74
connectionpool.py 383 DEBUG "POST /v1.20/exec/63e7bcc6574a53c01e493079c51103ca6a8697eea14b821a098384b956224c8d/start HTTP/1.1" 200 None
connectionpool.py 383 DEBUG "POST /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471/stop?t=1 HTTP/1.1" 204 0
connectionpool.py 383 DEBUG "DELETE /v1.20/containers/0d8a59766345c5724aabd31a4aacb259b85cb2be2f9d21bf88a8277ff7369471?link=False&force=False&v=False HTTP/1.1" 204 0

Then I reran the exec suite commenting out self.assertEqual(next_size, len(line)) just to see where it gets:

platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 7 items tests/integration/exec_test.py .....F.
tests/integration/exec_test.py:149: in test_exec_start_socket
self.assertEqual(data.decode('utf-8'), "{0}".format(line))
E AssertionError: u'yay, interactive exec!\r\n' != 'yay, interactive exec!'

And again just a single failing test:

$ py.test tests/integration/exec_test.py::ExecTest::test_exec_start_socket
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.6.4
plugins: capturelog
collected 8 items tests/integration/exec_test.py .

And now it works for me locally.

EDIT: passes now even locally in dind.
EDIT2: when I run the whole suite I get the error from CI, so it looks like that tests affect each other: does requests cache the connection?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Okay, so this is a python 3 only issue.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Done!

It was a race. Command in container didn't finish before tests tried to fetch results. Simple select([socket], [], []) solves it.

@shin- PTAL

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor
  • got rid of the decorator
  • moved import select to top

Comment threaddocker/api/exec_api.py Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a bit harder to read than it needs to be. How about just:

ifsocket:
stream=True

Also, this is just a personal preference, but I prefer to modify arguments at the very top of a function, so it's all in one place, so ideally this would go above the bit where we initialise data.

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand thanks for the review. As I said previously, this code is copy&pasted from attach container integration test. So I find it pretty funny that you are commenting on a code which is already in.

I'm assuming that I should make one helper function and use it in both codebases, right?

@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

@aanand very good suggestions! code for tests looks a lot cleaner now, please take a look.

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
b/c if test fails, dpy-dind is left running and integration-dind target
will refuse to start and you need to manually force-remove the container
Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

fixed the flake; rebased

@aanand

Copy link
Copy Markdown
Contributor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied. Your suggestion was a good one and the tests indeed look much better now, so thanks!

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Signed-off-by: Tomas Tomecek <ttomecek@redhat.com>
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

Apologies, I hadn't looked at the codebase in a while so I didn't realise it was copied.

No worries.

I'd like to make one more suggestion, assuming it's possible - can the select call be moved to the top of the read_socket function?

Done.

@aanand

Copy link
Copy Markdown
Contributor

LGTM

1 similar comment
@dnephin

Copy link
Copy Markdown
Contributor

LGTM

dnephin added a commit that referenced this pull request Dec 3, 2015
@dnephin
dnephin merged commit 9ebecb5 into docker:masterDec 3, 2015
@TomasTomecek
TomasTomecek deleted the improve-exec-api branch December 4, 2015 11:34
@TomasTomecek

Copy link
Copy Markdown
ContributorAuthor

\o/
dockerpty now

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@TomasTomecek@shin-@aanand@dnephin@GordonTheTurtle