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.
- {pycloudlib-1!7.0.2/pycloudlib.egg-info → pycloudlib-1!7.2.0}/PKG-INFO +1 -1
- pycloudlib-1!7.2.0/VERSION +1 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/cloud.py +5 -2
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/instance.py +47 -6
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0/pycloudlib.egg-info}/PKG-INFO +1 -1
- pycloudlib-1!7.0.2/VERSION +0 -1
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/LICENSE +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/MANIFEST.in +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/README.md +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/security_types.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/azure/util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/config.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/constants.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ec2/vpc.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/errors.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/errors.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/gce/util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/_util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/ibm/errors.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/key.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/_images.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/defaults.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/lxd/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/oci/utils.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/errors.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/openstack/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/py.typed +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/qemu/util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/result.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib/vmware/instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/SOURCES.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/dependency_links.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/requires.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/top_level.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pycloudlib.egg-info/zip-safe +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/pyproject.toml +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/requirements.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/setup.cfg +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/setup.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/test-requirements.txt +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/conftest.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/test_public_api.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/integration_tests/test_qemu.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/test_cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/azure/test_security_types.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/gce/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/gce/test_cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/ibm/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/ibm/test_util.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/__init__.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_defaults.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_images.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/lxd/test_instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_cloud.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_config.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_errors.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tests/unit_tests/test_instance.py +0 -0
- {pycloudlib-1!7.0.2 → pycloudlib-1!7.2.0}/tox.ini +0 -0
|
@@ -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",
|
|
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",
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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."""
|
pycloudlib-1!7.0.2/VERSION
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|