[Zope-CMF] Re: <genericsetup:upgradeRerunImportStep> (was Re:
Multiple GS profiles per product)
Rob Miller
ra at burningman.com
Tue May 20 14:23:06 EDT 2008
Maurits van Rees wrote:
> Rob Miller, on 2008-05-20:
>> it's maybe worth mentioning here that i _have_ recently started
>> using GS's upgrade machinery, and have been quite happy with it.
>> the one thing that i've missed, which i'd like to add to the GS core
>> if there's no strong objection, is the ability to easily register
>> re-running a particular import step as a part of an upgrade path.
>>
>> i propose introducing <genericsetup:upgradeRerunImportStep>, which
>> could be used as a standalone tag or nested within the grouping
>> defined by a <genericsetup:upgradeSteps> tag. it would function
>> similarly to a regular upgrade step, except instead of running an
>> arbitrary callable handler, it would rerun a registered import step
>> within the context of the profile with which the step is registered.
>>
>> it would also support an optional boolean purge attribute, which would be
>> passed in to the import step execution as the purge argument.
>>
>> a sample usage might look like this:
>>
>>
>> <configure xmlns="http://namespaces.zope.org/zope"
>> xmlns:genericsetup="http://namespaces.zope.org/genericsetup">
>>
>> <genericsetup:upgradeSteps
>> profile="PACKAGE_NAME:default"
>> source="1.0"
>> destination="1.1"
>> sortkey="10">
>>
>> <genericsetup:upgradeRerunImportStep
>> stepid="typeinfo" />
>>
>> <genericsetup:upgradeRerunImportStep
>> stepid="workflow"
>> purge="True" />
>>
>> <genericsetup:upgradeStep
>> title="Do something special"
>> description="Does something special"
>> handler=".upgrades.do_something_special"
>> />
>>
>> </genericsetup:upgradeSteps>
>>
>> </configure>
>
> And where are the original typeinfo and workflow upgrade steps
> defined? Are they in some other zcml file of your product? Or would
> they be general upgradesteps defined by GenericSetup, available for
> any products?
they're expected to be import steps that are already registered with the
portal_setup tool. they can be registered in all the usual manners, either
via import_steps.xml or ZCML. this is a reasonable requirement... you can
only run upgrades against profiles that have already been loaded into
portal_setup's step registry, and if your profile has been loaded, then any of
the steps that it depends upon will be there.
> I *could* imagine for example a general workflow upgrade step that
> reapplies the security settings based on some new workflow settings
> that your product has just defined. Although really that could be
> done like this, without needing to define a new zcml directive:
>
> <genericsetup:upgradeStep
> title="Workflow upgrade for my product"
> description="Same here"
> handler="Products.GenericSetup.upgrades.apply_security_settings"
> />
>
> So GenericSetup would then define some default upgrade handlers, just
> like it defines some export/import handlers.
>
> Would that suit your use case or are you thinking of something else?
that's not quite the case i'm talking about. i'm talking about a situation
where you've edited the my_workflow.xml file in your GS profile, and you want
to express (using GenericSetup's upgrade step registry) that the 'workflow'
import step needs to be re-applied to the site. this is extremely common...
i'm always having to keep track of which import steps i need to re-run for a
particular upgrade.
in theory, all upgrade code should always be idempotent, so you _could_ argue
that you should always just re-import the entire profile. but sometimes
people make mistakes and a particular step is not idempotent. and
re-importing the entire profile might be a much heavier operation than simply
re-applying a fairly trivial config change. i much prefer to mark specific
steps as needing to be re-run.
it CAN be done w/o a custom tag... i'm currently using a 'rerun_import_steps'
handler, you can see the implementation here:
http://tinyurl.com/5d69my
with a specific usage here:
http://tinyurl.com/6m7sjm (<-- ZCML)
http://tinyurl.com/6zhtzw (<-- handler)
but this is still too much boiler-plate for me. i have to stub out my own
data structure to store the steps that need to be run for a given upgrade
path, including whether or not the step should be run in purge mode. all of
this can be expressed in a new ZCML tag very easily, eliminating the need for
boiler-plate code. as an added bonus, it makes your upgrade registration ZCML
more informative, you can see at a glance everything that needs to happen for
a given upgrade path.
-r
More information about the Zope-CMF
mailing list