juju / python-libjuju

Python library for the Juju API
Apache License 2.0
57 stars 93 forks source link

[Bug] Cannot create more than one offer #1040

Closed Zvirovyi closed 2 months ago

Zvirovyi commented 3 months ago

When i do model.create_offer multiple times, i get exception:

kubernetes.client.exceptions.ApiException: (0)
Reason: [Errno 2] No such file or directory

Code example:

@pytest.mark.group(1)
@pytest.mark.abort_on_fail
async def test_cos(ops_test: OpsTest):
    await ops_test.model.deploy(
        "cos-lite",
        trust=True,
    )
    await ops_test.model.create_offer("grafana:grafana-dashboard", "grafana-dashboards") // this executes successfully
    await ops_test.model.create_offer("loki:logging", "loki-logging") // and this causes error
    await ops_test.model.create_offer("prometheus:receive-remote-write", "prometheus-receive-remote-write")

Full traceback:

Traceback (most recent call last):
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/stream/ws_client.py", line 559, in portforward_call
    websocket = create_websocket(configuration, url, headers)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/stream/ws_client.py", line 489, in create_websocket
    websocket.connect(url, **connect_opt)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/websocket/_core.py", line 256, in connect
    self.sock, addrs = connect(
                       ^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/websocket/_http.py", line 147, in connect
    sock = _ssl_socket(sock, options.sslopt, hostname)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/websocket/_http.py", line 307, in _ssl_socket
    sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/websocket/_http.py", line 247, in _wrap_sni_socket
    context.load_verify_locations(cafile=cafile, capath=capath)
FileNotFoundError: [Errno 2] No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/runner.py", line 340, in from_call
    result: Optional[TResult] = func()
                                ^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/runner.py", line 240, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_hooks.py", line 501, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_manager.py", line 119, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 138, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 121, in _multicall
    teardown.throw(exception)  # type: ignore[union-attr]
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/threadexception.py", line 87, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/threadexception.py", line 63, in thread_exception_runtest_hook
    yield
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 121, in _multicall
    teardown.throw(exception)  # type: ignore[union-attr]
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/unraisableexception.py", line 90, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/unraisableexception.py", line 65, in unraisable_exception_runtest_hook
    yield
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 121, in _multicall
    teardown.throw(exception)  # type: ignore[union-attr]
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/logging.py", line 849, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/logging.py", line 832, in _runtest_for
    yield
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 121, in _multicall
    teardown.throw(exception)  # type: ignore[union-attr]
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/capture.py", line 883, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 121, in _multicall
    teardown.throw(exception)  # type: ignore[union-attr]
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/skipping.py", line 256, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 102, in _multicall
    res = hook_impl.function(*args)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/runner.py", line 182, in pytest_runtest_call
    raise e
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/runner.py", line 172, in pytest_runtest_call
    item.runtest()
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/python.py", line 1772, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_hooks.py", line 501, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_manager.py", line 119, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 181, in _multicall
    return outcome.get_result()
           ^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_result.py", line 99, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pluggy/_callers.py", line 102, in _multicall
    res = hook_impl.function(*args)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/_pytest/python.py", line 195, in pytest_pyfunc_call
    result = testfunction(**testargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/pytest_asyncio/plugin.py", line 532, in inner
    _loop.run_until_complete(task)
  File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/tests/integration/test_cos.py", line 19, in test_cos
    await ops_test.model.create_offer("loki:logging", "loki-logging")
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/model.py", line 2511, in create_offer
    async with ConnectedController(self.connection()) as controller:
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/controller.py", line 990, in __aenter__
    await self._connect_direct(**kwargs)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/controller.py", line 169, in _connect_direct
    await self._connector.connect(**kwargs)
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/client/connector.py", line 100, in connect
    self._connection = await Connection.connect(**kwargs)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/client/connection.py", line 344, in connect
    self.proxy.connect()
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/juju/client/proxy/kubernetes/proxy.py", line 54, in connect
    self.port_forwarder = portforward(
                          ^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/stream/stream.py", line 35, in _websocket_request
    return api_method(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/client/api/core_v1_api.py", line 1142, in connect_get_namespaced_pod_portforward
    return self.connect_get_namespaced_pod_portforward_with_http_info(name, namespace, **kwargs)  # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/client/api/core_v1_api.py", line 1229, in connect_get_namespaced_pod_portforward_with_http_info
    return self.api_client.call_api(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/client/api_client.py", line 348, in call_api
    return self.__call_api(resource_path, method,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/client/api_client.py", line 180, in __call_api
    response_data = self.request(
                    ^^^^^^^^^^^^^
  File "/home/zvirovyi/postgresql-k8s-operator/.tox/integration/lib/python3.11/site-packages/kubernetes/stream/ws_client.py", line 562, in portforward_call
    raise ApiException(status=0, reason=str(e))
kubernetes.client.exceptions.ApiException: (0)
Reason: [Errno 2] No such file or directory
Aflynn50 commented 2 months ago

Will be fixed with PR #1044