diff --git a/CHANGELOG.md b/CHANGELOG.md index c51b6e90..9f451b24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Support for passing CAs to GitSync ([#903]). + ### Changed - Document Helm deployed RBAC permissions and remove unnecessary permissions ([#916]). @@ -11,6 +15,7 @@ All notable changes to this project will be documented in this file. Previously, arbitrary keys were silently accepted but ignored ([#921]). - Bump `stackable-operator` to 0.110.1 and `kube` to 3.1.0 ([#921]). +[#903]: https://github.com/stackabletech/nifi-operator/pull/903 [#916]: https://github.com/stackabletech/nifi-operator/pull/916 [#921]: https://github.com/stackabletech/nifi-operator/pull/921 diff --git a/Cargo.lock b/Cargo.lock index 70cefb84..198cb40e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -403,11 +403,12 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -1588,6 +1589,21 @@ dependencies = [ "snafu 0.9.0", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kube" version = "3.1.0" @@ -1836,7 +1852,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] @@ -2298,9 +2314,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", diff --git a/Cargo.nix b/Cargo.nix index 54f5a2b1..b7ed7465 100644 --- a/Cargo.nix +++ b/Cargo.nix @@ -1261,9 +1261,9 @@ rec { }; "const_format" = rec { crateName = "const_format"; - version = "0.2.35"; + version = "0.2.36"; edition = "2021"; - sha256 = "1b9h03z3k76ail1ldqxcqmsc4raa7dwgwwqwrjf6wmism5lp9akz"; + sha256 = "07ncczs8yndga2f8p4386c827l4fxwzl0pbwp7ijnhcsmlbsd0a4"; authors = [ "rodrimati1992 " ]; @@ -1272,6 +1272,12 @@ rec { name = "const_format_proc_macros"; packageId = "const_format_proc_macros"; } + { + name = "konst"; + packageId = "konst"; + usesDefaultFeatures = false; + features = [ "rust_1_64" ]; + } ]; features = { "__debug" = [ "const_format_proc_macros/debug" ]; @@ -1285,10 +1291,9 @@ rec { "constant_time_as_str" = [ "fmt" ]; "derive" = [ "fmt" "const_format_proc_macros/derive" ]; "fmt" = [ "rust_1_83" ]; - "konst" = [ "dep:konst" ]; "more_str_macros" = [ "rust_1_64" ]; "nightly_const_generics" = [ "const_generics" ]; - "rust_1_64" = [ "rust_1_51" "konst" "konst/rust_1_64" ]; + "rust_1_64" = [ "rust_1_51" ]; "rust_1_83" = [ "rust_1_64" ]; }; resolvedDefaultFeatures = [ "default" ]; @@ -5130,6 +5135,53 @@ rec { }; resolvedDefaultFeatures = [ "darling" ]; }; + "konst" = rec { + crateName = "konst"; + version = "0.2.20"; + edition = "2018"; + sha256 = "1yyf1fhk28wbf1lqrga9as4cpfmpbry9a5vvdqyxgz14g3nk708j"; + authors = [ + "rodrimati1992 " + ]; + dependencies = [ + { + name = "konst_macro_rules"; + packageId = "konst_macro_rules"; + } + ]; + features = { + "__ui" = [ "__test" "trybuild" "rust_latest_stable" ]; + "const_generics" = [ "rust_1_51" ]; + "constant_time_slice" = [ "rust_latest_stable" ]; + "default" = [ "cmp" "parsing" ]; + "deref_raw_in_fn" = [ "rust_1_56" ]; + "konst_proc_macros" = [ "dep:konst_proc_macros" ]; + "mut_refs" = [ "rust_latest_stable" "konst_macro_rules/mut_refs" ]; + "nightly_mut_refs" = [ "mut_refs" "konst_macro_rules/nightly_mut_refs" ]; + "parsing" = [ "parsing_no_proc" "konst_proc_macros" ]; + "rust_1_51" = [ "konst_macro_rules/rust_1_51" ]; + "rust_1_55" = [ "rust_1_51" "konst_macro_rules/rust_1_55" ]; + "rust_1_56" = [ "rust_1_55" "konst_macro_rules/rust_1_56" ]; + "rust_1_57" = [ "rust_1_56" "konst_macro_rules/rust_1_57" ]; + "rust_1_61" = [ "rust_1_57" "konst_macro_rules/rust_1_61" ]; + "rust_1_64" = [ "rust_1_61" ]; + "rust_latest_stable" = [ "rust_1_64" ]; + "trybuild" = [ "dep:trybuild" ]; + }; + resolvedDefaultFeatures = [ "rust_1_51" "rust_1_55" "rust_1_56" "rust_1_57" "rust_1_61" "rust_1_64" ]; + }; + "konst_macro_rules" = rec { + crateName = "konst_macro_rules"; + version = "0.2.19"; + edition = "2018"; + sha256 = "0dswja0dqcww4x3fwjnirc0azv2n6cazn8yv0kddksd8awzkz4x4"; + authors = [ + "rodrimati1992 " + ]; + features = { + }; + resolvedDefaultFeatures = [ "rust_1_51" "rust_1_55" "rust_1_56" "rust_1_57" "rust_1_61" ]; + }; "kube" = rec { crateName = "kube"; version = "3.1.0"; @@ -6095,7 +6147,7 @@ rec { } { name = "rand"; - packageId = "rand 0.8.5"; + packageId = "rand 0.8.6"; optional = true; usesDefaultFeatures = false; } @@ -6114,7 +6166,7 @@ rec { devDependencies = [ { name = "rand"; - packageId = "rand 0.8.5"; + packageId = "rand 0.8.6"; features = [ "small_rng" ]; } ]; @@ -7607,11 +7659,11 @@ rec { }; resolvedDefaultFeatures = [ "alloc" "default" "std" "std_rng" "sys_rng" "thread_rng" ]; }; - "rand 0.8.5" = rec { + "rand 0.8.6" = rec { crateName = "rand"; - version = "0.8.5"; + version = "0.8.6"; edition = "2018"; - sha256 = "013l6931nn7gkc23jz5mm3qdhf93jjf0fg64nz2lp4i51qd8vbrl"; + sha256 = "12kd4rljn86m00rcaz4c1rcya4mb4gk5ig6i8xq00a8wjgxfr82w"; authors = [ "The Rand Project Developers" "The Rust Project Developers" @@ -7633,12 +7685,9 @@ rec { "default" = [ "std" "std_rng" ]; "getrandom" = [ "rand_core/getrandom" ]; "libc" = [ "dep:libc" ]; - "log" = [ "dep:log" ]; - "packed_simd" = [ "dep:packed_simd" ]; "rand_chacha" = [ "dep:rand_chacha" ]; "serde" = [ "dep:serde" ]; "serde1" = [ "serde" "rand_core/serde1" ]; - "simd_support" = [ "packed_simd" ]; "std" = [ "rand_core/std" "rand_chacha/std" "alloc" "getrandom" "libc" ]; "std_rng" = [ "rand_chacha" ]; }; diff --git a/docs/modules/nifi/pages/usage_guide/custom-components.adoc b/docs/modules/nifi/pages/usage_guide/custom-components.adoc index f9f1e305..66bad710 100644 --- a/docs/modules/nifi/pages/usage_guide/custom-components.adoc +++ b/docs/modules/nifi/pages/usage_guide/custom-components.adoc @@ -58,14 +58,19 @@ spec: wait: 10s # <6> credentialsSecret: git-credentials # <7> gitSyncConf: # <8> - --git-config: http.sslCAInfo:/tmp/ca-cert/ca.crt - - repo: https://example.com/git/other-nifi-components # <9> + --git-config: pull.rebase=true # <9> + tls: + verification: + server: + caCert: + secretClass: git-ca-cert # <10> + - repo: https://example.com/git/other-nifi-components # <11> nodes: config: logging: enableVectorAgent: true containers: - git-sync: # <10> + git-sync: # <12> console: level: INFO file: @@ -94,8 +99,14 @@ data: The `password` field can either be an actual password (not recommended) or a GitHub token, as described in the {git-sync-docs}[git-sync documentation]. <8> A map of optional configuration settings that are listed in the {git-sync-docs}[git-sync documentation]. + These settings are not verified. -<9> Multiple repositories can be defined. Only the `repo` field is mandatory. -<10> Logging can be configured as described in xref:concepts:logging.adoc[]. +<9> Valid `git-config` settings can be passed here N.B. a warning will be triggered if both `http.sslCAInfo` is defined here and the field `caCertSecretName` is specified (as it maps onto the same config setting). +<10> An optional reference to the SecretClass used for holding CA certificates that will be used to verify the git server's TLS certificate by passing it to the git config option `http.sslCAInfo` passed with the gitsync command. + The associated secret must have a key named `ca.crt` whose value is the PEM-encoded certificate bundle. + If this field is set to `webPki: {}` or is omitted altogether, then no changes will be made to the gitsync command and it will default to presenting no certificate to the backend. + Omitting this field is non-breaking behaviour and as such it does *not* set `http.sslverify` to `false` as disabling security checks should be a last resort and not something activated by default. + This can still be achieved by passing `--git-config: http.sslverify=false` explicitly. +<11> Multiple repositories can be defined. Only the `repo` field is mandatory. +<12> Logging can be configured as described in xref:concepts:logging.adoc[]. As git-sync is a command-line tool, just its output is logged and no fine-grained log configuration is possible. All git-sync containers are configured via the one `git-sync` field. diff --git a/extra/crds.yaml b/extra/crds.yaml index eef2161c..ccbd08a7 100644 --- a/extra/crds.yaml +++ b/extra/crds.yaml @@ -181,10 +181,34 @@ spec: Since git-sync v4.x.x this field is mapped to the flag `--ref`. type: string - credentialsSecret: + credentials: description: An optional secret used for git access. nullable: true - type: string + oneOf: + - required: + - basicAuthSecretName + - required: + - sshPrivateKeySecretName + properties: + basicAuthSecretName: + description: |- + The name of the Secret used to access the repository via Basic Authentication if it is not public. + + The referenced Secret must include two fields: `user` and `password`. + The `password` field can either be an actual password (not recommended) or a GitHub token, + as described in the git-sync [documentation]. + + [documentation]: https://github.com/kubernetes/git-sync/tree/v4.2.4?tab=readme-ov-file#manual + type: string + sshPrivateKeySecretName: + description: |- + The name of the Secret used for SSH access to the repository. + + The referenced Secret must include two fields: `key` and `knownHosts`. + + [documentation]: https://github.com/kubernetes/git-sync/tree/v4.2.4?tab=readme-ov-file#manual + type: string + type: object depth: default: 1 description: The depth of syncing, i.e. the number of commits to clone; defaults to 1. diff --git a/nix/sources.json b/nix/sources.json index 10cce14f..dcec74a2 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -29,10 +29,10 @@ "homepage": "", "owner": "NixOS", "repo": "nixpkgs", - "rev": "26eaeac4e409d7b5a6bf6f90a2a2dc223c78d915", - "sha256": "1knl8dcr5ip70a2vbky3q844212crwrvybyw2nhfmgm1mvqry963", + "rev": "4215e62dc2cd3bc705b0a423b9719ff6be378a43", + "sha256": "00jincsannnifsprr6z6fifn1fhkc4zngbjglk5ap3lcv1lc5fdv", "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/26eaeac4e409d7b5a6bf6f90a2a2dc223c78d915.tar.gz", + "url": "https://github.com/NixOS/nixpkgs/archive/4215e62dc2cd3bc705b0a423b9719ff6be378a43.tar.gz", "url_template": "https://github.com///archive/.tar.gz" } } diff --git a/rust/operator-binary/src/config/mod.rs b/rust/operator-binary/src/config/mod.rs index a4b53e94..c5302f69 100644 --- a/rust/operator-binary/src/config/mod.rs +++ b/rust/operator-binary/src/config/mod.rs @@ -157,7 +157,7 @@ pub fn build_nifi_properties( auth_config: &NifiAuthenticationConfig, overrides: BTreeMap, product_version: &str, - git_sync_resources: &git_sync::v1alpha1::GitSyncResources, + git_sync_resources: &git_sync::v1alpha2::GitSyncResources, ) -> Result { // TODO: Remove once we dropped support for all NiFi 1.x versions let is_nifi_1 = product_version.starts_with("1."); diff --git a/rust/operator-binary/src/controller.rs b/rust/operator-binary/src/controller.rs index 39623578..cc59ebb6 100644 --- a/rust/operator-binary/src/controller.rs +++ b/rust/operator-binary/src/controller.rs @@ -230,7 +230,7 @@ pub enum Error { FailedToResolveConfig { source: crate::crd::Error }, #[snafu(display("invalid git-sync specification"))] - InvalidGitSyncSpec { source: git_sync::v1alpha1::Error }, + InvalidGitSyncSpec { source: git_sync::v1alpha2::Error }, #[snafu(display("vector agent is enabled but vector aggregator ConfigMap is missing"))] VectorAggregatorConfigMapMissing, @@ -493,7 +493,7 @@ pub async fn reconcile_nifi( .merged_config(&NifiRole::Node, rolegroup_name) .context(FailedToResolveConfigSnafu)?; - let git_sync_resources = git_sync::v1alpha1::GitSyncResources::new( + let git_sync_resources = git_sync::v1alpha2::GitSyncResources::new( &nifi.spec.cluster_config.custom_components_git_sync, &resolved_product_image, &env_vars_from_rolegroup_config(rolegroup_config), @@ -724,7 +724,7 @@ async fn build_node_rolegroup_config_map( rolegroup_config: &HashMap>, merged_config: &NifiConfig, proxy_hosts: &str, - git_sync_resources: &git_sync::v1alpha1::GitSyncResources, + git_sync_resources: &git_sync::v1alpha2::GitSyncResources, ) -> Result { tracing::debug!("building rolegroup configmaps"); @@ -851,7 +851,7 @@ async fn build_node_rolegroup_statefulset( rolling_update_supported: bool, replicas: Option, service_account_name: &str, - git_sync_resources: &git_sync::v1alpha1::GitSyncResources, + git_sync_resources: &git_sync::v1alpha2::GitSyncResources, ) -> Result { tracing::debug!("Building statefulset"); let role_group = role.role_groups.get(&rolegroup_ref.role_group); @@ -1238,6 +1238,9 @@ async fn build_node_rolegroup_statefulset( pod_builder .add_volumes(git_sync_resources.git_content_volumes.to_owned()) .context(AddVolumeSnafu)?; + pod_builder + .add_volumes(git_sync_resources.git_ca_cert_volumes.to_owned()) + .context(AddVolumeSnafu)?; if let Some(ContainerLogConfig { choice: diff --git a/rust/operator-binary/src/crd/mod.rs b/rust/operator-binary/src/crd/mod.rs index e4785213..3a4178aa 100644 --- a/rust/operator-binary/src/crd/mod.rs +++ b/rust/operator-binary/src/crd/mod.rs @@ -159,7 +159,7 @@ pub mod versioned { /// Learn more in the documentation for /// [Loading custom components](DOCS_BASE_URL_PLACEHOLDER/nifi/usage_guide/custom-components.html#git_sync). #[serde(default)] - pub custom_components_git_sync: Vec, + pub custom_components_git_sync: Vec, /// Extra volumes similar to `.spec.volumes` on a Pod to mount into every container, this can be useful to for /// example make client certificates, keytabs or similar things available to processors. These volumes will be diff --git a/tests/templates/kuttl/custom-components-git-sync/00-rbac.yaml.j2 b/tests/templates/kuttl/custom-components-git-sync/00-rbac.yaml.j2 new file mode 100644 index 00000000..0b9df7d2 --- /dev/null +++ b/tests/templates/kuttl/custom-components-git-sync/00-rbac.yaml.j2 @@ -0,0 +1,38 @@ +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: use-integration-tests-scc +rules: + - apiGroups: + - "" + resources: + - configmaps + - secrets + verbs: + - create + - get + - patch +{% if test_scenario['values']['openshift'] == "true" %} + - apiGroups: ["security.openshift.io"] + resources: ["securitycontextconstraints"] + resourceNames: ["privileged"] + verbs: ["use"] +{% endif %} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: integration-tests-sa +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: use-integration-tests-scc +subjects: + - kind: ServiceAccount + name: integration-tests-sa +roleRef: + kind: Role + name: use-integration-tests-scc + apiGroup: rbac.authorization.k8s.io diff --git a/tests/templates/kuttl/custom-components-git-sync/15-assert.yaml b/tests/templates/kuttl/custom-components-git-sync/15-assert.yaml new file mode 100644 index 00000000..3c2158b4 --- /dev/null +++ b/tests/templates/kuttl/custom-components-git-sync/15-assert.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: create-ca-cert +status: + succeeded: 1 diff --git a/tests/templates/kuttl/custom-components-git-sync/15-create-ca-cert.yaml b/tests/templates/kuttl/custom-components-git-sync/15-create-ca-cert.yaml new file mode 100644 index 00000000..2eed4bd9 --- /dev/null +++ b/tests/templates/kuttl/custom-components-git-sync/15-create-ca-cert.yaml @@ -0,0 +1,54 @@ +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + kubectl apply -n "$NAMESPACE" -f - < 0 %} - custom: "{{ test_scenario['values']['nifi'].split(',')[1] }}" - productVersion: "{{ test_scenario['values']['nifi'].split(',')[0] }}" -{% else %} - productVersion: "{{ test_scenario['values']['nifi'] }}" -{% endif %} - pullPolicy: IfNotPresent - clusterConfig: - zookeeperConfigMapName: test-nifi-znode - authentication: - - authenticationClass: nifi-users - sensitiveProperties: - keySecret: nifi-sensitive-property-key - autoGenerate: true - customComponentsGitSync: - - repo: https://github.com/stackabletech/nifi-operator - branch: ef61c87311ad2f57484c33245c9ed50908a1c785 - gitFolder: tests/templates/kuttl/custom-components-git-sync/java-processors - - repo: https://github.com/stackabletech/nifi-operator - branch: ef61c87311ad2f57484c33245c9ed50908a1c785 - gitFolder: tests/templates/kuttl/custom-components-git-sync/python-processors -{% if lookup('env', 'VECTOR_AGGREGATOR') %} - vectorAggregatorConfigMapName: vector-aggregator-discovery -{% endif %} - nodes: - config: - logging: - enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} - roleConfig: - listenerClass: external-unstable - podOverrides: - spec: - initContainers: - - name: init-flow - image: oci.stackable.tech/sdp/testing-tools/nifi:0.3.0-stackable0.0.0-dev - command: - - /bin/bash - - -c - args: - - gzip --stdout /stackable/nifi/flow/flow.json > /stackable/data/database/flow.json.gz - volumeMounts: - - name: nifi-flow - mountPath: /stackable/nifi/flow - - name: database-repository - mountPath: /stackable/data/database - containers: - - name: nifi - ports: - - name: greeting - containerPort: 8090 - protocol: TCP - volumes: - - name: nifi-flow - configMap: -{% if test_scenario['values']['nifi'].startswith("1.") %} - name: nifi1-flow -{% else %} - name: nifi2-flow -{% endif %} - roleGroups: - default: - replicas: 2 ---- -apiVersion: v1 -kind: Service -metadata: - name: nifi-greeting -spec: - selector: - app.kubernetes.io/component: node - app.kubernetes.io/instance: test-nifi - app.kubernetes.io/name: nifi - app.kubernetes.io/role-group: default - ports: - - name: greeting - port: 80 - protocol: TCP - targetPort: greeting ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: nifi1-flow -data: - flow.json: | - { - "encodingVersion": { - "majorVersion": 2, - "minorVersion": 0 - }, - "maxTimerDrivenThreadCount": 10, - "maxEventDrivenThreadCount": 1, - "registries": [], - "parameterContexts": [], - "parameterProviders": [], - "controllerServices": [], - "reportingTasks": [ - { - "identifier": "fd3cf892-0196-1000-0000-000074a555a2", - "instanceIdentifier": "fd3cf892-0196-1000-0000-000074a555a2", - "name": "StackablePrometheusReportingTask", - "type": "org.apache.nifi.reporting.prometheus.PrometheusReportingTask", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-prometheus-nar", - "version": "1.28.1" - }, - "properties": { - "prometheus-reporting-task-metrics-endpoint-port": "8081", - "prometheus-reporting-task-metrics-strategy": "All Components", - "prometheus-reporting-task-instance-id": "${hostname(true)}", - "prometheus-reporting-task-client-auth": "No Authentication", - "prometheus-reporting-task-metrics-send-jvm": "true" - }, - "propertyDescriptors": {}, - "scheduledState": "RUNNING", - "schedulingPeriod": "60 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "componentType": "REPORTING_TASK" - } - ], - "templates": [], - "rootGroup": { - "identifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "instanceIdentifier": "fd37b89e-0196-1000-9750-8b45eabee468", - "name": "NiFi Flow", - "comments": "", - "position": { - "x": 0.0, - "y": 0.0 - }, - "processGroups": [], - "remoteProcessGroups": [], - "processors": [ - { - "identifier": "b34e789e-1a70-3275-b5c5-f5856b628166", - "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556", - "name": "Greet", - "comments": "", - "position": { - "x": 800.0, - "y": 304.0 - }, - "type": "org.apache.nifi.processors.standard.ReplaceText", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "1.28.1" - }, - "properties": { - "Regular Expression": "(?s)(^.*$)", - "Replacement Value": "Hello!", - "Evaluation Mode": "Entire text", - "Line-by-Line Evaluation Mode": "All", - "Character Set": "UTF-8", - "Maximum Buffer Size": "1 MB", - "Replacement Strategy": "Always Replace" - }, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 25, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [ - "failure" - ], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - }, - { - "identifier": "d15c871b-e9c5-38bd-903b-6bf3a9c55765", - "instanceIdentifier": "fd45c24b-0196-1000-0000-00001a549d74", - "name": "HandleHttpResponse", - "comments": "", - "position": { - "x": 800.0, - "y": 752.0 - }, - "type": "org.apache.nifi.processors.standard.HandleHttpResponse", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "1.28.1" - }, - "properties": { - "HTTP Context Map": "fd3b17c4-0196-1000-0000-000076ed786c", - "HTTP Status Code": "200" - }, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [ - "success", - "failure" - ], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - }, - { - "identifier": "35d73904-95e1-3dae-81a7-56d0f907ad5c", - "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1", - "name": "ShoutProcessor", - "comments": "", - "position": { - "x": 800.0, - "y": 528.0 - }, - "type": "tech.stackable.nifi.processors.sample.ShoutProcessor", - "bundle": { - "group": "tech.stackable.nifi", - "artifact": "nifi-sample-nar", - "version": "1.0.0" - }, - "properties": {}, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - }, - { - "identifier": "c5fad835-91fd-31dc-afbf-c37209e03598", - "instanceIdentifier": "fd3a912f-0196-1000-ffff-ffffacaca66e", - "name": "HandleHttpRequest", - "comments": "", - "position": { - "x": 800.0, - "y": 80.0 - }, - "type": "org.apache.nifi.processors.standard.HandleHttpRequest", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "1.28.1" - }, - "properties": { - "multipart-request-max-size": "1 MB", - "Allow POST": "false", - "Default URL Character Set": "UTF-8", - "Allow DELETE": "false", - "Maximum Threads": "200", - "HTTP Protocols": "HTTP_1_1", - "container-queue-size": "50", - "HTTP Context Map": "fd3b17c4-0196-1000-0000-000076ed786c", - "multipart-read-buffer-size": "512 KB", - "Allow OPTIONS": "false", - "Allowed Paths": "/greeting", - "Allow GET": "true", - "Allow HEAD": "false", - "Listening Port": "8090", - "Client Authentication": "No Authentication", - "Allow PUT": "false" - }, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - } - ], - "inputPorts": [], - "outputPorts": [], - "connections": [ - { - "identifier": "3cb76499-9b4a-3199-9697-e05fdb86b38e", - "instanceIdentifier": "fd4532b6-0196-1000-ffff-ffffcb96239f", - "name": "", - "source": { - "id": "c5fad835-91fd-31dc-afbf-c37209e03598", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "HandleHttpRequest", - "comments": "", - "instanceIdentifier": "fd3a912f-0196-1000-ffff-ffffacaca66e" - }, - "destination": { - "id": "b34e789e-1a70-3275-b5c5-f5856b628166", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "Greet", - "comments": "", - "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556" - }, - "labelIndex": 1, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - }, - { - "identifier": "895aecef-a30b-3ad5-993a-6df611e64e0d", - "instanceIdentifier": "fd459382-0196-1000-0000-00000ad9142c", - "name": "", - "source": { - "id": "b34e789e-1a70-3275-b5c5-f5856b628166", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "Greet", - "comments": "", - "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556" - }, - "destination": { - "id": "35d73904-95e1-3dae-81a7-56d0f907ad5c", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "ShoutProcessor", - "comments": "", - "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1" - }, - "labelIndex": 1, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - }, - { - "identifier": "47c43ae4-44e5-3e94-9185-bfae5fd6776e", - "instanceIdentifier": "fd45f133-0196-1000-ffff-fffff094098e", - "name": "", - "source": { - "id": "35d73904-95e1-3dae-81a7-56d0f907ad5c", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "ShoutProcessor", - "comments": "", - "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1" - }, - "destination": { - "id": "d15c871b-e9c5-38bd-903b-6bf3a9c55765", - "type": "PROCESSOR", - "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", - "name": "HandleHttpResponse", - "comments": "", - "instanceIdentifier": "fd45c24b-0196-1000-0000-00001a549d74" - }, - "labelIndex": 1, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - } - ], - "labels": [], - "funnels": [], - "controllerServices": [ - { - "identifier": "0e58c44e-c294-3b7f-b323-bb94ca5074fb", - "instanceIdentifier": "fd3b17c4-0196-1000-0000-000076ed786c", - "name": "StandardHttpContextMap", - "comments": "", - "type": "org.apache.nifi.http.StandardHttpContextMap", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-http-context-map-nar", - "version": "1.28.1" - }, - "properties": { - "Request Expiration": "1 min", - "Maximum Outstanding Requests": "5000" - }, - "propertyDescriptors": {}, - "controllerServiceApis": [ - { - "type": "org.apache.nifi.http.HttpContextMap", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-services-api-nar", - "version": "1.28.1" - } - } - ], - "scheduledState": "ENABLED", - "bulletinLevel": "WARN", - "componentType": "CONTROLLER_SERVICE", - "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" - } - ], - "variables": {}, - "defaultFlowFileExpiration": "0 sec", - "defaultBackPressureObjectThreshold": 10000, - "defaultBackPressureDataSizeThreshold": "1 GB", - "flowFileConcurrency": "UNBOUNDED", - "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE", - "componentType": "PROCESS_GROUP" - } - } ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: nifi2-flow -data: - flow.json: | - { - "encodingVersion": { - "majorVersion": 2, - "minorVersion": 0 - }, - "maxTimerDrivenThreadCount": 10, - "registries": [], - "parameterContexts": [], - "parameterProviders": [], - "controllerServices": [], - "reportingTasks": [], - "flowAnalysisRules": [], - "rootGroup": { - "identifier": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "instanceIdentifier": "f7cda0ce-0196-1000-30b6-0f5577f07b63", - "name": "NiFi Flow", - "comments": "", - "position": { - "x": 0.0, - "y": 0.0 - }, - "processGroups": [], - "remoteProcessGroups": [], - "processors": [ - { - "identifier": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", - "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3", - "name": "ShoutProcessor", - "comments": "", - "position": { - "x": -112.0, - "y": 96.0 - }, - "type": "tech.stackable.nifi.processors.sample.ShoutProcessor", - "bundle": { - "group": "tech.stackable.nifi", - "artifact": "nifi-sample-nar", - "version": "1.0.0" - }, - "properties": {}, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - }, - { - "identifier": "1975618d-36bc-32b4-9d14-06a14d4dcba0", - "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8", - "name": "Greet", - "comments": "", - "position": { - "x": -112.0, - "y": -128.0 - }, - "type": "Greet", - "bundle": { - "group": "org.apache.nifi", - "artifact": "python-extensions", - "version": "1.0.0" - }, - "properties": {}, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 25, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [ - "original", - "failure" - ], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - }, - { - "identifier": "0b7338da-d770-365b-bff5-bba3f0236229", - "instanceIdentifier": "f80e3b3f-0196-1000-0000-00004590be6a", - "name": "HandleHttpResponse", - "comments": "", - "position": { - "x": -112.0, - "y": 320.0 - }, - "type": "org.apache.nifi.processors.standard.HandleHttpResponse", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "2.2.0" - }, - "properties": { - "HTTP Context Map": "f80ef95f-0196-1000-ffff-ffffabf564cb", - "HTTP Status Code": "200" - }, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [ - "success", - "failure" - ], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - }, - { - "identifier": "522d46b7-8c43-35b7-ab91-2e5150e44e5b", - "instanceIdentifier": "f809987c-0196-1000-ffff-fffff71b58df", - "name": "HandleHttpRequest", - "comments": "", - "position": { - "x": -112.0, - "y": -352.0 - }, - "type": "org.apache.nifi.processors.standard.HandleHttpRequest", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-nar", - "version": "2.2.0" - }, - "properties": { - "multipart-request-max-size": "1 MB", - "Allow POST": "false", - "Default URL Character Set": "UTF-8", - "Allow DELETE": "false", - "Request Header Maximum Size": "8 KB", - "Maximum Threads": "200", - "HTTP Protocols": "HTTP_1_1", - "container-queue-size": "50", - "HTTP Context Map": "f80ef95f-0196-1000-ffff-ffffabf564cb", - "multipart-read-buffer-size": "512 KB", - "Allow OPTIONS": "false", - "Allowed Paths": "/greeting", - "Allow GET": "true", - "Allow HEAD": "false", - "Listening Port": "8090", - "Client Authentication": "No Authentication", - "Allow PUT": "false" - }, - "propertyDescriptors": {}, - "style": {}, - "schedulingPeriod": "0 sec", - "schedulingStrategy": "TIMER_DRIVEN", - "executionNode": "ALL", - "penaltyDuration": "30 sec", - "yieldDuration": "1 sec", - "bulletinLevel": "WARN", - "runDurationMillis": 0, - "concurrentlySchedulableTaskCount": 1, - "autoTerminatedRelationships": [], - "scheduledState": "RUNNING", - "retryCount": 10, - "retriedRelationships": [], - "backoffMechanism": "PENALIZE_FLOWFILE", - "maxBackoffPeriod": "10 mins", - "componentType": "PROCESSOR", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - } - ], - "inputPorts": [], - "outputPorts": [], - "connections": [ - { - "identifier": "5f7beeba-4cdc-3099-aef6-96ced3560ecc", - "instanceIdentifier": "f80e0681-0196-1000-ffff-ffffc59964fa", - "name": "", - "source": { - "id": "1975618d-36bc-32b4-9d14-06a14d4dcba0", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "Greet", - "comments": "", - "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8" - }, - "destination": { - "id": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "ShoutProcessor", - "comments": "", - "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3" - }, - "labelIndex": 0, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - }, - { - "identifier": "5165254a-e18c-3ccb-b8cb-25c55d7151a7", - "instanceIdentifier": "f80e54a1-0196-1000-ffff-ffffa1c1bed7", - "name": "", - "source": { - "id": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "ShoutProcessor", - "comments": "", - "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3" - }, - "destination": { - "id": "0b7338da-d770-365b-bff5-bba3f0236229", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "HandleHttpResponse", - "comments": "", - "instanceIdentifier": "f80e3b3f-0196-1000-0000-00004590be6a" - }, - "labelIndex": 0, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - }, - { - "identifier": "ad7fc77b-6b4b-3750-8e22-fcbb228a6fb4", - "instanceIdentifier": "f80dbacc-0196-1000-0000-0000274b2561", - "name": "", - "source": { - "id": "522d46b7-8c43-35b7-ab91-2e5150e44e5b", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "HandleHttpRequest", - "comments": "", - "instanceIdentifier": "f809987c-0196-1000-ffff-fffff71b58df" - }, - "destination": { - "id": "1975618d-36bc-32b4-9d14-06a14d4dcba0", - "type": "PROCESSOR", - "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", - "name": "Greet", - "comments": "", - "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8" - }, - "labelIndex": 0, - "zIndex": 0, - "selectedRelationships": [ - "success" - ], - "backPressureObjectThreshold": 10000, - "backPressureDataSizeThreshold": "1 GB", - "flowFileExpiration": "0 sec", - "prioritizers": [], - "bends": [], - "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", - "partitioningAttribute": "", - "loadBalanceCompression": "DO_NOT_COMPRESS", - "componentType": "CONNECTION", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - } - ], - "labels": [], - "funnels": [], - "controllerServices": [ - { - "identifier": "68712a48-5a26-3bee-8bfc-dafafda62660", - "instanceIdentifier": "f80ef95f-0196-1000-ffff-ffffabf564cb", - "name": "StandardHttpContextMap", - "comments": "", - "type": "org.apache.nifi.http.StandardHttpContextMap", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-http-context-map-nar", - "version": "2.2.0" - }, - "properties": { - "Request Expiration": "1 min", - "Maximum Outstanding Requests": "5000" - }, - "propertyDescriptors": {}, - "controllerServiceApis": [ - { - "type": "org.apache.nifi.http.HttpContextMap", - "bundle": { - "group": "org.apache.nifi", - "artifact": "nifi-standard-services-api-nar", - "version": "2.2.0" - } - } - ], - "scheduledState": "ENABLED", - "bulletinLevel": "WARN", - "componentType": "CONTROLLER_SERVICE", - "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" - } - ], - "defaultFlowFileExpiration": "0 sec", - "defaultBackPressureObjectThreshold": 10000, - "defaultBackPressureDataSizeThreshold": "1 GB", - "scheduledState": "ENABLED", - "executionEngine": "INHERITED", - "maxConcurrentTasks": 1, - "statelessFlowTimeout": "1 min", - "flowFileConcurrency": "UNBOUNDED", - "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE", - "componentType": "PROCESS_GROUP" - } - } +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 120 +commands: + - script: | + envsubst < 30_install-nifi.yaml | kubectl apply -n $NAMESPACE -f - diff --git a/tests/templates/kuttl/custom-components-git-sync/30_install-nifi.yaml.j2 b/tests/templates/kuttl/custom-components-git-sync/30_install-nifi.yaml.j2 new file mode 100644 index 00000000..0e81347f --- /dev/null +++ b/tests/templates/kuttl/custom-components-git-sync/30_install-nifi.yaml.j2 @@ -0,0 +1,863 @@ +--- +apiVersion: authentication.stackable.tech/v1alpha1 +kind: AuthenticationClass +metadata: + name: nifi-users +spec: + provider: + static: + userCredentialsSecret: + name: nifi-user-credentials +--- +apiVersion: v1 +kind: Secret +metadata: + name: nifi-user-credentials +stringData: + admin: admin +--- +apiVersion: secrets.stackable.tech/v1alpha1 +kind: SecretClass +metadata: + name: git-ca-cert +spec: + backend: + k8sSearch: + searchNamespace: + pod: {} +--- +apiVersion: nifi.stackable.tech/v1alpha1 +kind: NifiCluster +metadata: + name: test-nifi +spec: + image: +{% if test_scenario['values']['nifi'].find(",") > 0 %} + custom: "{{ test_scenario['values']['nifi'].split(',')[1] }}" + productVersion: "{{ test_scenario['values']['nifi'].split(',')[0] }}" +{% else %} + productVersion: "{{ test_scenario['values']['nifi'] }}" +{% endif %} + pullPolicy: IfNotPresent + clusterConfig: + zookeeperConfigMapName: test-nifi-znode + authentication: + - authenticationClass: nifi-users + sensitiveProperties: + keySecret: nifi-sensitive-property-key + autoGenerate: true + customComponentsGitSync: + # Test one repo/folder *without* a custom CA + - repo: https://github.com/stackabletech/nifi-operator + branch: ef61c87311ad2f57484c33245c9ed50908a1c785 + gitFolder: tests/templates/kuttl/custom-components-git-sync/java-processors + # And the other one *with* the CA cert + - repo: https://git-proxy.$NAMESPACE.svc.cluster.local/stackabletech/nifi-operator + branch: ef61c87311ad2f57484c33245c9ed50908a1c785 + gitFolder: tests/templates/kuttl/custom-components-git-sync/python-processors + tls: + verification: + server: + caCert: + secretClass: git-ca-cert +{% if lookup('env', 'VECTOR_AGGREGATOR') %} + vectorAggregatorConfigMapName: vector-aggregator-discovery +{% endif %} + nodes: + config: + logging: + enableVectorAgent: {{ lookup('env', 'VECTOR_AGGREGATOR') | length > 0 }} + roleConfig: + listenerClass: external-unstable + podOverrides: + spec: + initContainers: + - name: init-flow + image: oci.stackable.tech/sdp/testing-tools/nifi:0.3.0-stackable0.0.0-dev + command: + - /bin/bash + - -c + args: + - gzip --stdout /stackable/nifi/flow/flow.json > /stackable/data/database/flow.json.gz + volumeMounts: + - name: nifi-flow + mountPath: /stackable/nifi/flow + - name: database-repository + mountPath: /stackable/data/database + containers: + - name: nifi + ports: + - name: greeting + containerPort: 8090 + protocol: TCP + volumes: + - name: nifi-flow + configMap: +{% if test_scenario['values']['nifi'].startswith("1.") %} + name: nifi1-flow +{% else %} + name: nifi2-flow +{% endif %} + roleGroups: + default: + replicas: 2 +--- +apiVersion: v1 +kind: Service +metadata: + name: nifi-greeting +spec: + selector: + app.kubernetes.io/component: node + app.kubernetes.io/instance: test-nifi + app.kubernetes.io/name: nifi + app.kubernetes.io/role-group: default + ports: + - name: greeting + port: 80 + protocol: TCP + targetPort: greeting +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: nifi1-flow +data: + flow.json: | + { + "encodingVersion": { + "majorVersion": 2, + "minorVersion": 0 + }, + "maxTimerDrivenThreadCount": 10, + "maxEventDrivenThreadCount": 1, + "registries": [], + "parameterContexts": [], + "parameterProviders": [], + "controllerServices": [], + "reportingTasks": [ + { + "identifier": "fd3cf892-0196-1000-0000-000074a555a2", + "instanceIdentifier": "fd3cf892-0196-1000-0000-000074a555a2", + "name": "StackablePrometheusReportingTask", + "type": "org.apache.nifi.reporting.prometheus.PrometheusReportingTask", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-prometheus-nar", + "version": "1.28.1" + }, + "properties": { + "prometheus-reporting-task-metrics-endpoint-port": "8081", + "prometheus-reporting-task-metrics-strategy": "All Components", + "prometheus-reporting-task-instance-id": "${hostname(true)}", + "prometheus-reporting-task-client-auth": "No Authentication", + "prometheus-reporting-task-metrics-send-jvm": "true" + }, + "propertyDescriptors": {}, + "scheduledState": "RUNNING", + "schedulingPeriod": "60 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "componentType": "REPORTING_TASK" + } + ], + "templates": [], + "rootGroup": { + "identifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "instanceIdentifier": "fd37b89e-0196-1000-9750-8b45eabee468", + "name": "NiFi Flow", + "comments": "", + "position": { + "x": 0.0, + "y": 0.0 + }, + "processGroups": [], + "remoteProcessGroups": [], + "processors": [ + { + "identifier": "b34e789e-1a70-3275-b5c5-f5856b628166", + "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556", + "name": "Greet", + "comments": "", + "position": { + "x": 800.0, + "y": 304.0 + }, + "type": "org.apache.nifi.processors.standard.ReplaceText", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "1.28.1" + }, + "properties": { + "Regular Expression": "(?s)(^.*$)", + "Replacement Value": "Hello!", + "Evaluation Mode": "Entire text", + "Line-by-Line Evaluation Mode": "All", + "Character Set": "UTF-8", + "Maximum Buffer Size": "1 MB", + "Replacement Strategy": "Always Replace" + }, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 25, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "failure" + ], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + }, + { + "identifier": "d15c871b-e9c5-38bd-903b-6bf3a9c55765", + "instanceIdentifier": "fd45c24b-0196-1000-0000-00001a549d74", + "name": "HandleHttpResponse", + "comments": "", + "position": { + "x": 800.0, + "y": 752.0 + }, + "type": "org.apache.nifi.processors.standard.HandleHttpResponse", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "1.28.1" + }, + "properties": { + "HTTP Context Map": "fd3b17c4-0196-1000-0000-000076ed786c", + "HTTP Status Code": "200" + }, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "success", + "failure" + ], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + }, + { + "identifier": "35d73904-95e1-3dae-81a7-56d0f907ad5c", + "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1", + "name": "ShoutProcessor", + "comments": "", + "position": { + "x": 800.0, + "y": 528.0 + }, + "type": "tech.stackable.nifi.processors.sample.ShoutProcessor", + "bundle": { + "group": "tech.stackable.nifi", + "artifact": "nifi-sample-nar", + "version": "1.0.0" + }, + "properties": {}, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + }, + { + "identifier": "c5fad835-91fd-31dc-afbf-c37209e03598", + "instanceIdentifier": "fd3a912f-0196-1000-ffff-ffffacaca66e", + "name": "HandleHttpRequest", + "comments": "", + "position": { + "x": 800.0, + "y": 80.0 + }, + "type": "org.apache.nifi.processors.standard.HandleHttpRequest", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "1.28.1" + }, + "properties": { + "multipart-request-max-size": "1 MB", + "Allow POST": "false", + "Default URL Character Set": "UTF-8", + "Allow DELETE": "false", + "Maximum Threads": "200", + "HTTP Protocols": "HTTP_1_1", + "container-queue-size": "50", + "HTTP Context Map": "fd3b17c4-0196-1000-0000-000076ed786c", + "multipart-read-buffer-size": "512 KB", + "Allow OPTIONS": "false", + "Allowed Paths": "/greeting", + "Allow GET": "true", + "Allow HEAD": "false", + "Listening Port": "8090", + "Client Authentication": "No Authentication", + "Allow PUT": "false" + }, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + } + ], + "inputPorts": [], + "outputPorts": [], + "connections": [ + { + "identifier": "3cb76499-9b4a-3199-9697-e05fdb86b38e", + "instanceIdentifier": "fd4532b6-0196-1000-ffff-ffffcb96239f", + "name": "", + "source": { + "id": "c5fad835-91fd-31dc-afbf-c37209e03598", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "HandleHttpRequest", + "comments": "", + "instanceIdentifier": "fd3a912f-0196-1000-ffff-ffffacaca66e" + }, + "destination": { + "id": "b34e789e-1a70-3275-b5c5-f5856b628166", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "Greet", + "comments": "", + "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + }, + { + "identifier": "895aecef-a30b-3ad5-993a-6df611e64e0d", + "instanceIdentifier": "fd459382-0196-1000-0000-00000ad9142c", + "name": "", + "source": { + "id": "b34e789e-1a70-3275-b5c5-f5856b628166", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "Greet", + "comments": "", + "instanceIdentifier": "fd432952-0196-1000-0000-000048f10556" + }, + "destination": { + "id": "35d73904-95e1-3dae-81a7-56d0f907ad5c", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "ShoutProcessor", + "comments": "", + "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + }, + { + "identifier": "47c43ae4-44e5-3e94-9185-bfae5fd6776e", + "instanceIdentifier": "fd45f133-0196-1000-ffff-fffff094098e", + "name": "", + "source": { + "id": "35d73904-95e1-3dae-81a7-56d0f907ad5c", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "ShoutProcessor", + "comments": "", + "instanceIdentifier": "fd4557bd-0196-1000-ffff-ffffb0a46ce1" + }, + "destination": { + "id": "d15c871b-e9c5-38bd-903b-6bf3a9c55765", + "type": "PROCESSOR", + "groupId": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9", + "name": "HandleHttpResponse", + "comments": "", + "instanceIdentifier": "fd45c24b-0196-1000-0000-00001a549d74" + }, + "labelIndex": 1, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + } + ], + "labels": [], + "funnels": [], + "controllerServices": [ + { + "identifier": "0e58c44e-c294-3b7f-b323-bb94ca5074fb", + "instanceIdentifier": "fd3b17c4-0196-1000-0000-000076ed786c", + "name": "StandardHttpContextMap", + "comments": "", + "type": "org.apache.nifi.http.StandardHttpContextMap", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-http-context-map-nar", + "version": "1.28.1" + }, + "properties": { + "Request Expiration": "1 min", + "Maximum Outstanding Requests": "5000" + }, + "propertyDescriptors": {}, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.http.HttpContextMap", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "1.28.1" + } + } + ], + "scheduledState": "ENABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "b4fe1571-02fd-3351-a2c0-e92f420b3ce9" + } + ], + "variables": {}, + "defaultFlowFileExpiration": "0 sec", + "defaultBackPressureObjectThreshold": 10000, + "defaultBackPressureDataSizeThreshold": "1 GB", + "flowFileConcurrency": "UNBOUNDED", + "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE", + "componentType": "PROCESS_GROUP" + } + } +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: nifi2-flow +data: + flow.json: | + { + "encodingVersion": { + "majorVersion": 2, + "minorVersion": 0 + }, + "maxTimerDrivenThreadCount": 10, + "registries": [], + "parameterContexts": [], + "parameterProviders": [], + "controllerServices": [], + "reportingTasks": [], + "flowAnalysisRules": [], + "rootGroup": { + "identifier": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "instanceIdentifier": "f7cda0ce-0196-1000-30b6-0f5577f07b63", + "name": "NiFi Flow", + "comments": "", + "position": { + "x": 0.0, + "y": 0.0 + }, + "processGroups": [], + "remoteProcessGroups": [], + "processors": [ + { + "identifier": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", + "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3", + "name": "ShoutProcessor", + "comments": "", + "position": { + "x": -112.0, + "y": 96.0 + }, + "type": "tech.stackable.nifi.processors.sample.ShoutProcessor", + "bundle": { + "group": "tech.stackable.nifi", + "artifact": "nifi-sample-nar", + "version": "1.0.0" + }, + "properties": {}, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + }, + { + "identifier": "1975618d-36bc-32b4-9d14-06a14d4dcba0", + "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8", + "name": "Greet", + "comments": "", + "position": { + "x": -112.0, + "y": -128.0 + }, + "type": "Greet", + "bundle": { + "group": "org.apache.nifi", + "artifact": "python-extensions", + "version": "1.0.0" + }, + "properties": {}, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 25, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "original", + "failure" + ], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + }, + { + "identifier": "0b7338da-d770-365b-bff5-bba3f0236229", + "instanceIdentifier": "f80e3b3f-0196-1000-0000-00004590be6a", + "name": "HandleHttpResponse", + "comments": "", + "position": { + "x": -112.0, + "y": 320.0 + }, + "type": "org.apache.nifi.processors.standard.HandleHttpResponse", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "2.2.0" + }, + "properties": { + "HTTP Context Map": "f80ef95f-0196-1000-ffff-ffffabf564cb", + "HTTP Status Code": "200" + }, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [ + "success", + "failure" + ], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + }, + { + "identifier": "522d46b7-8c43-35b7-ab91-2e5150e44e5b", + "instanceIdentifier": "f809987c-0196-1000-ffff-fffff71b58df", + "name": "HandleHttpRequest", + "comments": "", + "position": { + "x": -112.0, + "y": -352.0 + }, + "type": "org.apache.nifi.processors.standard.HandleHttpRequest", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-nar", + "version": "2.2.0" + }, + "properties": { + "multipart-request-max-size": "1 MB", + "Allow POST": "false", + "Default URL Character Set": "UTF-8", + "Allow DELETE": "false", + "Request Header Maximum Size": "8 KB", + "Maximum Threads": "200", + "HTTP Protocols": "HTTP_1_1", + "container-queue-size": "50", + "HTTP Context Map": "f80ef95f-0196-1000-ffff-ffffabf564cb", + "multipart-read-buffer-size": "512 KB", + "Allow OPTIONS": "false", + "Allowed Paths": "/greeting", + "Allow GET": "true", + "Allow HEAD": "false", + "Listening Port": "8090", + "Client Authentication": "No Authentication", + "Allow PUT": "false" + }, + "propertyDescriptors": {}, + "style": {}, + "schedulingPeriod": "0 sec", + "schedulingStrategy": "TIMER_DRIVEN", + "executionNode": "ALL", + "penaltyDuration": "30 sec", + "yieldDuration": "1 sec", + "bulletinLevel": "WARN", + "runDurationMillis": 0, + "concurrentlySchedulableTaskCount": 1, + "autoTerminatedRelationships": [], + "scheduledState": "RUNNING", + "retryCount": 10, + "retriedRelationships": [], + "backoffMechanism": "PENALIZE_FLOWFILE", + "maxBackoffPeriod": "10 mins", + "componentType": "PROCESSOR", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + } + ], + "inputPorts": [], + "outputPorts": [], + "connections": [ + { + "identifier": "5f7beeba-4cdc-3099-aef6-96ced3560ecc", + "instanceIdentifier": "f80e0681-0196-1000-ffff-ffffc59964fa", + "name": "", + "source": { + "id": "1975618d-36bc-32b4-9d14-06a14d4dcba0", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "Greet", + "comments": "", + "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8" + }, + "destination": { + "id": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "ShoutProcessor", + "comments": "", + "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3" + }, + "labelIndex": 0, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + }, + { + "identifier": "5165254a-e18c-3ccb-b8cb-25c55d7151a7", + "instanceIdentifier": "f80e54a1-0196-1000-ffff-ffffa1c1bed7", + "name": "", + "source": { + "id": "238c6f6f-9e6b-3faf-bcdc-7058c9473c76", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "ShoutProcessor", + "comments": "", + "instanceIdentifier": "f80dee83-0196-1000-0000-000051a29aa3" + }, + "destination": { + "id": "0b7338da-d770-365b-bff5-bba3f0236229", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "HandleHttpResponse", + "comments": "", + "instanceIdentifier": "f80e3b3f-0196-1000-0000-00004590be6a" + }, + "labelIndex": 0, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + }, + { + "identifier": "ad7fc77b-6b4b-3750-8e22-fcbb228a6fb4", + "instanceIdentifier": "f80dbacc-0196-1000-0000-0000274b2561", + "name": "", + "source": { + "id": "522d46b7-8c43-35b7-ab91-2e5150e44e5b", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "HandleHttpRequest", + "comments": "", + "instanceIdentifier": "f809987c-0196-1000-ffff-fffff71b58df" + }, + "destination": { + "id": "1975618d-36bc-32b4-9d14-06a14d4dcba0", + "type": "PROCESSOR", + "groupId": "a0cca604-51c7-32b2-9529-72ec3566e93c", + "name": "Greet", + "comments": "", + "instanceIdentifier": "f80d8c53-0196-1000-ffff-ffffb40a54f8" + }, + "labelIndex": 0, + "zIndex": 0, + "selectedRelationships": [ + "success" + ], + "backPressureObjectThreshold": 10000, + "backPressureDataSizeThreshold": "1 GB", + "flowFileExpiration": "0 sec", + "prioritizers": [], + "bends": [], + "loadBalanceStrategy": "DO_NOT_LOAD_BALANCE", + "partitioningAttribute": "", + "loadBalanceCompression": "DO_NOT_COMPRESS", + "componentType": "CONNECTION", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + } + ], + "labels": [], + "funnels": [], + "controllerServices": [ + { + "identifier": "68712a48-5a26-3bee-8bfc-dafafda62660", + "instanceIdentifier": "f80ef95f-0196-1000-ffff-ffffabf564cb", + "name": "StandardHttpContextMap", + "comments": "", + "type": "org.apache.nifi.http.StandardHttpContextMap", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-http-context-map-nar", + "version": "2.2.0" + }, + "properties": { + "Request Expiration": "1 min", + "Maximum Outstanding Requests": "5000" + }, + "propertyDescriptors": {}, + "controllerServiceApis": [ + { + "type": "org.apache.nifi.http.HttpContextMap", + "bundle": { + "group": "org.apache.nifi", + "artifact": "nifi-standard-services-api-nar", + "version": "2.2.0" + } + } + ], + "scheduledState": "ENABLED", + "bulletinLevel": "WARN", + "componentType": "CONTROLLER_SERVICE", + "groupIdentifier": "a0cca604-51c7-32b2-9529-72ec3566e93c" + } + ], + "defaultFlowFileExpiration": "0 sec", + "defaultBackPressureObjectThreshold": 10000, + "defaultBackPressureDataSizeThreshold": "1 GB", + "scheduledState": "ENABLED", + "executionEngine": "INHERITED", + "maxConcurrentTasks": 1, + "statelessFlowTimeout": "1 min", + "flowFileConcurrency": "UNBOUNDED", + "flowFileOutboundPolicy": "STREAM_WHEN_AVAILABLE", + "componentType": "PROCESS_GROUP" + } + }