コード例 #1
0
def run(dry_run,
        thread_pool_size=10,
        internal=None,
        use_jump_host=True,
        vault_throughput_path=None,
        defer=None):
    if not vault_throughput_path:
        logging.error('must supply vault throughput path')
        sys.exit(ExitCodes.ERROR)

    kafka_clusters = queries.get_kafka_clusters()
    if not kafka_clusters:
        logging.debug("No Kafka clusters found in app-interface")
        sys.exit(ExitCodes.SUCCESS)

    settings = queries.get_app_interface_settings()
    ocm_map = OCMMap(clusters=kafka_clusters,
                     integration=QONTRACT_INTEGRATION,
                     settings=settings)
    namespaces = []
    for kafka_cluster in kafka_clusters:
        namespaces.extend(kafka_cluster['namespaces'])
    ri, oc_map = ob.fetch_current_state(
        namespaces=namespaces,
        thread_pool_size=thread_pool_size,
        integration=QONTRACT_INTEGRATION,
        integration_version=QONTRACT_INTEGRATION_VERSION,
        override_managed_types=['Secret'],
        internal=internal,
        use_jump_host=use_jump_host)
    defer(oc_map.cleanup)

    current_state = ocm_map.kafka_cluster_specs()
    desired_state = fetch_desired_state(kafka_clusters)
    kafka_service_accounts = ocm_map.kafka_service_account_specs()

    for kafka_cluster in kafka_clusters:
        kafka_cluster_name = kafka_cluster['name']
        desired_cluster = [
            c for c in desired_state if kafka_cluster_name == c['name']
        ][0]
        current_cluster = [
            c for c in current_state if kafka_cluster_name == c['name']
        ]
        # check if cluster exists. if not - create it
        if not current_cluster:
            logging.info(['create_cluster', kafka_cluster_name])
            if not dry_run:
                ocm = ocm_map.get(kafka_cluster_name)
                ocm.create_kafka_cluster(desired_cluster)
            continue
        # there should only be one cluster
        current_cluster = current_cluster[0]
        # check if desired cluster matches current cluster. if not - error
        if not all(k in current_cluster.keys()
                   for k in desired_cluster.keys()):
            logging.error(
                '[%s] desired spec %s is different ' + 'from current spec %s',
                kafka_cluster_name, desired_cluster, current_cluster)
            ri.register_error()
            continue
        # check if cluster is ready. if not - wait
        status = current_cluster['status']
        if status != STATUS_READY:
            # check if cluster is failed
            if status == STATUS_FAILED:
                failed_reason = current_cluster['failed_reason']
                logging.error(
                    f'[{kafka_cluster_name}] cluster status is {status}. '
                    f'reason: {failed_reason}')
                ri.register_error()
            else:
                logging.warning(
                    f'[{kafka_cluster_name}] cluster status is {status}')
            continue
        # we have a ready cluster!
        # get a service account for the cluster
        kafka_service_account = get_kafa_service_account(
            kafka_service_accounts,
            kafka_cluster_name,
            vault_throughput_path,
            dry_run,
            ocm_map,
        )
        # let's create a Secret in all referencing namespaces
        kafka_namespaces = kafka_cluster['namespaces']
        secret_fields = ['bootstrap_server_host']
        data = {k: v for k, v in current_cluster.items() if k in secret_fields}
        data.update(kafka_service_account)
        resource = construct_oc_resource(data)
        for namespace_info in kafka_namespaces:
            ri.add_desired(namespace_info['cluster']['name'],
                           namespace_info['name'], resource.kind,
                           resource.name, resource)
        if not dry_run:
            write_output_to_vault(vault_throughput_path, kafka_cluster_name,
                                  resource.body['data'])

    ob.realize_data(dry_run, oc_map, ri, thread_pool_size)

    if ri.has_error_registered():
        sys.exit(ExitCodes.ERROR)
コード例 #2
0
def run(dry_run,
        thread_pool_size=10,
        internal=None,
        use_jump_host=True,
        defer=None):
    kafka_clusters = queries.get_kafka_clusters()
    if not kafka_clusters:
        logging.debug("No Kafka clusters found in app-interface")
        sys.exit(ExitCodes.SUCCESS)

    settings = queries.get_app_interface_settings()
    ocm_map = OCMMap(clusters=kafka_clusters,
                     integration=QONTRACT_INTEGRATION,
                     settings=settings)
    namespaces = []
    for kafka_cluster in kafka_clusters:
        namespaces.extend(kafka_cluster['namespaces'])
    ri, oc_map = ob.fetch_current_state(
        namespaces=namespaces,
        thread_pool_size=thread_pool_size,
        integration=QONTRACT_INTEGRATION,
        integration_version=QONTRACT_INTEGRATION_VERSION,
        override_managed_types=['Secret'],
        internal=internal,
        use_jump_host=use_jump_host)
    defer(lambda: oc_map.cleanup())

    current_state = ocm_map.kafka_cluster_specs()
    desired_state = fetch_desired_state(kafka_clusters)

    error = False
    for kafka_cluster in kafka_clusters:
        kafka_cluster_name = kafka_cluster['name']
        desired_cluster = [
            c for c in desired_state if kafka_cluster_name == c['name']
        ][0]
        current_cluster = [
            c for c in current_state if kafka_cluster_name == c['name']
        ]
        # check if cluster exists. if not - create it
        if not current_cluster:
            logging.info(['create_cluster', kafka_cluster_name])
            if not dry_run:
                ocm = ocm_map.get(kafka_cluster_name)
                ocm.create_kafka_cluster(desired_cluster)
            continue
        # there should only be one cluster
        current_cluster = current_cluster[0]
        # check if desired cluster matches current cluster. if not - error
        if not all(k in current_cluster.keys()
                   for k in desired_cluster.keys()):
            logging.error(
                '[%s] desired spec %s is different ' + 'from current spec %s',
                kafka_cluster_name, desired_cluster, current_cluster)
            error = True
            continue
        # check if cluster is ready. if not - wait
        if current_cluster['status'] != 'complete':
            continue
        # we have a ready cluster!
        # let's create a Secret in all referencing namespaces
        kafka_namespaces = kafka_cluster['namespaces']
        secret_fields = ['bootstrapServerHost']
        data = {k: v for k, v in current_cluster.items() if k in secret_fields}
        resource = construct_oc_resource(data)
        for namespace_info in kafka_namespaces:
            ri.add_desired(namespace_info['cluster']['name'],
                           namespace_info['name'], resource.kind,
                           resource.name, resource)

    ob.realize_data(dry_run, oc_map, ri)

    if error:
        sys.exit(ExitCodes.ERROR)