Re: Re: How to join multiple parts of one data container

"'Nick Anderson' via help-cfengine" <[email protected]> Fri, 28 Jul 2023 11:44:47 -0500
Newsgroups gmane.comp.sysutils.cfengine.general
Message-ID <[email protected]>
        While you can do some of this in CFEngine, (and I am
        usually tempted to try quite hard because I find it
        entertaining, and also prize the value of not relying on
        anything external) it can become a yak shaving exercise
        that winds up having a higher maintenance burden.

  Oh, renamed variable fixed and re-sent.

  Couldn't resist some fun Friday yak shaving ... I think this did what
  you wanted.

  Nearly what you had originally, just tweaked ever so slightly to move
  the bundle to `example' and called it from `__main__'.

  ,----
  | bundle agent __main__
  | {
  |   methods:
  |       "example";
  | }
  | bundle agent example
  | {
  | vars:
  |   any::
  |     "repos" data => '
  | {
  |   "ubuntu_16": {
  |     "ubuntu": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial", "xenial-backports", "xenial-proposed", "xenial-updates", "xenial-security" ]
  |     },
  |     "ubuntu-security": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial-security" ]
  |     },
  |     "hwraid": {
  |       "URIs": "https://hwraid.le-vert.net/debian",
  |       "Suites": [ "stretch" ]
  |     }
  |   },
  |   "debian_12": {
  |     "debian": {
  |       "URIs": "http://deb.debian.org/debian",
  |       "Suites": [ "bookworm", "bookworm-backports", "bookworm-proposed-updates", "bookworm-updates" ]
  |     },
  |     "debian-security": {
  |       "URIs": "http://deb.debian.org/debian-security",
  |       "Suites": [ "bookworm-security" ]
  |     },
  |     "icinga": {
  |       "URIs": "https://packages.icinga.com/debian",
  |       "Suites": [ "icinga-bookworm" ]
  |     }
  |   }
  | }
  | ';
  |       "l1_keys" slist => getindices( "repos" );
  | 
  |       # this working
  |       "level1_ubuntu" data => '@(repos[ubuntu_16])';
  |       "level1_debian" data => '@(repos[debian_12])';
  | 
  |       "level2_list" data => '[ level1_ubuntu[hwraid], level1_debian[icinga] ]';
  | 
  | }
  `----

  ,----
  | # cf-agent --no-lock --show-evaluated-vars=default:example --file /tmp/example.cf
  | Variable name                            Variable value                                               Meta tags                                Comment
  | default:example.l1_keys                   {"ubuntu_16","debian_12"}                                   source=promise
  | default:example.level1_debian            {"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}} source=promise
  | default:example.level1_ubuntu            {"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}} source=promise
  | default:example.level2_list              [{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}] source=promise
  | default:example.repos                    {"debian_12":{"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}},"ubuntu_16":{"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}}} source=promise
  `----


  A bit more dynamic ...

  Here instead of explicitly defining a variable for each level 1 key we
  did it dynamically by using a list derived from `getindices()'.

  ,----
  | bundle agent __main__
  | {
  |   methods:
  |       "example";
  | }
  | bundle agent example
  | {
  | vars:
  |   any::
  |     "repos" data => '
  | {
  |   "ubuntu_16": {
  |     "ubuntu": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial", "xenial-backports", "xenial-proposed", "xenial-updates", "xenial-security" ]
  |     },
  |     "ubuntu-security": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial-security" ]
  |     },
  |     "hwraid": {
  |       "URIs": "https://hwraid.le-vert.net/debian",
  |       "Suites": [ "stretch" ]
  |     }
  |   },
  |   "debian_12": {
  |     "debian": {
  |       "URIs": "http://deb.debian.org/debian",
  |       "Suites": [ "bookworm", "bookworm-backports", "bookworm-proposed-updates", "bookworm-updates" ]
  |     },
  |     "debian-security": {
  |       "URIs": "http://deb.debian.org/debian-security",
  |       "Suites": [ "bookworm-security" ]
  |     },
  |     "icinga": {
  |       "URIs": "https://packages.icinga.com/debian",
  |       "Suites": [ "icinga-bookworm" ]
  |     }
  |   }
  | }
  | ';
  |       "l1_keys" slist => getindices( "repos" );
  | 
  |       # this working
  |       # "level1_ubuntu" data => '@(repos[ubuntu_16])';
  |       # "level1_debian" data => '@(repos[debian_12])';
  | 
  |       # I know you had ubuntu and not the specific ubuntu but what about ubuntu_18 and 16 both being present?
  |       "level1_$(l1_keys)" data => '@(repos[$(l1_keys)])';
  | 
  | 
  |     "level2_list" data => '[ level1_ubuntu_16[hwraid], level1_debian_12[icinga] ]';
  | 
  | }
  `----

  ,----
  | # cf-agent --no-lock --show-evaluated-vars=default:example --file /tmp/example.cf
  | Variable name                            Variable value                                               Meta tags                                Comment
  | default:example.l1_keys                   {"ubuntu_16","debian_12"}                                   source=promise
  | default:example.level1_debian_12         {"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}} source=promise
  | default:example.level1_ubuntu_16         {"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}} source=promise
  | default:example.level2_list              [{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}] source=promise
  | default:example.repos                    {"debian_12":{"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}},"ubuntu_16":{"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}}} source=promise
  `----


  Even more dynamic ...

  Here instead of explicitly listing out each variable name reference
  you used to expand into a data container array we first generated the
  string you would have used between `[' and `]'.

  I will leave it for others to judge but this is the sort of thing that
  would probably be very good to add as an acceptance test in cfengine
  core. Care to make a pull request?

  ,----
  | bundle agent __main__
  | {
  |   methods:
  |       "example";
  | }
  | bundle agent example
  | {
  | vars:
  |   any::
  |     "repos" data => '
  | {
  |   "ubuntu_16": {
  |     "ubuntu": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial", "xenial-backports", "xenial-proposed", "xenial-updates", "xenial-security" ]
  |     },
  |     "ubuntu-security": {
  |       "URIs": "http://cz.archive.ubuntu.com/ubuntu",
  |       "Suites": [ "xenial-security" ]
  |     },
  |     "hwraid": {
  |       "URIs": "https://hwraid.le-vert.net/debian",
  |       "Suites": [ "stretch" ]
  |     }
  |   },
  |   "debian_12": {
  |     "debian": {
  |       "URIs": "http://deb.debian.org/debian",
  |       "Suites": [ "bookworm", "bookworm-backports", "bookworm-proposed-updates", "bookworm-updates" ]
  |     },
  |     "debian-security": {
  |       "URIs": "http://deb.debian.org/debian-security",
  |       "Suites": [ "bookworm-security" ]
  |     },
  |     "icinga": {
  |       "URIs": "https://packages.icinga.com/debian",
  |       "Suites": [ "icinga-bookworm" ]
  |     }
  |   }
  | }
  | ';
  |       "l1_keys" slist => getindices( "repos" );
  |       "l2_keys[$(l1_keys)]" slist =>  getindices( "repos[$(l1_keys)]" );
  |       "l2_keys_combined" slist => getvalues( l2_keys ); # This combines them all so you have a list of all level2 keys
  | 
  |       # this working
  |       # "level1_ubuntu" data => '@(repos[ubuntu_16])';
  |       # "level1_debian" data => '@(repos[debian_12])';
  | 
  |       # I know you had ubuntu and not the specific ubuntu but what about
  |       # ubuntu_18 and 16 both being present? Then they would collide and last
  |       # one would win. So, I just use the distro verison specific key names
  |       "level1_$(l1_keys)" data => '@(repos[$(l1_keys)])', meta => { "level1_keys" };
  | 
  |       # "level2_list" data => '[ level1_ubuntu_16[hwraid], level1_debian_12[icinga] ]';
  | 
  |       # :/
  |       # OK, so it wasn't a terrible amout of yak shaving. I probably only have enough to make slippers here.
  |       # I use an associatiave array to generate the variable names you used to define =level2_list=
  |       "YakShavingVarnames[$(l1_keys)]" string => "level1_$(l1_keys)[$(l2_keys[$(l1_keys)])]";
  |       # I joined them togehter with =,= just like you did.
  |       "YakShavinString" string => join( ", ", getvalues( YakShavingVarnames ) );
  |       # I expanded them so that it was just like y ou did
  |       "level2_list" data => data_expand('[ $(YakShavinString) ]');
  | }
  `----

  ,----
  | # cf-agent --no-lock --show-evaluated-vars=default:example --file /tmp/example.cf
  | Variable name                            Variable value                                               Meta tags                                Comment
  | default:example.YakShavinString          level1_debian_12[icinga], level1_ubuntu_16[hwraid]           source=promise
  | default:example.YakShavingVarnames[debian_12] level1_debian_12[icinga]                                     source=promise
  | default:example.YakShavingVarnames[ubuntu_16] level1_ubuntu_16[hwraid]                                     source=promise
  | default:example.l1_keys                   {"ubuntu_16","debian_12"}                                   source=promise
  | default:example.l2_keys[debian_12]        {"debian","debian-security","icinga"}                       source=promise
  | default:example.l2_keys[ubuntu_16]        {"ubuntu","ubuntu-security","hwraid"}                       source=promise
  | default:example.l2_keys_combined          {"debian","debian-security","icinga","ubuntu","ubuntu-security","hwraid"} source=promise
  | default:example.level1_debian_12         {"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}} source=promise,level1_keys
  | default:example.level1_ubuntu_16         {"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}} source=promise,level1_keys
  | default:example.level2_list              [{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"},{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"}] source=promise
  | default:example.repos                    {"debian_12":{"debian":{"Suites":["bookworm","bookworm-backports","bookworm-proposed-updates","bookworm-updates"],"URIs":"http://deb.debian.org/debian"},"debian-security":{"Suites":["bookworm-security"],"URIs":"http://deb.debian.org/debian-security"},"icinga":{"Suites":["icinga-bookworm"],"URIs":"https://packages.icinga.com/debian"}},"ubuntu_16":{"hwraid":{"Suites":["stretch"],"URIs":"https://hwraid.le-vert.net/debian"},"ubuntu":{"Suites":["xenial","xenial-backports","xenial-proposed","xenial-updates","xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"},"ubuntu-security":{"Suites":["xenial-security"],"URIs":"http://cz.archive.ubuntu.com/ubuntu"}}} source=promise
  `----

-- 
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/878rb0f0jk.fsf%40northern.tech.