On 29-12-15 14:46, Daan Hoogland wrote:
> Wido, Rafael,
> 
> I like the date-format but then of course CCYY-MM-DD. I can still think of
> ways to screw up that (or the plain int;)
> 

20151229 is a valid integer which you can simply use to compare with.

100, 101, 102 or 20151229, 20160103, 20160104, I don't care that much.

My point is that the database version should be separated from the code
base.

Wido

> On Tue, Dec 29, 2015 at 1:40 PM, Rafael Weingärtner <
> rafaelweingart...@gmail.com> wrote:
> 
>> Wido, that is true, you are right; the naming on upgrade routines can use a
>> numeric value independent of the number of the version. The numeric value
>> can be a simple integer that is incremented each routine that is added or a
>> time stamp when the routine was added. The point is that we would have to
>> link a version to a number. That would enable us to use flywaydb.
>>
>> To use that approach I think we might need to break compatibility as you
>> pointed out earlier, but I believe that the benefits of an improved way to
>> manage upgrade routines will compensate by the breaking of compatibility.
>>
>> On Tue, Dec 29, 2015 at 10:25 AM, Wido den Hollander <w...@widodh.nl>
>> wrote:
>>
>>>
>>>
>>> On 29-12-15 13:21, Rafael Weingärtner wrote:
>>>> I got your point Daan.
>>>>
>>>> Well, and if we linked a version of ACS with a time stamp in the format
>>> of
>>>> DD.MM.YYYY?
>>>>
>>>
>>> In that case you could also say.
>>>
>>> ACS 4.6.0 == db ver X
>>>
>>> You don't have to say ver >= X, you can also say ver = X.
>>>
>>>> We could then use the time stamp in the same format to name upgrade
>>>> routines. This way the idea of running all of the routines in between
>>>> version during upgrades could be applied.
>>>>
>>>
>>> Same goes for giving all database changes a simple numeric int which
>>> keeps incrementing each time a change is applied ;)
>>>
>>> Wido
>>>
>>>> On Tue, Dec 29, 2015 at 10:03 AM, Daan Hoogland <
>> daan.hoogl...@gmail.com
>>>>
>>>> wrote:
>>>>
>>>>> Rafael,
>>>>>
>>>>> On Tue, Dec 29, 2015 at 12:22 PM, Rafael Weingärtner <
>>>>> rafaelweingart...@gmail.com> wrote:
>>>>>
>>>>>> Thanks, Daan and Wido for your contributions, I will discuss them as
>>>>>> follows.
>>>>>>
>>>>>> Daan, about the idea of per commit upgrades. Do you mean that we
>>> separate
>>>>>> each change in the database that is introduced by PRs/Commits in a
>>>>>> different file (routine upgrade) per ACS version?
>>>>>> So we would have, V_480_A.sql (for a PR),V_480_B.sql (for another PR)
>>> and
>>>>>> so forth
>>>>>>
>>>>>> If that is the case, we can achieve that using a simple convention
>>> naming
>>>>>> as I suggested. Each developer when she/he needs to change or add
>>>>> something
>>>>>> in the database creates an upgrade routine separately and gives it an
>>>>>> execution order to be taken by Flywaydb. I think that could help RMs
>> to
>>>>>> track and isolate the problem, right?
>>>>>>
>>>>> ​Yes, with one little caveat. We do not know in what version a
>>> feature/PR
>>>>> will end up at the time of implementing, so a name containing the
>>> version
>>>>> would not be ideal.
>>>>> ​
>>>>>
>>>>>
>>>>>>
>>>>>> Hi Wido, now I understand your example.
>>>>>> I understand your worry about upgrade paths, and that is the point I
>>> want
>>>>>> to discuss and solve. In your example, if we release a 4.6.0 and
>> later
>>> a
>>>>>> 4.5.3. You said that there would be no upgrade path from 4.5.3 to
>>> 4.6.0.
>>>>>> Well, today that is what happens. However, if we change the
>> technology
>>> we
>>>>>> use to upgrade the database (using a tool such as Flywaydb) and if we
>>>>>> define a standard to create upgrade routines that would not be a
>>> problem.
>>>>>>
>>>>>> As I have written in my first email, to go from a version to another
>> we
>>>>>> should be able to run all of the upgrade routines in between them
>>>>>> (including the upgrade routine of the goal version). Therefore, if we
>>>>>> release a version 4.6.0, and then 4.5.3, if someone upgrades to 4.5.3
>>>>> from
>>>>>> any other version, and then wants to upgrade to 4.6.0, that would not
>>> be
>>>>> a
>>>>>> problem, it would be a metter of running only the routine upgrade of
>>>>> 4.6.0
>>>>>> version. We do not need to explicitly create upgrade paths. They
>> should
>>>>> be
>>>>>> implicit by our upgrade conventions.
>>>>>>
>>>>>> About creating versions of the code that rely on some version of the
>>>>>> database. I do not like much because of compatibility issues that
>> might
>>>>>> arise. For instance, let’s say version X of ACS depends on version
>>> =Y
>>> of
>>>>>> the database. If I upgrade the database to version Y + 1 or +2, the
>>> same
>>>>>> ACS version has to keep running nice and shiny. My worry is that may
>>>>> bring
>>>>>> some complications, such as to remove columns that cease to be used
>> or
>>>>> data
>>>>>> structure that we might want to improve.
>>>>>>
>>>>>> I normally see that the database version and the code base are tied
>> in
>>> a
>>>>>> mapping 1 to 1. Maybe I am having troubles identifying the benefits
>> of
>>>>> that
>>>>>> change.
>>>>>>
>>>>>> Thanks for your time ;)
>>>>>>
>>>>>> On Tue, Dec 29, 2015 at 8:15 AM, Wido den Hollander <w...@widodh.nl>
>>>>>> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 28-12-15 21:34, Rafael Weingärtner wrote:
>>>>>>>> Hi Wido, Rohit,
>>>>>>>> I have just read the feature suggestion.
>>>>>>>>
>>>>>>>> Wido, I am not trying to complicate things, quite the opposite, I
>>>>> just
>>>>>>>> illustrate a simple thing that can happen and is happening; I just
>>>>>>> pointed
>>>>>>>> how it can be easily solved.
>>>>>>>>
>>>>>>>> About the release of .Z, releases more constant and others, I do
>> not
>>>>>> want
>>>>>>>> to mix topics. Let’s keep this thread strict to discuss database
>>>>>>> upgrades.
>>>>>>>>
>>>>>>>
>>>>>>> I do not want to start the release discussion, but what I meant is
>>> that
>>>>>>> we try to find a technical solution to something which might be
>> solved
>>>>>>> easier by just changing the way we release.
>>>>>>>
>>>>>>> 4.6.0 is released and afterwards 4.5.3 is released. How does
>> somebody
>>>>>>> upgrade from 4.5.3 to 4.6.0? He can't, since the 4.6.0 code doesn't
>>>>>>> support that path.
>>>>>>>
>>>>>>> So my idea is to split the database version from the code version.
>>>>>>>
>>>>>>> The code requires database version >= X and during boot it simply
>>>>> checks
>>>>>>> that.
>>>>>>>
>>>>>>> The database migration tool can indeed do the DB migration, it
>> doesn't
>>>>>>> have to be the mgmt server who does the upgrade.
>>>>>>>
>>>>>>>> Now, about the FS. I agree with Rohit that we should have only one
>>>>> way
>>>>>> of
>>>>>>>> managing database upgrades and creation. I just do not like the
>> idea
>>>>> of
>>>>>>>> creating a tool that work as a wrapper on frameworks/tools such as
>>>>>>>> flywaydb. I think that those frameworks already work pretty good as
>>>>>> they
>>>>>>>> are; and, I would rather maintain configurations than some wrapper
>>>>>> code.
>>>>>>>>
>>>>>>>> I personally like the way ACS works during upgrades (I just do not
>>>>> like
>>>>>>> the
>>>>>>>> code itself and how things are structured), as a system
>>>>> administrator I
>>>>>>>> like to change the version in the
>>>>>>> “/etc/apt/sources.list.d/cloudstack.list”
>>>>>>>> and use the "apt-get" "update" and "install" from the command
>> line. I
>>>>>> do
>>>>>>>> not see the need to add another tool that is just a wrapper to the
>>>>> mix.
>>>>>>> If
>>>>>>>> I update ACS code to 4.7.0, why would I let the database schema in
>> an
>>>>>>> older
>>>>>>>> version? And if we want version DB schemas and application code
>>>>>>> separately
>>>>>>>> maintaining somehow compatibility between them, which would bring a
>>>>>> whole
>>>>>>>> other level of complexity to the code; I think we should avoid
>> that.
>>>>>>>>
>>>>>>>> The flywaydb can be easily integrated with everything we have now;
>> we
>>>>>>> could
>>>>>>>> have a maven profile for developers and integrate it in ACS
>> bootstrap
>>>>>>> using
>>>>>>>> its API as a Spring bean. Therefore, we could remove the current
>>>>>>>> “DatabaseUpgradeChecker “, “DbUpgrade” and other classes that aim
>> to
>>>>> do
>>>>>>>> that. We could even add the creation of the schema into the first
>>>>> time
>>>>>> it
>>>>>>>> boots using flywaydb and retire the “cloudstack-setup-database”
>>>>> script,
>>>>>>> or
>>>>>>>> at least make it less complicated, using it just to configure the
>>>>>>> database
>>>>>>>> URL and users.
>>>>>>>>
>>>>>>>> The point is that to use Flywaydb we would have to agree upon a
>>>>>>> convention
>>>>>>>> on creating routines (java and SQL) to execute upgrades. Moreover,
>>>>>> using
>>>>>>> a
>>>>>>>> tool such as Flywaydb we do not need to worry about upgrade paths.
>>>>> As I
>>>>>>>> wrote in the email I used to start this thread, the upgrade has to
>> be
>>>>>>>> straightforward, to go to a version we have to run all of the
>> upgrade
>>>>>>>> routines between the current version until the desired one. Our job
>>>>> is
>>>>>> to
>>>>>>>> create upgrade routines that work and name them properly, the job
>> of
>>>>>> the
>>>>>>>> tool is to check the current version, the desired one, the upgrades
>>>>>> that
>>>>>>> it
>>>>>>>> needs to run and execute everything properly.
>>>>>>>>
>>>>>>>
>>>>>>> Yes, indeed. I just wanted to start the discussion if we shouldn't
>>>>>>> version the database differently from the code.
>>>>>>>
>>>>>>>> Additionally, I do not see the need to break compatibility as Rohit
>>>>>>>> suggested in the FS; in my opinion, everything we have up today can
>>>>> be
>>>>>>>> migrated to the new structure I proposed. If we use a tool such as
>>>>>>>> Flywaydb, I even volunteered for that. The only thing we have to
>>>>>> discuss
>>>>>>>> and agree upon is the naming conventions for upgrades routines,
>> where
>>>>>> to
>>>>>>>> put them and the configurations for flywaydb.
>>>>>>>>
>>>>>>>> Thanks for your contribution and time.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, Dec 28, 2015 at 2:10 PM, Rohit Yadav <
>>>>>> rohit.ya...@shapeblue.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi Rafael and Wido,
>>>>>>>>>
>>>>>>>>> Thanks for starting a conversation in this regard, I could not
>>>>> pursue
>>>>>>> the
>>>>>>>>> Chimp tool due to other $dayjob work though it’s good to see some
>>>>>>>>> discussion has started again. Hope we’ll solve this in 2016.
>>>>>>>>>
>>>>>>>>> In my opinion, we will need to first separate the database
>>>>>>> init/migration
>>>>>>>>> tooling away from mgmt server (right now the mgmt server does db
>>>>>>> migrations
>>>>>>>>> when it starts and there is a code/db version mismatch) and
>> secondly
>>>>>>> make
>>>>>>>>> sure that we’re using the same code/tool to deploy database (right
>>>>>> now,
>>>>>>>>> users use the cloudstack-setup-database python tool while
>> developer
>>>>>> use
>>>>>>> the
>>>>>>>>> maven/java DatabaseCreator activated by the -Ddeploydb flag).
>>>>>>>>>
>>>>>>>>> After we’ve addressed these two issues we can look into how we can
>>>>>>> support
>>>>>>>>> minor releases workflow (or decide to do something else, like not
>>>>>>> support
>>>>>>>>> .Z releases like Wido mentioned), and see if we can or want to use
>>>>> any
>>>>>>>>> existing migration tool or write a wrapper tool “chimp” that uses
>>>>>>> existing
>>>>>>>>> tools (some of those are mentioned in the Chimp FS like flywaydb
>>>>> etc).
>>>>>>> For
>>>>>>>>> allowing users to go back and forth from a db schema/version,
>> we’ll
>>>>>> also
>>>>>>>>> need some new DB migration
>>>>>> conventions/versioning/rules/static-checking,
>>>>>>>>> and how developer need to write such paths (forward and reverse)
>>>>> etc.
>>>>>>>>>
>>>>>>>>> The best approach I figured at the time was to decide that we’ll
>> use
>>>>>> the
>>>>>>>>> previous db upgrade path mechanism till a certain CloudStack
>> version
>>>>>>> (say
>>>>>>>>> 4.8.0) and after that we’ll use the new approach or tooling to
>>>>>>>>> upgrade/downgrade DB schemas (thereby retiring away from the old
>> DB
>>>>>>> upgrade
>>>>>>>>> path mess).
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> [image: ShapeBlue] <http://www.shapeblue.com> Rohit Yadav
>> Software
>>>>>>>>> Architect ,  ShapeBlue d:  * | s: +44 203 603 0540*
>>>>>>>>> <%7C%20s:%20+44%20203%20603%200540>  |  m:  *+91 8826230892*
>>>>>>>>> <+91%208826230892> e:  *rohit.ya...@shapeblue.com | t: *
>>>>>>>>> <rohit.ya...@shapeblue.com%20%7C%20t:>  |  w:  *www.shapeblue.com
>> *
>>>>>>>>> <http://www.shapeblue.com> a:
>>>>>>>>> 53 Chandos Place, Covent Garden London WC2N 4HS UK Shape Blue Ltd
>>>>> is a
>>>>>>>>> company incorporated in England & Wales. ShapeBlue Services India
>>>>> LLP
>>>>>>> is a
>>>>>>>>> company incorporated in India and is operated under license from
>>>>> Shape
>>>>>>> Blue
>>>>>>>>> Ltd. Shape Blue Brasil Consultoria Ltda is a company incorporated
>> in
>>>>>>> Brasil
>>>>>>>>> and is operated under license from Shape Blue Ltd. ShapeBlue SA
>> Pty
>>>>>> Ltd
>>>>>>> is
>>>>>>>>> a company registered by The Republic of South Africa and is traded
>>>>>> under
>>>>>>>>> license from Shape Blue Ltd. ShapeBlue is a registered trademark.
>>>>>>>>> This email and any attachments to it may be confidential and are
>>>>>>> intended
>>>>>>>>> solely for the use of the individual to whom it is addressed. Any
>>>>>> views
>>>>>>> or
>>>>>>>>> opinions expressed are solely those of the author and do not
>>>>>> necessarily
>>>>>>>>> represent those of Shape Blue Ltd or related companies. If you are
>>>>> not
>>>>>>> the
>>>>>>>>> intended recipient of this email, you must neither take any action
>>>>>> based
>>>>>>>>> upon its contents, nor copy or show it to anyone. Please contact
>> the
>>>>>>> sender
>>>>>>>>> if you believe you have received this email in error.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 28-Dec-2015, at 9:10 PM, Wido den Hollander <w...@widodh.nl>
>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 28-12-15 16:21, Rafael Weingärtner wrote:
>>>>>>>>>>> Thanks for your contribution Wido,
>>>>>>>>>>> I have not seen Rohit’s email; I will take a look at it.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Ok, he has a FS here:
>>>>>>>>>>
>>>>>>>
>>>>>
>> https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+Chimp
>>>>>>>>>>
>>>>>>>>>>> About database schema changes happening only in X.Y, I also
>> agree
>>>>>> with
>>>>>>>>> you
>>>>>>>>>>> (that is a convention we all could agree on, and such as conding
>>>>> and
>>>>>>>>>>> release procedures we could have a wiki page for that).
>> However, I
>>>>>>>>> think we
>>>>>>>>>>> still might have scripts in versions X.Y.Z to add data to a
>> table
>>>>>> such
>>>>>>>>> as
>>>>>>>>>>> “guest_os_hypervisor”.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Yes, that is true. A bugfix could be a addition into the
>> database,
>>>>>> but
>>>>>>>>>> we have to prevent it as much as possible.
>>>>>>>>>>
>>>>>>>>>>> The point to manage such scripts is that, if we are in version
>>>>> such
>>>>>> as
>>>>>>>>>>> 4.7.0 and a new script emerges in version 4.5.3, we would have
>> to
>>>>>>>>> decide to
>>>>>>>>>>> run or not to run it. I would rather not run them, since if they
>>>>> add
>>>>>>>>>>> something to the code base; those changes should also be applied
>>>>>> into
>>>>>>>>>>> master and as a consequence it will be available in a future
>>>>> update.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I understand, but this is where our release cycle becomes the
>>>>>> problem.
>>>>>>>>>> It is because we release a X.Y.Z release we run into these kind
>> of
>>>>>>>>> problems.
>>>>>>>>>>
>>>>>>>>>> If we as a project simple do not release the .Z releases we would
>>>>> be
>>>>>>>>>> fine as well ;)
>>>>>>>>>>
>>>>>>>>>> You can try to complicate things with technical things, or if we
>>>>>>> release
>>>>>>>>>> every two / three weeks we don't run into these kind of
>> situations
>>>>> :)
>>>>>>>>>>
>>>>>>>>>> We might even cut the database version loose from the code
>> version.
>>>>>>>>>>
>>>>>>>>>> Database version is simple 100, 101, 102, 103, 104, 105. And a
>> code
>>>>>>>>>> version requires a certain version of the database.
>>>>>>>>>>
>>>>>>>>>> Wido
>>>>>>>>>>
>>>>>>>>>>> On Mon, Dec 28, 2015 at 12:50 PM, Wido den Hollander <
>>>>>> w...@widodh.nl>
>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On 28-12-15 14:16, Rafael Weingärtner wrote:
>>>>>>>>>>>>> Hi all devs,
>>>>>>>>>>>>> First of all, sorry the long text, but I hope we can start a
>>>>>>>>> discussion
>>>>>>>>>>>>> here and improve that part of ACS.
>>>>>>>>>>>>>
>>>>>>>>>>>>> A while ago I have faced the code that Apache CloudStack (ACS)
>>>>>> uses
>>>>>>> to
>>>>>>>>>>>>> upgrade from a version to newer one and that did not seem to
>> be
>>>>> a
>>>>>>> good
>>>>>>>>>>>> way
>>>>>>>>>>>>> to execute our upgrades. Therefore, I decided to use some time
>>>>> to
>>>>>>>>> search
>>>>>>>>>>>>> for alternatives.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I think we all saw that happen once or more :)
>>>>>>>>>>>>
>>>>>>>>>>>>> I have read some material about versioning of scripts used to
>>>>>>> upgrade
>>>>>>>>> a
>>>>>>>>>>>>> database (DB) of a system and went through some frameworks
>> that
>>>>>>> could
>>>>>>>>>>>> help
>>>>>>>>>>>>> us.
>>>>>>>>>>>>>
>>>>>>>>>>>>> In the literature of software engineering, it is firmly stated
>>>>>> that
>>>>>>> we
>>>>>>>>>>>> have
>>>>>>>>>>>>> to version DB scripts as we do with the source code of the
>>>>>>>>> application,
>>>>>>>>>>>>> using the baseline approach. Gladly, we were not that bad at
>>>>> this
>>>>>>>>> point,
>>>>>>>>>>>> we
>>>>>>>>>>>>> already versioned our routines for DB upgrade (.sql and
>> .java).
>>>>>>>>>>>> Therefore,
>>>>>>>>>>>>> it seemed that we just did not have used a practical approach
>> to
>>>>>>> help
>>>>>>>>> us
>>>>>>>>>>>>> during DB upgrades.
>>>>>>>>>>>>>
>>>>>>>>>>>>> From my readings and looking at the ACS source code I raised
>> the
>>>>>>>>>>>> following
>>>>>>>>>>>>> requirement:
>>>>>>>>>>>>> • We should be able to write more than one routine to upgrade
>>>>> to a
>>>>>>>>>>>>> version; those routines can be written in Java and SQL. We
>> might
>>>>>>> have
>>>>>>>>>>>> more
>>>>>>>>>>>>> than a routine to be executed for each version and we should
>> be
>>>>>> able
>>>>>>>>> to
>>>>>>>>>>>>> define an order of execution. Additionally, to go to an upper
>>>>>>>>> version, we
>>>>>>>>>>>>> have to run all of the routines from smaller versions first,
>>>>> until
>>>>>>> we
>>>>>>>>>>>>> achieve the desired version.
>>>>>>>>>>>>>
>>>>>>>>>>>>> We could also add another requirement that is the downgrade
>>>>> from a
>>>>>>>>>>>> version,
>>>>>>>>>>>>> which we currently do not support. With that comes my first
>>>>>> question
>>>>>>>>> for
>>>>>>>>>>>>> discussion:
>>>>>>>>>>>>> • Do we want/need a method to downgrade from a version to a
>>>>>> previous
>>>>>>>>>>>> one?
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I personally do not care. Usually people should create a backup
>>>>>> PRIOR
>>>>>>>>> to
>>>>>>>>>>>> a upgrade. If that fails they can restore the backup.
>>>>>>>>>>>>
>>>>>>>>>>>>> I found an explanation for not supporting downgrades, and I
>>>>> liked
>>>>>>> it:
>>>>>>>>>>>>> http://flywaydb.org/documentation/faq.html#downgrade
>>>>>>>>>>>>>
>>>>>>>>>>>>> So, what I devised for us:
>>>>>>>>>>>>> First the bureaucracy part - our migrations occur basically in
>>>>>> three
>>>>>>>>> (3)
>>>>>>>>>>>>> steps, first we have a "prepare script", then a cleanup script
>>>>> and
>>>>>>>>>>>> finally
>>>>>>>>>>>>> the migration per se that is written in Java, at least, that
>> is
>>>>>> what
>>>>>>>>> we
>>>>>>>>>>>> can
>>>>>>>>>>>>> expect when reading the interface
>>>>>> “com.cloud.upgrade.dao.DbUpgrade”.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Additionally, our scripts have the following naming
>> convention:
>>>>>>>>>>>>> schema-<currentVersion>to<desiredVersion>, which in IMHO may
>>>>> cause
>>>>>>>>> some
>>>>>>>>>>>>> confusion because at first sight we may think that from the
>> same
>>>>>>>>> version
>>>>>>>>>>>> we
>>>>>>>>>>>>> could have different paths to an upper version, which in
>>>>> practice
>>>>>> is
>>>>>>>>> not
>>>>>>>>>>>>> happening. Instead of a <currentVersion>to<version> we could
>>>>>> simply
>>>>>>>>> use
>>>>>>>>>>>>> V_<numberOfVersion>_<sequencial>.<fileExtension>, giving that,
>>>>> we
>>>>>>>>> have to
>>>>>>>>>>>>> execute all of the V_<version> scripts that are smaller than
>> the
>>>>>>>>> version
>>>>>>>>>>>> we
>>>>>>>>>>>>> want to upgrade.
>>>>>>>>>>>>>
>>>>>>>>>>>>> To clarify what I am saying, I will use an example. Let’s say
>> we
>>>>>>> have
>>>>>>>>>>>> just
>>>>>>>>>>>>> installed ACS and ran the cloudstack-setup-database. That
>>>>> command
>>>>>>> will
>>>>>>>>>>>>> create a database schema in version 4.0.0. To upgrade that
>>>>> schema
>>>>>> to
>>>>>>>>>>>>> version 4.3.0 (it is just an example, it could be any other
>>>>>>> version),
>>>>>>>>> ACS
>>>>>>>>>>>>> will use the following mapping:
>>>>>>>>>>>>>
>>>>>>>>>>>>> _upgradeMap.put("4.0.0", new DbUpgrade[] {new Upgrade40to41(),
>>>>> new
>>>>>>>>>>>>> Upgrade410to420(), new Upgrade420to421(), new
>> Upgrade421to430())
>>>>>>>>>>>>>
>>>>>>>>>>>>> After loading the mapping, ACS will execute the scripts
>> defined
>>>>> in
>>>>>>>>> each
>>>>>>>>>>>> one
>>>>>>>>>>>>> of the Upgrade path classes and the migration code per se.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Now, let’s say we change the “.sql” scripts name to the
>> pattern
>>>>> I
>>>>>>>>>>>>> mentioned, we would have the following scripts; those are the
>>>>>>> scripts
>>>>>>>>>>>> found
>>>>>>>>>>>>> that aim to upgrade to versions between the interval 4.0.0 –
>>>>> 4.3.0
>>>>>>>>>>>>> (considering 4.3.0, since that is the goal version):
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> - schema-40to410, can be named to: V_410_A.sql
>>>>>>>>>>>>> - schema-40to410-cleanup, can be named to: V_410_B.sql
>>>>>>>>>>>>> - schema-410to420, can be named to: V_420_A.sql
>>>>>>>>>>>>> - schema-410to420-cleanup , can be named to: V_420_b.sql
>>>>>>>>>>>>> - schema-420to421, can be named to: V_421_A.sql
>>>>>>>>>>>>> - schema-421to430, can be named to: V_430_A.sql
>>>>>>>>>>>>> - schema-421to430-cleanup, can be named to: V_430_B.sql
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Additionally, all of the java code would have to follow the
>> same
>>>>>>>>>>>>> convention. For instance, we have
>>>>>>>>> “com.cloud.upgrade.dao.Upgrade40to41”,
>>>>>>>>>>>>> which has some java code to migrate from 4.0.0 to 4.1.0. The
>>>>> idea
>>>>>> is
>>>>>>>>> to
>>>>>>>>>>>>> extract that migration code to a Java class named:
>> V_410_C.java,
>>>>>>>>> giving
>>>>>>>>>>>>> that it has to execute the SQL scripts before the java code.
>>>>>>>>>>>>>
>>>>>>>>>>>>> In order to go from a smaller version (4.0.0) to an upper one
>>>>>>>>> (4.3.0), we
>>>>>>>>>>>>> have to run all of the migration routines from intermediate
>>>>>>> versions.
>>>>>>>>>>>> That
>>>>>>>>>>>>> is what we are already doing, but we do all of that manually.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Bottom line, I think we could simple use the convention
>>>>>>>>>>>>> V_<numberOfVersion>_<sequencial>.<fileExtension> to name
>> upgrade
>>>>>>>>>>>> routines.
>>>>>>>>>>>>> That would facilitate us to use a framework to help us with
>> that
>>>>>>>>> process.
>>>>>>>>>>>>> Additionally, I believe that we should always assume that to
>> go
>>>>>>> from a
>>>>>>>>>>>>> smaller version to a higher one, we should run all of the
>>>>> scripts
>>>>>>> that
>>>>>>>>>>>>> exist between them. What do you guys think of that?
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> That seems good to me. But we still have to prevent that we
>>>>> perform
>>>>>>>>>>>> database changes in a X.Y.Z release since that is branched off
>>>>> to a
>>>>>>>>>>>> different branch.
>>>>>>>>>>>>
>>>>>>>>>>>> Imho database changes should only happen in X.Y releases.
>>>>>>>>>>>>
>>>>>>>>>>>>> After the bureaucracy, we can discuss tools. If we use that
>>>>>>>>> convention to
>>>>>>>>>>>>> name migration (upgrade) routines, we can start thinking on
>>>>> tools
>>>>>> to
>>>>>>>>>>>>> support our migration process. I found two (2) promising ones:
>>>>>>>>> Liquibase
>>>>>>>>>>>>> and Flywaydb (both seem to be under Apache license, but the
>>>>> first
>>>>>>> one
>>>>>>>>> has
>>>>>>>>>>>>> an enterprise version?!). After reading the documentation and
>>>>> some
>>>>>>>>> usage
>>>>>>>>>>>>> examples I found the flywaydb easier and simpler to use.
>>>>>>>>>>>>>
>>>>>>>>>>>>> What are the options of tools that we can use to help us
>> manage
>>>>>> the
>>>>>>>>>>>>> database upgrade, without needing to code the upgrade path
>> that
>>>>>> you
>>>>>>>>> know?
>>>>>>>>>>>>>
>>>>>>>>>>>>> After that, I think we should decide if we should create
>> another
>>>>>>>>>>>>> project/component to take care of migrations, or we can just
>> add
>>>>>> the
>>>>>>>>>>>>> dependency of the tool to a project such as
>> “cloud-framework-db”
>>>>>> and
>>>>>>>>>>>> start
>>>>>>>>>>>>> using it.
>>>>>>>>>>>>>
>>>>>>>>>>>>> The “cloud-framework-db” project seems to have a focus on
>> other
>>>>>>> things
>>>>>>>>>>>> such
>>>>>>>>>>>>> as managing transactions and generating SQLs from annotations
>>>>> (?!?
>>>>>>>>> That
>>>>>>>>>>>>> should be a topic for another discussion). Therefore, I would
>>>>>> rather
>>>>>>>>>>>> create
>>>>>>>>>>>>> a new project that has the specific goal of managing ACS DB
>>>>>>> upgrades.
>>>>>>>>> I
>>>>>>>>>>>>> would also move all of the routines (SQL and Java) to this new
>>>>>>>>> project.
>>>>>>>>>>>>> This project would be a module of the CloudStack project and
>> it
>>>>>>> would
>>>>>>>>>>>>> execute the upgrade routines at the startup of ACS.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I believe that going from a homemade solution to one that is
>>>>> more
>>>>>>>>>>>>> consolidated and used by other communities would be the way to
>>>>> go.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I can volunteer myself to create a PR with the aforementioned
>>>>>>> changes
>>>>>>>>> and
>>>>>>>>>>>>> using flywaydb to manage our upgrades. However, I prefer to
>>>>> have a
>>>>>>>>> good
>>>>>>>>>>>>> discussion with other devs first, before starting coding.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Do you have suggestions or points that should be raised before
>>>>> we
>>>>>>>>> start
>>>>>>>>>>>>> working on that?
>>>>>>>>>>>>
>>>>>>>>>>>> Rohit suggested Chimp earlier this year:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>
>> http://mail-archives.apache.org/mod_mbox/cloudstack-dev/201508.mbox/%3c677bd09f-fc75-4888-8dc8-2b7af7439...@shapeblue.com%3E
>>>>>>>>>>>>
>>>>>>>>>>>> The thread is called: "[DISCUSS] Let's fix CloudStack Upgrades
>>>>> and
>>>>>> DB
>>>>>>>>>>>> migrations with CloudStack Chimp"
>>>>>>>>>>>>
>>>>>>>>>>>> Maybe there is something good in there.
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Rafael Weingärtner
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Regards.
>>>>>>>>>
>>>>>>>>> Find out more about ShapeBlue and our range of CloudStack related
>>>>>>> services:
>>>>>>>>> IaaS Cloud Design & Build
>>>>>>>>> <http://shapeblue.com/iaas-cloud-design-and-build//> | CSForge –
>>>>>> rapid
>>>>>>>>> IaaS deployment framework <http://shapeblue.com/csforge/>
>>>>>>>>> CloudStack Consulting <
>> http://shapeblue.com/cloudstack-consultancy/
>>>>>>
>>>>>> |
>>>>>>> CloudStack
>>>>>>>>> Software Engineering
>>>>>>>>> <http://shapeblue.com/cloudstack-software-engineering/>
>>>>>>>>> CloudStack Infrastructure Support
>>>>>>>>> <http://shapeblue.com/cloudstack-infrastructure-support/> |
>>>>>> CloudStack
>>>>>>>>> Bootcamp Training Courses <
>>>>> http://shapeblue.com/cloudstack-training/>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Rafael Weingärtner
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Daan
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>> --
>> Rafael Weingärtner
>>
> 
> 
> 

Reply via email to