pycloudlib 1!7.7.0__tar.gz → 1!7.7.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. {pycloudlib-1!7.7.0/pycloudlib.egg-info → pycloudlib-1!7.7.2}/PKG-INFO +1 -1
  2. pycloudlib-1!7.7.2/VERSION +1 -0
  3. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/gce/cloud.py +2 -0
  4. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/instance.py +3 -1
  5. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2/pycloudlib.egg-info}/PKG-INFO +1 -1
  6. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib.egg-info/SOURCES.txt +2 -0
  7. pycloudlib-1!7.7.2/tests/integration_tests/gce/__init__.py +0 -0
  8. pycloudlib-1!7.7.2/tests/integration_tests/gce/test_launch.py +25 -0
  9. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/test_instance.py +16 -2
  10. pycloudlib-1!7.7.0/VERSION +0 -1
  11. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/LICENSE +0 -0
  12. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/MANIFEST.in +0 -0
  13. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/README.md +0 -0
  14. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/__init__.py +0 -0
  15. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/azure/__init__.py +0 -0
  16. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/azure/cloud.py +0 -0
  17. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/azure/instance.py +0 -0
  18. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/azure/security_types.py +0 -0
  19. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/azure/util.py +0 -0
  20. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/cloud.py +0 -0
  21. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/config.py +0 -0
  22. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/constants.py +0 -0
  23. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ec2/__init__.py +0 -0
  24. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ec2/cloud.py +0 -0
  25. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ec2/instance.py +0 -0
  26. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ec2/util.py +0 -0
  27. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ec2/vpc.py +0 -0
  28. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/errors.py +0 -0
  29. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/gce/__init__.py +0 -0
  30. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/gce/errors.py +0 -0
  31. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/gce/instance.py +0 -0
  32. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/gce/util.py +0 -0
  33. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm/__init__.py +0 -0
  34. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm/_util.py +0 -0
  35. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm/cloud.py +0 -0
  36. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm/errors.py +0 -0
  37. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm/instance.py +0 -0
  38. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm_classic/__init__.py +0 -0
  39. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm_classic/cloud.py +0 -0
  40. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm_classic/errors.py +0 -0
  41. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/ibm_classic/instance.py +0 -0
  42. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/key.py +0 -0
  43. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/lxd/__init__.py +0 -0
  44. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/lxd/_images.py +0 -0
  45. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/lxd/cloud.py +0 -0
  46. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/lxd/defaults.py +0 -0
  47. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/lxd/instance.py +0 -0
  48. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/oci/__init__.py +0 -0
  49. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/oci/cloud.py +0 -0
  50. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/oci/instance.py +0 -0
  51. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/oci/utils.py +0 -0
  52. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/openstack/__init__.py +0 -0
  53. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/openstack/cloud.py +0 -0
  54. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/openstack/errors.py +0 -0
  55. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/openstack/instance.py +0 -0
  56. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/py.typed +0 -0
  57. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/qemu/__init__.py +0 -0
  58. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/qemu/cloud.py +0 -0
  59. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/qemu/instance.py +0 -0
  60. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/qemu/util.py +0 -0
  61. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/result.py +0 -0
  62. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/util.py +0 -0
  63. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/vmware/__init__.py +0 -0
  64. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/vmware/cloud.py +0 -0
  65. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib/vmware/instance.py +0 -0
  66. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib.egg-info/dependency_links.txt +0 -0
  67. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib.egg-info/requires.txt +0 -0
  68. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib.egg-info/top_level.txt +0 -0
  69. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pycloudlib.egg-info/zip-safe +0 -0
  70. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/pyproject.toml +0 -0
  71. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/requirements.txt +0 -0
  72. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/setup.cfg +0 -0
  73. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/setup.py +0 -0
  74. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/test-requirements.txt +0 -0
  75. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/__init__.py +0 -0
  76. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/conftest.py +0 -0
  77. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/integration_tests/__init__.py +0 -0
  78. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/integration_tests/test_public_api.py +0 -0
  79. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/integration_tests/test_qemu.py +0 -0
  80. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/__init__.py +0 -0
  81. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/azure/__init__.py +0 -0
  82. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/azure/test_cloud.py +0 -0
  83. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/azure/test_security_types.py +0 -0
  84. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/gce/__init__.py +0 -0
  85. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/gce/test_cloud.py +0 -0
  86. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/ibm/__init__.py +0 -0
  87. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/ibm/test_util.py +0 -0
  88. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/ibm_classic/__init__.py +0 -0
  89. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/ibm_classic/test_cloud.py +0 -0
  90. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/lxd/__init__.py +0 -0
  91. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/lxd/test_cloud.py +0 -0
  92. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/lxd/test_defaults.py +0 -0
  93. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/lxd/test_images.py +0 -0
  94. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/lxd/test_instance.py +0 -0
  95. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/test_cloud.py +0 -0
  96. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/test_config.py +0 -0
  97. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tests/unit_tests/test_errors.py +0 -0
  98. {pycloudlib-1!7.7.0 → pycloudlib-1!7.7.2}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!7.7.0
3
+ Version: 1!7.7.2
4
4
  Summary: Python library to launch, interact, and snapshot cloud instances
5
5
  Home-page: https://github.com/canonical/pycloudlib
6
6
  Author: pycloudlib-devs
@@ -0,0 +1 @@
1
+ 1!7.7.2
@@ -409,6 +409,8 @@ class GCE(BaseCloud):
409
409
  },
410
410
  }
411
411
 
412
+ config.update(kwargs)
413
+
412
414
  if self.service_account_email:
413
415
  config["serviceAccounts"] = [{"email": self.service_account_email}]
414
416
 
@@ -505,10 +505,12 @@ class BaseInstance(ABC):
505
505
  start = time.time()
506
506
  end = start + timeout * 60
507
507
  while time.time() < end:
508
- with suppress(SSHException, OSError):
508
+ try:
509
509
  boot_id = self.get_boot_id()
510
510
  if not old_boot_id or boot_id != old_boot_id:
511
511
  return
512
+ except (SSHException, OSError) as e:
513
+ self._log.debug("Failed to obtain new boot id: %s", e)
512
514
  time.sleep(1)
513
515
 
514
516
  raise PycloudlibTimeoutError(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!7.7.0
3
+ Version: 1!7.7.2
4
4
  Summary: Python library to launch, interact, and snapshot cloud instances
5
5
  Home-page: https://github.com/canonical/pycloudlib
6
6
  Author: pycloudlib-devs
@@ -73,6 +73,8 @@ tests/conftest.py
73
73
  tests/integration_tests/__init__.py
74
74
  tests/integration_tests/test_public_api.py
75
75
  tests/integration_tests/test_qemu.py
76
+ tests/integration_tests/gce/__init__.py
77
+ tests/integration_tests/gce/test_launch.py
76
78
  tests/unit_tests/__init__.py
77
79
  tests/unit_tests/test_cloud.py
78
80
  tests/unit_tests/test_config.py
@@ -0,0 +1,25 @@
1
+ import pytest
2
+ from pycloudlib.gce.cloud import GCE
3
+
4
+
5
+ @pytest.fixture
6
+ def gce_instance():
7
+ with GCE(tag="test-launch") as gce:
8
+ yield gce
9
+
10
+
11
+ def test_gce_launch_updates_config(gce_instance: GCE):
12
+ """Test that the launch method updates the config."""
13
+ daily = gce_instance.daily_image("noble", arch="x86_64")
14
+ description = "Test description for kwarg verification."
15
+ with gce_instance.launch(daily, description=description) as inst:
16
+ result = (
17
+ gce_instance.compute.instances()
18
+ .get(
19
+ project=gce_instance.project,
20
+ zone=gce_instance.zone,
21
+ instance=inst.name,
22
+ )
23
+ .execute()
24
+ )
25
+ assert result["description"] == description
@@ -47,13 +47,25 @@ class TestWait:
47
47
 
48
48
  @pytest.mark.parametrize(
49
49
  "execute_effect",
50
- [lambda *args, **kwargs: Result("", "", 1), SSHException],
50
+ [
51
+ pytest.param(
52
+ lambda *args, **kwargs: Result("", "", 1), id="nonzero"
53
+ ),
54
+ pytest.param(SSHException, id="exception"),
55
+ ],
51
56
  )
52
57
  @mock.patch.object(BaseInstance, "execute")
53
58
  @mock.patch("pycloudlib.instance.time.sleep")
54
59
  @mock.patch("pycloudlib.instance.time.time")
60
+ @mock.patch("logging.Logger.debug")
55
61
  def test_wait_execute_failure(
56
- self, m_time, m_sleep, m_execute, execute_effect, concrete_instance_cls
62
+ self,
63
+ m_debug,
64
+ m_time,
65
+ m_sleep,
66
+ m_execute,
67
+ execute_effect,
68
+ concrete_instance_cls,
57
69
  ):
58
70
  """Test wait calls when execute command fails."""
59
71
  instance = concrete_instance_cls(key_pair=None)
@@ -176,8 +188,10 @@ class TestWaitForRestart:
176
188
  @mock.patch.object(BaseInstance, "execute")
177
189
  @mock.patch("pycloudlib.instance.time.sleep")
178
190
  @mock.patch("pycloudlib.instance.time.time")
191
+ @mock.patch("logging.Logger.debug")
179
192
  def test_boot_id_failure(
180
193
  self,
194
+ m_debug,
181
195
  m_time,
182
196
  m_sleep,
183
197
  m_execute,
@@ -1 +0,0 @@
1
- 1!7.7.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes