{"id":28123,"library":"qontract-reconcile","title":"qontract-reconcile","description":"A collection of tools to reconcile the state of services with their desired state defined in app-interface, typically used in Service Delivery Platforms and configuration management. Current version 0.10.1. Releases follow an unpredictable cadence driven by internal Red Hat needs.","status":"active","version":"0.10.1","language":"python","source_language":"en","source_url":"https://github.com/app-sre/qontract-reconcile","tags":["app-interface","reconciliation","service delivery","red-hat"],"install":[{"cmd":"pip install qontract-reconcile","lang":"bash","label":"PyPI"},{"cmd":"pip install qontract-reconcile[integrations]","lang":"bash","label":"With integrations extras"}],"dependencies":[{"reason":"The primary data source (desired state DB)","package":"app-interface","optional":false}],"imports":[{"note":"The top-level package does not re-export this class.","wrong":"from reconcile import ReconcileIntegration","symbol":"ReconcileIntegration","correct":"from reconcile.utils.integration import ReconcileIntegration"},{"note":"Not exposed in the root __init__.py.","wrong":"from reconcile import run_integration","symbol":"run_integration","correct":"from reconcile.utils.integration import run_integration"}],"quickstart":{"code":"import os\n\nfrom reconcile.utils.integration import ReconcileIntegration, run_integration\n\nclass MyIntegration(ReconcileIntegration):\n    @property\n    def name(self) -> str:\n        return \"my-integration\"\n\n    def reconcile(self, dry_run: bool) -> None:\n        print(f\"Reconciling (dry_run={dry_run})\")\n\nif __name__ == \"__main__\":\n    run_integration(MyIntegration())","lang":"python","description":"Minimal integration following the official pattern."},"warnings":[{"fix":"Use Python 3.11 or later.","message":"Python 3.11+ only. Older versions will fail with syntax/import errors.","severity":"breaking","affected_versions":">=0.10.0"},{"fix":"Migrate to class-based integrations defined in reconcile.utils.integration.","message":"The old 'reconcile/<integration>.py' module pattern is deprecated in favor of the ReconcileIntegration class-based approach.","severity":"deprecated","affected_versions":">=0.10.0"},{"fix":"Set DRY_RUN=true or pass --dry-run; consult app-interface docs for each integration's expectations.","message":"Many integrations require an app-interface secret or environment variable (e.g., INTEGRATION_EXTRA_ARGS). The CLI dry-run flag is not always enough to skip all side effects.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-09T00:00:00.000Z","next_check":"2026-08-07T00:00:00.000Z","problems":[{"fix":"Run: pip install qontract-reconcile","cause":"Package not installed or Python environment misconfigured.","error":"ModuleNotFoundError: No module named 'reconcile'"},{"fix":"Use: from reconcile.utils.integration import ReconcileIntegration","cause":"Using a cross-version release where the class was not yet introduced, or wrong import path.","error":"ImportError: cannot import name 'ReconcileIntegration' from 'reconcile'"},{"fix":"Implement the reconcile(self, dry_run: bool) -> None method.","cause":"The reconcile method is not implemented in the user's integration class.","error":"TypeError: Can't instantiate abstract class MyIntegration with abstract methods reconcile"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}