Skip to content
This repository has been archived by the owner on Mar 22, 2023. It is now read-only.

fix flaky test MultiWaiterCliTest.test_federated_tokens #1071

Open
shamsimam opened this issue Apr 15, 2020 · 0 comments
Open

fix flaky test MultiWaiterCliTest.test_federated_tokens #1071

shamsimam opened this issue Apr 15, 2020 · 0 comments
Assignees

Comments

@shamsimam
Copy link
Contributor

=================================== FAILURES ===================================
___________________ MultiWaiterCliTest.test_federated_tokens ___________________
[gw3] linux -- Python 3.6.3 /opt/pyenv/versions/3.6.3/bin/python3.6
self = <tests.waiter.test_cli_multi_cluster.MultiWaiterCliTest testMethod=test_federated_tokens>
    def test_federated_tokens(self):
        # Create in cluster #1
        token_name = self.token_name()
        util.post_token(self.waiter_url_1, token_name, util.minimal_service_description())
        try:
            # Single query for the tokens, federated across clusters
            cluster_1 = f'foo_{uuid.uuid4()}'
            cluster_2 = f'bar_{uuid.uuid4()}'
            config = {'clusters': [{'name': cluster_1, 'url': self.waiter_url_1},
                                   {'name': cluster_2, 'url': self.waiter_url_2}]}
            with cli.temp_config_file(config) as path:
                cp, tokens = cli.tokens_data(flags='--config %s' % path)
                tokens = [t for t in tokens if t['token'] == token_name]
                self.assertEqual(0, cp.returncode, cp.stderr)
                self.assertEqual(1, len(tokens), tokens)
    
                # Create in cluster #2
                util.post_token(self.waiter_url_2, token_name, util.minimal_service_description())
                try:
                    # Again, single query for the tokens, federated across clusters
                    cp, tokens = cli.tokens_data(flags='--config %s' % path)
                    tokens = [t for t in tokens if t['token'] == token_name]
                    self.assertEqual(0, cp.returncode, cp.stderr)
                    self.assertEqual(2, len(tokens), tokens)
    
                    # Test the secondary sort on cluster
                    cp = cli.tokens(flags='--config %s' % path)
                    stdout = cli.stdout(cp)
                    self.assertEqual(0, cp.returncode, cp.stderr)
                    self.assertIn(cluster_1, stdout)
                    self.assertIn(cluster_2, stdout)
>                   self.assertLess(stdout.index(cluster_2), stdout.index(cluster_1))
E                   AssertionError: 247 not less than 120
tests/waiter/test_cli_multi_cluster.py:299: AssertionError
----------------------------- Captured stderr call -----------------------------
2020-04-15 19:43:11,891 [DEBUG] [18629] curl -XPOST -H 'Content-Type: application/json' -H 'x-cid: waiter-tests-f7a38245-4cc5-42a8-81ac-42a6915479f6' -d '{"cmd": "/home/travis/build/twosigma/waiter/cli/bin/ci/../../../containers/test-apps/kitchen/bin/kitchen --port ${PORT0}", "cpus": 1.0, "mem": 256, "metric-group": "waiter_test", "name": "service_dxj1wfNUqC", "version": "abdc0df0-46bd-4cfb-85f6-8fd7427036a4", "cmd-type": "shell"}' 'http://localhost:9091/token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a'
2020-04-15 19:43:11,936 [DEBUG] [18629] http://localhost:9091 "POST /token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a HTTP/1.1" 200 None
2020-04-15 19:43:11,936 [DEBUG] [18629] Response headers: {'ETag': 'E-99f9c466f6fa9fa451a1f7e87ca71f78', 'Content-Type': 'application/json', 'Server': 'waiter/0a9ac94', 'x-cid': 'waiter-tests-f7a38245-4cc5-42a8-81ac-42a6915479f6', 'Transfer-Encoding': 'chunked'}
2020-04-15 19:43:11,944 [DEBUG] [18629] http://localhost:9091 "GET /token HTTP/1.1" 200 None
2020-04-15 19:43:11,945 [INFO] [18629] echo 'b'{\n  "clusters": [\n    {\n      "name": "foo_c8070a6d-c510-4114-b564-47a84fa70d14",\n      "url": "http://localhost:9091"\n    },\n    {\n      "name": "bar_2e93c78b-8da9-4186-a9df-390422607d94",\n      "url": "http://localhost:9191"\n    }\n  ]\n}'' > /tmp/tmpeqbhs5bt
2020-04-15 19:43:11,946 [INFO] [18629] waiter  --config /tmp/tmpeqbhs5bt  tokens --json
2020-04-15 19:43:12,441 [DEBUG] [18629] 
stdout:
{
  "clusters": {
    "foo_c8070a6d-c510-4114-b564-47a84fa70d14": {
      "count": 8,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-2060be236875b902070c0344cdc0d5f9",
          "last-update-time": "2020-04-15T19:42:50.703Z",
          "owner": "travis",
          "token": "cli_test_show_services_using_token_20200415T194244_AWOcpB6A"
        },
        {
          "deleted": false,
          "etag": "E-0517d9627ba073755b66d9514f89d718",
          "last-update-time": "2020-04-15T19:42:41.116Z",
          "owner": "travis",
          "token": "cli_test_kill_services_sorted_20200415T194234_fsygCHRa"
        },
        {
          "deleted": false,
          "etag": "E-287d95a7a739364758e13810fc88e6da",
          "last-update-time": "2020-04-15T19:42:37.767Z",
          "owner": "travis",
          "token": "cli_test_ping_timeout_20200415T194237_mwUE2AeL"
        },
        {
          "deleted": false,
          "etag": "E-62a63cd22149e5dd32af1a59298174df",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_Rq6GJoHa"
        },
        {
          "deleted": false,
          "etag": "E-99f9c466f6fa9fa451a1f7e87ca71f78",
          "last-update-time": "2020-04-15T19:43:11.907Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        },
        {
          "deleted": false,
          "etag": "E-8ee38749c2ba1c80f25832ee2439fc0b",
          "last-update-time": "2020-04-15T19:42:54.684Z",
          "owner": "travis",
          "token": "cli_test_ping_no_wait_20200415T194254_K0J90BnU"
        },
        {
          "deleted": false,
          "etag": "E-c08439bbb2aff891dee4117c01a517ae",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_2mTSFruI"
        },
        {
          "deleted": false,
          "etag": "E-f0e5e63fbbeb740e82bb0736f1dd89a1",
          "last-update-time": "2020-04-15T19:42:58.355Z",
          "owner": "travis",
          "token": "cli_test_federated_ping_20200415T194258_QsT2oZ9A"
        }
      ]
    }
  },
  "count": 8
}
stderr:
2020-04-15 19:43:12,441 [DEBUG] [18629] curl -XPOST -H 'Content-Type: application/json' -H 'x-cid: waiter-tests-5023388a-40ac-493d-b021-12b9ce80400f' -d '{"cmd": "/home/travis/build/twosigma/waiter/cli/bin/ci/../../../containers/test-apps/kitchen/bin/kitchen --port ${PORT0}", "cpus": 1.0, "mem": 256, "metric-group": "waiter_test", "name": "service_0uKj0s93RO", "version": "ee4f1908-9669-42b5-9b40-ce12836d8520", "cmd-type": "shell"}' 'http://localhost:9191/token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a'
2020-04-15 19:43:12,478 [DEBUG] [18629] http://localhost:9191 "POST /token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a HTTP/1.1" 200 None
2020-04-15 19:43:12,479 [DEBUG] [18629] Response headers: {'ETag': 'E-3376a0d34b7cd395f3cccd05d702e4dc', 'Content-Type': 'application/json', 'Server': 'waiter/0a9ac94', 'x-cid': 'waiter-tests-5023388a-40ac-493d-b021-12b9ce80400f', 'Transfer-Encoding': 'chunked'}
2020-04-15 19:43:12,491 [DEBUG] [18629] http://localhost:9191 "GET /token HTTP/1.1" 200 None
2020-04-15 19:43:12,498 [INFO] [18629] waiter  --config /tmp/tmpeqbhs5bt  tokens --json
2020-04-15 19:43:12,977 [DEBUG] [18629] 
stdout:
{
  "clusters": {
    "bar_2e93c78b-8da9-4186-a9df-390422607d94": {
      "count": 1,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-3376a0d34b7cd395f3cccd05d702e4dc",
          "last-update-time": "2020-04-15T19:43:12.450Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        }
      ]
    },
    "foo_c8070a6d-c510-4114-b564-47a84fa70d14": {
      "count": 8,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-2060be236875b902070c0344cdc0d5f9",
          "last-update-time": "2020-04-15T19:42:50.703Z",
          "owner": "travis",
          "token": "cli_test_show_services_using_token_20200415T194244_AWOcpB6A"
        },
        {
          "deleted": false,
          "etag": "E-0517d9627ba073755b66d9514f89d718",
          "last-update-time": "2020-04-15T19:42:41.116Z",
          "owner": "travis",
          "token": "cli_test_kill_services_sorted_20200415T194234_fsygCHRa"
        },
        {
          "deleted": false,
          "etag": "E-287d95a7a739364758e13810fc88e6da",
          "last-update-time": "2020-04-15T19:42:37.767Z",
          "owner": "travis",
          "token": "cli_test_ping_timeout_20200415T194237_mwUE2AeL"
        },
        {
          "deleted": false,
          "etag": "E-62a63cd22149e5dd32af1a59298174df",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_Rq6GJoHa"
        },
        {
          "deleted": false,
          "etag": "E-99f9c466f6fa9fa451a1f7e87ca71f78",
          "last-update-time": "2020-04-15T19:43:11.907Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        },
        {
          "deleted": false,
          "etag": "E-8ee38749c2ba1c80f25832ee2439fc0b",
          "last-update-time": "2020-04-15T19:42:54.684Z",
          "owner": "travis",
          "token": "cli_test_ping_no_wait_20200415T194254_K0J90BnU"
        },
        {
          "deleted": false,
          "etag": "E-c08439bbb2aff891dee4117c01a517ae",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_2mTSFruI"
        },
        {
          "deleted": false,
          "etag": "E-f0e5e63fbbeb740e82bb0736f1dd89a1",
          "last-update-time": "2020-04-15T19:42:58.355Z",
          "owner": "travis",
          "token": "cli_test_federated_ping_20200415T194258_QsT2oZ9A"
        }
      ]
    }
  },
  "count": 9
}
stderr:
2020-04-15 19:43:12,977 [INFO] [18629] waiter  --config /tmp/tmpeqbhs5bt tokens 
2020-04-15 19:43:13,461 [DEBUG] [18629] 
stdout:
Cluster                                   Owner    Token                                                        Updated
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_federated_ping_20200415T194258_QsT2oZ9A             15 seconds ago
bar_2e93c78b-8da9-4186-a9df-390422607d94  travis   cli_test_federated_tokens_20200415T194311_3nA4WD0a           just now
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_federated_tokens_20200415T194311_3nA4WD0a           just now
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_kill_services_sorted_20200415T194234_fsygCHRa       32 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_ping_no_wait_20200415T194254_K0J90BnU               19 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_ping_timeout_20200415T194237_mwUE2AeL               36 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_service_current_20200415T194249_2mTSFruI       24 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_service_current_20200415T194249_Rq6GJoHa       24 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_services_using_token_20200415T194244_AWOcpB6A  23 seconds ago
stderr:
2020-04-15 19:43:13,495 [DEBUG] [18629] http://localhost:9191 "DELETE /token HTTP/1.1" 200 None
2020-04-15 19:43:13,495 [DEBUG] [18629] Response status code: 200
2020-04-15 19:43:13,523 [DEBUG] [18629] http://localhost:9091 "DELETE /token HTTP/1.1" 200 None
2020-04-15 19:43:13,524 [DEBUG] [18629] Response status code: 200
------------------------------ Captured log call -------------------------------
DEBUG    root:util.py:123 curl -XPOST -H 'Content-Type: application/json' -H 'x-cid: waiter-tests-f7a38245-4cc5-42a8-81ac-42a6915479f6' -d '{"cmd": "/home/travis/build/twosigma/waiter/cli/bin/ci/../../../containers/test-apps/kitchen/bin/kitchen --port ${PORT0}", "cpus": 1.0, "mem": 256, "metric-group": "waiter_test", "name": "service_dxj1wfNUqC", "version": "abdc0df0-46bd-4cfb-85f6-8fd7427036a4", "cmd-type": "shell"}' 'http://localhost:9091/token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a'
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9091 "POST /token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a HTTP/1.1" 200 None
DEBUG    root:util.py:139 Response headers: {'ETag': 'E-99f9c466f6fa9fa451a1f7e87ca71f78', 'Content-Type': 'application/json', 'Server': 'waiter/0a9ac94', 'x-cid': 'waiter-tests-f7a38245-4cc5-42a8-81ac-42a6915479f6', 'Transfer-Encoding': 'chunked'}
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9091 "GET /token HTTP/1.1" 200 None
INFO     root:cli.py:144 echo 'b'{\n  "clusters": [\n    {\n      "name": "foo_c8070a6d-c510-4114-b564-47a84fa70d14",\n      "url": "http://localhost:9091"\n    },\n    {\n      "name": "bar_2e93c78b-8da9-4186-a9df-390422607d94",\n      "url": "http://localhost:9191"\n    }\n  ]\n}'' > /tmp/tmpeqbhs5bt
INFO     root:cli.py:35 waiter  --config /tmp/tmpeqbhs5bt  tokens --json
DEBUG    root:cli.py:65 
stdout:
{
  "clusters": {
    "foo_c8070a6d-c510-4114-b564-47a84fa70d14": {
      "count": 8,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-2060be236875b902070c0344cdc0d5f9",
          "last-update-time": "2020-04-15T19:42:50.703Z",
          "owner": "travis",
          "token": "cli_test_show_services_using_token_20200415T194244_AWOcpB6A"
        },
        {
          "deleted": false,
          "etag": "E-0517d9627ba073755b66d9514f89d718",
          "last-update-time": "2020-04-15T19:42:41.116Z",
          "owner": "travis",
          "token": "cli_test_kill_services_sorted_20200415T194234_fsygCHRa"
        },
        {
          "deleted": false,
          "etag": "E-287d95a7a739364758e13810fc88e6da",
          "last-update-time": "2020-04-15T19:42:37.767Z",
          "owner": "travis",
          "token": "cli_test_ping_timeout_20200415T194237_mwUE2AeL"
        },
        {
          "deleted": false,
          "etag": "E-62a63cd22149e5dd32af1a59298174df",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_Rq6GJoHa"
        },
        {
          "deleted": false,
          "etag": "E-99f9c466f6fa9fa451a1f7e87ca71f78",
          "last-update-time": "2020-04-15T19:43:11.907Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        },
        {
          "deleted": false,
          "etag": "E-8ee38749c2ba1c80f25832ee2439fc0b",
          "last-update-time": "2020-04-15T19:42:54.684Z",
          "owner": "travis",
          "token": "cli_test_ping_no_wait_20200415T194254_K0J90BnU"
        },
        {
          "deleted": false,
          "etag": "E-c08439bbb2aff891dee4117c01a517ae",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_2mTSFruI"
        },
        {
          "deleted": false,
          "etag": "E-f0e5e63fbbeb740e82bb0736f1dd89a1",
          "last-update-time": "2020-04-15T19:42:58.355Z",
          "owner": "travis",
          "token": "cli_test_federated_ping_20200415T194258_QsT2oZ9A"
        }
      ]
    }
  },
  "count": 8
}
stderr:
DEBUG    root:util.py:123 curl -XPOST -H 'Content-Type: application/json' -H 'x-cid: waiter-tests-5023388a-40ac-493d-b021-12b9ce80400f' -d '{"cmd": "/home/travis/build/twosigma/waiter/cli/bin/ci/../../../containers/test-apps/kitchen/bin/kitchen --port ${PORT0}", "cpus": 1.0, "mem": 256, "metric-group": "waiter_test", "name": "service_0uKj0s93RO", "version": "ee4f1908-9669-42b5-9b40-ce12836d8520", "cmd-type": "shell"}' 'http://localhost:9191/token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a'
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9191 "POST /token?token=cli_test_federated_tokens_20200415T194311_3nA4WD0a HTTP/1.1" 200 None
DEBUG    root:util.py:139 Response headers: {'ETag': 'E-3376a0d34b7cd395f3cccd05d702e4dc', 'Content-Type': 'application/json', 'Server': 'waiter/0a9ac94', 'x-cid': 'waiter-tests-5023388a-40ac-493d-b021-12b9ce80400f', 'Transfer-Encoding': 'chunked'}
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9191 "GET /token HTTP/1.1" 200 None
INFO     root:cli.py:35 waiter  --config /tmp/tmpeqbhs5bt  tokens --json
DEBUG    root:cli.py:65 
stdout:
{
  "clusters": {
    "bar_2e93c78b-8da9-4186-a9df-390422607d94": {
      "count": 1,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-3376a0d34b7cd395f3cccd05d702e4dc",
          "last-update-time": "2020-04-15T19:43:12.450Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        }
      ]
    },
    "foo_c8070a6d-c510-4114-b564-47a84fa70d14": {
      "count": 8,
      "tokens": [
        {
          "deleted": false,
          "etag": "E-2060be236875b902070c0344cdc0d5f9",
          "last-update-time": "2020-04-15T19:42:50.703Z",
          "owner": "travis",
          "token": "cli_test_show_services_using_token_20200415T194244_AWOcpB6A"
        },
        {
          "deleted": false,
          "etag": "E-0517d9627ba073755b66d9514f89d718",
          "last-update-time": "2020-04-15T19:42:41.116Z",
          "owner": "travis",
          "token": "cli_test_kill_services_sorted_20200415T194234_fsygCHRa"
        },
        {
          "deleted": false,
          "etag": "E-287d95a7a739364758e13810fc88e6da",
          "last-update-time": "2020-04-15T19:42:37.767Z",
          "owner": "travis",
          "token": "cli_test_ping_timeout_20200415T194237_mwUE2AeL"
        },
        {
          "deleted": false,
          "etag": "E-62a63cd22149e5dd32af1a59298174df",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_Rq6GJoHa"
        },
        {
          "deleted": false,
          "etag": "E-99f9c466f6fa9fa451a1f7e87ca71f78",
          "last-update-time": "2020-04-15T19:43:11.907Z",
          "owner": "travis",
          "token": "cli_test_federated_tokens_20200415T194311_3nA4WD0a"
        },
        {
          "deleted": false,
          "etag": "E-8ee38749c2ba1c80f25832ee2439fc0b",
          "last-update-time": "2020-04-15T19:42:54.684Z",
          "owner": "travis",
          "token": "cli_test_ping_no_wait_20200415T194254_K0J90BnU"
        },
        {
          "deleted": false,
          "etag": "E-c08439bbb2aff891dee4117c01a517ae",
          "last-update-time": "2020-04-15T19:42:49.269Z",
          "owner": "travis",
          "token": "cli_test_show_service_current_20200415T194249_2mTSFruI"
        },
        {
          "deleted": false,
          "etag": "E-f0e5e63fbbeb740e82bb0736f1dd89a1",
          "last-update-time": "2020-04-15T19:42:58.355Z",
          "owner": "travis",
          "token": "cli_test_federated_ping_20200415T194258_QsT2oZ9A"
        }
      ]
    }
  },
  "count": 9
}
stderr:
INFO     root:cli.py:35 waiter  --config /tmp/tmpeqbhs5bt tokens 
DEBUG    root:cli.py:65 
stdout:
Cluster                                   Owner    Token                                                        Updated
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_federated_ping_20200415T194258_QsT2oZ9A             15 seconds ago
bar_2e93c78b-8da9-4186-a9df-390422607d94  travis   cli_test_federated_tokens_20200415T194311_3nA4WD0a           just now
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_federated_tokens_20200415T194311_3nA4WD0a           just now
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_kill_services_sorted_20200415T194234_fsygCHRa       32 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_ping_no_wait_20200415T194254_K0J90BnU               19 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_ping_timeout_20200415T194237_mwUE2AeL               36 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_service_current_20200415T194249_2mTSFruI       24 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_service_current_20200415T194249_Rq6GJoHa       24 seconds ago
foo_c8070a6d-c510-4114-b564-47a84fa70d14  travis   cli_test_show_services_using_token_20200415T194244_AWOcpB6A  23 seconds ago
stderr:
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9191 "DELETE /token HTTP/1.1" 200 None
DEBUG    root:util.py:88 Response status code: 200
DEBUG    urllib3.connectionpool:connectionpool.py:437 http://localhost:9091 "DELETE /token HTTP/1.1" 200 None
DEBUG    root:util.py:88 Response status code: 200
@shamsimam shamsimam self-assigned this Apr 15, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

1 participant