Beispiel #1
0
    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())
Beispiel #3
0
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())
Beispiel #5
0
    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())
Beispiel #6
0
def load_cluster_config(config_path):

    return pai_common.load_yaml_file(config_path)
Beispiel #7
0
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!")
Beispiel #8
0
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)