Greetings all,

After lots of hallway conversations about how best to handle this, here's a proposal for how the cli might look:

A new option, -Z is added as an option to pkg (a peer to -R). The -Z option allows the user to specify which child images (practically zones) to execute the operation on. -Z and -R may be used together. If they are, the images specified in -Z are relative to the image root specified by -R.

We need a scheme for what arguments that the -Z option takes. The simplest would involve just naming exactly all images to be operated on. Given that we can have multiple layers of linked images (in theory at least), I thought that might involve a bit more typing than was ideal. Based on the conversations with Danek and Bart, I put together two examples of what the scheme might look like.

The underlying principle behind both is that explicitly specifying a particular image carries implications about what should be done to the ancestors, cousins, and siblings, of that image. Specifically, if a particular image is named explicitly for inclusion(or exclusion), then its ancestors, siblings and cousins are implied to be excluded(or included) unless otherwise specified. The difference between the two schemes is really whether naming an image explicitly for inclusion(or exclusion) implies its children should be included (the first scheme below) or excluded (the second scheme). An image that is not explicitly noted cannot have conflicting implications produced by the same generation. When implications conflict, the implications produced by the youngest generation wins.

Here's the first scheme that seemed reasonable to me, and that involves little extra typing and typically captures what I think the intent would be:

-Z '*': operate recursively on the root image
-Z test1: operate recursively on the image named test1
-Z test1,!test1/*: operate on only the image named test1
-Z !test2: operate recursively on all child images of the root image except test2 (and its descendants) -Z !test2/*: operate on all child images of the root image, including test2, but don't operate on test2's descendants -Z test1,test2,test4: operate recursively only on the child images named test1, test2 and test4 -Z test1,!test2 : Error since !test2 and test1 have conflicting implications for test3. If test3 doesn't exist, this could be allowed to succeed in theory, but would suggest that it fail. -Z *,!test2,test2/test2-2 : Operates recursively on root and all children of root except for test2. It also operates recursively on the image test2/test2-2, but not on test2/test2-1 -Z test1/a* : operate recursively on all child images of test1 whose name begin with a
To operate only on the root image, don't specify -Z.

Problems:
It's impossible to express "operate on the root and these child images" following the conventions above without using ! to specify each child image that shouldn't be operated on. We could treat "root" specially so that using it explicitly doesn't imply operating on its descendants.


Here's another possible scheme where there's more typing because "operate recursively on children" is now explicitly indicated: (In this example, I'm using '^' prepended to image names, but it could be appended instead, and a different character could be used)

-Z '*': operate on all images including the root image
-Z test1: operate only on the image named test1
-Z ^test1: operate recursively on the image named test1
-Z ^test1,!test1/*: Probably an error, or it's equivalent to -Z test1
-Z !test2: operate recursively on all child images of the root image except test2 but does operate on test2's children -Z !^test2: operate recursively on all child images of the root image except test2 and its decendants -Z !test2/*: operate on all child images of the root image, including test2, but don't operate on test2's children, but do operate on their descendants -Z !test2/^*: operate on all child images of the root image, including test2, but don't operate on test2's decscendants -Z test1,test2,test4: operate only on the child images named test1, test2 and test4 -Z ^test1,^test2,^test4: operate recursively only on the child images named test1, test2 and test4
-Z test1,!test2 : Error since !test2 implies test1
-Z *,!^test2,test2/test2-2 : Operates recursively on root and all children of root except for test2. It also operates recursively on the image test2/test2-2, but not on test2/test2-1 -Z test1/^a* : operate recursively on all child images of test1 whose name begin with a -Z root: operative only on the root image (also what happens if -Z isn't specified) -Z root, ^test1, test2: operate on root and test2, operate recursively on test1

Problems:
The syntax doesn't strike me as being especially intuitive and is more verbose than the first proposal.



There's another issue I think we need to address as we start to think about how to handle the cli for recursive operations: how operations in a parent image are allowed to affect the child images. From my understanding, here's how things are today: 1) 'pkg update' (with no arguments) takes the parent and all child images as far forward as possible. 2) All other operations which affect packages are allowed only to sync child images. A sync is allowed to move existing packages forward, but is not allowed to install, uninstall, or downgrade packages (i think). 3) All other operations have no effect on child images at all (setting properties, freezing packages, etc...)

The current situation has some issues we know about:
Can't uninstall a synced package without manually uninstalling it in each child image first Completely impossible to downgrade a synced package without detaching all zones Updates can fail because of differing image properties (whether signatures are required or not as an example) Updates and installs can fail because of differences in which packages are frozen.

While I suspect the final answer lies somewhere in the middle, let me lay out what I see as the two extremes a person could take to deal with these issues.

Recursion everywhere:
The solution here is based on the new ability to recursively do operations. If you want to uninstall a synced package, use the -Z (ie, do the operation recursively) option. The same solution underlies downgrading a synced package. When you freeze a package, just freeze it everywhere. When you set an image property, set it at all levels. Taken to its extreme, we could mostly remove the sysrem-repository since the user would've set the publishers recursively (we'd need to propagate the keys and certs for https operations and ensure that child images couldn't harm the publisher configuration). The downside of this extreme is that I suspect users will just add -Z '*' to every command they enter reflexively (and may wonder why this isn't the default).

User knows best:
The solution here is to do what we were told to the best of our ability. If the user says to uninstall a synced pacakge, we'll go to the child images and uninstall that package. An extreme version of this is that if that means that other packages in the child image also need to be removed, they're uninstalled as well. Similarly, if a synced package is downgraded in the parent image it's downgraded in the child images (and again, at the extreme of this position, other packages which must get downgraded to allow the operation to succeed are downgraded). When a child image is attached, whatever operations needed to bring the child image into sync with the parent are done (install, uninstall, upgrade, downgrade). This approach would also propagate information about package freezes, relevant image properties (like signature policy) and probably other things I haven't thought of at the moment to try to ensure that whatever operation is entered by the parent image admin succeeds. It would also unfreeze packages in the child images if necessary. With this approach, the -Z option would only get used to install a package in all child images, uninstall a (unsynced) package from all child images, and perhaps update all images to the latest bits (after changing what 'pkg update' does). The downside of this extreme is that child images' functionality could be unintentionally broken without the parent image admin making explicit the desire to operate on child images. (The other extreme can break child images' functionality equally throughly, it just requires the parent image admin to use the -Z option explicitly.)

I'm not sure where to draw the line here, but I hope that by illustrating what I see as two extremes, we can start the conversation about how we'd like this to work.

Thanks,
Brock
_______________________________________________
pkg-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/pkg-discuss

Reply via email to