summaryrefslogtreecommitdiff
path: root/cpp/config/upgradeicegrid.py
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/config/upgradeicegrid.py')
-rwxr-xr-xcpp/config/upgradeicegrid.py218
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)