1
0

- Replace support-pytest-8.2.patch:

* The existing patch unintentionally skips a lot of the testsuite.

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-apache-libcloud?expand=0&rev=137
This commit is contained in:
Steve Kowalik 2024-09-03 04:50:47 +00:00 committed by Git OBS Bridge
commit 5dcb7e8dbd
11 changed files with 4017 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

BIN
apache-libcloud-3.8.0.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
-----BEGIN PGP SIGNATURE-----
iQKlBAABCgCPFiEEmXgo3GL3Wc6hidZeLAdUss4GkvMFAmTP0UZfFIAAAAAALgAo
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDk5
NzgyOERDNjJGNzU5Q0VBMTg5RDY1RTJDMDc1NEIyQ0UwNjkyRjMRHHRvbWF6QGFw
YWNoZS5vcmcACgkQLAdUss4GkvOzOg//WBt4g+CvH3qfi2ChvLHSuzjNxszgTnvB
bVkDsvqJNQlZPEQ+a5l/ZLgRYr7L2trOvqqzVBjEmCq8I0u3GYlOwiBRfmEKLKXO
jRlrMME9swRJJ9KS1slaT9vAuZ5RB8wyzAsJfT45QFXLGpgSW3pGQ9KpX0ZBvvCc
FvWZqBR3wCtc7mcq4e6kj/6pR93WszeTmkZC57JFiAQclhxd0/wPecDKOSZT0ro3
vXvN6Bm5m0NOIx8zAQpyPprT3EIHXp3FiBTPzqwZQVtcPsx5upjswMknEBlj2L9G
JhOh3Emq29byWKtM/++dF1QCICieCmDcW/4Bk1kyslXyloC2SeiBhr1u4gdL6tlO
L5Z1zcLjl8McCWVBbTjNbn9H92t3TPozgSVx2+e4Zsb0T5XirQL2iwCfoZAscjrX
DrvbY9bzSvrjz1EDoxqp3/oN8nUeHMVd7eQfx4aOnr1cAWROlRNSHx2p1De8Gamx
7nbyaFsdJSwIeTn6CtJ6vpWzqtwWdBYlJrOkhv33ElPD+KhHUsv92utE809weCfY
PdFruz8Hu2FvIOiqJQD7sMSfo+FWz22kKzz/Sv0TqL4qIjfoMyFYQ/i0Y5vUdWcM
CzGXc154x/njmZYApK5EYS9F1b94LOIrHfZgQHVIXmeojQnwEGevvjLPbleOnC9N
v4k0idgyEns=
=RMm3
-----END PGP SIGNATURE-----

24
ec2_create_node.patch Normal file
View File

@ -0,0 +1,24 @@
Index: apache-libcloud-3.5.1/libcloud/compute/drivers/ec2.py
===================================================================
--- apache-libcloud-3.5.1.orig/libcloud/compute/drivers/ec2.py
+++ apache-libcloud-3.5.1/libcloud/compute/drivers/ec2.py
@@ -1622,12 +1622,18 @@ class BaseEC2NodeDriver(NodeDriver):
on-demand price will be used.
:type ex_spot_max_price: ``float``
"""
+
+ try:
+ instance_type = size.id
+ except AttributeError:
+ instance_type = size
+
params = {
"Action": "RunInstances",
"ImageId": image.id,
"MinCount": str(ex_mincount),
"MaxCount": str(ex_maxcount),
- "InstanceType": size.id,
+ "InstanceType": instance_type,
}
if ex_terminate_on_shutdown:

39
gce_image_projects.patch Normal file
View File

@ -0,0 +1,39 @@
Index: apache-libcloud-3.5.1/libcloud/compute/drivers/gce.py
===================================================================
--- apache-libcloud-3.5.1.orig/libcloud/compute/drivers/gce.py
+++ apache-libcloud-3.5.1/libcloud/compute/drivers/gce.py
@@ -1981,12 +1981,19 @@ class GCENodeDriver(NodeDriver):
"debian-cloud": ["debian-8", "debian-9", "debian-10"],
"opensuse-cloud": ["opensuse-leap"],
"rhel-cloud": ["rhel-6", "rhel-7", "rhel-8"],
- "suse-cloud": ["sles-11", "sles-12", "sles-15"],
+ "suse-cloud": ["sles-12", "sles-15"],
"suse-byos-cloud": [
"sles-11-byos",
"sles-12-byos",
+ "sles-15-byos",
+ "sles-12-sp1-sap-byos",
"sles-12-sp2-sap-byos",
"sles-12-sp3-sap-byos",
+ "sles-12-sp4-sap-byos",
+ "sles-12-sp5-sap-byos",
+ "sles-15-sap-byos",
+ "sles-15-sp1-sap-byos",
+ "sles-15-sp1-chost-byos",
"suse-manager-proxy-byos",
"suse-manager-server-byos",
],
@@ -1994,7 +2001,13 @@ class GCENodeDriver(NodeDriver):
"sles-12-sp2-sap",
"sles-12-sp3-sap",
"sles-12-sp4-sap",
+ "sles-12-sp5-sap",
"sles-15-sap",
+ "sles-15-sp1-sap",
+ ],
+ "suse-sap-cal-cloud": [
+ "sles-12-sp1-sapcal",
+ "sles-12-sp3-sapcal",
],
"ubuntu-os-cloud": [
"ubuntu-1404-lts",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

107
python-apache-libcloud.spec Normal file
View File

@ -0,0 +1,107 @@
#
# spec file for package python-apache-libcloud
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%{?sle15_python_module_pythons}
Name: python-apache-libcloud
Version: 3.8.0
Release: 0
Summary: Abstraction over multiple cloud provider APIs
License: Apache-2.0
URL: https://libcloud.apache.org
Source0: https://downloads.apache.org/libcloud/apache-libcloud-%{version}.tar.gz
Source1: https://downloads.apache.org/libcloud/apache-libcloud-%{version}.tar.gz.asc
# https://libcloud.apache.org/downloads.html#package-verification-guide
Source2: https://www.apache.org/dist/libcloud/KEYS#/%{name}.keyring
Patch1: gce_image_projects.patch
Patch2: ec2_create_node.patch
# PATCH-FIX-UPSTREAM gh#apache/libcloud#1994
Patch3: support-pytest-8.patch
# PATCH-FIX-UPSTREAM gh#apache/libcloud#2033
Patch4: support-pytest-8.2.patch
BuildRequires: %{python_module base >= 3.7}
BuildRequires: %{python_module fasteners}
BuildRequires: %{python_module libvirt-python}
BuildRequires: %{python_module paramiko}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module pyOpenSSL}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module requests-mock}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module wheel}
BuildRequires: %{python_module xml}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-requests
Suggests: python-libvirt-python
Suggests: python-fastners
Suggests: python-paramiko
Suggests: python-pysphere
BuildArch: noarch
%python_subpackages
%description
Apache Libcloud is a standard Python library that abstracts away
differences among multiple cloud provider APIs.
%prep
%autosetup -p1 -n apache-libcloud-%{version}
sed -i '/^#!/d' demos/gce_demo.py
chmod a-x demos/gce_demo.py
# Setup tests
cp libcloud/test/secrets.py-dist libcloud/test/secrets.py
%build
%pyproject_wheel
%install
%pyproject_install
find %{buildroot} -name '*.DS_Store' -delete
find %{buildroot} -name '*.json' -size 0 -delete
find %{buildroot} -name '*.pem' -size 0 -delete
%python_expand rm -r %{buildroot}%{$python_sitelib}/libcloud/test
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
# Skip OvhTests::test_list_nodes_invalid_region which tries to reach OVH servers
donttest="test_consume_stderr_chunk_contains_part_of_multi_byte_utf8_character"
donttest+=" or test_consume_stdout_chunk_contains_part_of_multi_byte_utf8_character"
donttest+=" or test_consume_stdout_chunk_contains_non_utf8_character"
donttest+=" or test_consume_stderr_chunk_contains_non_utf8_character"
# Skip test_key_file_non_pem_format_error since OpenSSH support is backported for SLE python-paramiko < 2.7.0
donttest+=" or test_key_file_non_pem_format_error"
# Skip ShellOutSSHClientTests tests which attempt to ssh to localhost
donttest+=" or ShellOutSSHClientTests"
# Note these four extra py3 failures are undesirable and should be fixed: fail in s390 and ppc64
donttest+=" or ElasticContainerDriverTestCase"
donttest+=" or test_list_nodes_invalid_region"
donttest+=" or test_connection_timeout_raised"
donttest+=" or test_retry_on_all_default_retry_exception_classes"
# Works upstream, requires other changes made, drop after upgrade
# from 3.8.0
donttest+=" or test_init_once_and_debug_mode"
%pytest -k "not ($donttest)"
%files %{python_files}
%license LICENSE
%doc CHANGES.rst README.rst demos/ example_*.py
%{python_sitelib}/libcloud
%{python_sitelib}/apache_libcloud-%{version}.dist-info
%changelog

39
support-pytest-8.2.patch Normal file
View File

@ -0,0 +1,39 @@
From 44e923662205f2a2413fadb23715dc2934bff625 Mon Sep 17 00:00:00 2001
From: Steve Kowalik <steven@wedontsleep.org>
Date: Tue, 3 Sep 2024 14:30:51 +1000
Subject: [PATCH] Only call super() during MockHttp if required
With pytest 8.2 and above, any class that contains classes is collected,
which means they are instantiated, which MockHttp's superclasses do not
accept, since they require keyword arguments. To work around this, only
call the superclass's __init__ method if we are passed kwargs.
---
libcloud/test/__init__.py | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libcloud/test/__init__.py b/libcloud/test/__init__.py
index d45c82c84d..1cc595f685 100644
--- a/libcloud/test/__init__.py
+++ b/libcloud/test/__init__.py
@@ -87,7 +87,7 @@ def read(self, chunk_size=None):
return StringIO.read(self)
-class MockHttp(LibcloudConnection):
+class MockHttp(LibcloudConnection, unittest.TestCase):
"""
A mock HTTP client/server suitable for testing purposes. This replaces
`HTTPConnection` by implementing its API and returning a mock response.
@@ -108,7 +108,11 @@ def __init__(self, *args, **kwargs):
# within a response
if isinstance(self, unittest.TestCase):
unittest.TestCase.__init__(self, "__init__")
- super().__init__(*args, **kwargs)
+ # When this class is collected, it is instantiated with no arguments,
+ # which breaks any superclasses that expect arguments, so only
+ # do so if we were passed any keyword arguments.
+ if kwargs:
+ super().__init__(*args, **kwargs)
def _get_request(self, method, url, body=None, headers=None):
# Find a method we can use for this request

440
support-pytest-8.patch Normal file
View File

@ -0,0 +1,440 @@
From 6a646d0c3fd3c1d33183bb338235aaa43f86d1f8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 26 Feb 2024 17:44:37 +0000
Subject: [PATCH 01/15] Bump pytest from 7.4.0 to 8.0.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 8.0.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...8.0.2)
---
updated-dependencies:
- dependency-name: pytest
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---
requirements-tests.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: apache-libcloud-3.8.0/requirements-tests.txt
===================================================================
--- apache-libcloud-3.8.0.orig/requirements-tests.txt
+++ apache-libcloud-3.8.0/requirements-tests.txt
@@ -1,7 +1,7 @@
coverage[toml]==7.2.7; python_version >= '3.8'
requests>=2.31.0
requests_mock==1.11.0
-pytest==7.4.0
+pytest==8.0.2
pytest-xdist==3.3.1
pytest-timeout==2.1.0
pytest-benchmark[histogram]==4.0.0
Index: apache-libcloud-3.8.0/tox.ini
===================================================================
--- apache-libcloud-3.8.0.orig/tox.ini
+++ apache-libcloud-3.8.0/tox.ini
@@ -39,8 +39,11 @@ setenv =
# To avoid per-test function process safety issues we run all tests in a single
# file in the same worker process.
# for pytest-xdist, we want to distribute tests by file aka --dist loadfile
+# Tests which are not safe to run in paralell are marked with "serial" tag
+# and run separately at the end
commands = cp libcloud/test/secrets.py-dist libcloud/test/secrets.py
- pytest --color=yes -rsx -vvv --capture=tee-sys -o log_cli=True --durations=10 --timeout=15 -n auto --dist loadfile --ignore libcloud/test/benchmarks/ --ignore-glob "*test_list_objects_filtering_performance*"
+ pytest --color=yes -rsx -vvv --capture=tee-sys -o log_cli=True --durations=10 --timeout=15 -n auto --dist loadfile --ignore libcloud/test/benchmarks/ --ignore-glob "*test_list_objects_filtering_performance*" -m "not serial"
+ pytest --color=yes -rsx -vvv --capture=tee-sys -o log_cli=True --durations=10 --timeout=15 --ignore libcloud/test/benchmarks/ --ignore-glob "*test_list_objects_filtering_performance*" -m "serial"
[testenv:py3.6-dist]
# Verify library installs without any dependencies when using python setup.py
Index: apache-libcloud-3.8.0/libcloud/test/test_init.py
===================================================================
--- apache-libcloud-3.8.0.orig/libcloud/test/test_init.py
+++ apache-libcloud-3.8.0/libcloud/test/test_init.py
@@ -19,6 +19,8 @@ import logging
import tempfile
from unittest.mock import patch
+import pytest
+
import libcloud
from libcloud import _init_once
from libcloud.base import DriverTypeNotFoundError
@@ -38,6 +40,7 @@ class TestUtils(unittest.TestCase):
if "LIBCLOUD_DEBUG" in os.environ:
del os.environ["LIBCLOUD_DEBUG"]
+ @pytest.mark.serial
def test_init_once_and_debug_mode(self):
if have_paramiko:
paramiko_logger = logging.getLogger("paramiko")
Index: apache-libcloud-3.8.0/libcloud/test/common/test_digitalocean_v2.py
===================================================================
--- apache-libcloud-3.8.0.orig/libcloud/test/common/test_digitalocean_v2.py
+++ apache-libcloud-3.8.0/libcloud/test/common/test_digitalocean_v2.py
@@ -15,22 +15,28 @@
import sys
import unittest
+from libcloud.http import LibcloudConnection
from libcloud.test import MockHttp, LibcloudTestCase
from libcloud.utils.py3 import httplib
from libcloud.common.types import InvalidCredsError
from libcloud.test.secrets import DIGITALOCEAN_v2_PARAMS
from libcloud.test.file_fixtures import FileFixtures
-from libcloud.common.digitalocean import DigitalOceanBaseDriver
+from libcloud.common.digitalocean import DigitalOceanBaseDriver, DigitalOcean_v2_BaseDriver
class DigitalOceanTests(LibcloudTestCase):
def setUp(self):
- DigitalOceanBaseDriver.connectionCls.conn_class = DigitalOceanMockHttp
- DigitalOceanMockHttp.type = None
+ DigitalOceanBaseDriver.connectionCls.conn_class = DigitalOceanCommonMockHttp
+ DigitalOcean_v2_BaseDriver.connectionCls.conn_class = DigitalOceanCommonMockHttp
+ DigitalOceanCommonMockHttp.type = None
self.driver = DigitalOceanBaseDriver(*DIGITALOCEAN_v2_PARAMS)
+ def tearDown(self):
+ LibcloudConnection.type = None
+ DigitalOceanCommonMockHttp.type = None
+
def test_authentication(self):
- DigitalOceanMockHttp.type = "UNAUTHORIZED"
+ DigitalOceanCommonMockHttp.type = "UNAUTHORIZED"
self.assertRaises(InvalidCredsError, self.driver.ex_account_info)
def test_ex_account_info(self):
@@ -51,13 +57,13 @@ class DigitalOceanTests(LibcloudTestCase
self.assertEqual(action["type"], "power_on")
def test__paginated_request(self):
- DigitalOceanMockHttp.type = "page_1"
+ DigitalOceanCommonMockHttp.type = "page_1"
actions = self.driver._paginated_request("/v2/actions", "actions")
self.assertEqual(actions[0]["id"], 12345671)
self.assertEqual(actions[0]["status"], "completed")
-class DigitalOceanMockHttp(MockHttp):
+class DigitalOceanCommonMockHttp(MockHttp):
fixtures = FileFixtures("common", "digitalocean")
response = {
Index: apache-libcloud-3.8.0/libcloud/test/compute/test_digitalocean_v2.py
===================================================================
--- apache-libcloud-3.8.0.orig/libcloud/test/compute/test_digitalocean_v2.py
+++ apache-libcloud-3.8.0/libcloud/test/compute/test_digitalocean_v2.py
@@ -16,6 +16,7 @@ import sys
import unittest
from datetime import datetime
+from libcloud.http import LibcloudConnection
from libcloud.test import MockHttp, LibcloudTestCase
from libcloud.utils.py3 import httplib, assertRaisesRegex
from libcloud.common.types import InvalidCredsError
@@ -23,8 +24,15 @@ from libcloud.compute.base import NodeIm
from libcloud.test.secrets import DIGITALOCEAN_v1_PARAMS, DIGITALOCEAN_v2_PARAMS
from libcloud.utils.iso8601 import UTC
from libcloud.test.file_fixtures import ComputeFileFixtures
-from libcloud.common.digitalocean import DigitalOcean_v1_Error
-from libcloud.compute.drivers.digitalocean import DigitalOceanNodeDriver
+from libcloud.common.digitalocean import (
+ DigitalOcean_v1_Error,
+ DigitalOceanBaseDriver,
+ DigitalOcean_v2_BaseDriver,
+)
+from libcloud.compute.drivers.digitalocean import (
+ DigitalOceanNodeDriver,
+ DigitalOcean_v2_NodeDriver,
+)
try:
import simplejson as json
@@ -35,10 +43,17 @@ except ImportError:
# class DigitalOceanTests(unittest.TestCase, TestCaseMixin):
class DigitalOcean_v2_Tests(LibcloudTestCase):
def setUp(self):
- DigitalOceanNodeDriver.connectionCls.conn_class = DigitalOceanMockHttp
- DigitalOceanMockHttp.type = None
+ DigitalOceanBaseDriver.connectionCls.conn_class = DigitalOceanComputeMockHttp
+ DigitalOcean_v2_BaseDriver.connectionCls.conn_class = DigitalOceanComputeMockHttp
+ DigitalOceanNodeDriver.connectionCls.conn_class = DigitalOceanComputeMockHttp
+ DigitalOcean_v2_NodeDriver.connectionCls.conn_class = DigitalOceanComputeMockHttp
+ DigitalOceanComputeMockHttp.type = None
self.driver = DigitalOceanNodeDriver(*DIGITALOCEAN_v2_PARAMS)
+ def tearDown(self):
+ LibcloudConnection.type = None
+ DigitalOceanComputeMockHttp.type = None
+
def test_v1_Error(self):
self.assertRaises(
DigitalOcean_v1_Error,
@@ -56,7 +71,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
)
def test_authentication(self):
- DigitalOceanMockHttp.type = "UNAUTHORIZED"
+ DigitalOceanComputeMockHttp.type = "UNAUTHORIZED"
self.assertRaises(InvalidCredsError, self.driver.list_nodes)
def test_list_images_success(self):
@@ -128,7 +143,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
size = self.driver.list_sizes()[0]
location = self.driver.list_locations()[0]
- DigitalOceanMockHttp.type = "INVALID_IMAGE"
+ DigitalOceanComputeMockHttp.type = "INVALID_IMAGE"
expected_msg = (
r"You specified an invalid image for Droplet creation."
+ r" \(code: (404|HTTPStatus.NOT_FOUND)\)"
@@ -146,13 +161,13 @@ class DigitalOcean_v2_Tests(LibcloudTest
def test_reboot_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "REBOOT"
+ DigitalOceanComputeMockHttp.type = "REBOOT"
result = self.driver.reboot_node(node)
self.assertTrue(result)
def test_create_image_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "SNAPSHOT"
+ DigitalOceanComputeMockHttp.type = "SNAPSHOT"
result = self.driver.create_image(node, "My snapshot")
self.assertTrue(result)
@@ -164,62 +179,62 @@ class DigitalOcean_v2_Tests(LibcloudTest
def test_delete_image_success(self):
image = self.driver.get_image(12345)
- DigitalOceanMockHttp.type = "DESTROY"
+ DigitalOceanComputeMockHttp.type = "DESTROY"
result = self.driver.delete_image(image)
self.assertTrue(result)
def test_ex_power_on_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "POWERON"
+ DigitalOceanComputeMockHttp.type = "POWERON"
result = self.driver.ex_power_on_node(node)
self.assertTrue(result)
def test_ex_shutdown_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "SHUTDOWN"
+ DigitalOceanComputeMockHttp.type = "SHUTDOWN"
result = self.driver.ex_shutdown_node(node)
self.assertTrue(result)
def test_ex_hard_reboot_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "POWERCYCLE"
+ DigitalOceanComputeMockHttp.type = "POWERCYCLE"
result = self.driver.ex_hard_reboot(node)
self.assertTrue(result)
def test_ex_rebuild_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "REBUILD"
+ DigitalOceanComputeMockHttp.type = "REBUILD"
result = self.driver.ex_rebuild_node(node)
self.assertTrue(result)
def test_ex_resize_node_success(self):
node = self.driver.list_nodes()[0]
size = self.driver.list_sizes()[0]
- DigitalOceanMockHttp.type = "RESIZE"
+ DigitalOceanComputeMockHttp.type = "RESIZE"
result = self.driver.ex_resize_node(node, size)
self.assertTrue(result)
def test_destroy_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "DESTROY"
+ DigitalOceanComputeMockHttp.type = "DESTROY"
result = self.driver.destroy_node(node)
self.assertTrue(result)
def test_ex_change_kernel_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "KERNELCHANGE"
+ DigitalOceanComputeMockHttp.type = "KERNELCHANGE"
result = self.driver.ex_change_kernel(node, 7515)
self.assertTrue(result)
def test_ex_enable_ipv6_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "ENABLEIPV6"
+ DigitalOceanComputeMockHttp.type = "ENABLEIPV6"
result = self.driver.ex_enable_ipv6(node)
self.assertTrue(result)
def test_ex_rename_node_success(self):
node = self.driver.list_nodes()[0]
- DigitalOceanMockHttp.type = "RENAME"
+ DigitalOceanComputeMockHttp.type = "RENAME"
result = self.driver.ex_rename_node(node, "fedora helios")
self.assertTrue(result)
@@ -231,7 +246,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
self.assertEqual(keys[0].public_key, "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQDGk5 example")
def test_create_key_pair(self):
- DigitalOceanMockHttp.type = "CREATE"
+ DigitalOceanComputeMockHttp.type = "CREATE"
key = self.driver.create_key_pair(
name="test1", public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQsxRiUKn example"
)
@@ -250,7 +265,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
self.assertEqual(nodes[0]["size_slug"], "s-1vcpu-1gb")
def test__paginated_request_two_pages(self):
- DigitalOceanMockHttp.type = "PAGE_ONE"
+ DigitalOceanComputeMockHttp.type = "PAGE_ONE"
nodes = self.driver._paginated_request("/v2/droplets", "droplets")
self.assertEqual(len(nodes), 2)
@@ -264,13 +279,13 @@ class DigitalOcean_v2_Tests(LibcloudTest
self.assertEqual(volume.driver, self.driver)
def test_list_volumes_empty(self):
- DigitalOceanMockHttp.type = "EMPTY"
+ DigitalOceanComputeMockHttp.type = "EMPTY"
volumes = self.driver.list_volumes()
self.assertEqual(len(volumes), 0)
def test_create_volume(self):
nyc1 = [r for r in self.driver.list_locations() if r.id == "nyc1"][0]
- DigitalOceanMockHttp.type = "CREATE"
+ DigitalOceanComputeMockHttp.type = "CREATE"
volume = self.driver.create_volume(4, "example", nyc1)
self.assertEqual(volume.id, "62766883-2c28-11e6-b8e6-000f53306ae1")
self.assertEqual(volume.name, "example")
@@ -280,19 +295,19 @@ class DigitalOcean_v2_Tests(LibcloudTest
def test_attach_volume(self):
node = self.driver.list_nodes()[0]
volume = self.driver.list_volumes()[0]
- DigitalOceanMockHttp.type = "ATTACH"
+ DigitalOceanComputeMockHttp.type = "ATTACH"
resp = self.driver.attach_volume(node, volume)
self.assertTrue(resp)
def test_detach_volume(self):
volume = self.driver.list_volumes()[0]
- DigitalOceanMockHttp.type = "DETACH"
+ DigitalOceanComputeMockHttp.type = "DETACH"
resp = self.driver.detach_volume(volume)
self.assertTrue(resp)
def test_destroy_volume(self):
volume = self.driver.list_volumes()[0]
- DigitalOceanMockHttp.type = "DESTROY"
+ DigitalOceanComputeMockHttp.type = "DESTROY"
resp = self.driver.destroy_volume(volume)
self.assertTrue(resp)
@@ -307,7 +322,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
def test_create_volume_snapshot(self):
volume = self.driver.list_volumes()[0]
- DigitalOceanMockHttp.type = "CREATE"
+ DigitalOceanComputeMockHttp.type = "CREATE"
snapshot = self.driver.create_volume_snapshot(volume, "test-snapshot")
self.assertEqual(snapshot.id, "c0def940-9324-11e6-9a56-000f533176b1")
self.assertEqual(snapshot.name, "test-snapshot")
@@ -316,7 +331,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
def test_delete_volume_snapshot(self):
volume = self.driver.list_volumes()[0]
snapshot = self.driver.list_volume_snapshots(volume)[0]
- DigitalOceanMockHttp.type = "DELETE"
+ DigitalOceanComputeMockHttp.type = "DELETE"
result = self.driver.delete_volume_snapshot(snapshot)
self.assertTrue(result)
@@ -396,7 +411,7 @@ class DigitalOcean_v2_Tests(LibcloudTest
self.assertTrue(ret)
-class DigitalOceanMockHttp(MockHttp):
+class DigitalOceanComputeMockHttp(MockHttp):
fixtures = ComputeFileFixtures("digitalocean_v2")
def _v2_regions(self, method, url, body, headers):
Index: apache-libcloud-3.8.0/libcloud/test/dns/test_digitalocean.py
===================================================================
--- apache-libcloud-3.8.0.orig/libcloud/test/dns/test_digitalocean.py
+++ apache-libcloud-3.8.0/libcloud/test/dns/test_digitalocean.py
@@ -15,20 +15,28 @@
import sys
import unittest
+from libcloud.http import LibcloudConnection
from libcloud.test import MockHttp, LibcloudTestCase
from libcloud.dns.types import RecordType
from libcloud.utils.py3 import httplib
from libcloud.test.secrets import DIGITALOCEAN_v2_PARAMS
from libcloud.test.file_fixtures import DNSFileFixtures
+from libcloud.common.digitalocean import DigitalOceanBaseDriver, DigitalOcean_v2_BaseDriver
from libcloud.dns.drivers.digitalocean import DigitalOceanDNSDriver
class DigitalOceanDNSTests(LibcloudTestCase):
def setUp(self):
+ DigitalOceanBaseDriver.connectionCls.conn_class = DigitalOceanDNSMockHttp
+ DigitalOcean_v2_BaseDriver.connectionCls.conn_class = DigitalOceanDNSMockHttp
DigitalOceanDNSDriver.connectionCls.conn_class = DigitalOceanDNSMockHttp
DigitalOceanDNSMockHttp.type = None
self.driver = DigitalOceanDNSDriver(*DIGITALOCEAN_v2_PARAMS)
+ def tearDown(self):
+ LibcloudConnection.type = None
+ DigitalOceanDNSMockHttp.type = None
+
def test_list_zones(self):
zones = self.driver.list_zones()
self.assertTrue(len(zones) >= 1)
Index: apache-libcloud-3.8.0/libcloud/test/__init__.py
===================================================================
--- apache-libcloud-3.8.0.orig/libcloud/test/__init__.py
+++ apache-libcloud-3.8.0/libcloud/test/__init__.py
@@ -205,7 +205,7 @@ class MockHttp(LibcloudConnection):
) # Python 3.7 no longer quotes ~
if type:
- meth_name = "{}_{}".format(meth_name, self.type)
+ meth_name = "{}_{}".format(meth_name, type)
if use_param and use_param in qs:
param = qs[use_param][0].replace(".", "_").replace("-", "_")
Index: apache-libcloud-3.8.0/CHANGES.rst
===================================================================
--- apache-libcloud-3.8.0.orig/CHANGES.rst
+++ apache-libcloud-3.8.0/CHANGES.rst
@@ -1,6 +1,22 @@
Changelog
=========
+Other / Development
+~~~~~--------------
+
+- pytest library used for running tests and microbenchmarks has been upgraded to
+ v8.1.
+
+ Changes in the pytest test discovery and collection mechanism and ordering
+ have uncovered some race conditions and cross test pollution which has been
+ addressed.
+
+ Now all the tests are passing, but it's possible that there are still some
+ race conditions hiding which many only pop up in the future (since we run
+ tests in parallel and order in which they run is not fully deterministic).
+ (#1994)
+ [Tomaz Muraus - @Kami]
+
Changes in Apache Libcloud 3.8.0
--------------------------------