X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=tools%2Fclustering%2Fcluster-deployer%2Fdeploy.py;h=a9819e0cfc730f21fb1647ecd68e2b428cea5103;hb=HEAD;hp=877d7d946b5d2b494d74aa0917edad9402594de4;hpb=3c37aa091e4d28d96d7987d7ddca127fd957d419;p=integration%2Ftest.git diff --git a/tools/clustering/cluster-deployer/deploy.py b/tools/clustering/cluster-deployer/deploy.py index 877d7d946b..11a56e0099 100755 --- a/tools/clustering/cluster-deployer/deploy.py +++ b/tools/clustering/cluster-deployer/deploy.py @@ -42,33 +42,55 @@ import random import re from remote_host import RemoteHost -parser = argparse.ArgumentParser(description='Cluster Deployer') -parser.add_argument("--distribution", default="", - help="the absolute path of the distribution on the local " - "host that needs to be deployed. (Must contain " - "version in the form: \"<#>.<#>.<#>-\", e.g. " - "0.2.0-SNAPSHOT)", - required=True) -parser.add_argument("--rootdir", default="/root", - help="the root directory on the remote host where the " - "distribution is to be deployed", - required=True) -parser.add_argument("--hosts", default="", help="a comma separated list of " - "host names or ip addresses", - required=True) -parser.add_argument("--clean", action="store_true", default=False, - help="clean the deployment on the remote host") -parser.add_argument("--template", default="openflow", - help="the name of the template to be used. " - "This name should match a folder in the templates " - "directory.") -parser.add_argument("--rf", default=3, type=int, - help="replication factor. This is the number of replicas " - "that should be created for each shard.") -parser.add_argument("--user", default="root", help="the SSH username for the " - "remote host(s)") -parser.add_argument("--password", default="Ecp123", - help="the SSH password for the remote host(s)") +parser = argparse.ArgumentParser(description="Cluster Deployer") +parser.add_argument( + "--distribution", + default="", + help="the absolute path of the distribution on the local " + "host that needs to be deployed. (Must contain " + 'version in the form: "<#>.<#>.<#>-", e.g. ' + "0.2.0-SNAPSHOT)", + required=True, +) +parser.add_argument( + "--rootdir", + default="/root", + help="the root directory on the remote host where the " + "distribution is to be deployed", + required=True, +) +parser.add_argument( + "--hosts", + default="", + help="a comma separated list of " "host names or ip addresses", + required=True, +) +parser.add_argument( + "--clean", + action="store_true", + default=False, + help="clean the deployment on the remote host", +) +parser.add_argument( + "--template", + default="openflow", + help="the name of the template to be used. " + "This name should match a folder in the templates " + "directory.", +) +parser.add_argument( + "--rf", + default=3, + type=int, + help="replication factor. This is the number of replicas " + "that should be created for each shard.", +) +parser.add_argument( + "--user", default="root", help="the SSH username for the " "remote host(s)" +) +parser.add_argument( + "--password", default="Ecp123", help="the SSH password for the remote host(s)" +) args = parser.parse_args() @@ -90,7 +112,7 @@ class TemplateRenderer: with open(self.template_root + template_path, "r") as myfile: data = myfile.read() - parsed = pystache.parse(u"%(data)s" % locals()) + parsed = pystache.parse("%(data)s" % locals()) renderer = pystache.Renderer() output = renderer.render(parsed, variables) @@ -118,9 +140,22 @@ def array_str(arr): # The Deployer deploys the controller to one host and configures it # class Deployer: - def __init__(self, host, member_no, template, user, password, rootdir, - distribution, dir_name, hosts, ds_seed_nodes, rpc_seed_nodes, - replicas, clean=False): + def __init__( + self, + host, + member_no, + template, + user, + password, + rootdir, + distribution, + dir_name, + hosts, + ds_seed_nodes, + rpc_seed_nodes, + replicas, + clean=False, + ): self.host = host self.member_no = member_no self.template = template @@ -136,8 +171,7 @@ class Deployer: self.replicas = replicas # Connect to the remote host and start doing operations - self.remote = RemoteHost(self.host, self.user, self.password, - self.rootdir) + self.remote = RemoteHost(self.host, self.user, self.password, self.rootdir) def kill_controller(self): self.remote.copy_file("kill_controller.sh", self.rootdir + "/") @@ -145,50 +179,58 @@ class Deployer: def deploy(self): # Determine distribution version - distribution_name \ - = os.path.splitext(os.path.basename(self.distribution))[0] - distribution_ver = re.search('(\d+\.\d+\.\d+-\w+\Z)|' - '(\d+\.\d+\.\d+-\w+)(-SR\d+\Z)|' - '(\d+\.\d+\.\d+-\w+)(-SR\d+(\.\d+)\Z)', - distribution_name) # noqa + distribution_name = os.path.splitext(os.path.basename(self.distribution))[0] + distribution_ver = re.search( + r"(\d+\.\d+\.\d+-\w+\Z)|" + r"(\d+\.\d+\.\d+-\w+)(-RC\d+\Z)|" + r"(\d+\.\d+\.\d+-\w+)(-RC\d+(\.\d+)\Z)|" + r"(\d+\.\d+\.\d+-\w+)(-SR\d+\Z)|" + r"(\d+\.\d+\.\d+-\w+)(-SR\d+(\.\d+)\Z)", + distribution_name, + ) # noqa if distribution_ver is None: - print distribution_name + " is not a valid distribution version." \ - " (Must contain version in the form: " \ - "\"<#>.<#>.<#>-\" or \"<#>.<#>." \ - "<#>--SR<#>\" or \"<#>.<#>.<#>" \ - "-\", e.g. 0.2.0-SNAPSHOT)" # noqa + print( + "%s is not a valid distribution version." + " (Must contain version in the form: " + '"<#>.<#>.<#>-" or "<#>.<#>.' + '<#>--SR<#>" or "<#>.<#>.<#>' + '--RC<#>", e.g. 0.2.0-SNAPSHOT)' % distribution_name + ) sys.exit(1) distribution_ver = distribution_ver.group() # Render all the templates renderer = TemplateRenderer(self.template) akka_conf = renderer.render( - "akka.conf.template", "akka.conf", + "akka.conf.template", + "akka.conf", { "HOST": self.host, "MEMBER_NAME": "member-" + str(self.member_no), "DS_SEED_NODES": array_str(self.ds_seed_nodes), - "RPC_SEED_NODES": array_str(self.rpc_seed_nodes) - }) - module_shards_conf = renderer.render("module-shards.conf.template", - "module-shards.conf", - self.replicas) - modules_conf = renderer.render("modules.conf.template", - "modules.conf") - features_cfg = \ - renderer.render("org.apache.karaf.features.cfg.template", - "org.apache.karaf.features.cfg", - {"ODL_DISTRIBUTION": distribution_ver}) + "RPC_SEED_NODES": array_str(self.rpc_seed_nodes), + }, + ) + module_shards_conf = renderer.render( + "module-shards.conf.template", "module-shards.conf", self.replicas + ) + modules_conf = renderer.render("modules.conf.template", "modules.conf") + features_cfg = renderer.render( + "org.apache.karaf.features.cfg.template", + "org.apache.karaf.features.cfg", + {"ODL_DISTRIBUTION": distribution_ver}, + ) jolokia_xml = renderer.render("jolokia.xml.template", "jolokia.xml") - management_cfg = \ - renderer.render("org.apache.karaf.management.cfg.template", - "org.apache.karaf.management.cfg", - {"HOST": self.host}) - datastore_cfg = \ - renderer.render( - "org.opendaylight.controller.cluster.datastore.cfg.template", - "org.opendaylight.controller.cluster.datastore.cfg") + management_cfg = renderer.render( + "org.apache.karaf.management.cfg.template", + "org.apache.karaf.management.cfg", + {"HOST": self.host}, + ) + datastore_cfg = renderer.render( + "org.opendaylight.controller.cluster.datastore.cfg.template", + "org.opendaylight.controller.cluster.datastore.cfg", + ) # Delete all the sub-directories under the deploy directory if # the --clean flag is used @@ -204,35 +246,39 @@ class Deployer: # Copy the distribution to the host and unzip it odl_file_path = self.dir_name + "/odl.zip" self.remote.copy_file(self.distribution, odl_file_path) - self.remote.exec_cmd("unzip -o " + odl_file_path + " -d " + - self.dir_name + "/") + self.remote.exec_cmd("unzip -o " + odl_file_path + " -d " + self.dir_name + "/") # Rename the distribution directory to odl - self.remote.exec_cmd("mv " + self.dir_name + "/" + - distribution_name + " " + self.dir_name + "/odl") + self.remote.exec_cmd( + "mv " + + self.dir_name + + "/" + + distribution_name + + " " + + self.dir_name + + "/odl" + ) # Copy all the generated files to the server - self.remote.mkdir(self.dir_name + - "/odl/configuration/initial") - self.remote.copy_file(akka_conf, self.dir_name + - "/odl/configuration/initial/") - self.remote.copy_file(module_shards_conf, self.dir_name + - "/odl/configuration/initial/") - self.remote.copy_file(modules_conf, self.dir_name + - "/odl/configuration/initial/") - self.remote.copy_file(features_cfg, self.dir_name + - "/odl/etc/") - self.remote.copy_file(jolokia_xml, self.dir_name + - "/odl/deploy/") - self.remote.copy_file(management_cfg, self.dir_name + - "/odl/etc/") + self.remote.mkdir(self.dir_name + "/odl/configuration/initial") + self.remote.copy_file(akka_conf, self.dir_name + "/odl/configuration/initial/") + self.remote.copy_file( + module_shards_conf, self.dir_name + "/odl/configuration/initial/" + ) + self.remote.copy_file( + modules_conf, self.dir_name + "/odl/configuration/initial/" + ) + self.remote.copy_file(features_cfg, self.dir_name + "/odl/etc/") + self.remote.copy_file(jolokia_xml, self.dir_name + "/odl/deploy/") + self.remote.copy_file(management_cfg, self.dir_name + "/odl/etc/") if datastore_cfg is not None: self.remote.copy_file(datastore_cfg, self.dir_name + "/odl/etc/") # Add symlink - self.remote.exec_cmd("ln -sfn " + self.dir_name + " " + - args.rootdir + "/deploy/current") + self.remote.exec_cmd( + "ln -sfn " + self.dir_name + " " + args.rootdir + "/deploy/current" + ) # Run karaf self.remote.start_controller(self.dir_name) @@ -241,11 +287,11 @@ class Deployer: def main(): # Validate some input if os.path.exists(args.distribution) is False: - print args.distribution + " is not a valid file" + print("%s is not a valid file" % args.distribution) sys.exit(1) if os.path.exists(os.getcwd() + "/templates/" + args.template) is False: - print args.template + " is not a valid template" + print("%s is not a valid template" % args.template) # Prepare some 'global' variables hosts = args.hosts.split(",") @@ -258,27 +304,40 @@ def main(): replicas = {} for x in range(0, len(hosts)): - ds_seed_nodes.append("akka.tcp://opendaylight-cluster-data@" + - hosts[x] + ":2550") - rpc_seed_nodes.append("akka.tcp://odl-cluster-rpc@" + - hosts[x] + ":2551") + ds_seed_nodes.append( + "akka.tcp://opendaylight-cluster-data@" + hosts[x] + ":2550" + ) + rpc_seed_nodes.append("akka.tcp://odl-cluster-rpc@" + hosts[x] + ":2551") all_replicas.append("member-" + str(x + 1)) for x in range(0, 10): if len(all_replicas) > args.rf: - replicas["REPLICAS_" + str(x + 1)] \ - = array_str(random.sample(all_replicas, args.rf)) + replicas["REPLICAS_" + str(x + 1)] = array_str( + random.sample(all_replicas, args.rf) + ) else: replicas["REPLICAS_" + str(x + 1)] = array_str(all_replicas) deployers = [] for x in range(0, len(hosts)): - deployers.append(Deployer(hosts[x], x + 1, args.template, args.user, - args.password, args.rootdir, - args.distribution, dir_name, hosts, - ds_seed_nodes, rpc_seed_nodes, replicas, - args.clean)) + deployers.append( + Deployer( + hosts[x], + x + 1, + args.template, + args.user, + args.password, + args.rootdir, + args.distribution, + dir_name, + hosts, + ds_seed_nodes, + rpc_seed_nodes, + replicas, + args.clean, + ) + ) for x in range(0, len(hosts)): deployers[x].kill_controller() @@ -286,5 +345,6 @@ def main(): for x in range(0, len(hosts)): deployers[x].deploy() + # Run the script main()