Hi Jean / Dave,

Comments inline...

On 05/10/10 06:21 PM, jean.mccormack wrote:
> During the last prototype meeting, Dave and I were tasked with figuring
> out the DOC interface to pass data to the checkpoint modules. We met to
> discuss this last week with Evan and Sanjay attending for portions of
> the meeting to help.
> Input on this proposal is requested from Dermot, Darren, Karen and Sarah
> but anyone else is welcome to respond.
>
>
> There will be a class CheckpointNode that will be an ABC and will
> inherit from DataObject. It will have a name attribute.
> Each type of checkpoint (TI, TD, Transfer etc) will have it's own
> subclass of CheckpointNode that will have attributes
>    specific to that type of checkpoint.
>
> The xml that will be generated would look like this:
>
>
> <checkpoint>
> <name>"name of checkpoint"</name>
> <checkpoint specific attributes to be defined by each checkpoint>
> </checkpoint>

Just curious why you are using a tag to specify the name as opposed to an
attribute - I feel that using an attribute is more capable of validation in
DTD, etc. but maybe I'm wrong, so I would think:

<checkpoint <name="name of checkpoint">
  <checkpoint specific attributes to be defined by each checkpoint>
</checkpoint>

>
>
> To further explain this I'll use an example of a client that does TD,
> TI, TI, Transfer, Transfer. Note this is not meant
> to be any real code, it's more  pseudocode than anything.
>
> Client()
>
>      td_node = TD_ChkptNode("TargetDiscovery")
>      ti_node1 = TI_ChkptNode("TI_IPS")
>      ti_node2 = TI_ChkptNode("TI_CPIO")
>      xfer_node1 = Xfer_ChkptNode("XFER_IPS")
>      xfer_node2 = Xfer_ChkptNode("XFER_CPIO")
>      ...
>
>
>      TD = register_checkpoint(td.discover, td_node)
>      TI1 = register_checkpoint(ti.instantiate, ti_node1)
>      TI2 = register_checkpoint(ti.instantiate, ti_node2)
>      Xfer1 = register_checkpoint(xfer.transfer, xfer_node1)
>      Xfer2 = register_checkpoint(xfer.transfer, xfer_node2)
>
>
>      # Because we bounce out of engine after TD runs we may want to tell TD
where to put things.
>      td_node.dst = "Discovered Targets" # TD_ChkptNode has property "dst"
which is just a name.
>                                         # this name is the name it will give
the root node of
>                                         # a tree of nodes, Physical and
Logical that it discoveres.

There are a couple of things that I see here:

- In the above code you seem to be using the same checkpoint, but with
  different parameters (TI and Transfer specifically) to do different things.
  This doesn't really fit with the Object-Oriented Design approach, where you
  would expect to have a class hierarchy like:


                                TI
                              /    \
                       TI_IPS       TI_CPIO ...

   In other words there is a base-TI class, where all common functionality is,
   and then each specialization of this class for specific purposes - using
   this the above code would be more like:

       TD = register_checkpoint(td.discover)
       TI1 = register_checkpoint(ti_ips.instantiate)
       TI2 = register_checkpoint(ti_cpio.instantiate)
       Xfer1 = register_checkpoint(xfer_ips.transfer)
       Xfer2 = register_checkpoint(xfer_cpio.transfer)

       # Actually I'm not 100% sure what the .instantiate and .transfer
       # methods are meant to be... I would really have expected the
       # parameters to register_checkpoint to be simply class objects, e.g.
       #    TD = register_checkpoint(TargetData)
       #    TI1 = register_checkpoint(TargetInstantiationIps)
       #    TI2 = register_checkpoint(TargetInstantiationCpio)
       # ...

- Each checkpoint should have a defined "interface" in that it would define
  what it takes in (via the DOC) and what it outputs (via the DOC).

  As such, I would have thought that setting td_node.dst would be unnecessary
  since it would be the default for TD.

  In the case of TD, it would have no input parameters, but would, by default,
  output a tree of discovered targets into the DOC. This would be a part of
  the "well-known and documented" interface.

>      td_node.start = "..." # maybe for DC we don't want it to do physical
target discovery...
>
>      # Now execute engine just running TD:
>      execute(TD)
>
>      # And now we need to add information to other nodes
>      ti_node1.create = ... # root node of some tree of nodes that the App 
> wants
>      ti_node2.create = ... # root node of some tree of nodes that the App 
> wants
>      xfer_node1.src ="http://some/ips/repo:port";
>      xfer_node1.dst = "rpool/jean/pkg_imag" # image area for  IPS to install 
> to.
>      xfer_node2.src = "/"
>      xfer_node2.dst = "rpool/jean/whatever"   # area to cpio to

I'm really wary of objects being used like this - for example, if at anypoint
the application does a roll-back to a previous snapshot, in-process, then the
objects in the DOC will be different to the objects being used above.

As such, the use-case for anything stored in the DOC should be along the lines
of:

    ti_node1 = doc.get_child_by_name( "TI_IPS" );
    if ti_node1:
        ti_node1.create = ...
    else:
        # handle no entry, by either creating one, and inserting it or raising
        # an exception if it should be there.

If you don't do this, then there is a real chance of things not working as
expected.

>
>
>      # And execute remaining checkpoints:
>      execute(TI1, TI2, Xfer1, Xfer2) #<---- execute the rest of the 
> checkpoints.

Thanks,

Darren.
>
_______________________________________________
caiman-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/caiman-discuss

Reply via email to