-
Notifications
You must be signed in to change notification settings - Fork 52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(GH-187) Fixes abs failing provision if inventory file exists #190
Conversation
I introduced this in cd72bb6. When the newly structured abs task calls lib/task_helper's get_inventory_hash() method and finds a pre-existing inventory_full_path file. It attempts to call PuppetLitmus::InventoryManipulation.inventory_hash_from_inventory_file() which fails, because that method is not a class method. The puzzling thing about this is why it ever worked, because I was wrong that puppetlabs#187 was pre-existing. The issue here is that the abs (the previous version), docker, docker_exp, and vagrant tasks all use 'include PuppetLitmus::InventoryManipulation' or 'include PuppetLitmus' (which includes InventoryManipulation) in the scope of global functions declared implicitly on the main Object. This causes the included module to be included in the base Object class, which effectively makes its methods available everywhere. So a call to PuppetLitmus::InventoryManipulation.inventory_hash_from_inventory_file() actually works, as would String.inventory_hash_from_inventory_file or anything else... When I 'fixed' the abs task to include PuppetLitmus::InventoryManipulation within the new ABSProvision class, I broke that global behavior but only for abs. The fix is straightforward now that I know what's going on. Removing the module prefix from the method call works for both the new abs task and the other tasks that still rely on the global behavior. In the abs task case, InventoryManipulation is included in the class, so the methods are available. For the other tasks, InventoryManipulation is still included by main, and the methods are available everywhere anyway.
I can't write specs for docker or vagrant tasks without refactoring them as well, but here's a manual run of provision::docker testing the patch:
If there's a Jenkins pipeline for provision I should check up on, let me know. |
Codecov Report
@@ Coverage Diff @@
## main #190 +/- ##
=======================================
Coverage ? 77.30%
=======================================
Files ? 2
Lines ? 141
Branches ? 0
=======================================
Hits ? 109
Misses ? 32
Partials ? 0 Continue to review full report at Codecov.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approved. Thanks for sorting this out & thanks for posting the test evidence for docker & vagrant. I'll double check if there is a Jenkins pipeline out there.
I introduced this in cd72bb6.
When the newly structured abs task calls lib/task_helper's
get_inventory_hash() method and finds a pre-existing inventory_full_path
file. It attempts to call
PuppetLitmus::InventoryManipulation.inventory_hash_from_inventory_file()
which fails, because that method is not a class method.
The puzzling thing about this is why it ever worked, because I was wrong
that #187 was pre-existing.
The issue here is that the abs (the previous version), docker,
docker_exp, and vagrant tasks all use 'include PuppetLitmus::InventoryManipulation'
or 'include PuppetLitmus' (which includes InventoryManipulation) in the
scope of global functions declared implicitly on the main Object. This
causes the included module to be included in the base Object class,
which effectively makes its methods available everywhere. So a call to
PuppetLitmus::InventoryManipulation.inventory_hash_from_inventory_file()
actually works, as would String.inventory_hash_from_inventory_file or
anything else...
When I 'fixed' the abs task to include PuppetLitmus::InventoryManipulation
within the new ABSProvision class, I broke that global behavior
but only for abs.
The fix is straightforward now that I know what's going on. Removing the
module prefix from the method call works for both the new abs task and
the other tasks that still rely on the global behavior. In the abs task
case, InventoryManipulation is included in the class, so the methods are
available. For the other tasks, InventoryManipulation is still included
by main, and the methods are available everywhere anyway.