Skip to content

[WIP] Fix fetch-lib error in charmcraft 3.4.3#2504

Draft
Copilot wants to merge 2 commits intomainfrom
copilot/fix-fetch-lib-error
Draft

[WIP] Fix fetch-lib error in charmcraft 3.4.3#2504
Copilot wants to merge 2 commits intomainfrom
copilot/fix-fetch-lib-error

Conversation

Copy link

Copilot AI commented Dec 3, 2025

  • Explore repository structure and understand the issue
  • Identify the bug location (line 1539 and 1562 in charmcraft/application/commands/store.py)
  • Confirm bug exists in 4.0.1, hotfix/3.5, and main branches
  • Write a failing test that reproduces the issue
  • Implement the fix for both error locations
  • Run the test on tag 4.0.1 to verify it fails
  • Run the test on hotfix/3.5 to verify it fails
  • Run the test on hotfix/2.7 to verify behavior (command may not exist)
  • Run the test on main to verify it fails without fix
  • Verify the fix works with the tests
  • Run code review and CodeQL checks
Original prompt

This section details on the original issue you should resolve

<issue_title>[3.4.3] Charmcraft fetch-lib fails with Library None not found in Charmhub.</issue_title>
<issue_description>### Bug Description

I am using charmcraft: installed: 3.4.3.post51+g6153055c (6228) 60MB classic
Installed from channel latest/edge

We have done some few changes in the OpenSearch libs and now the check_libs started failing with an error instead of simply a list of outdated libs.

Running it locally and I can also reproduce the same error.

This error message is not really helpful and the logs print the entire lib content, making it hard to read.

To Reproduce

$ git clone https://github.com/canonical/opensearch-operator -b 2/edge
$ cd opensearch-operator
$ charmcraft fetch-lib
Library None not found in Charmhub.

Environment

OS: 24.04
charmcraft: latest/edge, currently on 3.4.3

charmcraft.yaml

# Copyright 2022 Canonical Ltd.
# See LICENSE file for licensing details.

type: charm
platforms:
  ubuntu@22.04:amd64:
  ubuntu@24.04:amd64:
# Files implicitly created by charmcraft without a part:
# - dispatch (https://github.com/canonical/charmcraft/pull/1898)
# - manifest.yaml
#   (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L259)
# Files implicitly copied/"staged" by charmcraft without a part:
# - actions.yaml, config.yaml, metadata.yaml
#   (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L290-L293
#   https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/services/package.py#L156-L157)
parts:
  # "poetry-deps" part name is a magic constant
  # https://github.com/canonical/craft-parts/pull/901
  poetry-deps:
    plugin: nil
    build-packages:
      - curl
    override-build: |
      # Use environment variable instead of `--break-system-packages` to avoid failing on older
      # versions of pip that do not recognize `--break-system-packages`
      # `--user` needed (in addition to `--break-system-packages`) for Ubuntu >=24.04
      PIP_BREAK_SYSTEM_PACKAGES=true python3 -m pip install --user --upgrade pip==24.3.1  # renovate: charmcraft-pip-latest

      # Use uv to install poetry so that a newer version of Python can be installed if needed by poetry
      curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.5.15/uv-installer.sh | sh  # renovate: charmcraft-uv-latest
      # poetry 2.0.0 requires Python >=3.9
      if ! "$HOME/.local/bin/uv" python find '>=3.9'
      then
        # Use first Python version that is >=3.9 and available in an Ubuntu LTS
        # (to reduce the number of Python versions we use)
        "$HOME/.local/bin/uv" python install 3.10.12  # renovate: charmcraft-python-ubuntu-22.04
      fi
      "$HOME/.local/bin/uv" tool install --no-python-downloads --python '>=3.9' poetry==2.0.0 --with poetry-plugin-export==1.8.0  # renovate: charmcraft-poetry-latest

      ln -sf "$HOME/.local/bin/poetry" /usr/local/bin/poetry
  # "charm-poetry" part name is arbitrary; use for consistency
  # Avoid using "charm" part name since that has special meaning to charmcraft
  charm-poetry:
    # By default, the `poetry` plugin creates/stages these directories:
    # - lib, src
    #   (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/parts/plugins/_poetry.py#L76-L78)
    # - venv
    #   (https://github.com/canonical/charmcraft/blob/9ff19c328e23b50cc06f04e8a5ad4835740badf4/charmcraft/parts/plugins/_poetry.py#L95
    #   https://github.com/canonical/craft-parts/blob/afb0d652eb330b6aaad4f40fbd6e5357d358de47/craft_parts/plugins/base.py#L270)
    plugin: poetry
    source: .
    after:
      - poetry-deps
    poetry-export-extra-args: ['--only', 'main,charm-libs']
    build-packages:
      - libffi-dev  # Needed to build Python dependencies with Rust from source
      - libssl-dev  # Needed to build Python dependencies with Rust from source
      - pkg-config  # Needed to build Python dependencies with Rust from source
    override-build: |
      # Workaround for https://github.com/canonical/charmcraft/issues/2068
      # rustup used to install rustc and cargo, which are needed to build Python dependencies with Rust from source
      if [[ "$CRAFT_PLATFORM" == ubuntu@20.04:* || "$CRAFT_PLATFORM" == ubuntu@22.04:* ]]
      then
        snap install rustup --classic
      else
        apt-get install rustup -y
      fi

      # If Ubuntu version < 24.04, rustup was installed from snap instead of from the Ubuntu
      # archive—which means the rustup version could be updated at any time. Print rustup version
      # to build log to make changes to the snap's rustup version easier to track
      rustup --version

      # rpds-py (Python package) >=0.19.0 requires rustc >=1.76, which is not available in the...

</details>

- Fixes canonical/charmcraft#2204

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ Let Copilot coding agent [set things up for you](https://github.com/canonical/charmcraft/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.

When running `charmcraft fetch-lib` without arguments and encountering a LibraryError,
the error message was showing "Library None not found in Charmhub." instead of the
actual library name. This fix:

1. Re-raises the original LibraryError from get_libraries_metadata instead of
   creating a new one with parsed_args.library (which could be None)
2. Uses lib_data.full_name instead of parsed_args.library when a library tip
   is not found in the store

Co-authored-by: lengau <4305943+lengau@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants