def test_package_common_3(self): maintain_config = common.load_yaml_file("test-maintain.yaml") cluster_object_model = common.load_yaml_file( "test-generated-cluster-object-model.yaml") node_config = cluster_object_model['machine']['machine-list'][ 'worker-01'] common.maintain_package_wrapper(cluster_object_model, maintain_config, node_config, "unittest-common-3") self.assertTrue( os.path.exists("parcel-center/1.2.3.2/unittest-common-3.tar")) package = tarfile.open("parcel-center/1.2.3.2/unittest-common-3.tar", "r:") package.extractall() self.assertTrue(os.path.exists("unittest-common-3/")) target_file_list = ["testfile1.sh"] package_file_list = os.listdir("unittest-common-3/") self.assertListEqual(sorted(target_file_list), sorted(package_file_list)) shutil.rmtree("unittest-common-3/") common.maintain_package_cleaner(node_config) self.assertFalse(os.path.exists("parcel-center/1.2.3.2")) self.assertTrue(os.path.exists("parcel-center")) shutil.rmtree("parcel-center/")
def test_etcdfix_conf_validation_node_config_validation(self): node_list = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_node_list_config.yaml") cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-ok.yaml" ) node_config = node_list['machinelist']['ok-machine-node'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertTrue(validation.node_conf_validation()) node_config = node_list['machinelist']['miss-node-name'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['miss-host-ip'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['wrong-host-ip'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['wrong-ssh-port'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['miss-user-name'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['miss-password'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation()) node_config = node_list['machinelist']['miss-etcd-id'] validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.node_conf_validation())
def setup_logging(): """ Setup logging configuration. """ configuration_path = "sysconf/logging.yaml" logging_configuration = pai_common.load_yaml_file(configuration_path) logging.config.dictConfig(logging_configuration)
def test_etcdfix_conf_validation_cluster_config_validation(self): node_list = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_node_list_config.yaml") node_config = node_list['machinelist']['ok-machine-node'] cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-ok.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertTrue(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-miss-master.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-miss-node-config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-wrong-node-config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/generated-cluster-object-model-inconsistent-node-config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation())
def test_etcdfix_conf_validation_cluster_config_validation(self): node_list = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_node_list_config.yaml") node_config = node_list['machinelist']['ok-machine-node'] cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_cluster_config_ok.yaml") validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertTrue(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_cluster_config_miss_master_list.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_cluster_config_miss_node_config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_cluster_config_wrong_node_config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation()) cluster_config = common.load_yaml_file( "data/data_maintainlib_etcdfix/test_cluster_config_inconsistent_node_config.yaml" ) validation = etcdfix.etcdfix_conf_validation(cluster_config, node_config) self.assertFalse(validation.cluster_conf_validation())
def load_cluster_config(config_path): return pai_common.load_yaml_file(config_path)
def main(): parser = argparse.ArgumentParser() parser.add_argument('-p', '--path', required=True, help='path of cluster configuration file') parser.add_argument('-a', '--action', required=True, default=None, help="action to maintain the cluster") parser.add_argument('-f', '--file', default=None, help="An yamlfile with the nodelist to maintain") args = parser.parse_args() logger.info("Begin option validation! ") if option_validation(args) == False: return logger.info("Pass option validation! ") config_path = args.path cluster_config = logClusterObjectModel(config_path) master_list = cluster_config['mastermachinelist'] etcd_cluster_ips_peer, etcd_cluster_ips_server = generate_etcd_ip_list( master_list) # ETCD will communicate with each other through this address. cluster_config['clusterinfo'][ 'etcd_cluster_ips_peer'] = etcd_cluster_ips_peer # Other service will write and read data through this address. cluster_config['clusterinfo'][ 'etcd_cluster_ips_server'] = etcd_cluster_ips_server cluster_config['clusterinfo']['etcd-initial-cluster-state'] = 'new' if args.action == 'add': logger.info("Begin to add new nodes to PAI cluster.") #Todo in the future we should finish the following two line #cluster_config = get_cluster_configuration() #node_list_config = get_node_list_config() node_list_config = pai_common.load_yaml_file(args.file) maintain_nodes(cluster_config, node_list_config, args.action) #up_data_cluster_configuration() logger.info("New nodes have been added.") return if args.action == 'remove': logger.info("Begin to remove nodes from PAI cluster.") # Todo in the future we should finish the following two line # cluster_config = get_cluster_configuration() # node_list_config = get_node_list() node_list_config = pai_common.load_yaml_file(args.file) maintain_nodes(cluster_config, node_list_config, args.action) # up_data_cluster_configuration() logger.info("Nodes have been removed.") return if args.action == 'repair': logger.info("Begin to repair the target nodes.") # Todo in the future we should finish the following two line # cluster_config = get_cluster_configuration() # node_list_config = get_node_list() node_list_config = pai_common.load_yaml_file(args.file) maintain_nodes(cluster_config, node_list_config, args.action) logger.info("The nodes have been repaired.") return if args.action == 'clean': logger.info("Begin to clean up whole cluster.") maintain_cluster(cluster_config, job_name=args.action, clean=True) logger.info("Clean up job finished") return if args.action == 'etcdfix': logger.info("Begin to fix broken etcd server.") node_list_config = pai_common.load_yaml_file(args.file) logger.debug("FIX ETCD on {0}".format(str(node_list_config))) if len(node_list_config['machinelist']) != 1: logger.error( "etcdfix can't fix more than one machine everytime. Please fix them one by one!" ) sys.exit(1) maintain_nodes(cluster_config, node_list_config, args.action) logger.info("Etcd has been fixed.") return if args.action == 'deploy': logger.info("Begin to initialize PAI.") maintain_cluster(cluster_config, job_name=args.action, clean=True) logger.info("Finish initializing PAI.") if args.action == 'install_kubectl': logger.info("Begin to install kubectl.") maintain_cluster(cluster_config, job_name="kubectl_install") logger.info("Kubectl has been installed.") logger.info("Maintenance Finished!")
def main(): setup_logging() parser = argparse.ArgumentParser() parser.add_argument('-p', '--path', required=True, help="cluster configuration's path") parser.add_argument('-c', '--clean', action="store_true", help="clean the generated script") parser.add_argument('-d', '--deploy', action="store_true", help="deploy all the service") parser.add_argument('-s', '--service', default='all', help="bootStrap a target service") parser.add_argument('-a', '--action', choices=['add', 'remove'], help="action to maintain services") parser.add_argument('-f', '--file', help="An yamlfile with the nodelist to maintain services on nodes") args = parser.parse_args() # step 1: load configuration from yaml file. config_path = args.path cluster_config = loadClusterObjectModel(config_path) service_config = load_yaml_config("service.yaml") # step 2: generate base64code for secret.yaml and get the config.json of docker after logining generate_secret_base64code(cluster_config[ "clusterinfo" ][ "dockerregistryinfo" ]) generate_docker_credential(cluster_config[ "clusterinfo" ][ "dockerregistryinfo" ]) # step 3: generate image url prefix for yaml file. generate_image_url_prefix(cluster_config[ "clusterinfo" ][ "dockerregistryinfo" ]) if 'docker_tag' not in cluster_config['clusterinfo']['dockerregistryinfo']: cluster_config['clusterinfo']['dockerregistryinfo']['docker_tag'] = 'latest' # step 4: generate configuration of hadoop queues generate_configuration_of_hadoop_queues(cluster_config) # step 5: generate templatefile if args.action == 'add' or args.action == 'remove': node_list_config = pai_common.load_yaml_file(args.file) cluster_config, service_config = generate_new_nodes_template_file( cluster_config, service_config, node_list_config) elif args.service == 'all': copy_arrangement(service_config) generate_template_file(cluster_config, service_config) else: copy_arrangement_service(args.service, service_config) generate_template_file_service(args.service, cluster_config, service_config) # step 6: Bootstrap service. # Without flag -d, this deploy process will be skipped. if args.action == 'add': bootstrap_service_new_nodes(service_config) elif args.action == 'remove': remove_service(cluster_config, service_config, node_list_config) elif args.deploy: if args.service == 'all': # dependency_bootstrap will auto-start all service in a correctly order. bootstrap_service(service_config) else: # Single service startup will ignore the dependency. User should ensure the operation is in a correctly order. This option is mainly designed for debug. single_service_bootstrap(args.service, service_config) # Optional : clean all the generated file. if args.clean: clean_up_generated_file(service_config)