Skip to content

Commit

Permalink
Fix data file path detection with new pip
Browse files Browse the repository at this point in the history
Using an editable installation of Kayobe fails on Rocky Linux 9 or
Ubuntu with an error such as:

    ERROR! The requirements file '/home/rocky/kayobe/kayobe/requirements.yml' does not exist.
    Failed to install Ansible roles from /home/rocky/kayobe/kayobe/utils.py/../requirements.yml via Ansible Galaxy: returncode 1
    Control host bootstrap failed - likely Ansible Galaxy flakiness. Sleeping 5 seconds before retrying

This is caused by recent changes to how pip manages editable
installations. The egg-link file that Kayobe was using to find the
source path does not exist anymore. Instead, there is a direct_url.json
file under the kayobe dist-info directory that can be parsed.

This also includes Ic53efd03cecbd53ad3e3b64b664e084f4e25be0e to work
around mocking issues in unit tests.

Change-Id: I9dd5b97dec93c0e5393a1e7d9640f85003651b56
Closes-Bug: #2020135
(cherry picked from commit 1847ad3)
  • Loading branch information
priteau committed Oct 4, 2023
1 parent 6ec4e8a commit a44f063
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
22 changes: 22 additions & 0 deletions kayobe/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

import base64
import glob
import importlib_metadata
import json
import logging
import os
import shutil
Expand Down Expand Up @@ -48,10 +50,30 @@ def _detect_install_prefix(path):
return prefix_path


def _get_direct_url(dist):
direct_url = os.path.join(dist._path, 'direct_url.json')
if os.path.isfile(direct_url):
with open(direct_url, 'r') as f:
direct_url_content = json.loads(f.readline().strip())
url = direct_url_content['url']
prefix = 'file://'
if url.startswith(prefix):
return url[len(prefix):]

return None


def _get_base_path():
override = os.environ.get("KAYOBE_DATA_FILES_PATH")
if override:
return os.path.join(override)

kayobe_dist = list(importlib_metadata.Distribution.discover(name="kayobe"))
if kayobe_dist:
direct_url = _get_direct_url(kayobe_dist[0])
if direct_url:
return direct_url

egg_glob = os.path.join(
sys.prefix, 'lib*', 'python*', '*-packages', 'kayobe.egg-link'
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
fixes:
- |
Fixes detection of data file path when using editable installations with a
recent pip.

0 comments on commit a44f063

Please sign in to comment.