summaryrefslogtreecommitdiff
path: root/lib/chef/node
Commit message (Collapse)AuthorAgeFilesLines
* fix node assignment of ImmutableArrays to VividMashes/AttrArraysLamont Granquist2018-01-252-1/+3
| | | | | | | | | | | | | node.default['foo'] = node['bar'] need to have node['bar'] have its cache vivified otherwise we potentially get an empty hash or array. in the case of hashes, the assignment must have been walking though the values with #each or something which poked the cache on the target hash which caused it to vivify, so this bug only affected Arrays where the AttrArray initializer likely did a quick-n-dirty copy of the internal structure of the ImmutableArray which was empty. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* add missing Array#abbrevlcg/immutable-node-apisLamont Granquist2018-01-231-0/+1
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* update immutable API blacklist and whitelistLamont Granquist2018-01-232-8/+220
| | | | | | | | | | | | | adds the whitelist so that when we update to new ruby versions it forces us to audit the new Array and Hash methods and figure out if they are mutators or not. this change closes the Hash#store loophole that was being abused by some cookbook consumers to directly modify merged ImmutableHashes (producing inherently undefined behavior that we 'broke' at one point). Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Chef-14 Breaking: remove node.set and node.set_unlesslcg/remove-node-setLamont Granquist2018-01-221-6/+1
| | | | | | been deprecated since late-12. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* prepping for rubocop 0.52.1lcg/rubocop-0.52.1Lamont Granquist2018-01-172-6/+4
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* remove comments + debuggingLamont Granquist2017-12-062-3/+0
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* turboize arraysLamont Granquist2017-12-061-10/+36
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* turbo attribute mergingLamont Granquist2017-12-061-1/+16
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Per-container deep merge cachingLamont Granquist2017-12-065-105/+200
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Replaces the one-big top level deep merge cache with individual deep merge caches in every container. The Immutable container state becomes the deep merge cache. - Does not use a pure decorator style approach since that failed before because of ruby internals breaking things like `===` and `=~` on decorated objects, so we inherit (ultimately from Hash + Array). - The state being the container state is useful in ruby since APIs on Hash and Array poke around in internal state to make things fast. If we inherit from Hash/Array but don't have the correct internal state things go wonky. - Throwing away the internal state is equivalent to flushing the cache. - Since we throw away all linked objects when we do that, we flush at every level below the level being flushed (which is correct semantics). - If a user has a pointer to an old immutable object from a sub-level, that isn't mutated so the old object still contains the old view of the data (which I think is correct, although I have some doubts that its necessary, but it came along free for the ride). - When we reset the cache we do mutate the cache being reset, which might change data in held references. If this becomes an issue the fix would be to reset the cache at the level above by creating a new, "empty" ImmutableHash/ImmutableArray object and inserting it into the deep_merge_cache datastructure instead of clearing the internal state of the child object. I don't know practically how anyone would hit this, though, so would prefer to wait on doing that work until we see an actual bug report. - Because of the way ruby pokes around internally there's some weirdnesses like the pre-generation of the cache for all the values of a subarray when #each is called, which is due to the way that ruby walks through array-serialized hashes when called like: `Array#each { key, value| ... }` (which is an undocumented(?) thing in ruby). Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* immutablize on the fly and reduce dupinglcg/deep-merge-immutablizingLamont Granquist2017-08-312-29/+96
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Merge pull request #6356 from chef/lcg/remove-useless-dupLamont Granquist2017-08-281-4/+0
|\ | | | | node attributes: remove useless dup in merge_all
| * node attributes: remove useless dup in merge_alllcg/remove-useless-dupLamont Granquist2017-08-281-4/+0
| | | | | | | | | | | | | | | | | | since immutablize now does dup + freeze of everything this is definitively unnecessary, and appears to have been unnecessary even in Chef-12 (at last does not break any specs there either). Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* | speed up immutabilizationLamont Granquist2017-08-281-1/+1
|/ | | | | | since we only inject Mash/VividMashes do not convert Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix node#debug_value access through arrayslcg/debub-value-arraysLamont Granquist2017-03-161-8/+4
| | | | | | nod to @jaymzh for finding this one. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Chef-13 freeze merged node attributelcg/node-freezeLamont Granquist2017-03-153-4/+10
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* additional fix deep-duping as welllcg/deep-dup-attrsLamont Granquist2017-03-131-14/+19
| | | | | | | | | similarly to fixing to_hash. kind of feels like we should return a VividMash instead of a Mash here, to get a writable thing that behaves like an attribute... Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Chef-13: properly deep dup Node#to_hashLamont Granquist2017-03-131-5/+16
| | | | | | | | | | | | previously to_hash allowed mutating non-container elements, now they get properly dup'd. fixes a 2.5 year old pending spec test. also fills out the API so that there is to_h/to_hash/to_a/to_array instead of the weird mix-and-match we had before. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Chef-13: remove method_missing access to node object.Lamont Granquist2017-03-133-58/+3
| | | | | | | | | | | | | | | | | | | | So again the reasons why we break this: - node.class vs. node['class'] kinds of problems - adding node#foo to Chef::Node as an extension to the API and breaking node.foo meaning node["foo"] (we can't make exensions to that class without possibly breaking someone) - crazy things like the old CHEF-3799 issue in the old ticketing system where IO#puts in ruby blindly calls #to_ary on stuff and expects it to raise -- whereas we would potentially autovivify a 'to_ary' hash key and return nil which breaks the world. This also has caused issues with the hashie gem and they've gone to spamming warnings by default to try to deal with it: https://github.com/berkshelf/berkshelf/issues/1665 Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix specs: RedundantReturn, RedundantSelf, RedundantBeginLamont Granquist2017-02-132-11/+9
| | | | | | department of redundancy department Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix comment [ci skip]Lamont Granquist2017-01-111-1/+1
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix node attribute "unless" API methodsLamont Granquist2017-01-111-6/+5
| | | | | | | | | | closes #5556 corrects behavior to 12.11.x behavior which was lost in the refactor may address #5715 Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Merge pull request #5547 from chef/lcg/unified-integerLamont Granquist2016-11-161-1/+1
|\ | | | | Core: fix Lint/UnifiedInteger cop
| * fix Lint/UnifiedInteger copLamont Granquist2016-11-151-1/+1
| | | | | | | | | | | | believe this becomes necessary for ruby 2.4/3.0 Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* | Structure deprecations with additional metadatatm/deprecation_with_urlThom May2016-11-161-3/+3
| | | | | | | | | | | | | | | | This adds URLs to each class of deprecation, and correctly prints and formats them for maximum user efficiency. We also provide the URL to the data collector for Visibility to ingest. Signed-off-by: Thom May <thom@chef.io>
* | Remove debug writeAdam Ward2016-11-161-1/+0
|/ | | | | | | Obvious fix. Introduced in: e57e29b96b75ff7fc04abb7f9db73920b2a5894a Signed-off-by: Adam Ward <adamw@subdesigns.net>
* fix ImmutableArray slicesLamont Granquist2016-11-141-2/+5
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix existing specsLamont Granquist2016-10-312-2/+5
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* add attribute_changed hook to event handlersLamont Granquist2016-10-284-47/+72
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* rename __path to __path__ and __node to __node__lcg/node-path-trackingLamont Granquist2016-10-254-26/+26
| | | | | | | | | | | | consistency with Unchain here: https://github.com/chef/chef/blob/master/lib/chef/decorator/unchain.rb#L23-L24 and with SimpleDelegator: https://ruby-doc.org/stdlib-2.1.0/libdoc/delegate/rdoc/SimpleDelegator.html#method-i-__getobj__ Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* remove breadcrumb stateLamont Granquist2016-10-255-35/+28
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* standardize initializer args for VividMash+ImmutableMashLamont Granquist2016-10-254-30/+31
| | | | | | | | | | | | | | | | | | | if anyone is using these directly this might be a breaking change, although it makes it considerably easier to use VividMash and IMO ImmutableMash is an implementation detail of the deep merge cache and Chef::Node object. we definitely have never documented these APIs, so I think the onus is on the consumer to update their code. VividMash.new() should now work. VividMash.new({ foo: :bar }) should also now work. IDK what object people would have been passing in as the root object before. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* green testsLamont Granquist2016-10-253-6/+5
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* fix immutablize to add __rootLamont Granquist2016-10-251-2/+2
| | | | | | much less red now Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* savegame for more aggressive refactoringLamont Granquist2016-10-255-29/+28
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* add a deep_merge_cache mixinLamont Granquist2016-10-252-83/+115
| | | | | | gets the inheritence chain correct Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* s/path_tracking/state_tracking and add __root stateLamont Granquist2016-10-254-13/+25
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* add code to implement node path trackingLamont Granquist2016-10-256-75/+198
| | | | | | | | | | via node.__path variable using __underscore format because node["path"] could very well be used and we still have to deal with node.path method_missing horribleness. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* Call convert_value in AttrArray constructorGiacomo Bagnoli2016-09-211-1/+21
|
* Convert attributes defined as literal arraysGiacomo Bagnoli2016-09-212-4/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | VividMash, unlike Mash, does not recursively convert values inside arrays, just the array itself. As such, hashes inside arrays are not converted to *Mash, introducing a behaviour that differs from Chef 11, e.g. having this attr defined node['foo'] = [ { 'attr' => 'value' } ] in Chef 11 `node[:foo][0][:attr]` returns `'value'` while in Chef 12 it returns `nil` This commit fixes VividMash so arrays are recursively converted and the behaviour restored. Plus, immutablize merge_all result, so to be sure that hashes contained in Arrays are properly immutablized as well, so not existing attributes are not automatically vivified (thus returning an empty VividMash instead of nil) This problem was first reported in chef/chef#2871. Signed-off-by: Giacomo Bagnoli <gbagnoli@gmail.com>
* fix Style/BlockDelimiters, Style/MultilineBlockLayout and 0.42.0 engine upgradeLamont Granquist2016-08-171-2/+2
| | | | Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
* autofixing Style/AccessModifierIndentation copLamont Granquist2016-08-161-1/+1
|
* Merge pull request #5103 from chef/lcg/fix-5012Lamont Granquist2016-07-121-2/+2
|\ | | | | add back method_missing support to set_unless
| * fix stray double quoteslcg/fix-5012Lamont Granquist2016-07-111-2/+2
| |
* | fix for #5094 12.12.13 node.default_unless issueLamont Granquist2016-07-081-0/+5
|/ | | | | | note that the node_spec test in this commit is not red on master so it ain't testing the right thing yet, but this fixes the issue in chef-shell...
* Attributes v1.1 changeslcg/attributes-v1.1Lamont Granquist2016-06-274-202/+283
| | | | | | | | | | | - fixes *_unless behavior and set_unless_value_present hack from Chef 12 - simplifies rm_* code - introduces functional read/write/unlink/exist? API - deprecates method_missing access to attributes for Chef 13 - deprecates set/set_unless aliases for Chef 14 - removes MultiMash mess that I wrote for Chef 13 https://github.com/chef/chef/pull/5029 for more details
* autofixing some missed copsLamont Granquist2016-02-051-1/+1
| | | | second round of autofixing for some reason...
* autofixing whitespace copsLamont Granquist2016-02-053-283/+283
| | | | | | | | | | | | | | | | | | | | | | 4174 Style/SpaceInsideHashLiteralBraces 1860 Style/SpaceAroundOperators 1336 Style/SpaceInsideBlockBraces 1292 Style/AlignHash 997 Style/SpaceAfterComma 860 Style/SpaceAroundEqualsInParameterDefault 310 Style/EmptyLines 294 Style/IndentationConsistency 267 Style/TrailingWhitespace 238 Style/ExtraSpacing 212 Style/SpaceBeforeBlockBraces 166 Style/MultilineOperationIndentation 144 Style/TrailingBlankLines 120 Style/EmptyLineBetweenDefs 101 Style/IndentationWidth 82 Style/SpaceAroundBlockParameters 40 Style/EmptyLinesAroundMethodBody 29 Style/EmptyLinesAroundAccessModifier 1 Style/RescueEnsureAlignment
* Update all auth email address from opscode.com and getchef.com to chef.io.Noah Kantrowitz2016-02-022-3/+3
| | | Generated via git ls-files | xargs perl -pi -e "s/(Author.*?<[^@]+@)(?:opscode\\.com|getchef\\.com)(>)/\\1chef.io\\2/gi"
* Copyright year update for 2016 and massive cleanup.Noah Kantrowitz2016-02-022-2/+2
| | | Generated via git ls-files | xargs perl -pi -e "s/[Cc]opyright (?:\([Cc]\) )?((?\!$(date +%Y))\\d{4})(-\\d{4})?([, ][ \d]+)*(,|(?= ))/Copyright \\1-$(date +%Y),/g"
* Use double quotes by defaultThom May2016-01-141-5/+5
| | | | | | | This is an entirely mechanically generated (chefstyle -a) change, to go along with chef/chefstyle#5 . We should pick something and use it consistently, and my opinion is that double quotes are the appropriate thing.