[Cuis] InstallStream 1.0

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[Cuis] InstallStream 1.0

keith1y
InstallStream 1.0 - Cuis (and All Smalltalks)

Introduction
Cuis2.0 from Juan Vuletich is showing the way towards the goal of working with a relatively small kernel image as the starting point, to build evolutionary and revolutionary new Smalltalk platforms. (e.g. Morphic3)

A true kernel image need have no package or source code management tools out of the box, nor does it have network protocols loaded.

The idea of InstallStream is to enable the simplest possible mechanism that could possibly work, for a broad range of tasks.

1) Loading kernel updates.
2) Publishing and collaborating on kernel fixes for approval and inclusion in the release image.
3) Publishing and maintaining personal collections of fixes.
4) Publishing and collaborating on specific kernel innovations.
5) A very simple means to publish and reload mini-packages so that more can be removed from the kernel
6) Publishing sequences of monticello packages and fixes to load and use tools/frameworks e.g. Seaside
7) Building derived images using all of the above
8) Capturing exactly the content and installation process of a derived image for customisation and cherry picking.

Example Usage:
The collaboration and distribution of files for use with the minimal kernel image is managed using source code management tools external to squeak, such as Bazaar2.0, Mercurial, or Git. The following assumes we have checked out the projects we wish to include in the image we are building.

The existing updates stream mechanism consists of a single numbered series of changesets, serially applied to improve the released image.

InstallStream (IS) provides an extension of the updates idea, such that you may publish or subscribe to a number of different InstallStreams in local directories. These will be applied in a prescribed order, to a known starting image.

1) Loading release image kernel updates.
"to view pending updates"
InstallStream kernel pending.

an OrderedCollection(
InstallChangeSet on: 'updates/0394-DummyUpdateForDemo.1.cs'.
InstallChangeSet on: 'updates/0395-2ndDummyUpdateForDemo.1.cs'.)

"to load these updates"
InstallStream kernel applyAll. 

"to see the status"
InstallStream status ==> a Dictionary('updates'->395 )

2 3 4 & 5) Loading kernel fixes and updates
"to view all pending updates"
InstallStream updates collect: [ :e | e pending ].

an OrderedCollection(
 an OrderedCollection() "kernel updates are already installed"
 an OrderedCollection(
InstallChangeSet on: 'updates-System-InstallStream/01-System-InstallStream.st'.) 
 an OrderedCollection(
InstallChangeSet on: 'updates-demo/01-InstallStreamTest1.st'. 
InstallChangeSet on: 'updates-demo/02-Load2more/01-InstallStreamTest2.st'.
InstallChangeSet on: 'updates-demo/02-Load2more/02-InstallStreamTest3.st'.
InstallChangeSet on: 'updates-demo/04-InstallStreamTest4.st'.)
 an OrderedCollection(
InstallChangeSet on: 'updates-kph/0001-Symbol-value.st'.
InstallChangeSet on: 'updates-kph/0002-CodeHolder-HandleSelectedClassIsNil.1.cs'.))

In the above example output the following directories are seen:
updates-System-InstallStream - a mini changeset-based package for keeping InstallStream up to date.
updates-demo - a hierarchically organised collection of fixes
updates-kph - a personal set of fixes in progress

6 7 & 8) Deploying Packages and Building Images
"to view all pending installs"
InstallStream installs collect: [ :e | e pending ]. 
an OrderedCollection(
 an OrderedCollection(
  InstallMonticelloPackage on: 'Installer/install.Installer/01-Installer-Core-kph.325.mcz'.
  InstallMonticelloPackage on: 'Installer/install.Installer/02-Installer-Scripts-kph.24.mcz'.))
 
Use Cases
Personal Kernel Fixes and Personal Application Fixes

An IS may be used as a collection point for personal local fixes, and as a publishing mechanism to share fixes with others, and to nudge them upstream to the kernel maintainer.

Similarly an IS may be used by a group to collaborate on a suite of fixes, such as an audit of mathematical functions provided by the kernel.

An IS may be used to publish, collaborate on, and subscribe to optional features to the kernel, or prospective upgrades, such as Traits, or a Namespace implementation.

In connection with an existing application-framework such as Seaside, an IS may be used to manage local patches required by that application-framework (applied prior to loading the application), or local patches to that application itself after it is loaded.

In addition an IS may be used to provide the equivalent of packages, but with less imposed structure. 

And finally IS may be used to deploy sequences of existing monticello packages, to install applications such as Magma or Seaside.

A Matter of Record
When Monticello or a package management system is used to load a number of packages, the record of the exact installation process is not kept in a manner which is then easily available for use by others. 

"Installer" is one option for sharing install procedures, since it is used to write scripts for loading packages in a specific order, after which scripts may then be exchanged, and customised.

Using IS to organise packages for loading into a base image, the directories of files are in themselves the record of exactly what was loaded and in which order.

Thus when updates.webapp.seaside3 is published for Cuis using Bazaar, and you check it out locally, it comes with all the chosen packages in the appropriate order. You may branch it if you need a custom version, and when you publish your application, it may be published with the whole updates/installs build tree, since the build tree is the documentation of what happened in which order to build your application, ripe for cherry picking, or branching by any other subscriber.

Packages in InstallStreams
It is worth noting that existing Monticello packages may be put into IS in order to be loaded sequentially. This means that a single update stream may publish the equivalent of a MonticelloConfiguration, or a Sake/Packages load sequence, or a Metacello package definition.

A complex package like Magma, can be delivered by checking out a single install stream, of ordered packages.

The "layer-cake" Model of the Image
Within existing package managers, the idea that there are explicit dependencies between packages is used to provide a safe load order.

IS does not have this mechanism, instead, the system is considered to have a layered architecture, and packages are published with respect to a specific layer. Notably they may be subscribed to at a different layer if required.

The basic layering is provided by a dot notation, in the directory name.

Layer 3 - /updates.webapp.seaside - application frameworks
Layer 2 - /updates.network - tools and services
Layer 1 - /updates-system - the kernel and core sub-systems
Layer 0 - /updates - the kernel update stream

The fundamental purpose of layers 0 & 1, the kernel and core layers, is to provide a standardised language for use by all the other layers. If there is a change in language syntax in this layer all the other layers are compromised.

The rest of the layering is intended so that each layer builds upon the layer of the API below. For example, an application framework such as seaside, may if it chooses, isolate its users from variations in the layers above.

Within each layer there are packages which provide a base framework, and packages which use the base framework. So we may optionally use alphabetic sorting to provide explicit load ordering subdividing the layers further as follows. (from top to bottom)

Post-Post-Layer 2 Users Fixes - /updates.~kph-network-patches - the tilda is used to "sort last"
Post-Layer 2 - /updates.~01-network-patches
Within Layer 2 - /updates.network-02-shttp
Within Layer 2 - /updates.network-01-http
Ordered Pre-Layer 2 - /updates.02-network-http
Ordered Pre-Layer 2 - /updates.01-network-sockets - the digits are used to "sort first"

You can have as many layers as you wish and IS is agnostic about how the layers are used, apart from the bottom layer 0. This is the default, a re-implementation of the updates directory of old, which may be used in any manner that the kernel maintainer wishes. Note there is no "pre layer 0".

We may define the layers by commonly accepted and useful norms like so: (bottom to top)

1a. kernel  - the absolute minimum e.g. compiler in /updates
1b. core     - a working minimum e.g. /updates-morphic /updates-collection

2a. system - interfaces /updates.00-sockets
2b. system - tool and service frameworks /updates.network /updates.toolbuilder
2c. system-extensions - services servers e.g. /updates.network-smtp

3a. application frameworks - e.g. Seaside
3b. application frameworks - integration e.g Seaside-Magma

4. Generic Application Development
updates.webbapp.seaside.store
5. Specific Application Deployment
updates.webbapp.seaside.store.acmestores

Conclusion
InstallStreams 1.0 is looking pretty usable and looks to have a lot of potential bang for its buck. This simple idea has, in this 1.0 release, a clean and extensible implementation. I trust that this passes Juan's criteria for simplicity.

In conjunction with Bazaar (or other scm tools) IS can provide the basis for a "trunk for kernel images", in which both parallel (the old 3.11 process) and sequential (the new trunk process) approaches may be combined.

I think that Cuis2.0 is poised ready to make great strides.

best regards

Keith

postscript:

Next Steps
1. InstallStreams may be used to tidy and trim Cuis2.0 further, if Juan adopts IS for himself for loading his favourite bits and pieces.
2. The classes InstallChangeSet, and InstallMonticelloPackage, could be joined by an InstallAtomically.
3. Loading Monticello into Cuis







01-System-InstallStream.st (18K) Download Attachment