def teardown(self):
        root_pg, _, flow_id = nf.set_environment()

        canvas.schedule_process_group(root_pg.id, False)
        while True:
            failed = False
            for controller in canvas.list_all_controllers(root_pg.id):
                try:
                    canvas.schedule_controller(controller, False)
                    LOG.debug('Controller %s stopped.',
                              controller.component.name)
                except ApiException as exc:
                    if exc.status == 409 and 'is referenced by' in exc.body:
                        LOG.debug(
                            'Controller %s failed to stop. Will retry later.',
                            controller.component.name)
                        failed = True
            if not failed:
                break

        nf.delete_all(root_pg)
        efm.delete_all(flow_id)
        schreg.delete_all_schemas()
        reg_client = versioning.get_registry_client('NiFi Registry')
        if reg_client:
            versioning.delete_registry_client(reg_client)
        nifireg.delete_flows('SensorFlows')
        kudu.drop_table()
Beispiel #2
0
def lab4_nifi_flow(env):
    LOG.info("Running step4_nifi_flow")
    # Create a bucket in NiFi Registry to save the edge flow versions
    env.sensor_bucket = versioning.get_registry_bucket('SensorFlows')
    if not env.sensor_bucket:
        env.sensor_bucket = versioning.create_registry_bucket('SensorFlows')

    # Create NiFi Process Group
    env.reg_client = versioning.create_registry_client('NiFi Registry', _NIFIREG_URL, 'The registry...')
    env.sensor_pg = canvas.create_process_group(env.root_pg, PG_NAME, (330, 350))
    #env.sensor_flow = versioning.save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_name='SensorProcessGroup', comment='Enabled version control - ' + env.run_id)
    env.sensor_flow = save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_name='SensorProcessGroup', comment='Enabled version control - ' + str(env.run_id))

    # Create controller services
    env.sr_svc = create_controller(env.sensor_pg, 'org.apache.nifi.schemaregistry.hortonworks.HortonworksSchemaRegistry', {'url': _SCHREG_API_URL}, True)
    env.json_reader_svc = create_controller(env.sensor_pg, 'org.apache.nifi.json.JsonTreeReader', {'schema-access-strategy': 'schema-name', 'schema-registry': env.sr_svc.id}, True)
    env.json_writer_svc = create_controller(env.sensor_pg, 'org.apache.nifi.json.JsonRecordSetWriter', {'schema-access-strategy': 'schema-name', 'schema-registry': env.sr_svc.id, 'Schema Write Strategy': 'hwx-schema-ref-attributes'}, True)

    # Create flow
    sensor_port = canvas.create_port(env.sensor_pg.id, 'INPUT_PORT', 'Sensor Data', 'RUNNING', (0, 0))

    upd_attr = create_processor(env.sensor_pg, 'Set Schema Name', 'org.apache.nifi.processors.attributes.UpdateAttribute', (0, 100),
        {
            'properties': {
                'schema.name': 'SensorReading',
            },
        }
    )
    canvas.create_connection(sensor_port, upd_attr)

    pub_kafka = create_processor(env.sensor_pg, 'Publish to Kafka topic: iot', 'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0', (0, 300),
        {
            'properties': {
                'bootstrap.servers': 'edge2ai-1.dim.local:9092',
                'topic': 'iot',
                'record-reader': env.json_reader_svc.id,
                'record-writer': env.json_writer_svc.id,
                'use-transactions': 'false',
                'attribute-name-regex': 'schema.*',
                'client.id': PRODUCER_CLIENT_ID,
            },
            'autoTerminatedRelationships': ['success'],
        }
    )
    canvas.create_connection(upd_attr, pub_kafka, ['success'])

    fail_funnel = create_funnel(env.sensor_pg.id, (600, 343))
    canvas.create_connection(pub_kafka, fail_funnel, ['failure'])

    # Commit changes
    #versioning.save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_id=env.sensor_flow.version_control_information.flow_id, comment='First version - ' + env.run_id)
    save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_id=env.sensor_flow.version_control_information.flow_id, comment='First version - ' + str(env.run_id))

    # Start flow
    canvas.schedule_process_group(env.root_pg.id, True)

    # Update "from Gateway" input port to connect to the process group
    update_connection(env.from_gw, env.temp_funnel, sensor_port)
Beispiel #3
0
def test_schedule_process_group(fixture_processor, fixture_pg):
    test_pg = fixture_pg.generate()
    _ = fixture_processor.generate(parent_pg=test_pg)
    r1 = canvas.schedule_process_group(test_pg.id, 'RUNNING')
    assert r1.state == 'RUNNING'
    r2 = canvas.schedule_process_group(test_pg.id, 'STOPPED')
    assert r2.state == 'STOPPED'
    with pytest.raises(ValueError):
        _ = canvas.schedule_process_group(test_pg.id, 'BANANA')
Beispiel #4
0
def test_delete_process_group(fixture_pg, regress, fixture_processor):
    # Delete stopped PG
    pg_1 = fixture_pg.generate()
    r1 = canvas.delete_process_group(pg_1.id, pg_1.revision)
    assert r1.id == pg_1.id
    assert r1.status is None
    # Test deleting a running PG
    pg_2 = fixture_pg.generate()
    p_1 = fixture_processor.generate(parent_pg=pg_2)
    canvas.schedule_process_group(pg_2.id, 'RUNNING')
    with pytest.raises(ValueError):
        _ = canvas.delete_process_group(pg_2.id, pg_2.revision)
    def setUpClass(cls):
        super(Test1ToNTest, cls).setUpClass()
        print("Start of tests: preparing nifi objects")
        config.nifi_config.host = 'http://192.168.56.5:8080/nifi-api'

        flow_name = "Test1ToNTest"

        nav = CanvasNavigator()
        # Delete all leftovers from previous (failed?) tests
        pgs_to_be_deleted = nav.groups(flow_name)
        for pg in pgs_to_be_deleted:
            canvas.delete_process_group(pg, force=True)
        # Create new process group in root
        Test1ToNTest.pg_test = canvas.create_process_group(nav.current, flow_name, (0, 0))

        # Create simple flow to test
        Test1ToNTest.proc_start = canvas.create_processor(
            Test1ToNTest.pg_test,
            canvas.get_processor_type("GenerateFlowFile"),
            CANVAS_CENTER,
            "Start")
        Test1ToNTest.proc_2 = canvas.create_processor(
            Test1ToNTest.pg_test,
            canvas.get_processor_type("DebugFlow"),
            CANVAS_CENTER,
            "Processor 2")
        Test1ToNTest.proc_3 = canvas.create_processor(
            Test1ToNTest.pg_test,
            canvas.get_processor_type("DebugFlow"),
            CANVAS_CENTER,
            "Processor 3")
        Test1ToNTest.proc_end_1 = canvas.create_processor(
            Test1ToNTest.pg_test,
            canvas.get_processor_type("DebugFlow"),
            CANVAS_CENTER,
            "End 1")
        Test1ToNTest.proc_end_2 = canvas.create_processor(
            Test1ToNTest.pg_test,
            canvas.get_processor_type("DebugFlow"),
            CANVAS_CENTER,
            "End 2")
        canvas.update_processor(Test1ToNTest.proc_end_1,
                                nifi.ProcessorConfigDTO(auto_terminated_relationships=["success", "failure"]))
        canvas.update_processor(Test1ToNTest.proc_end_2,
                                nifi.ProcessorConfigDTO(auto_terminated_relationships=["success", "failure"]))
        Test1ToNTest.conn_1 = canvas.create_connection(Test1ToNTest.proc_start, Test1ToNTest.proc_2, ["success"])
        Test1ToNTest.conn_2 = canvas.create_connection(Test1ToNTest.proc_2, Test1ToNTest.proc_3, ["success", "failure"])
        Test1ToNTest.conn_3 = canvas.create_connection(Test1ToNTest.proc_3, Test1ToNTest.proc_end_1, ["success", "failure"])
        Test1ToNTest.conn_4 = canvas.create_connection(Test1ToNTest.proc_3, Test1ToNTest.proc_end_2, ["success", "failure"])

        canvas.schedule_process_group(Test1ToNTest.pg_test.component.id, scheduled=True)
Beispiel #6
0
def test_schedule_process_group(fix_proc, fix_pg):
    f_pg = fix_pg.generate()
    _ = fix_proc.generate(parent_pg=f_pg)
    r1 = canvas.schedule_process_group(f_pg.id, True)
    status = canvas.get_process_group(f_pg.id, 'id')
    assert r1 is True
    assert status.running_count == 1
    r2 = canvas.schedule_process_group(f_pg.id, False)
    assert r2 is True
    status = canvas.get_process_group(f_pg.id, 'id')
    assert status.running_count == 0
    assert status.stopped_count == 1
    with pytest.raises(AssertionError):
        _ = canvas.schedule_process_group(f_pg.id, 'BANANA')
Beispiel #7
0
def test_delete_process_group(regress_nifi, fix_pg, fix_proc):
    # Delete stopped PG
    f_pg1 = fix_pg.generate()
    r1 = canvas.delete_process_group(f_pg1)
    assert r1.id == f_pg1.id
    assert r1.status is None
    # Test deleting a running PG
    pg_2 = fix_pg.generate()
    _ = fix_proc.generate(parent_pg=pg_2)
    canvas.schedule_process_group(pg_2.id, True)
    with pytest.raises(ValueError):
        _ = canvas.delete_process_group(pg_2)
    # Once more with feeling
    r2 = canvas.delete_process_group(pg_2, force=True)
    assert r2.status is None
Beispiel #8
0
def test_complex_template_versioning(regress_flow_reg, fix_ctv):
    # There is a complex bug where a new flow version cannot be switched to
    # and generates a NiFi NPE if attempted when create_flow_version is used
    # BUG FIXED: issue with variable name found in Swagger definition
    # https://github.com/apache/nifi/pull/2479#issuecomment-366582829

    # Create a new flow version
    vers = versioning.list_flow_versions(fix_ctv.bucket.identifier,
                                         fix_ctv.flow.identifier)
    assert vers[0].version == 2
    # create_flow_version is the problem
    new_ss = versioning.create_flow_version(
        flow=fix_ctv.flow,
        flow_snapshot=fix_ctv.snapshot_w_template,
        refresh=True)
    assert isinstance(new_ss, registry.VersionedFlowSnapshot)
    vers = versioning.list_flow_versions(fix_ctv.bucket.identifier,
                                         fix_ctv.flow.identifier)
    assert vers[0].version == 3
    new_ver_info = versioning.get_version_info(fix_ctv.pg)
    r1 = versioning.update_flow_ver(fix_ctv.pg)
    assert r1.request.complete is True
    assert r1.request.failure_reason is None
    r2 = canvas.schedule_process_group(fix_ctv.pg.id, True)
    status = canvas.get_process_group(fix_ctv.pg.id, 'id')
    assert status.running_count >= 5
    with pytest.raises(ValueError):
        _ = versioning.update_flow_ver(fix_ctv.pg, 'bob')
    with pytest.raises(ValueError):
        _ = versioning.update_flow_ver(fix_ctv.pg, '9999999')
def global_teardown(run_id=None,
                    schema_text=None,
                    cdsw_flag=True,
                    target_lab=99):
    (run_id, root_pg, efm_pg_id, flow_id) = set_environment(run_id)

    canvas.schedule_process_group(root_pg.id, False)
    while True:
        failed = False
        for controller in canvas.list_all_controllers(root_pg.id):
            try:
                canvas.schedule_controller(controller, False)
                LOG.debug('Controller %s stopped.', controller.component.name)
            except ApiException as exc:
                if exc.status == 409 and 'is referenced by' in exc.body:
                    LOG.debug(
                        'Controller %s failed to stop. Will retry later.',
                        controller.component.name)
                    failed = True
        if not failed:
            break

    nifi_delete_all(root_pg)

    class _Env(object):
        pass

    env = _Env()
    env.run_id, env.root_pg, env.efm_pg_id, env.flow_id = set_environment(
        run_id)
    env.schema_text = schema_text if schema_text is not None else read_in_schema(
    )
    LOG.info("Using Schema: %s", schema_text)
    env.cdsw_flag = cdsw_flag
    LOG.info("Build just enough")
    lab2_edge_flow(env)
    lab3_register_schema(env)
    lab6_expand_edge_flow(env)
    create_kudu_table()
    LOG.info("Created edge, schema, kudu")
Beispiel #10
0
def nifi_delete_all(pg):
    canvas.schedule_process_group(pg.id, False)
    for conn in canvas.list_all_connections(pg.id):
        LOG.debug('Connection: ' + conn.id)
        canvas.delete_connection(conn, purge=True)
    for input_port in canvas.list_all_input_ports(pg.id):
        LOG.debug('Input Port: ' + input_port.id)
        canvas.delete_port(input_port)
    for output_port in canvas.list_all_output_ports(pg.id):
        LOG.debug('Output Port: ' + output_port.id)
        canvas.delete_port(output_port)
    for funnel in canvas.list_all_funnels(pg.id):
        LOG.debug('Funnel: ' + funnel.id)
        canvas.delete_funnel(funnel)
    for processor in canvas.list_all_processors(pg.id):
        LOG.debug('Processor: ' + processor.id)
        canvas.delete_processor(processor, force=True)
    for process_group in canvas.list_all_process_groups(pg.id):
        if pg.id == process_group.id:
            continue
        LOG.debug('Process Group: ' + process_group.id)
        nifi_delete_all(process_group)
        canvas.delete_process_group(process_group, force=True)
Beispiel #11
0
def lab7_rest_and_kudu(env):
    LOG.info("Running step7_rest_and_kudu")
    # Create controllers
    env.json_reader_with_schema_svc = create_controller(
        env.sensor_pg,
        'org.apache.nifi.json.JsonTreeReader', {
            'schema-access-strategy': 'hwx-schema-ref-attributes',
            'schema-registry': env.sr_svc.id
        },
        True,
        name='JsonTreeReader - With schema identifier')
    props = {
        'rest-lookup-url': get_cdsw_altus_api() + '/models/call-model',
        'rest-lookup-record-reader': env.json_reader_svc.id,
        'rest-lookup-record-path': '/response'
    }
    if _IS_TLS_ENABLED:
        props.update({
            'rest-lookup-ssl-context-service': env.ssl_svc.id,
        })
    rest_lookup_svc = create_controller(
        env.sensor_pg, 'org.apache.nifi.lookup.RestLookupService', props, True)

    # Build flow
    fail_funnel = create_funnel(env.sensor_pg.id, (1400, 340))

    props = {
        'topic': 'iot',
        'topic_type': 'names',
        'record-reader': env.json_reader_with_schema_svc.id,
        'record-writer': env.json_writer_svc.id,
    }
    props.update(_get_common_kafka_client_properties(env, 'consumer'))
    consume_kafka = create_processor(
        env.sensor_pg, 'Consume Kafka iot messages',
        'org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0',
        (700, 0), {'properties': props})
    canvas.create_connection(consume_kafka, fail_funnel, ['parse.failure'])

    predict = create_processor(
        env.sensor_pg, 'Predict machine health',
        'org.apache.nifi.processors.standard.LookupRecord', (700, 200), {
            'properties': {
                'record-reader': env.json_reader_with_schema_svc.id,
                'record-writer': env.json_writer_svc.id,
                'lookup-service': rest_lookup_svc.id,
                'result-record-path': '/response',
                'routing-strategy': 'route-to-success',
                'result-contents': 'insert-entire-record',
                'mime.type': "toString('application/json', 'UTF-8')",
                'request.body':
                "concat('{\"accessKey\":\"', '${cdsw.access.key}', '\",\"request\":{\"feature\":\"', /sensor_0, ', ', /sensor_1, ', ', /sensor_2, ', ', /sensor_3, ', ', /sensor_4, ', ', /sensor_5, ', ', /sensor_6, ', ', /sensor_7, ', ', /sensor_8, ', ', /sensor_9, ', ', /sensor_10, ', ', /sensor_11, '\"}}')",
                'request.method': "toString('post', 'UTF-8')",
            },
        })
    canvas.create_connection(predict, fail_funnel, ['failure'])
    canvas.create_connection(consume_kafka, predict, ['success'])

    update_health = create_processor(
        env.sensor_pg, 'Update health flag',
        'org.apache.nifi.processors.standard.UpdateRecord', (700, 400), {
            'properties': {
                'record-reader': env.json_reader_with_schema_svc.id,
                'record-writer': env.json_writer_svc.id,
                'replacement-value-strategy': 'record-path-value',
                '/is_healthy': '/response/result',
            },
        })
    canvas.create_connection(update_health, fail_funnel, ['failure'])
    canvas.create_connection(predict, update_health, ['success'])

    if get_kudu_version() >= (1, 14):
        kudu_table_name = 'default.sensors'
    else:
        kudu_table_name = 'impala::default.sensors'
    write_kudu = create_processor(
        env.sensor_pg, 'Write to Kudu',
        'org.apache.nifi.processors.kudu.PutKudu', (700, 600), {
            'properties': {
                'Kudu Masters':
                _HOSTNAME + ':7051',
                'Table Name':
                kudu_table_name,
                'record-reader':
                env.json_reader_with_schema_svc.id,
                'kerberos-credentials-service':
                env.keytab_svc.id if _IS_TLS_ENABLED else None,
            },
        })
    canvas.create_connection(write_kudu, fail_funnel, ['failure'])
    canvas.create_connection(update_health, write_kudu, ['success'])

    props = {
        'topic': 'iot_enriched',
        'record-reader': env.json_reader_with_schema_svc.id,
        'record-writer': env.json_writer_svc.id,
    }
    props.update(_get_common_kafka_client_properties(env, 'producer'))
    pub_kafka_enriched = create_processor(
        env.sensor_pg, 'Publish to Kafka topic: iot_enriched',
        'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0',
        (300, 600), {
            'properties': props,
            'autoTerminatedRelationships': ['success', 'failure'],
        })
    canvas.create_connection(update_health, pub_kafka_enriched, ['success'])

    props = {
        'topic': 'iot_enriched_avro',
        'record-reader': env.json_reader_with_schema_svc.id,
        'record-writer': env.avro_writer_svc.id,
    }
    props.update(_get_common_kafka_client_properties(env, 'producer'))
    pub_kafka_enriched_avro = create_processor(
        env.sensor_pg, 'Publish to Kafka topic: iot_enriched_avro',
        'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0',
        (-100, 600), {
            'properties': props,
            'autoTerminatedRelationships': ['success', 'failure'],
        })
    canvas.create_connection(update_health, pub_kafka_enriched_avro,
                             ['success'])

    monitor_activity = create_processor(
        env.sensor_pg, 'Monitor Activity',
        'org.apache.nifi.processors.standard.MonitorActivity', (700, 800), {
            'properties': {
                'Threshold Duration': '45 secs',
                'Continually Send Messages': 'true',
            },
            'autoTerminatedRelationships': ['activity.restored', 'success'],
        })
    canvas.create_connection(monitor_activity, fail_funnel, ['inactive'])
    canvas.create_connection(write_kudu, monitor_activity, ['success'])

    # Version flow
    save_flow_ver(env.sensor_pg,
                  env.reg_client,
                  env.sensor_bucket,
                  flow_id=env.sensor_flow.version_control_information.flow_id,
                  comment='Second version - ' + str(env.run_id))

    # Prepare Impala/Kudu table
    create_kudu_table()

    # Set the variable with the CDSW access key
    if env.cdsw_flag:
        canvas.update_variable_registry(
            env.sensor_pg, [('cdsw.access.key', get_cdsw_model_access_key())])

    # Start everything
    canvas.schedule_process_group(env.root_pg.id, True)
Beispiel #12
0
 def __stop_base(self):
     canvas.schedule_process_group(self.base.component.id, False)
 def tearDownClass(cls):
     print("Tests done: deleting nifi objects")
     canvas.schedule_process_group(Test1ToNTest.pg_test.component.id, scheduled=False)
    def lab4_rest_and_kudu(self):
        # Prepare Impala/Kudu table
        kudu.create_table()
        kudu_table_name = kudu.get_kudu_table_name('default', 'sensors')

        # Set required variables
        if not self.context.skip_cdsw:
            # Set the variable with the CDSW access key
            canvas.update_variable_registry(
                self.context.sensor_pg,
                [('cdsw.access.key', cdsw.get_model_access_key())])
            # Set the variable with the CDSW model API key
            canvas.update_variable_registry(
                self.context.sensor_pg,
                [('cdsw.model.api.key', cdsw.create_model_api_key())])

        # Create controllers
        self.context.json_reader_with_schema_svc = nf.create_controller(
            self.context.sensor_pg,
            'org.apache.nifi.json.JsonTreeReader', {
                'schema-access-strategy': 'hwx-schema-ref-attributes',
                'schema-registry': self.context.sr_svc.id
            },
            True,
            name='JsonTreeReader - With schema identifier')
        props = {
            'rest-lookup-url': cdsw.get_model_endpoint_url(),
            'rest-lookup-record-reader': self.context.json_reader_svc.id,
            'rest-lookup-record-path': '/response',
            'Authorization': 'Bearer ${cdsw.model.api.key}',
        }
        if is_tls_enabled():
            props.update({
                'rest-lookup-ssl-context-service':
                self.context.ssl_svc.id,
            })
        rest_lookup_svc = nf.create_controller(
            self.context.sensor_pg, 'org.apache.nifi.lookup.RestLookupService',
            props, True)

        # Build flow
        fail_funnel = nf.create_funnel(self.context.sensor_pg.id, (1400, 340))

        props = {
            'topic': 'iot',
            'topic_type': 'names',
            'record-reader': self.context.json_reader_with_schema_svc.id,
            'record-writer': self.context.json_writer_svc.id,
        }
        props.update(
            kafka.get_common_client_properties(self.context, 'consumer',
                                               CONSUMER_GROUP_ID,
                                               PRODUCER_CLIENT_ID))
        consume_kafka = nf.create_processor(
            self.context.sensor_pg, 'Consume Kafka iot messages', [
                'org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_6',
                'org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0'
            ], (700, 0), {'properties': props})
        canvas.create_connection(consume_kafka, fail_funnel, ['parse.failure'])

        predict = nf.create_processor(
            self.context.sensor_pg, 'Predict machine health',
            'org.apache.nifi.processors.standard.LookupRecord', (700, 200), {
                'properties': {
                    'record-reader':
                    self.context.json_reader_with_schema_svc.id,
                    'record-writer':
                    self.context.json_writer_svc.id,
                    'lookup-service':
                    rest_lookup_svc.id,
                    'result-record-path':
                    '/response',
                    'routing-strategy':
                    'route-to-success',
                    'result-contents':
                    'insert-entire-record',
                    'mime.type':
                    "toString('application/json', 'UTF-8')",
                    'request.body':
                    "concat('{\"accessKey\":\"', '${cdsw.access.key}', "
                    "'\",\"request\":{\"feature\":\"', /sensor_0, ', ', "
                    "/sensor_1, ', ', /sensor_2, ', ', /sensor_3, ', ', "
                    "/sensor_4, ', ', /sensor_5, ', ', /sensor_6, ', ', "
                    "/sensor_7, ', ', /sensor_8, ', ', /sensor_9, ', ', "
                    "/sensor_10, ', ', /sensor_11, '\"}}')",
                    'request.method':
                    "toString('post', 'UTF-8')",
                },
            })
        canvas.create_connection(predict, fail_funnel, ['failure'])
        canvas.create_connection(consume_kafka, predict, ['success'])

        update_health = nf.create_processor(
            self.context.sensor_pg, 'Update health flag',
            'org.apache.nifi.processors.standard.UpdateRecord', (700, 400), {
                'properties': {
                    'record-reader':
                    self.context.json_reader_with_schema_svc.id,
                    'record-writer': self.context.json_writer_svc.id,
                    'replacement-value-strategy': 'record-path-value',
                    '/is_healthy': '/response/result',
                },
            })
        canvas.create_connection(update_health, fail_funnel, ['failure'])
        canvas.create_connection(predict, update_health, ['success'])

        write_kudu = nf.create_processor(
            self.context.sensor_pg, 'Write to Kudu',
            'org.apache.nifi.processors.kudu.PutKudu', (700, 600), {
                'properties': {
                    'Kudu Masters':
                    get_hostname() + ':7051',
                    'Table Name':
                    kudu_table_name,
                    'record-reader':
                    self.context.json_reader_with_schema_svc.id,
                    'kerberos-credentials-service':
                    self.context.keytab_svc.id if is_tls_enabled() else None,
                },
            })
        canvas.create_connection(write_kudu, fail_funnel, ['failure'])
        canvas.create_connection(update_health, write_kudu, ['success'])

        props = {
            'topic': 'iot_enriched',
            'record-reader': self.context.json_reader_with_schema_svc.id,
            'record-writer': self.context.json_writer_svc.id,
        }
        props.update(
            kafka.get_common_client_properties(self.context, 'producer',
                                               CONSUMER_GROUP_ID,
                                               PRODUCER_CLIENT_ID))
        pub_kafka_enriched = nf.create_processor(
            self.context.sensor_pg, 'Publish to Kafka topic: iot_enriched', [
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6',
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0'
            ], (300, 600), {
                'properties': props,
                'autoTerminatedRelationships': ['success', 'failure'],
            })
        canvas.create_connection(update_health, pub_kafka_enriched,
                                 ['success'])

        props = {
            'topic': 'iot_enriched_avro',
            'record-reader': self.context.json_reader_with_schema_svc.id,
            'record-writer': self.context.avro_writer_svc.id,
        }
        props.update(
            kafka.get_common_client_properties(self.context, 'producer',
                                               CONSUMER_GROUP_ID,
                                               PRODUCER_CLIENT_ID))
        pub_kafka_enriched_avro = nf.create_processor(
            self.context.sensor_pg,
            'Publish to Kafka topic: iot_enriched_avro', [
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6',
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0'
            ], (-100, 600), {
                'properties': props,
                'autoTerminatedRelationships': ['success', 'failure'],
            })
        canvas.create_connection(update_health, pub_kafka_enriched_avro,
                                 ['success'])

        monitor_activity = nf.create_processor(
            self.context.sensor_pg, 'Monitor Activity',
            'org.apache.nifi.processors.standard.MonitorActivity', (700, 800),
            {
                'properties': {
                    'Threshold Duration': '45 secs',
                    'Continually Send Messages': 'true',
                },
                'autoTerminatedRelationships':
                ['activity.restored', 'success'],
            })
        canvas.create_connection(monitor_activity, fail_funnel, ['inactive'])
        canvas.create_connection(write_kudu, monitor_activity, ['success'])

        # Version flow
        nifireg.save_flow_ver(self.context.sensor_pg,
                              self.context.reg_client,
                              self.context.sensor_bucket,
                              flow_id=self.context.sensor_flow.
                              version_control_information.flow_id,
                              comment='Second version - {}'.format(
                                  self.run_id))

        # Start everything
        canvas.schedule_process_group(self.context.root_pg.id, True)
    def lab2_nifi_flow(self):
        # Create a bucket in NiFi Registry to save the edge flow versions
        self.context.sensor_bucket = versioning.get_registry_bucket(
            'SensorFlows')
        if not self.context.sensor_bucket:
            self.context.sensor_bucket = versioning.create_registry_bucket(
                'SensorFlows')

        # Create NiFi Process Group
        self.context.reg_client = versioning.create_registry_client(
            'NiFi Registry', nifireg.get_url(), 'The registry...')
        self.context.sensor_pg = canvas.create_process_group(
            self.context.root_pg, PG_NAME, (330, 350))
        self.context.sensor_flow = nifireg.save_flow_ver(
            self.context.sensor_pg,
            self.context.reg_client,
            self.context.sensor_bucket,
            flow_name='SensorProcessGroup',
            comment='Enabled version control - {}'.format(self.run_id))

        # Update default SSL context controller service
        ssl_svc_name = 'Default NiFi SSL Context Service'
        if is_tls_enabled():
            props = {
                'SSL Protocol': 'TLS',
                'Truststore Type': 'JKS',
                'Truststore Filename':
                '/opt/cloudera/security/jks/truststore.jks',
                'Truststore Password': get_the_pwd(),
                'Keystore Type': 'JKS',
                'Keystore Filename': '/opt/cloudera/security/jks/keystore.jks',
                'Keystore Password': get_the_pwd(),
                'key-password': get_the_pwd(),
            }
            self.context.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
            if self.context.ssl_svc:
                canvas.schedule_controller(self.context.ssl_svc, False)
                self.context.ssl_svc = canvas.get_controller(
                    ssl_svc_name, 'name')
                canvas.update_controller(
                    self.context.ssl_svc,
                    nifi.ControllerServiceDTO(properties=props))
                self.context.ssl_svc = canvas.get_controller(
                    ssl_svc_name, 'name')
                canvas.schedule_controller(self.context.ssl_svc, True)
            else:
                self.context.keytab_svc = nf.create_controller(
                    self.context.root_pg,
                    'org.apache.nifi.ssl.StandardRestrictedSSLContextService',
                    props,
                    True,
                    name=ssl_svc_name)

        # Create controller services
        if is_tls_enabled():
            self.context.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
            props = {
                'Kerberos Keytab': '/keytabs/admin.keytab',
                'Kerberos Principal': 'admin',
            }
            self.context.keytab_svc = nf.create_controller(
                self.context.sensor_pg,
                'org.apache.nifi.kerberos.KeytabCredentialsService', props,
                True)
        else:
            self.context.ssl_svc = None
            self.context.keytab_svc = None

        props = {
            'url': schreg.get_api_url(),
        }
        if is_tls_enabled():
            props.update({
                'kerberos-credentials-service':
                self.context.keytab_svc.id,
                'ssl-context-service':
                self.context.ssl_svc.id,
            })
        self.context.sr_svc = nf.create_controller(
            self.context.sensor_pg,
            'org.apache.nifi.schemaregistry.hortonworks.HortonworksSchemaRegistry',
            props, True)
        self.context.json_reader_svc = nf.create_controller(
            self.context.sensor_pg, 'org.apache.nifi.json.JsonTreeReader', {
                'schema-access-strategy': 'schema-name',
                'schema-registry': self.context.sr_svc.id
            }, True)
        self.context.json_writer_svc = nf.create_controller(
            self.context.sensor_pg, 'org.apache.nifi.json.JsonRecordSetWriter',
            {
                'schema-access-strategy': 'schema-name',
                'schema-registry': self.context.sr_svc.id,
                'Schema Write Strategy': 'hwx-schema-ref-attributes'
            }, True)
        self.context.avro_writer_svc = nf.create_controller(
            self.context.sensor_pg, 'org.apache.nifi.avro.AvroRecordSetWriter',
            {
                'schema-access-strategy': 'schema-name',
                'schema-registry': self.context.sr_svc.id,
                'Schema Write Strategy': 'hwx-content-encoded-schema'
            }, True)

        # Create flow
        sensor_port = canvas.create_port(self.context.sensor_pg.id,
                                         'INPUT_PORT', 'Sensor Data',
                                         'STOPPED', (0, 0))

        upd_attr = nf.create_processor(
            self.context.sensor_pg, 'Set Schema Name',
            'org.apache.nifi.processors.attributes.UpdateAttribute', (0, 100),
            {
                'properties': {
                    'schema.name': 'SensorReading',
                },
            })
        canvas.create_connection(sensor_port, upd_attr)

        props = {
            'topic': 'iot',
            'record-reader': self.context.json_reader_svc.id,
            'record-writer': self.context.json_writer_svc.id,
        }
        props.update(
            kafka.get_common_client_properties(self.context, 'producer',
                                               CONSUMER_GROUP_ID,
                                               PRODUCER_CLIENT_ID))
        pub_kafka = nf.create_processor(
            self.context.sensor_pg, 'Publish to Kafka topic: iot', [
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_6',
                'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0'
            ], (0, 300), {
                'properties': props,
                'autoTerminatedRelationships': ['success'],
            })
        canvas.create_connection(upd_attr, pub_kafka, ['success'])

        fail_funnel = nf.create_funnel(self.context.sensor_pg.id, (600, 343))
        canvas.create_connection(pub_kafka, fail_funnel, ['failure'])

        # Commit changes
        nifireg.save_flow_ver(self.context.sensor_pg,
                              self.context.reg_client,
                              self.context.sensor_bucket,
                              flow_id=self.context.sensor_flow.
                              version_control_information.flow_id,
                              comment='First version - {}'.format(self.run_id))

        # Start flow
        canvas.schedule_process_group(self.context.root_pg.id, True)

        # Update "from Gateway" input port to connect to the process group
        nf.update_connection(self.context.from_gw, self.context.temp_funnel,
                             sensor_port)
        canvas.schedule_components(self.context.root_pg.id, True,
                                   [sensor_port])
Beispiel #16
0
def lab4_nifi_flow(env):
    LOG.info("Running step4_nifi_flow")
    # Create a bucket in NiFi Registry to save the edge flow versions
    env.sensor_bucket = versioning.get_registry_bucket('SensorFlows')
    if not env.sensor_bucket:
        env.sensor_bucket = versioning.create_registry_bucket('SensorFlows')

    # Create NiFi Process Group
    env.reg_client = versioning.create_registry_client('NiFi Registry',
                                                       _get_nifireg_url(),
                                                       'The registry...')
    env.sensor_pg = canvas.create_process_group(env.root_pg, PG_NAME,
                                                (330, 350))
    #env.sensor_flow = versioning.save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_name='SensorProcessGroup', comment='Enabled version control - ' + env.run_id)
    env.sensor_flow = save_flow_ver(env.sensor_pg,
                                    env.reg_client,
                                    env.sensor_bucket,
                                    flow_name='SensorProcessGroup',
                                    comment='Enabled version control - ' +
                                    str(env.run_id))

    # Update default SSL context controller service
    ssl_svc_name = 'Default NiFi SSL Context Service'
    if _IS_TLS_ENABLED:
        props = {
            'SSL Protocol': 'TLS',
            'Truststore Type': 'JKS',
            'Truststore Filename': '/opt/cloudera/security/jks/truststore.jks',
            'Truststore Password': _THE_PWD,
            'Keystore Type': 'JKS',
            'Keystore Filename': '/opt/cloudera/security/jks/keystore.jks',
            'Keystore Password': _THE_PWD,
            'key-password': _THE_PWD,
        }
        env.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
        if env.ssl_svc:
            canvas.schedule_controller(env.ssl_svc, False)
            env.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
            canvas.update_controller(
                env.ssl_svc, nifi.ControllerServiceDTO(properties=props))
            env.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
            canvas.schedule_controller(env.ssl_svc, True)
        else:
            env.keytab_svc = create_controller(
                env.root_pg,
                'org.apache.nifi.ssl.StandardRestrictedSSLContextService',
                props,
                True,
                name=ssl_svc_name)

    # Create controller services
    if _IS_TLS_ENABLED:
        env.ssl_svc = canvas.get_controller(ssl_svc_name, 'name')
        props = {
            'Kerberos Keytab': '/keytabs/admin.keytab',
            'Kerberos Principal': 'admin',
        }
        env.keytab_svc = create_controller(
            env.sensor_pg, 'org.apache.nifi.kerberos.KeytabCredentialsService',
            props, True)
    else:
        env.ssl_svc = None
        env.keytab_svc = None

    props = {
        'url': _get_schreg_api_url(),
    }
    if _IS_TLS_ENABLED:
        props.update({
            'kerberos-credentials-service': env.keytab_svc.id,
            'ssl-context-service': env.ssl_svc.id,
        })
    env.sr_svc = create_controller(
        env.sensor_pg,
        'org.apache.nifi.schemaregistry.hortonworks.HortonworksSchemaRegistry',
        props, True)
    env.json_reader_svc = create_controller(
        env.sensor_pg, 'org.apache.nifi.json.JsonTreeReader', {
            'schema-access-strategy': 'schema-name',
            'schema-registry': env.sr_svc.id
        }, True)
    env.json_writer_svc = create_controller(
        env.sensor_pg, 'org.apache.nifi.json.JsonRecordSetWriter', {
            'schema-access-strategy': 'schema-name',
            'schema-registry': env.sr_svc.id,
            'Schema Write Strategy': 'hwx-schema-ref-attributes'
        }, True)
    env.avro_writer_svc = create_controller(
        env.sensor_pg, 'org.apache.nifi.avro.AvroRecordSetWriter', {
            'schema-access-strategy': 'schema-name',
            'schema-registry': env.sr_svc.id,
            'Schema Write Strategy': 'hwx-content-encoded-schema'
        }, True)

    # Create flow
    sensor_port = canvas.create_port(env.sensor_pg.id, 'INPUT_PORT',
                                     'Sensor Data', 'RUNNING', (0, 0))

    upd_attr = create_processor(
        env.sensor_pg, 'Set Schema Name',
        'org.apache.nifi.processors.attributes.UpdateAttribute', (0, 100), {
            'properties': {
                'schema.name': 'SensorReading',
            },
        })
    canvas.create_connection(sensor_port, upd_attr)

    props = {
        'topic': 'iot',
        'record-reader': env.json_reader_svc.id,
        'record-writer': env.json_writer_svc.id,
    }
    props.update(_get_common_kafka_client_properties(env, 'producer'))
    pub_kafka = create_processor(
        env.sensor_pg, 'Publish to Kafka topic: iot',
        'org.apache.nifi.processors.kafka.pubsub.PublishKafkaRecord_2_0',
        (0, 300), {
            'properties': props,
            'autoTerminatedRelationships': ['success'],
        })
    canvas.create_connection(upd_attr, pub_kafka, ['success'])

    fail_funnel = create_funnel(env.sensor_pg.id, (600, 343))
    canvas.create_connection(pub_kafka, fail_funnel, ['failure'])

    # Commit changes
    #versioning.save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_id=env.sensor_flow.version_control_information.flow_id, comment='First version - ' + env.run_id)
    save_flow_ver(env.sensor_pg,
                  env.reg_client,
                  env.sensor_bucket,
                  flow_id=env.sensor_flow.version_control_information.flow_id,
                  comment='First version - ' + str(env.run_id))

    # Start flow
    canvas.schedule_process_group(env.root_pg.id, True)

    # Update "from Gateway" input port to connect to the process group
    update_connection(env.from_gw, env.temp_funnel, sensor_port)
Beispiel #17
0
def step7_rest_and_kudu(env):
    # Create controllers
    json_reader_with_schema_svc = create_controller(
        env.sensor_pg,
        'org.apache.nifi.json.JsonTreeReader', {
            'schema-access-strategy': 'hwx-schema-ref-attributes',
            'schema-registry': env.sr_svc.id
        },
        True,
        name='JsonTreeReader - With schema identifier')
    rest_lookup_svc = create_controller(
        env.sensor_pg, 'org.apache.nifi.lookup.RestLookupService', {
            'rest-lookup-url': get_cdsw_altus_api() + '/models/call-model',
            'rest-lookup-record-reader': env.json_reader_svc.id,
            'rest-lookup-record-path': '/response'
        }, True)

    # Build flow
    fail_funnel = create_funnel(env.sensor_pg.id, (1400, 340))

    consume_kafka = create_processor(
        env.sensor_pg, 'Consume Kafka iot messages',
        'org.apache.nifi.processors.kafka.pubsub.ConsumeKafkaRecord_2_0',
        (700, 0), {
            'properties': {
                'bootstrap.servers': 'edge2ai-1.dim.local:9092',
                'topic': 'iot',
                'topic_type': 'names',
                'record-reader': json_reader_with_schema_svc.id,
                'record-writer': env.json_writer_svc.id,
                'honor-transactions': 'false',
                'group.id': CONSUMER_GROUP_ID,
                'auto.offset.reset': 'latest',
                'header-name-regex': 'schema.*',
            },
        })
    canvas.create_connection(consume_kafka, fail_funnel, ['parse.failure'])

    predict = create_processor(
        env.sensor_pg, 'Predict machine health',
        'org.apache.nifi.processors.standard.LookupRecord', (700, 200), {
            'properties': {
                'record-reader': json_reader_with_schema_svc.id,
                'record-writer': env.json_writer_svc.id,
                'lookup-service': rest_lookup_svc.id,
                'result-record-path': '/response',
                'routing-strategy': 'route-to-success',
                'result-contents': 'insert-entire-record',
                'mime.type': "toString('application/json', 'UTF-8')",
                'request.body':
                "concat('{\"accessKey\":\"', '${cdsw.access.key}', '\",\"request\":{\"feature\":\"', /sensor_0, ', ', /sensor_1, ', ', /sensor_2, ', ', /sensor_3, ', ', /sensor_4, ', ', /sensor_5, ', ', /sensor_6, ', ', /sensor_7, ', ', /sensor_8, ', ', /sensor_9, ', ', /sensor_10, ', ', /sensor_11, '\"}}')",
                'request.method': "toString('post', 'UTF-8')",
            },
        })
    canvas.create_connection(predict, fail_funnel, ['failure'])
    canvas.create_connection(consume_kafka, predict, ['success'])

    update_health = create_processor(
        env.sensor_pg, 'Update health flag',
        'org.apache.nifi.processors.standard.UpdateRecord', (700, 400), {
            'properties': {
                'record-reader': json_reader_with_schema_svc.id,
                'record-writer': env.json_writer_svc.id,
                'replacement-value-strategy': 'record-path-value',
                '/is_healthy': '/response/result',
            },
        })
    canvas.create_connection(update_health, fail_funnel, ['failure'])
    canvas.create_connection(predict, update_health, ['success'])

    write_kudu = create_processor(
        env.sensor_pg, 'Write to Kudu',
        'org.apache.nifi.processors.kudu.PutKudu', (700, 600), {
            'properties': {
                'Kudu Masters': 'edge2ai-1.dim.local:7051',
                'Table Name': 'impala::default.sensors',
                'record-reader': json_reader_with_schema_svc.id,
            },
        })
    canvas.create_connection(write_kudu, fail_funnel, ['failure'])
    canvas.create_connection(update_health, write_kudu, ['success'])

    monitor_activity = create_processor(
        env.sensor_pg, 'Monitor Activity',
        'org.apache.nifi.processors.standard.MonitorActivity', (700, 800), {
            'properties': {
                'Threshold Duration': '45 secs',
                'Continually Send Messages': 'true',
            },
            'autoTerminatedRelationships': ['activity.restored', 'success'],
        })
    canvas.create_connection(monitor_activity, fail_funnel, ['inactive'])
    canvas.create_connection(write_kudu, monitor_activity, ['success'])

    # Version flow
    #versioning.save_flow_ver(env.sensor_pg, env.reg_client, env.sensor_bucket, flow_id=env.sensor_flow.version_control_information.flow_id, comment='Second version - ' + env.run_id)
    save_flow_ver(env.sensor_pg,
                  env.reg_client,
                  env.sensor_bucket,
                  flow_id=env.sensor_flow.version_control_information.flow_id,
                  comment='Second version - ' + env.run_id)

    # Prepare Impala/Kudu table
    create_kudu_table()

    # Set the variable with the CDSW access key
    canvas.update_variable_registry(
        env.sensor_pg, [('cdsw.access.key', get_cdsw_model_access_key())])

    # Start everything
    canvas.schedule_process_group(env.root_pg.id, True)
Beispiel #18
0
root_pg = canvas.get_process_group(root_pg_id, 'id')

location_x = 2000
location_y = 2000

location = (location_x, location_y)

template_entity = nipyapi.templates.upload_template(root_pg_id,
                                                    'jangowave_demo.xml')

flow = nipyapi.templates.deploy_template(root_pg_id, template_entity.id, 2000,
                                         2000)

jd = canvas.get_process_group('jangowave_demo')
for cs in canvas.list_all_processors(jd.id):
    if cs.status.run_status != "ENABLED" and cs.component.name == "RecordIngest":
        config_update = nifi.models.processor_config_dto.ProcessorConfigDTO(
            properties={
                "Accumulo User": "******",
                "Instance Name": instance,
                "Accumulo Password": "******",
                "ZooKeeper Quorum": zookeeper_list
            })
        canvas.update_processor(cs, config_update)
for cs in canvas.list_all_controllers(jd.id):
    canvas.schedule_controller(cs, True)
for cs in canvas.list_all_processors(jd.id):
    canvas.schedule_processor(cs, True)
canvas.schedule_process_group(jd.id, True)
Beispiel #19
0
 def __start_base(self):
     canvas.schedule_process_group(self.base.component.id, True)