pycloudlib 1!7.0.2__tar.gz → 1!7.2.0__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 (90) hide show
  1. {pycloudlib-1!7.0.2/pycloudlib.egg-info → pycloudlib-1!7.2.0}/PKG-INFO +1 -1
  2. pycloudlib-1!7.2.0/VERSION +1 -0
  3. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/cloud.py +5 -2
  4. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/instance.py +47 -6
  5. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0/pycloudlib.egg-info}/PKG-INFO +1 -1
  6. pycloudlib-1!7.0.2/VERSION +0 -1
  7. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/LICENSE +0 -0
  8. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/MANIFEST.in +0 -0
  9. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/README.md +0 -0
  10. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/__init__.py +0 -0
  11. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/__init__.py +0 -0
  12. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/instance.py +0 -0
  13. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/security_types.py +0 -0
  14. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/util.py +0 -0
  15. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/cloud.py +0 -0
  16. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/config.py +0 -0
  17. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/constants.py +0 -0
  18. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/__init__.py +0 -0
  19. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/cloud.py +0 -0
  20. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/instance.py +0 -0
  21. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/util.py +0 -0
  22. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/vpc.py +0 -0
  23. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/errors.py +0 -0
  24. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/__init__.py +0 -0
  25. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/cloud.py +0 -0
  26. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/errors.py +0 -0
  27. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/instance.py +0 -0
  28. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/util.py +0 -0
  29. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/__init__.py +0 -0
  30. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/_util.py +0 -0
  31. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/cloud.py +0 -0
  32. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/errors.py +0 -0
  33. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/instance.py +0 -0
  34. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/key.py +0 -0
  35. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/__init__.py +0 -0
  36. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/_images.py +0 -0
  37. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/cloud.py +0 -0
  38. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/defaults.py +0 -0
  39. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/instance.py +0 -0
  40. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/__init__.py +0 -0
  41. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/cloud.py +0 -0
  42. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/instance.py +0 -0
  43. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/utils.py +0 -0
  44. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/__init__.py +0 -0
  45. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/cloud.py +0 -0
  46. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/errors.py +0 -0
  47. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/instance.py +0 -0
  48. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/py.typed +0 -0
  49. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/__init__.py +0 -0
  50. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/cloud.py +0 -0
  51. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/instance.py +0 -0
  52. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/util.py +0 -0
  53. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/result.py +0 -0
  54. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/util.py +0 -0
  55. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/__init__.py +0 -0
  56. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/cloud.py +0 -0
  57. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/instance.py +0 -0
  58. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/SOURCES.txt +0 -0
  59. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/dependency_links.txt +0 -0
  60. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/requires.txt +0 -0
  61. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/top_level.txt +0 -0
  62. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/zip-safe +0 -0
  63. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pyproject.toml +0 -0
  64. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/requirements.txt +0 -0
  65. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/setup.cfg +0 -0
  66. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/setup.py +0 -0
  67. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/test-requirements.txt +0 -0
  68. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/__init__.py +0 -0
  69. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/conftest.py +0 -0
  70. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/__init__.py +0 -0
  71. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/test_public_api.py +0 -0
  72. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/test_qemu.py +0 -0
  73. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/__init__.py +0 -0
  74. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/__init__.py +0 -0
  75. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/test_cloud.py +0 -0
  76. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/test_security_types.py +0 -0
  77. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/gce/__init__.py +0 -0
  78. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/gce/test_cloud.py +0 -0
  79. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/ibm/__init__.py +0 -0
  80. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/ibm/test_util.py +0 -0
  81. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/__init__.py +0 -0
  82. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_cloud.py +0 -0
  83. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_defaults.py +0 -0
  84. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_images.py +0 -0
  85. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_instance.py +0 -0
  86. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_cloud.py +0 -0
  87. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_config.py +0 -0
  88. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_errors.py +0 -0
  89. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_instance.py +0 -0
  90. {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!7.0.2
3
+ Version: 1!7.2.0
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.2.0
@@ -34,14 +34,14 @@ UBUNTU_DAILY_IMAGES = {
34
34
  "kinetic": "Canonical:0001-com-ubuntu-server-kinetic-daily:22_10-daily:latest", # noqa: E501
35
35
  "lunar": "Canonical:0001-com-ubuntu-server-lunar-daily:23_04-daily:latest",
36
36
  "mantic": "Canonical:0001-com-ubuntu-server-mantic-daily:23_10-daily:latest", # noqa: E501
37
- "noble": "Canonical:ubuntu-24_04-lts-daily:server:latest", # noqa: E501
37
+ "noble": "Canonical:ubuntu-24_04-lts-daily:server:latest",
38
38
  }
39
39
 
40
40
  UBUNTU_MINIMAL_DAILY_IMAGES = {
41
41
  "focal": "Canonical:0001-com-ubuntu-minimal-focal-daily:minimal-20_04-daily-lts:latest", # noqa: E501
42
42
  "jammy": "Canonical:0001-com-ubuntu-minimal-jammy-daily:minimal-22_04-daily-lts:latest", # noqa: E501
43
43
  "mantic": "Canonical:0001-com-ubuntu-minimal-mantic-daily:minimal-23_10-daily:latest", # noqa: E501
44
- "noble": "Canonical:ubuntu-24_04-lts-daily:minimal:latest", # noqa: E501
44
+ "noble": "Canonical:ubuntu-24_04-lts-daily:minimal:latest",
45
45
  }
46
46
 
47
47
  UBUNTU_DAILY_PRO_IMAGES = {
@@ -49,6 +49,7 @@ UBUNTU_DAILY_PRO_IMAGES = {
49
49
  "bionic": "Canonical:0001-com-ubuntu-pro-bionic:pro-18_04-lts:latest",
50
50
  "focal": "Canonical:0001-com-ubuntu-pro-focal:pro-20_04-lts:latest",
51
51
  "jammy": "Canonical:0001-com-ubuntu-pro-jammy:pro-22_04-lts:latest",
52
+ "noble": "Canonical:ubuntu-24_04-lts:ubuntu-pro:latest",
52
53
  }
53
54
 
54
55
  UBUNTU_DAILY_PRO_FIPS_IMAGES = {
@@ -63,11 +64,13 @@ UBUNTU_RELEASE_IMAGES = {
63
64
  "focal": "Canonical:0001-com-ubuntu-server-focal:20_04-lts-gen2:latest",
64
65
  "impish": "Canonical:0001-com-ubuntu-server-impish:21_10-gen2:latest",
65
66
  "jammy": "Canonical:0001-com-ubuntu-server-jammy:22_04-lts-gen2:latest",
67
+ "noble": "Canonical:ubuntu-24_04-lts:server:latest",
66
68
  }
67
69
 
68
70
  UBUNTU_CVM_IMAGES = {
69
71
  "focal": "Canonical:0001-com-ubuntu-confidential-vm-focal:20_04-lts-cvm:latest", # noqa: E501
70
72
  "jammy": "Canonical:0001-com-ubuntu-confidential-vm-jammy:22_04-lts-cvm:latest", # noqa: E501
73
+ "noble": "Canonical:ubuntu-24_04-lts:cvm:latest",
71
74
  }
72
75
 
73
76
  logging.getLogger("azure.core.pipeline.policies.http_logging_policy").setLevel(
@@ -16,7 +16,7 @@ from ibm_vpc.vpc_v1 import InstanceAction as _InstanceAction
16
16
  from pycloudlib.ibm._util import get_first as _get_first
17
17
  from pycloudlib.ibm._util import iter_resources as _iter_resources
18
18
  from pycloudlib.ibm._util import wait_until as _wait_until
19
- from pycloudlib.ibm.errors import IBMException
19
+ from pycloudlib.ibm.errors import IBMCapacityException, IBMException
20
20
  from pycloudlib.instance import BaseInstance
21
21
 
22
22
  if TYPE_CHECKING:
@@ -399,7 +399,9 @@ class _IBMInstanceType(Enum):
399
399
  return client.create_instance_action(id, action.value, force=force)
400
400
  if self == self.BARE_METAL_SERVER:
401
401
  if action == _Action.STOP:
402
- return client.stop_bare_metal_server(id)
402
+ return client.stop_bare_metal_server(
403
+ id, type="hard" if force else "soft"
404
+ )
403
405
  if action == _Action.START:
404
406
  return client.start_bare_metal_server(id)
405
407
  if action == _Action.REBOOT:
@@ -709,12 +711,22 @@ class IBMInstance(BaseInstance):
709
711
  self._instance = self._get_instance(self.id).get_result()
710
712
  return self._instance
711
713
 
712
- def _wait_for_status(self, status: _Status, sleep_seconds: int = 300):
714
+ def _wait_for_status(
715
+ self,
716
+ status: _Status,
717
+ sleep_seconds: int = 300,
718
+ side_effect_fn=None,
719
+ ):
720
+ def check_status_and_do_side_effect():
721
+ if side_effect_fn:
722
+ side_effect_fn()
723
+ return self._refresh_instance()["status"] == status.value
724
+
713
725
  _wait_until(
714
- lambda: self._refresh_instance()["status"] == status.value,
726
+ check_status_and_do_side_effect,
715
727
  timeout_seconds=sleep_seconds,
716
728
  timeout_msg_fn=lambda: (
717
- "Expected {status.value} state, but found"
729
+ f"Expected {status.value} state, but found"
718
730
  f" {self._instance['status']} "
719
731
  f"after waiting {sleep_seconds} seconds. "
720
732
  "Check IBM VPC console for more details."
@@ -746,9 +758,38 @@ class IBMInstance(BaseInstance):
746
758
  if wait:
747
759
  self.wait()
748
760
 
761
+ def _check_instance_failed_status(self) -> None:
762
+ """
763
+ Check if the instance failed to start and raise an exception if so.
764
+
765
+ Raises:
766
+ IBMCapacityException: If the instance failed to start due to
767
+ capacity issues.
768
+ IBMException: If the instance failed to start due to other reasons.
769
+ """
770
+ if self._instance["status"] == _Status.FAILED.value:
771
+ if any(
772
+ "capacity" in reason["code"]
773
+ for reason in self._instance["status_reasons"]
774
+ ):
775
+ raise IBMCapacityException(
776
+ f"Out of capacity! Instance {self.id} failed to start: "
777
+ f"{self._instance['status_reasons'][0]['message']}"
778
+ )
779
+ # Raise generic IBM exception if not capacity related
780
+ raise IBMException(
781
+ f"Instance {self.id} failed to start: "
782
+ f"{self._instance['status_reasons'][0]['message']}"
783
+ )
784
+
749
785
  def _wait_for_instance_start(self, **kwargs):
750
786
  """Wait for the cloud instance to be up."""
751
- self._wait_for_status(_Status.RUNNING)
787
+ # if self.b
788
+ self._wait_for_status(
789
+ _Status.RUNNING,
790
+ sleep_seconds=900,
791
+ side_effect_fn=self._check_instance_failed_status,
792
+ )
752
793
 
753
794
  def wait_for_delete(self, sleep_seconds=30, raise_on_fail=False):
754
795
  """Wait for instance to be deleted."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!7.0.2
3
+ Version: 1!7.2.0
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
@@ -1 +0,0 @@
1
- 1!7.0.2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes