Re: Re: classfiltercsv: filtering only works on bundle level
Nick Anderson <[email protected]>
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <[email protected]> |
[image: thumbs-up-01.png] On Friday, November 5, 2021 at 11:06:23 AM UTC-5 Xander Cage wrote: > nick, thank you for the clarification, at least i know which route to go > now. > > On Friday, November 5, 2021 at 4:52:03 PM UTC+1 Nick Anderson wrote: > >> Xander Cage <[email protected]> writes: >> >> i forgot to mention that the above shows hat the "filter classes" in the >> classesfiltercsv function not "filtering" when used in various child >> bundles if the definition of the datacontainer or the call to the >> classfiltercsv function is not present in the bundle. >> >> Reading the policy …, you are using classfiltercsv() inside of bundle >> agent parent_bundle. Running with your data set I get no data container >> defined, for example: >> >> >> # cf-agent --no-lock --log-level info --show-evaluated-vars=parent_bundle --file /tmp/example.cf >> R: check_user reached: $(user) >> R: create_users reached: $(user) >> R: parent bundle: $(user) >> Variable name Variable value Meta tags Comment >> default:parent_bundle.data_file /tmp/my.csv source=promise >> default:parent_bundle.keys source=promise >> default:parent_bundle.keys_unsorted source=promise >> default:parent_bundle.my_data [] source=promise >> >> This is because none of the class expressions in your first (zeroth) >> column evaluate to true on my system in that bundle. So, I added a row that >> would (any,nickanderson,Nick Anderson,neither-us-nor-them,ssh-bs) and I >> modified the policy to point to the path I am using for the CSV ( >> /tmp/my.csv) >> Listing 1: CSV Data (/tmp/my.csv) >> >> ClassExpression,uid,name,group,ssh_key >> weirdos,mscott,Michael Scott,pathetic,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg >> weirdos,jkras,John Krasinski,pathetic,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg >> twats,tflen,Toby Flenderson,tedious,ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg >> zombie,wimm,,dbaldap, >> >> ssh-someSupERsecretKey287483438dsdjhdsdsdjahhsgdsg >> any,nickanderson,Nick Anderson,neither-us-nor-them,ssh-bs >> >> Listing 2: Example Policy >> >> bundle agent parent_bundle{ >> >> vars: >> >> "data_file" string => "/tmp/my.csv"; >> "my_data" data => classfiltercsv( $(data_file), "true", 0); >> >> >> >> "keys_unsorted" slist => getindices(my_data); >> >> "keys" slist => sort(keys_unsorted, "lex"); >> "user" string => "$(my_data[$(keys)][uid])"; >> >> >> >> methods: >> >> "call_check_user" usebundle => check_user( @(my_data) ), >> handle => "remove_it"; >> >> "call_create_user" usebundle => create_users_new( @(my_data) ), >> depends_on => { "remove_it" }; >> >> reports: >> >> "parent bundle: $(user)"; >> } >> >> bundle agent check_user (info) { >> >> vars: >> >> "keys_unsorted" slist => getindices(info); >> "keys" slist => sort(keys_unsorted, "lex"); >> "user" string => "$(info[$(keys)][uid])"; >> >> classes: >> >> "zombie"; >> >> >> reports: >> >> "check_user reached: $(user)"; >> >> } >> >> bundle agent create_users_new(info) { >> >> >> vars: >> "keys_unsorted" slist => getindices(info); >> >> "keys" slist => sort(keys_unsorted, "lex"); >> >> "user" string => "$(info[$(keys)][uid])"; >> "group" string => "$(info[$(keys)][group])"; >> "ssh_key" string => "$(info[$(keys)][ssh_key])"; >> "name" string => "$(info[$(keys)][name])"; >> >> classes: >> >> "weirdos"; >> "twats"; >> >> reports: >> >> "create_users reached: $(user)"; >> } >> bundle agent __main__{ >> methods: >> "parent_bundle";} >> >> With that change, the rows with class expressions that evaluate to true >> become part of the data container that result from parsing. >> >> >> # cf-agent --no-lock --log-level info --show-evaluated-vars=parent_bundle --file /tmp/example.cf >> R: check_user reached: nickanderson >> R: create_users reached: nickanderson >> R: parent bundle: nickanderson >> Variable name Variable value Meta tags Comment >> default:parent_bundle.data_file /tmp/my.csv source=promise >> default:parent_bundle.keys {"0"} source=promise >> default:parent_bundle.keys_unsorted {"0"} source=promise >> default:parent_bundle.my_data [{"group":"neither-us-nor-them","name":"Nick Anderson","ssh_key":"ssh-bs","uid":"nickanderson"}] source=promise >> default:parent_bundle.user nickanderson source=promise >> >> Reading the policy further …., some bundles (bundle agent check_user, >> and bundle agent create_user_new) are promised as methods. Inside these >> bundles there are some bundle scope classes defined and some variables are >> created by pulling the data off of the previously defined data container >> that is passed in to the bundle as an argument. >> >> whats the deal if i have to define all filtering classes in the parent >> bundle? seems useless to me. this function is at least somewhat >> inconvenient , or i am doing something completely wrong. any insights? >> >> Yes, sorry to say, I think you have a completely different expectation of >> what the behavior should be than what it provides. >> >> To me, it looks like you expect classfiltercsv() to filter your data set >> when you access the data set. That might be a nifty function in it's own >> right, but that is not how classfiltercsv() behaves. classfiltercsv() >> filters the data as it is read in based on the context at that point in >> time. >> >> So, if you want one data set of the rows that match *weirdos* and *twats* >> and another data set consisting of the rows that match *zombie* as I >> believe your example policy illustrates you would need to make 2 calls to >> classfiltercsv(). >> > -- You received this message because you are subscribed to the Google Groups "help-cfengine" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/81f97abc-642d-4bea-b15b-2f5c40727f12n%40googlegroups.com.
thumbs-up-01.png
(image/png, 82.7 KB) - not displayed