Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ansible-core-2.17 for openSUSE:Factory checked in at 2025-02-25 16:58:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ansible-core-2.17 (Old) and /work/SRC/openSUSE:Factory/.ansible-core-2.17.new.1873 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-core-2.17" Tue Feb 25 16:58:28 2025 rev:4 rq:1248286 version:2.17.9 Changes: -------- --- /work/SRC/openSUSE:Factory/ansible-core-2.17/ansible-core-2.17.changes 2025-01-29 16:18:49.172473467 +0100 +++ /work/SRC/openSUSE:Factory/.ansible-core-2.17.new.1873/ansible-core-2.17.changes 2025-02-25 16:58:39.570714591 +0100 @@ -1,0 +2,14 @@ +Tue Feb 25 06:43:25 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- update to 2.17.9: + * Minor Changes + - ansible-test - Automatically retry HTTP GET/PUT/DELETE + requests on exceptions. + - ansible-test - Use Python's urllib instead of curl for HTTP + requests. + * Bugfixes + - include_vars - fixed erroneous warning if an unreserved + variable name contains a single character that matches a + reserved variable. (#84623) + +------------------------------------------------------------------- Old: ---- ansible_core-2.17.8.tar.gz ansible_core-2.17.8.tar.gz.sha256 New: ---- ansible_core-2.17.9.tar.gz ansible_core-2.17.9.tar.gz.sha256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ansible-core-2.17.spec ++++++ --- /var/tmp/diff_new_pack.0c0yeB/_old 2025-02-25 16:58:42.218825548 +0100 +++ /var/tmp/diff_new_pack.0c0yeB/_new 2025-02-25 16:58:42.218825548 +0100 @@ -43,7 +43,7 @@ %endif Name: ansible-core-2.17 -Version: 2.17.8 +Version: 2.17.9 Release: 0 Summary: Radically simple IT automation License: GPL-3.0-or-later ++++++ ansible_core-2.17.8.tar.gz -> ansible_core-2.17.9.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/PKG-INFO new/ansible_core-2.17.9/PKG-INFO --- old/ansible_core-2.17.8/PKG-INFO 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/PKG-INFO 2025-02-24 20:31:50.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.2 Name: ansible-core -Version: 2.17.8 +Version: 2.17.9 Summary: Radically simple IT automation Home-page: https://ansible.com/ Author: Ansible, Inc. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/changelogs/CHANGELOG-v2.17.rst new/ansible_core-2.17.9/changelogs/CHANGELOG-v2.17.rst --- old/ansible_core-2.17.8/changelogs/CHANGELOG-v2.17.rst 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/changelogs/CHANGELOG-v2.17.rst 2025-02-24 20:31:50.000000000 +0100 @@ -4,6 +4,26 @@ .. contents:: Topics +v2.17.9 +======= + +Release Summary +--------------- + +| Release Date: 2025-02-24 +| `Porting Guide <https://docs.ansible.com/ansible-core/2.17/porting_guides/porting_guide_core_2.17.html>`__ + +Minor Changes +------------- + +- ansible-test - Automatically retry HTTP GET/PUT/DELETE requests on exceptions. +- ansible-test - Use Python's ``urllib`` instead of ``curl`` for HTTP requests. + +Bugfixes +-------- + +- include_vars - fixed erroneous warning if an unreserved variable name contains a single character that matches a reserved variable. (https://github.com/ansible/ansible/issues/84623) + v2.17.8 ======= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/changelogs/changelog.yaml new/ansible_core-2.17.9/changelogs/changelog.yaml --- old/ansible_core-2.17.8/changelogs/changelog.yaml 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/changelogs/changelog.yaml 2025-02-24 20:31:50.000000000 +0100 @@ -1076,3 +1076,33 @@ - reserved_module_chekc.yml - vault_cli_fix.yml release_date: '2025-01-20' + 2.17.9: + changes: + release_summary: '| Release Date: 2025-02-24 + + | `Porting Guide <https://docs.ansible.com/ansible-core/2.17/porting_guides/porting_guide_core_2.17.html>`__ + + ' + codename: Gallows Pole + fragments: + - 2.17.9_summary.yaml + release_date: '2025-02-24' + 2.17.9rc1: + changes: + bugfixes: + - include_vars - fixed erroneous warning if an unreserved variable name contains + a single character that matches a reserved variable. (https://github.com/ansible/ansible/issues/84623) + minor_changes: + - ansible-test - Automatically retry HTTP GET/PUT/DELETE requests on exceptions. + - ansible-test - Use Python's ``urllib`` instead of ``curl`` for HTTP requests. + release_summary: '| Release Date: 2025-02-17 + + | `Porting Guide <https://docs.ansible.com/ansible-core/2.17/porting_guides/porting_guide_core_2.17.html>`__ + + ' + codename: Gallows Pole + fragments: + - 2.17.9rc1_summary.yaml + - ansible-test-curl.yml + - fix-include_vars-reserved-warning.yml + release_date: '2025-02-17' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/lib/ansible/module_utils/ansible_release.py new/ansible_core-2.17.9/lib/ansible/module_utils/ansible_release.py --- old/ansible_core-2.17.8/lib/ansible/module_utils/ansible_release.py 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/lib/ansible/module_utils/ansible_release.py 2025-02-24 20:31:50.000000000 +0100 @@ -17,6 +17,6 @@ from __future__ import annotations -__version__ = '2.17.8' +__version__ = '2.17.9' __author__ = 'Ansible, Inc.' __codename__ = "Gallows Pole" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/lib/ansible/release.py new/ansible_core-2.17.9/lib/ansible/release.py --- old/ansible_core-2.17.8/lib/ansible/release.py 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/lib/ansible/release.py 2025-02-24 20:31:50.000000000 +0100 @@ -17,6 +17,6 @@ from __future__ import annotations -__version__ = '2.17.8' +__version__ = '2.17.9' __author__ = 'Ansible, Inc.' __codename__ = "Gallows Pole" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/lib/ansible/vars/manager.py new/ansible_core-2.17.9/lib/ansible/vars/manager.py --- old/ansible_core-2.17.8/lib/ansible/vars/manager.py 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/lib/ansible/vars/manager.py 2025-02-24 20:31:50.000000000 +0100 @@ -742,7 +742,7 @@ Sets a value in the vars_cache for a host. """ - warn_if_reserved(varname) + warn_if_reserved([varname]) if host not in self._vars_cache: self._vars_cache[host] = dict() if varname in self._vars_cache[host] and isinstance(self._vars_cache[host][varname], MutableMapping) and isinstance(value, MutableMapping): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/lib/ansible_core.egg-info/PKG-INFO new/ansible_core-2.17.9/lib/ansible_core.egg-info/PKG-INFO --- old/ansible_core-2.17.8/lib/ansible_core.egg-info/PKG-INFO 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/lib/ansible_core.egg-info/PKG-INFO 2025-02-24 20:31:50.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.2 Name: ansible-core -Version: 2.17.8 +Version: 2.17.9 Summary: Radically simple IT automation Home-page: https://ansible.com/ Author: Ansible, Inc. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/lib/ansible_core.egg-info/SOURCES.txt new/ansible_core-2.17.9/lib/ansible_core.egg-info/SOURCES.txt --- old/ansible_core-2.17.8/lib/ansible_core.egg-info/SOURCES.txt 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/lib/ansible_core.egg-info/SOURCES.txt 2025-02-24 20:31:50.000000000 +0100 @@ -3856,11 +3856,13 @@ test/integration/targets/var_precedence/vars/test_var_precedence.yml test/integration/targets/var_reserved/aliases test/integration/targets/var_reserved/tasks/block_vars.yml +test/integration/targets/var_reserved/tasks/include_vars.yml test/integration/targets/var_reserved/tasks/main.yml test/integration/targets/var_reserved/tasks/play_vars.yml test/integration/targets/var_reserved/tasks/set_fact.yml test/integration/targets/var_reserved/tasks/task_vars.yml test/integration/targets/var_reserved/tasks/task_vars_used.yml +test/integration/targets/var_reserved/vars/set_host_variable.yml test/integration/targets/var_templating/aliases test/integration/targets/var_templating/ansible_debug_template.j2 test/integration/targets/var_templating/runme.sh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/packaging/release.py new/ansible_core-2.17.9/packaging/release.py --- old/ansible_core-2.17.8/packaging/release.py 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/packaging/release.py 2025-02-24 20:31:50.000000000 +0100 @@ -369,6 +369,7 @@ ANSIBLE_BIN_DIR = CHECKOUT_DIR / "bin" ANSIBLE_RELEASE_FILE = ANSIBLE_DIR / "release.py" ANSIBLE_REQUIREMENTS_FILE = CHECKOUT_DIR / "requirements.txt" +ANSIBLE_CHANGELOG_REQUIREMENTS_FILE = CHECKOUT_DIR / "test/lib/ansible_test/_data/requirements/sanity.changelog.txt" ANSIBLE_PYPROJECT_TOML_FILE = CHECKOUT_DIR / "pyproject.toml" DIST_DIR = CHECKOUT_DIR / "dist" @@ -660,23 +661,8 @@ @functools.cache -def ensure_venv() -> dict[str, t.Any]: +def ensure_venv(requirements_content: str) -> dict[str, t.Any]: """Ensure the release venv is ready and return the env vars needed to use it.""" - - # TODO: consider freezing the ansible and release requirements along with their dependencies - - ansible_requirements = ANSIBLE_REQUIREMENTS_FILE.read_text() - - release_requirements = """ -build -twine -""" - - requirements_file = CHECKOUT_DIR / "test/sanity/code-smell/package-data.requirements.txt" - requirements_content = requirements_file.read_text() - requirements_content += ansible_requirements - requirements_content += release_requirements - requirements_hash = hashlib.sha256(requirements_content.encode()).hexdigest()[:8] python_version = ".".join(map(str, sys.version_info[:2])) @@ -1298,7 +1284,12 @@ @command def generate_changelog() -> None: """Generate the changelog and validate the results.""" - env = ensure_venv() + changelog_requirements = ( + ANSIBLE_CHANGELOG_REQUIREMENTS_FILE.read_text() + + ANSIBLE_REQUIREMENTS_FILE.read_text() # TODO: consider pinning the ansible requirements and dependencies + ) + + env = ensure_venv(changelog_requirements) env.update( PATH=os.pathsep.join((str(ANSIBLE_BIN_DIR), env["PATH"])), PYTHONPATH=ANSIBLE_LIB_DIR, @@ -1352,7 +1343,12 @@ def build(allow_dirty: bool = False) -> None: """Build the sdist and wheel.""" version = get_ansible_version(mode=VersionMode.ALLOW_DEV_POST) - env = ensure_venv() + + # TODO: consider pinning the build requirement and its dependencies + build_requirements = """ +build +""" + env = ensure_venv(build_requirements) dirty = git("status", "--porcelain", "--untracked-files=all", capture_output=True).stdout.strip().splitlines() @@ -1449,7 +1445,12 @@ version = get_ansible_version() sdist_file = get_sdist_path(version) wheel_file = get_wheel_path(version) - env = ensure_venv() + + # TODO: consider pinning the twine requirement and its dependencies + publish_requirements = """ +twine +""" + env = ensure_venv(publish_requirements) if prompt: try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/test/integration/targets/handlers/runme.sh new/ansible_core-2.17.9/test/integration/targets/handlers/runme.sh --- old/ansible_core-2.17.8/test/integration/targets/handlers/runme.sh 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/test/integration/targets/handlers/runme.sh 2025-02-24 20:31:50.000000000 +0100 @@ -135,9 +135,7 @@ [ "$(grep out.txt -ce 'META: noop')" = "1" ] # https://github.com/ansible/ansible/issues/46447 -set +e -test "$(ansible-playbook 46447.yml -i inventory.handlers -vv "$@" 2>&1 | grep -c 'SHOULD NOT GET HERE')" -set -e +test "$(ansible-playbook 46447.yml -i inventory.handlers "$@" 2>&1 | grep -c 'SHOULD NOT GET HERE')" = "0" # https://github.com/ansible/ansible/issues/52561 ansible-playbook 52561.yml -i inventory.handlers "$@" 2>&1 | tee out.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/test/integration/targets/var_reserved/tasks/include_vars.yml new/ansible_core-2.17.9/test/integration/targets/var_reserved/tasks/include_vars.yml --- old/ansible_core-2.17.8/test/integration/targets/var_reserved/tasks/include_vars.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.17.9/test/integration/targets/var_reserved/tasks/include_vars.yml 2025-02-24 20:31:50.000000000 +0100 @@ -0,0 +1,5 @@ +- hosts: localhost + gather_facts: no + tasks: + - include_vars: + file: ../vars/set_host_variable.yml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/test/integration/targets/var_reserved/tasks/main.yml new/ansible_core-2.17.9/test/integration/targets/var_reserved/tasks/main.yml --- old/ansible_core-2.17.8/test/integration/targets/var_reserved/tasks/main.yml 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/test/integration/targets/var_reserved/tasks/main.yml 2025-02-24 20:31:50.000000000 +0100 @@ -2,22 +2,32 @@ vars: canary: Found variable using reserved name block: - - shell: ansible-playbook '{{[ role_path, "tasks", item ~ ".yml"] | path_join }}' + - shell: ansible-playbook '{{[ role_path, "tasks", item.file ~ ".yml"] | path_join }}' environment: ANSIBLE_LOCALHOST_WARNING: 0 + ANSIBLE_FORCE_COLOR: 0 failed_when: false loop: - - play_vars - - block_vars - - task_vars - - task_vars_used - - set_fact + - file: play_vars + name: lipsum + - file: block_vars + name: query + - file: task_vars + name: query + - file: task_vars_used + name: q + - file: set_fact + name: lookup + - file: include_vars + name: query register: play_out - name: check they all complain about bad defined var assert: that: - - canary in item['stderr'] + - item.stderr == warning_message loop: '{{play_out.results}}' loop_control: - label: '{{item.item}}' + label: '{{item.item.file}}' + vars: + warning_message: "[WARNING]: {{ canary }}: {{ item.item.name }}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/test/integration/targets/var_reserved/vars/set_host_variable.yml new/ansible_core-2.17.9/test/integration/targets/var_reserved/vars/set_host_variable.yml --- old/ansible_core-2.17.8/test/integration/targets/var_reserved/vars/set_host_variable.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible_core-2.17.9/test/integration/targets/var_reserved/vars/set_host_variable.yml 2025-02-24 20:31:50.000000000 +0100 @@ -0,0 +1 @@ +query: overwrite global Jinja2 function diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible_core-2.17.8/test/lib/ansible_test/_internal/http.py new/ansible_core-2.17.9/test/lib/ansible_test/_internal/http.py --- old/ansible_core-2.17.8/test/lib/ansible_test/_internal/http.py 2025-01-27 20:45:28.000000000 +0100 +++ new/ansible_core-2.17.9/test/lib/ansible_test/_internal/http.py 2025-02-24 20:31:50.000000000 +0100 @@ -1,36 +1,29 @@ -""" -Primitive replacement for requests to avoid extra dependency. -Avoids use of urllib2 due to lack of SNI support. -""" +"""A simple HTTP client.""" from __future__ import annotations +import http.client import json import time import typing as t +import urllib.error +import urllib.request from .util import ( ApplicationError, - SubprocessError, display, ) from .util_common import ( CommonConfig, - run_command, ) class HttpClient: - """Make HTTP requests via curl.""" + """Make HTTP requests.""" - def __init__(self, args: CommonConfig, always: bool = False, insecure: bool = False, proxy: t.Optional[str] = None) -> None: + def __init__(self, args: CommonConfig, always: bool = False) -> None: self.args = args self.always = always - self.insecure = insecure - self.proxy = proxy - - self.username = None - self.password = None def get(self, url: str) -> HttpResponse: """Perform an HTTP GET and return the response.""" @@ -46,74 +39,65 @@ def request(self, method: str, url: str, data: t.Optional[str] = None, headers: t.Optional[dict[str, str]] = None) -> HttpResponse: """Perform an HTTP request and return the response.""" - cmd = ['curl', '-s', '-S', '-i', '-X', method] - - if self.insecure: - cmd += ['--insecure'] - if headers is None: headers = {} - headers['Expect'] = '' # don't send expect continue header - - if self.username: - if self.password: - display.sensitive.add(self.password) - cmd += ['-u', '%s:%s' % (self.username, self.password)] - else: - cmd += ['-u', self.username] + data_bytes = data.encode() if data else None - for header in headers.keys(): - cmd += ['-H', '%s: %s' % (header, headers[header])] + request = urllib.request.Request(method=method, url=url, data=data_bytes, headers=headers) + response: http.client.HTTPResponse - if data is not None: - cmd += ['-d', data] - - if self.proxy: - cmd += ['-x', self.proxy] - - cmd += [url] + display.info(f'HTTP {method} {url}', verbosity=2) attempts = 0 max_attempts = 3 sleep_seconds = 3 - # curl error codes which are safe to retry (request never sent to server) - retry_on_status = ( - 6, # CURLE_COULDNT_RESOLVE_HOST - ) - - stdout = '' + status_code = 200 + reason = 'OK' + body_bytes = b'' while True: attempts += 1 - try: - stdout = run_command(self.args, cmd, capture=True, always=self.always, cmd_verbosity=2)[0] + start = time.monotonic() + + if self.args.explain and not self.always: break - except SubprocessError as ex: - if ex.status in retry_on_status and attempts < max_attempts: - display.warning('%s' % ex) - time.sleep(sleep_seconds) - continue - - raise - - if self.args.explain and not self.always: - return HttpResponse(method, url, 200, '') - - header, body = stdout.split('\r\n\r\n', 1) - - response_headers = header.split('\r\n') - first_line = response_headers[0] - http_response = first_line.split(' ') - status_code = int(http_response[1]) + + try: + try: + with urllib.request.urlopen(request) as response: + status_code = response.status + reason = response.reason + body_bytes = response.read() + except urllib.error.HTTPError as ex: + status_code = ex.status + reason = ex.reason + body_bytes = ex.read() + except Exception as ex: # pylint: disable=broad-exception-caught + if attempts >= max_attempts: + raise + + # all currently implemented methods are idempotent, so retries are unconditionally supported + duration = time.monotonic() - start + display.warning(f'{type(ex).__module__}.{type(ex).__name__}: {ex} [{duration:.2f} seconds]') + time.sleep(sleep_seconds) + + continue + + break + + duration = time.monotonic() - start + display.info(f'HTTP {method} {url} -> HTTP {status_code} ({reason}) [{len(body_bytes)} bytes, {duration:.2f} seconds]', verbosity=3) + + body = body_bytes.decode() return HttpResponse(method, url, status_code, body) class HttpResponse: - """HTTP response from curl.""" + """HTTP response.""" def __init__(self, method: str, url: str, status_code: int, response: str) -> None: self.method = method ++++++ ansible_core-2.17.8.tar.gz.sha256 -> ansible_core-2.17.9.tar.gz.sha256 ++++++ --- /work/SRC/openSUSE:Factory/ansible-core-2.17/ansible_core-2.17.8.tar.gz.sha256 2025-01-29 16:18:49.400482922 +0100 +++ /work/SRC/openSUSE:Factory/.ansible-core-2.17.new.1873/ansible_core-2.17.9.tar.gz.sha256 2025-02-25 16:58:40.458751801 +0100 @@ -1 +1 @@ -39be8a7986a2c7d36069b0d97220bc2f6783c65fea7c6d7e0e2d00d1ac8af877 ansible_core-2.17.8.tar.gz +c24cdc2bab19b910bbdb4a1074af5745e16c78c618f15829e7ddcf699f69a510 ansible_core-2.17.9.tar.gz