pycloudlib 1!9.3.2__tar.gz → 1!9.3.3__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 (104) hide show
  1. {pycloudlib-1!9.3.2/pycloudlib.egg-info → pycloudlib-1!9.3.3}/PKG-INFO +1 -1
  2. pycloudlib-1!9.3.3/VERSION +1 -0
  3. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ec2/cloud.py +11 -7
  4. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/gce/cloud.py +7 -3
  5. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3/pycloudlib.egg-info}/PKG-INFO +1 -1
  6. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/test_public_api.py +9 -5
  7. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ec2/test_cloud.py +50 -6
  8. pycloudlib-1!9.3.2/VERSION +0 -1
  9. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/LICENSE +0 -0
  10. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/MANIFEST.in +0 -0
  11. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/README.md +0 -0
  12. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/__init__.py +0 -0
  13. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/azure/__init__.py +0 -0
  14. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/azure/cloud.py +0 -0
  15. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/azure/instance.py +0 -0
  16. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/azure/security_types.py +0 -0
  17. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/azure/util.py +0 -0
  18. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/cloud.py +0 -0
  19. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/config.py +0 -0
  20. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/constants.py +0 -0
  21. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ec2/__init__.py +0 -0
  22. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ec2/instance.py +0 -0
  23. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ec2/util.py +0 -0
  24. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ec2/vpc.py +0 -0
  25. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/errors.py +0 -0
  26. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/gce/__init__.py +0 -0
  27. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/gce/errors.py +0 -0
  28. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/gce/instance.py +0 -0
  29. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/gce/util.py +0 -0
  30. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm/__init__.py +0 -0
  31. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm/_util.py +0 -0
  32. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm/cloud.py +0 -0
  33. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm/errors.py +0 -0
  34. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm/instance.py +0 -0
  35. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm_classic/__init__.py +0 -0
  36. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm_classic/cloud.py +0 -0
  37. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm_classic/errors.py +0 -0
  38. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/ibm_classic/instance.py +0 -0
  39. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/instance.py +0 -0
  40. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/key.py +0 -0
  41. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/lxd/__init__.py +0 -0
  42. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/lxd/_images.py +0 -0
  43. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/lxd/cloud.py +0 -0
  44. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/lxd/defaults.py +0 -0
  45. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/lxd/instance.py +0 -0
  46. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/oci/__init__.py +0 -0
  47. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/oci/cloud.py +0 -0
  48. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/oci/instance.py +0 -0
  49. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/oci/utils.py +0 -0
  50. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/openstack/__init__.py +0 -0
  51. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/openstack/cloud.py +0 -0
  52. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/openstack/errors.py +0 -0
  53. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/openstack/instance.py +0 -0
  54. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/py.typed +0 -0
  55. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/qemu/__init__.py +0 -0
  56. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/qemu/cloud.py +0 -0
  57. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/qemu/instance.py +0 -0
  58. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/qemu/util.py +0 -0
  59. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/result.py +0 -0
  60. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/util.py +0 -0
  61. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/vmware/__init__.py +0 -0
  62. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/vmware/cloud.py +0 -0
  63. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib/vmware/instance.py +0 -0
  64. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib.egg-info/SOURCES.txt +0 -0
  65. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib.egg-info/dependency_links.txt +0 -0
  66. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib.egg-info/requires.txt +0 -0
  67. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib.egg-info/top_level.txt +0 -0
  68. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pycloudlib.egg-info/zip-safe +0 -0
  69. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/pyproject.toml +0 -0
  70. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/requirements.txt +0 -0
  71. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/setup.cfg +0 -0
  72. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/setup.py +0 -0
  73. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/test-requirements.txt +0 -0
  74. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/__init__.py +0 -0
  75. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/conftest.py +0 -0
  76. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/__init__.py +0 -0
  77. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/gce/__init__.py +0 -0
  78. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/gce/test_launch.py +0 -0
  79. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/ibm/__init__.py +0 -0
  80. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/ibm/test_launch.py +0 -0
  81. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/integration_tests/test_qemu.py +0 -0
  82. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/__init__.py +0 -0
  83. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/azure/__init__.py +0 -0
  84. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/azure/test_cloud.py +0 -0
  85. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/azure/test_security_types.py +0 -0
  86. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ec2/__init__.py +0 -0
  87. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/gce/__init__.py +0 -0
  88. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/gce/test_cloud.py +0 -0
  89. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm/__init__.py +0 -0
  90. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm/test_cloud.py +0 -0
  91. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm/test_instance.py +0 -0
  92. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm/test_util.py +0 -0
  93. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm_classic/__init__.py +0 -0
  94. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/ibm_classic/test_cloud.py +0 -0
  95. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/lxd/__init__.py +0 -0
  96. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/lxd/test_cloud.py +0 -0
  97. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/lxd/test_defaults.py +0 -0
  98. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/lxd/test_images.py +0 -0
  99. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/lxd/test_instance.py +0 -0
  100. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/test_cloud.py +0 -0
  101. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/test_config.py +0 -0
  102. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/test_errors.py +0 -0
  103. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tests/unit_tests/test_instance.py +0 -0
  104. {pycloudlib-1!9.3.2 → pycloudlib-1!9.3.3}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!9.3.2
3
+ Version: 1!9.3.3
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!9.3.3
@@ -139,20 +139,24 @@ class EC2(BaseCloud):
139
139
  ):
140
140
  disk_type = "hvm-ssd" if release in NO_GP3_RELEASES else "hvm-ssd-gp3"
141
141
  if image_type in (ImageType.GENERIC, ImageType.MINIMAL):
142
- base_location = "ubuntu/{images_path}/{disk_type}".format(
143
- images_path="images-testing" if daily else "images",
144
- disk_type=disk_type,
142
+ base_location = "ubuntu{}/{}/{}".format(
143
+ "-minimal" if image_type == ImageType.MINIMAL else "",
144
+ "images-testing" if daily else "images",
145
+ disk_type,
145
146
  )
146
147
  if release in LTS_RELEASES:
147
- return "{}/ubuntu-{}{}-*-server{}-*".format(
148
+ return "{}/ubuntu-{}{}-*-{}-*".format(
148
149
  base_location,
149
150
  release,
150
151
  "-daily" if daily else "",
151
- "-minimal" if image_type == ImageType.MINIMAL else "",
152
+ "minimal" if image_type == ImageType.MINIMAL else "server",
152
153
  )
153
154
 
154
- return "{}/ubuntu-{}{}-*".format(
155
- base_location, release, "-daily" if daily else ""
155
+ return "{}/ubuntu-{}{}-*-{}-*".format(
156
+ base_location,
157
+ release,
158
+ "-daily" if daily else "",
159
+ "minimal" if image_type == ImageType.MINIMAL else "server",
156
160
  )
157
161
 
158
162
  release_ver = UBUNTU_RELEASE_VERSION_MAP.get(release)
@@ -125,8 +125,10 @@ class GCE(BaseCloud):
125
125
  self.instance_counter = count()
126
126
  # Prefer service_account_email from pycloudlib.toml and fallback to
127
127
  # the credentials listed in GOOGLE_APPLICATION_CREDENTIALS otherwise
128
- self.service_account_email = service_account_email or self.config.get(
129
- "service_account_email", credentials.service_account_email
128
+ self.service_account_email = (
129
+ service_account_email
130
+ or self.config.get("service_account_email")
131
+ or getattr(credentials, "service_account_email", None)
130
132
  )
131
133
 
132
134
  def released_image(
@@ -430,7 +432,9 @@ class GCE(BaseCloud):
430
432
  config.update(kwargs)
431
433
 
432
434
  if self.service_account_email:
433
- config["serviceAccounts"] = [{"email": self.service_account_email}]
435
+ config["service_accounts"] = [
436
+ {"email": self.service_account_email}
437
+ ]
434
438
 
435
439
  if user_data:
436
440
  user_metadata = {"key": "user-data", "value": user_data}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycloudlib
3
- Version: 1!9.3.2
3
+ Version: 1!9.3.3
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
@@ -24,11 +24,15 @@ def cloud(request):
24
24
  tag="pycl-test", timestamp_suffix=True
25
25
  ) as cloud_instance:
26
26
  if isinstance(cloud_instance, pycloudlib.EC2):
27
- cloud_instance.upload_key(
28
- public_key_path=cloud_instance.config["public_key_path"],
29
- private_key_path=cloud_instance.config["private_key_path"],
30
- name=cloud_instance.tag,
31
- )
27
+ # if key has already been uploaded, skip uploading it again.
28
+ # this is because the cloud instance is shared between tests and
29
+ # so the cloud does not clean up and remove the key between tests
30
+ if cloud_instance.tag not in cloud_instance.list_keys():
31
+ cloud_instance.upload_key(
32
+ public_key_path=cloud_instance.config["public_key_path"],
33
+ private_key_path=cloud_instance.config["private_key_path"],
34
+ name=cloud_instance.tag,
35
+ )
32
36
 
33
37
  yield cloud_instance
34
38
 
@@ -25,6 +25,7 @@ class TestEC2:
25
25
  @pytest.mark.parametrize(
26
26
  ["release", "image_type", "daily", "expected_name_filter"],
27
27
  [
28
+ # Test GENERIC with LTS release and daily = True
28
29
  pytest.param(
29
30
  "focal",
30
31
  ImageType.GENERIC,
@@ -45,7 +46,7 @@ class TestEC2:
45
46
  "jammy",
46
47
  ImageType.MINIMAL,
47
48
  True,
48
- "ubuntu/images-testing/hvm-ssd/ubuntu-jammy-daily-*-server-minimal-*",
49
+ "ubuntu-minimal/images-testing/hvm-ssd/ubuntu-jammy-daily-*-minimal-*",
49
50
  id="minimal-lts-daily",
50
51
  ),
51
52
  # Test MINIMAL with LTS release and daily = False
@@ -53,24 +54,56 @@ class TestEC2:
53
54
  "noble",
54
55
  ImageType.MINIMAL,
55
56
  False,
56
- "ubuntu/images/hvm-ssd-gp3/ubuntu-noble-*-server-minimal-*",
57
+ "ubuntu-minimal/images/hvm-ssd-gp3/ubuntu-noble-*-minimal-*",
57
58
  id="minimal-lts-non-daily",
58
59
  ),
59
- # Test PRO with non-LTS release
60
+ # Test PRO with LTS release
60
61
  pytest.param(
61
62
  "jammy",
62
63
  ImageType.PRO,
63
64
  False,
64
65
  "ubuntu-pro-server/images/hvm-ssd/ubuntu-jammy-22.04-*",
65
- id="pro-non-lts",
66
+ id="pro-lts",
66
67
  ),
67
- # Test PRO_FIPS with non-LTS release
68
+ # Test PRO_FIPS with LTS release
68
69
  pytest.param(
69
70
  "noble",
70
71
  ImageType.PRO_FIPS,
71
72
  False,
72
73
  "ubuntu-pro-fips*/images/hvm-ssd-gp3/ubuntu-noble-24.04-*",
73
- id="pro-fips-non-lts",
74
+ id="pro-fips-lts",
75
+ ),
76
+ # Test GENERIC with non-LTS release and daily = False
77
+ pytest.param(
78
+ "oracular",
79
+ ImageType.GENERIC,
80
+ False,
81
+ "ubuntu/images/hvm-ssd-gp3/ubuntu-oracular-*-server-*",
82
+ id="generic-non-lts-non-daily",
83
+ ),
84
+ # Test MINIMAL with non-LTS release and daily = False
85
+ pytest.param(
86
+ "oracular",
87
+ ImageType.MINIMAL,
88
+ False,
89
+ "ubuntu-minimal/images/hvm-ssd-gp3/ubuntu-oracular-*-minimal-*",
90
+ id="minimal-non-lts-non-daily",
91
+ ),
92
+ # Test GENERIC with non-LTS release and daily = True
93
+ pytest.param(
94
+ "oracular",
95
+ ImageType.GENERIC,
96
+ True,
97
+ "ubuntu/images-testing/hvm-ssd-gp3/ubuntu-oracular-daily-*-server-*",
98
+ id="generic-non-lts-daily",
99
+ ),
100
+ # Test MINIMAL with non-LTS release and daily = True
101
+ pytest.param(
102
+ "oracular",
103
+ ImageType.MINIMAL,
104
+ True,
105
+ "ubuntu-minimal/images-testing/hvm-ssd-gp3/ubuntu-oracular-daily-*-minimal-*",
106
+ id="minimal-non-lts-daily",
74
107
  ),
75
108
  ],
76
109
  )
@@ -91,6 +124,17 @@ class TestEC2:
91
124
  )
92
125
  assert result == expected_name_filter
93
126
 
127
+ def test_get_name_for_image_type_invalid_image_type(self):
128
+ """
129
+ Test the _get_name_for_image_type() method with an invalid ImageType
130
+ """
131
+ ec2 = FakeEC2()
132
+ with pytest.raises(ValueError) as exc_info:
133
+ ec2._get_name_for_image_type(
134
+ release="focal", image_type=None, daily=True
135
+ )
136
+ assert "Invalid image_type" in str(exc_info.value)
137
+
94
138
  def test_get_owner_for_all_image_types(self):
95
139
  """
96
140
  Test the _get_project() method against all possible ImageType enum values
@@ -1 +0,0 @@
1
- 1!9.3.2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes