diff options
Diffstat (limited to 'cpp/config/upgradeicegrid.py')
-rwxr-xr-x | cpp/config/upgradeicegrid.py | 218 |
1 files changed, 144 insertions, 74 deletions
diff --git a/cpp/config/upgradeicegrid.py b/cpp/config/upgradeicegrid.py index d04ce809ddb..6f924227527 100755 --- a/cpp/config/upgradeicegrid.py +++ b/cpp/config/upgradeicegrid.py @@ -27,7 +27,7 @@ # the script to perform the database transformation. # -import sys, os, gzip, time +import sys, os, gzip, time, shutil, getopt olddbenv = None newdbenv = None @@ -42,6 +42,7 @@ def usage(): print print "Options:" print "-h Show this message." + sys.exit(2) def printOutputFromPipe(pipe): while 1: @@ -55,51 +56,150 @@ def error(message): print "error: " + message sys.exit(1) -def transformdb(db, desc): - global olddbenv, newdbenv, slicedir, bindir +def transformdb(olddbenv, newdbenv, db, desc, oldslice, newslice): + global bindir - oldslice = os.path.join(newdbenv, "icegrid-slice.3.1.ice") - oldslicefile = open(oldslice, "w+") - oldslicefile.write(gzip.GzipFile(os.path.join(os.path.dirname(sys.argv[0]), "icegrid-slice.3.1.ice.gz")).read()) + oldslicefile = open(os.path.join(newdbenv, oldslice), "w+") + oldslicefile.write(gzip.GzipFile(os.path.join(os.path.dirname(__file__), oldslice + ".gz")).read()) oldslicefile.close() + newslicefile = open(os.path.join(newdbenv, newslice), "w+") + newslicefile.write(gzip.GzipFile(os.path.join(os.path.dirname(__file__), newslice + ".gz")).read()) + newslicefile.close() + tmpdesc = os.path.join(newdbenv, "tmpdesc.xml") tmpfile = open(tmpdesc, "w+") tmpfile.write(desc) tmpfile.close() - transformdb = os.path.join(bindir, "transformdb") + \ - " -i --old " + oldslice + \ - " --include-new " + slicedir + " --new " + os.path.join(slicedir, "IceGrid", "Admin.ice") + transformdb = os.path.join(bindir, "transformdb") + " -i" + \ + " --old " + os.path.join(newdbenv, oldslice) + \ + " --new " + os.path.join(newdbenv, newslice) pipe = os.popen(transformdb + " -f " + tmpdesc + " " + olddbenv + " " + db + " " + newdbenv + " 2>&1" ) printOutputFromPipe(pipe) os.remove(tmpdesc) - os.remove(oldslice) + os.remove(os.path.join(newdbenv, oldslice)) + os.remove(os.path.join(newdbenv, newslice)) + if pipe.close(): + sys.exit(1) + +def upgrade31(olddbenv, newdbenv): + desc = \ + '<transformdb>' + \ + ' ' + \ + ' <database name="applications" ' + \ + ' key="string" ' + \ + ' value="::IceGrid::ApplicationDescriptor,::IceGrid::ApplicationInfo">' + \ + ' <record>' + \ + ' <set target="newvalue.revision" value="1"/>' + \ + ' <set target="newvalue.uuid" value="generateUUID()"/>' + \ + ' <set target="newvalue.createUser" value="\'IceGrid Registry (database upgrade)\'"/>' + \ + ' <set target="newvalue.updateUser" value="\'IceGrid Registry (database upgrade)\'"/>' + \ + ' <set target="newvalue.createTime" value="' + str(int(time.time() * 1000)) + '"/>' + \ + ' <set target="newvalue.updateTime" value="' + str(int(time.time() * 1000)) + '"/>' + \ + ' <set target="newvalue.descriptor" value="oldvalue"/>' + \ + ' </record>' + \ + ' </database>' + \ + ' <database name="objects" key="::Ice::Identity" value="::IceGrid::ObjectInfo"><record/></database>' + \ + ' <database name="adapters" key="string" value="::IceGrid::AdapterInfo"><record/></database>' + \ + '' + \ + ' <transform type="::IceGrid::AdapterDescriptor">' + \ + ' <set target="new.serverLifetime" value="old.waitForActivation"/>' + \ + ' </transform>' + \ + '' + \ + ' <transform type="::IceGrid::ReplicaGroupDescriptor">' + \ + ' <if test="old.loadBalancing == nil">' + \ + ' <set target="new.loadBalancing" type="::IceGrid::RandomLoadBalancingPolicy"/>' + \ + ' <set target="new.loadBalancing.nReplicas" value="\'0\'"/>' + \ + ' </if>' + \ + ' <if test="old.loadBalancing != nil and old.loadBalancing.nReplicas == \'0\'">' + \ + ' <set target="new.loadBalancing.nReplicas" value="\'1\'"/>' + \ + ' </if>' + \ + ' </transform>' + \ + ' ' + \ + '</transformdb>' + + transformdb(olddbenv, newdbenv, "objects", desc, "icegrid-slice.3.1.ice", "icegrid-slice.3.2.ice") + transformdb(olddbenv, newdbenv, "adapters", desc, "icegrid-slice.3.1.ice", "icegrid-slice.3.2.ice") + transformdb(olddbenv, newdbenv, "applications", desc, "icegrid-slice.3.1.ice", "icegrid-slice.3.2.ice") + +def upgrade32(olddbenv, newdbenv, iceServerVersion): + + databases = \ + '<database name="adapters" key="string" value="::IceGrid::AdapterInfo"><record/></database>' + \ + '<database name="applications" key="string" value="::IceGrid::ApplicationInfo"><record/></database>' + \ + '<database name="internal-objects" key="::Ice::Identity" value="::IceGrid::ObjectInfo">' + \ + '<record/></database>' + \ + '<database name="objects" key="::Ice::Identity" value="::IceGrid::ObjectInfo"><record/></database>' + + if not iceServerVersion.startswith("3.3"): + desc = \ + '<transformdb>' + \ + databases + \ + ' <transform type="::IceGrid::ServerDescriptor">' + \ + ' <set target="new.iceVersion" value="\'' + iceServerVersion + '\'"/>' + \ + ' </transform>' + \ + '</transformdb>' + else: + desc = \ + '<transformdb>' + \ + databases + \ + ' <transform type="::IceGrid::AdapterDescriptor">' + \ + ' <set target="new.registerProcess" value="false"/>' + \ + ' </transform>' + \ + ' <transform type="::IceGrid::ServerDescriptor">' + \ + ' <define name="adminEndpointProp" type="::IceGrid::PropertyDescriptor"/>' + \ + ' <set target="adminEndpointProp.name" value="\'Ice.Admin.Endpoints\'"/>' + \ + ' <set target="adminEndpointProp.value" value="\'tcp -h 127.0.0.1\'"/>' + \ + ' <add target="new.propertySet.properties" index="0" value="adminEndpointProp"/>' + \ + ' </transform>' + \ + '</transformdb>' + + transformdb(olddbenv, newdbenv, "objects", desc, "icegrid-slice.3.2.ice", "icegrid-slice.3.3.ice") + transformdb(olddbenv, newdbenv, "adapters", desc, "icegrid-slice.3.2.ice", "icegrid-slice.3.3.ice") + transformdb(olddbenv, newdbenv, "applications", desc, "icegrid-slice.3.2.ice", "icegrid-slice.3.3.ice") + if os.path.exists(os.path.join(olddbenv, "internal-objects")): + transformdb(olddbenv, newdbenv, "internal-objects", desc, "icegrid-slice.3.2.ice", "icegrid-slice.3.3.ice") + +def getIceGridEnvVersion(dbenv): + global bindir + + pipe = os.popen(os.path.join(bindir, "dumpdb") + " -c " + dbenv + " 2>&1") + ver = None + for line in pipe.readlines(): + if line.find("value type = ::IceGrid::ApplicationDescriptor") > 0: + ver = "3.1" + break + elif line.find("value type = ::IceGrid::ApplicationInfo") > 0: + ver = "3.2" + break + if pipe.close(): sys.exit(1) + return ver + # # Check arguments # -olddbenv = "" -newdbenv = "" -for x in sys.argv[1:]: - if x == "-h": - usage() - sys.exit(0) - elif x.startswith("-"): - print sys.argv[0] + ": unknown option `" + x + "'" - print - usage() - sys.exit(1) - elif olddbenv == "": - olddbenv = x - elif newdbenv == "": - newdbenv = x - else: + +try: + opts, args = getopt.getopt(sys.argv[1:], "hs:", ["help", "server-version="]) +except getopt.GetoptError: + usage() + +if not args or len(args) != 2: + print sys.argv[0] + ": missing database environment arguments" + usage() +olddbenv = args[0] +newdbenv = args[1] + +for o, a in opts: + if o in ("-h", "--help"): usage() - sys.exit(0) + if o in ("-s", "--server-version"): + serverVersion = a if not os.path.exists(olddbenv): error("database environment `" + olddbenv + "' doesn't exist") @@ -108,60 +208,30 @@ if not os.path.exists(newdbenv): error("database environment `" + newdbenv + "' doesn't exist") elif os.path.exists(os.path.join(newdbenv, "applications")) or \ os.path.exists(os.path.join(newdbenv, "adapters")) or \ + os.path.exists(os.path.join(newdbenv, "internal-objects")) or \ os.path.exists(os.path.join(newdbenv, "objects")): error("database environment `" + newdbenv + "' already has databases") -icedir = os.getenv("ICE_HOME") -if icedir == None: - icedir = os.path.join(os.path.dirname(sys.argv[0]), "..") - -for bindir in [os.path.join(icedir, "bin"), "/usr/bin"]: +for bindir in [os.path.join(os.path.dirname(__file__), "..", "bin"), "/usr/bin"]: bindir = os.path.normpath(bindir) if os.path.exists(os.path.join(bindir, "transformdb")): break else: error("can't locate the `transformdb' executable") -for slicedir in [os.path.join(icedir, "slice"), "/usr/share/slice"]: - slicedir = os.path.normpath(slicedir) - if os.path.exists(os.path.join(slicedir, "IceGrid", "Admin.ice")): - break +dbEnvVersion = getIceGridEnvVersion(olddbenv) +if dbEnvVersion == "3.1": + print "upgrading 3.1 database environment...", + sys.stdout.flush() + os.mkdir(os.path.join(newdbenv, "3.2")) + upgrade31(olddbenv, os.path.join(newdbenv, "3.2")) + upgrade32(os.path.join(newdbenv, "3.2"), newdbenv, "3.3") + shutil.rmtree(os.path.join(newdbenv, "3.2")) + print "ok" +elif dbEnvVersion == "3.2": + print "upgrading 3.2 database environment...", + sys.stdout.flush() + upgrade32(olddbenv, newdbenv, serverVersion) + print "ok" else: - error("can't locate the IceGrid slice files") - -desc = \ -'<transformdb>' + \ -' ' + \ -' <database name="applications" key="string" value="::IceGrid::ApplicationDescriptor,::IceGrid::ApplicationInfo">' + \ -' <record>' + \ -' <set target="newvalue.revision" value="1"/>' + \ -' <set target="newvalue.uuid" value="generateUUID()"/>' + \ -' <set target="newvalue.createUser" value="\'IceGrid Registry (database upgrade)\'"/>' + \ -' <set target="newvalue.updateUser" value="\'IceGrid Registry (database upgrade)\'"/>' + \ -' <set target="newvalue.createTime" value="' + str(int(time.time() * 1000)) + '"/>' + \ -' <set target="newvalue.updateTime" value="' + str(int(time.time() * 1000)) + '"/>' + \ -' <set target="newvalue.descriptor" value="oldvalue"/>' + \ -' </record>' + \ -' </database>' + \ -' <database name="objects" key="::Ice::Identity" value="::IceGrid::ObjectInfo"/>' + \ -' <database name="adapters" key="string" value="::IceGrid::AdapterInfo"/>' + \ -'' + \ -' <transform type="::IceGrid::AdapterDescriptor">' + \ -' <set target="new.serverLifetime" value="old.waitForActivation"/>' + \ -' </transform>' + \ -'' + \ -' <transform type="::IceGrid::ReplicaGroupDescriptor">' + \ -' <if test="old.loadBalancing == nil">' + \ -' <set target="new.loadBalancing" type="::IceGrid::RandomLoadBalancingPolicy"/>' + \ -' <set target="new.loadBalancing.nReplicas" value="\'0\'"/>' + \ -' </if>' + \ -' <if test="old.loadBalancing != nil and old.loadBalancing.nReplicas == \'0\'">' + \ -' <set target="new.loadBalancing.nReplicas" value="\'1\'"/>' + \ -' </if>' + \ -' </transform>' + \ -' ' + \ -'</transformdb>' - -transformdb("objects", desc) -transformdb("adapters", desc) -transformdb("applications", desc) + error("can't figure out the version of the IceGrid database environment " + olddbenv) |