kcr_fluentd_fluent_io 3.20260124.214859

Kubernetes Custom Resource Bindings
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
// WARNING: generated by kopium - manual changes will be overwritten
// kopium command: kopium --docs --derive=Default --derive=PartialEq --smart-derive-elision --filename crd-catalog/fluent/fluent-operator/fluentd.fluent.io/v1alpha1/clusterinputs.yaml
// kopium version: 0.22.5

#[allow(unused_imports)]
mod prelude {
    pub use kube::CustomResource;
    pub use serde::{Serialize, Deserialize};
    pub use std::collections::BTreeMap;
}
use self::prelude::*;

/// ClusterInputSpec defines the desired state of ClusterInput
#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
#[kube(group = "fluentd.fluent.io", version = "v1alpha1", kind = "ClusterInput", plural = "clusterinputs")]
#[kube(schema = "disabled")]
#[kube(derive="Default")]
#[kube(derive="PartialEq")]
pub struct ClusterInputSpec {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub inputs: Option<Vec<ClusterInputInputs>>,
}

/// Input defines all available input plugins and their parameters
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputs {
    /// Custom plugin type
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "customPlugin")]
    pub custom_plugin: Option<ClusterInputInputsCustomPlugin>,
    /// in_forward plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub forward: Option<ClusterInputInputsForward>,
    /// in_http plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub http: Option<ClusterInputInputsHttp>,
    /// The @id parameter specifies a unique name for the configuration.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    /// The @label parameter is to route the input events to <label> sections.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub label: Option<String>,
    /// The @log_level parameter specifies the plugin-specific logging level
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "logLevel")]
    pub log_level: Option<String>,
    /// monitor_agent plugin
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "monitorAgent")]
    pub monitor_agent: Option<ClusterInputInputsMonitorAgent>,
    /// in_sample plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sample: Option<ClusterInputInputsSample>,
    /// in_tail plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tail: Option<ClusterInputInputsTail>,
}

/// Custom plugin type
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsCustomPlugin {
    pub config: String,
}

/// in_forward plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForward {
    /// Adds the prefix to the incoming event's tag.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "addTagPrefix")]
    pub add_tag_prefix: Option<String>,
    /// The port to listen to, default is "0.0.0.0"
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bind: Option<String>,
    /// The size limit of the received chunk. If the chunk size is larger than this value, the received chunk is dropped.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "chunkSizeLimit")]
    pub chunk_size_limit: Option<String>,
    /// The warning size limit of the received chunk. If the chunk size is larger than this value, a warning message will be sent.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "chunkSizeWarnLimit")]
    pub chunk_size_warn_limit: Option<String>,
    /// The security section of client plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub client: Option<ClusterInputInputsForwardClient>,
    /// The connections will be disconnected right after receiving a message, if true.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "denyKeepalive")]
    pub deny_keepalive: Option<bool>,
    /// The timeout used to set the linger option.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "lingerTimeout")]
    pub linger_timeout: Option<i64>,
    /// The port to listen to, default is 24224.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub port: Option<i32>,
    /// Tries to resolve hostname from IP addresses or not.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "resolveHostname")]
    pub resolve_hostname: Option<bool>,
    /// The security section of forward plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub security: Option<ClusterInputInputsForwardSecurity>,
    /// Enables the TCP keepalive for sockets.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "sendKeepalivePacket")]
    pub send_keepalive_packet: Option<bool>,
    /// Skips the invalid incoming event.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "skipInvalidEvent")]
    pub skip_invalid_event: Option<bool>,
    /// The field name of the client's source address. If set, the client's address will be set to its key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "sourceAddressKey")]
    pub source_address_key: Option<String>,
    /// The field name of the client's hostname. If set, the client's hostname will be set to its key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "sourceHostnameKey")]
    pub source_hostname_key: Option<String>,
    /// in_forward uses incoming event's tag by default (See Protocol Section).
    /// If the tag parameter is set, its value is used instead.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tag: Option<String>,
    /// The transport section of forward plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub transport: Option<ClusterInputInputsForwardTransport>,
    /// The security section of user plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub user: Option<ClusterInputInputsForwardUser>,
}

/// The security section of client plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardClient {
    /// The IP address or hostname of the client. This is exclusive with Network.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub host: Option<String>,
    /// The network address specification. This is exclusive with Host.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub network: Option<String>,
    /// The shared key per client.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "sharedKey")]
    pub shared_key: Option<String>,
    /// The array of usernames.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub users: Option<String>,
}

/// The security section of forward plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurity {
    /// Allows the anonymous source. <client> sections are required, if disabled.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "allowAnonymousSource")]
    pub allow_anonymous_source: Option<String>,
    /// The hostname.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "selfHostname")]
    pub self_hostname: Option<String>,
    /// The shared key for authentication.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "sharedKey")]
    pub shared_key: Option<String>,
    /// Defines user section directly.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub user: Option<ClusterInputInputsForwardSecurityUser>,
    /// If true, user-based authentication is used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "userAuth")]
    pub user_auth: Option<String>,
}

/// Defines user section directly.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUser {
    /// Secret defines the key of a value.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub password: Option<ClusterInputInputsForwardSecurityUserPassword>,
    /// Secret defines the key of a value.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub username: Option<ClusterInputInputsForwardSecurityUserUsername>,
}

/// Secret defines the key of a value.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserPassword {
    /// ValueSource defines how to find a value's key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "valueFrom")]
    pub value_from: Option<ClusterInputInputsForwardSecurityUserPasswordValueFrom>,
}

/// ValueSource defines how to find a value's key.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserPasswordValueFrom {
    /// Selects a key of a secret in the pod's namespace
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretKeyRef")]
    pub secret_key_ref: Option<ClusterInputInputsForwardSecurityUserPasswordValueFromSecretKeyRef>,
}

/// Selects a key of a secret in the pod's namespace
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserPasswordValueFromSecretKeyRef {
    /// The key of the secret to select from.  Must be a valid secret key.
    pub key: String,
    /// Name of the referent.
    /// This field is effectively required, but due to backwards compatibility is
    /// allowed to be empty. Instances of this type with an empty value here are
    /// almost certainly wrong.
    /// More info: <https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names>
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// Specify whether the Secret or its key must be defined
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub optional: Option<bool>,
}

/// Secret defines the key of a value.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserUsername {
    /// ValueSource defines how to find a value's key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "valueFrom")]
    pub value_from: Option<ClusterInputInputsForwardSecurityUserUsernameValueFrom>,
}

/// ValueSource defines how to find a value's key.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserUsernameValueFrom {
    /// Selects a key of a secret in the pod's namespace
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretKeyRef")]
    pub secret_key_ref: Option<ClusterInputInputsForwardSecurityUserUsernameValueFromSecretKeyRef>,
}

/// Selects a key of a secret in the pod's namespace
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardSecurityUserUsernameValueFromSecretKeyRef {
    /// The key of the secret to select from.  Must be a valid secret key.
    pub key: String,
    /// Name of the referent.
    /// This field is effectively required, but due to backwards compatibility is
    /// allowed to be empty. Instances of this type with an empty value here are
    /// almost certainly wrong.
    /// More info: <https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names>
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// Specify whether the Secret or its key must be defined
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub optional: Option<bool>,
}

/// The transport section of forward plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardTransport {
    /// for Cert generated
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caCertPath")]
    pub ca_cert_path: Option<String>,
    /// for Cert signed by public CA
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPath")]
    pub ca_path: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPrivateKeyPassphrase")]
    pub ca_private_key_passphrase: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPrivateKeyPath")]
    pub ca_private_key_path: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "certPath")]
    pub cert_path: Option<String>,
    /// other parameters
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "certVerifier")]
    pub cert_verifier: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub ciphers: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "clientCertAuth")]
    pub client_cert_auth: Option<bool>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub insecure: Option<bool>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "privateKeyPassphrase")]
    pub private_key_passphrase: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "privateKeyPath")]
    pub private_key_path: Option<String>,
    /// The protocol name of this plugin, i.e: tls
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub protocol: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub version: Option<String>,
}

/// The security section of user plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUser {
    /// Secret defines the key of a value.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub password: Option<ClusterInputInputsForwardUserPassword>,
    /// Secret defines the key of a value.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub username: Option<ClusterInputInputsForwardUserUsername>,
}

/// Secret defines the key of a value.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserPassword {
    /// ValueSource defines how to find a value's key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "valueFrom")]
    pub value_from: Option<ClusterInputInputsForwardUserPasswordValueFrom>,
}

/// ValueSource defines how to find a value's key.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserPasswordValueFrom {
    /// Selects a key of a secret in the pod's namespace
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretKeyRef")]
    pub secret_key_ref: Option<ClusterInputInputsForwardUserPasswordValueFromSecretKeyRef>,
}

/// Selects a key of a secret in the pod's namespace
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserPasswordValueFromSecretKeyRef {
    /// The key of the secret to select from.  Must be a valid secret key.
    pub key: String,
    /// Name of the referent.
    /// This field is effectively required, but due to backwards compatibility is
    /// allowed to be empty. Instances of this type with an empty value here are
    /// almost certainly wrong.
    /// More info: <https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names>
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// Specify whether the Secret or its key must be defined
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub optional: Option<bool>,
}

/// Secret defines the key of a value.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserUsername {
    /// ValueSource defines how to find a value's key.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "valueFrom")]
    pub value_from: Option<ClusterInputInputsForwardUserUsernameValueFrom>,
}

/// ValueSource defines how to find a value's key.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserUsernameValueFrom {
    /// Selects a key of a secret in the pod's namespace
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "secretKeyRef")]
    pub secret_key_ref: Option<ClusterInputInputsForwardUserUsernameValueFromSecretKeyRef>,
}

/// Selects a key of a secret in the pod's namespace
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsForwardUserUsernameValueFromSecretKeyRef {
    /// The key of the secret to select from.  Must be a valid secret key.
    pub key: String,
    /// Name of the referent.
    /// This field is effectively required, but due to backwards compatibility is
    /// allowed to be empty. Instances of this type with an empty value here are
    /// almost certainly wrong.
    /// More info: <https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names>
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// Specify whether the Secret or its key must be defined
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub optional: Option<bool>,
}

/// in_http plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsHttp {
    /// Adds HTTP_ prefix headers to the record.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "addHttpHeaders")]
    pub add_http_headers: Option<bool>,
    /// Adds REMOTE_ADDR field to the record. The value of REMOTE_ADDR is the client's address.
    /// i.e: X-Forwarded-For: host1, host2
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "addRemoteAddr")]
    pub add_remote_addr: Option<String>,
    /// The port to listen to, default is "0.0.0.0"
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bind: Option<String>,
    /// The size limit of the POSTed element.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "bodySizeLimit")]
    pub body_size_limit: Option<String>,
    /// Whitelist domains for CORS.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "corsAllOrigins")]
    pub cors_all_origins: Option<String>,
    /// Add Access-Control-Allow-Credentials header. It's needed when a request's credentials mode is include
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "corsAllowCredentials")]
    pub cors_allow_credentials: Option<String>,
    /// The timeout limit for keeping the connection alive.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "keepaliveTimeout")]
    pub keepalive_timeout: Option<String>,
    /// The parse section of http plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub parse: Option<ClusterInputInputsHttpParse>,
    /// The port to listen to, default is 9880.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub port: Option<i32>,
    /// Responds with an empty GIF image of 1x1 pixel (rather than an empty string).
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "respondsWithEmptyImg")]
    pub responds_with_empty_img: Option<bool>,
    /// The transport section of http plugin
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub transport: Option<ClusterInputInputsHttpTransport>,
}

/// The parse section of http plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct ClusterInputInputsHttpParse {
    /// Path to the file that includes custom grok patterns.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "customPatternPath")]
    pub custom_pattern_path: Option<String>,
    /// If true, use Fluent::Eventnow(current time) as a timestamp when time_key is specified.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "estimateCurrentEvent")]
    pub estimate_current_event: Option<bool>,
    /// Specifies the regular expression for matching logs. Regular expression also supports i and m suffix.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub expression: Option<String>,
    /// Grok Sections
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub grok: Option<Vec<ClusterInputInputsHttpParseGrok>>,
    /// The key has grok failure reason.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokFailureKey")]
    pub grok_failure_key: Option<String>,
    /// The pattern of grok.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokPattern")]
    pub grok_pattern: Option<String>,
    /// Specify grok pattern series set.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokPatternSeries")]
    pub grok_pattern_series: Option<String>,
    /// The @id parameter specifies a unique name for the configuration.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    /// If true, keep time field in th record.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "keepTimeKey")]
    pub keep_time_key: Option<bool>,
    /// If true, uses local time.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub localtime: Option<bool>,
    /// The @log_level parameter specifies the plugin-specific logging level
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "logLevel")]
    pub log_level: Option<String>,
    /// The regexp to match beginning of multiline. This is only for "multiline_grok".
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "multiLineStartRegexp")]
    pub multi_line_start_regexp: Option<String>,
    /// Process value according to the specified format. This is available only when time_type is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormat")]
    pub time_format: Option<String>,
    /// Uses the specified time format as a fallback in the specified order. You can parse undetermined time format by using time_format_fallbacks. This options is enabled when time_type is mixed.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormatFallbacks")]
    pub time_format_fallbacks: Option<String>,
    /// Specify time field for event time. If the event doesn't have this field, current time is used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeKey")]
    pub time_key: Option<String>,
    /// parses/formats value according to this type, default is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeType")]
    pub time_type: Option<ClusterInputInputsHttpParseTimeType>,
    /// Specify timeout for parse processing.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub timeout: Option<String>,
    /// Uses the specified timezone.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub timezone: Option<String>,
    /// The @type parameter specifies the type of the plugin.
    #[serde(rename = "type")]
    pub r#type: ClusterInputInputsHttpParseType,
    /// Specify types for converting field into another, i.e: types user_id:integer,paid:bool,paid_usd_amount:float
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub types: Option<String>,
    /// If true, uses UTC.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub utc: Option<bool>,
}

#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsHttpParseGrok {
    /// If true, keep time field in the record.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "keepTimeKey")]
    pub keep_time_key: Option<bool>,
    /// The name of this grok section.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// The pattern of grok. Required parameter.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub pattern: Option<String>,
    /// Process value using specified format. This is available only when time_type is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormat")]
    pub time_format: Option<String>,
    /// Specify time field for event time. If the event doesn't have this field, current time is used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeKey")]
    pub time_key: Option<String>,
    /// Use specified timezone. one can parse/format the time value in the specified timezone.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeZone")]
    pub time_zone: Option<String>,
}

/// The parse section of http plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum ClusterInputInputsHttpParseTimeType {
    #[serde(rename = "float")]
    Float,
    #[serde(rename = "unixtime")]
    Unixtime,
    #[serde(rename = "string")]
    String,
    #[serde(rename = "mixed")]
    Mixed,
}

/// The parse section of http plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum ClusterInputInputsHttpParseType {
    #[serde(rename = "regexp")]
    Regexp,
    #[serde(rename = "apache2")]
    Apache2,
    #[serde(rename = "apache_error")]
    ApacheError,
    #[serde(rename = "nginx")]
    Nginx,
    #[serde(rename = "syslog")]
    Syslog,
    #[serde(rename = "csv")]
    Csv,
    #[serde(rename = "tsv")]
    Tsv,
    #[serde(rename = "ltsv")]
    Ltsv,
    #[serde(rename = "json")]
    Json,
    #[serde(rename = "multiline")]
    Multiline,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "grok")]
    Grok,
    #[serde(rename = "multiline_grok")]
    MultilineGrok,
}

/// The transport section of http plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsHttpTransport {
    /// for Cert generated
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caCertPath")]
    pub ca_cert_path: Option<String>,
    /// for Cert signed by public CA
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPath")]
    pub ca_path: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPrivateKeyPassphrase")]
    pub ca_private_key_passphrase: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "caPrivateKeyPath")]
    pub ca_private_key_path: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "certPath")]
    pub cert_path: Option<String>,
    /// other parameters
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "certVerifier")]
    pub cert_verifier: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub ciphers: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "clientCertAuth")]
    pub client_cert_auth: Option<bool>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub insecure: Option<bool>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "privateKeyPassphrase")]
    pub private_key_passphrase: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "privateKeyPath")]
    pub private_key_path: Option<String>,
    /// The protocol name of this plugin, i.e: tls
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub protocol: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub version: Option<String>,
}

/// monitor_agent plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsMonitorAgent {
    /// The bind address to listen to.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub bind: Option<String>,
    /// The interval time between event emits. This will be used when "tag" is configured.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "emitInterval")]
    pub emit_interval: Option<i64>,
    /// You can set this option to false to remove the config field from the response.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "includeConfig")]
    pub include_config: Option<bool>,
    /// You can set this option to false to remove the retry field from the response.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "includeRetry")]
    pub include_retry: Option<bool>,
    /// The port to listen to.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub port: Option<i64>,
    /// If you set this parameter, this plugin emits metrics as records.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tag: Option<String>,
}

/// in_sample plugin
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsSample {
    /// If specified, each generated event has an auto-incremented key field.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "autoIncrementKey")]
    pub auto_increment_key: Option<String>,
    /// It configures how many events to generate per second.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub rate: Option<i64>,
    /// The sample data to be generated. It should be either an array of JSON hashes or a single JSON hash. If it is an array of JSON hashes, the hashes in the array are cycled through in order.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sample: Option<String>,
    /// The number of events in the event stream of each emit.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub size: Option<i64>,
    /// The tag of the event. The value is the tag assigned to the generated events.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tag: Option<String>,
}

/// in_tail plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct ClusterInputInputsTail {
    /// Emits unmatched lines when <parse> format is not matched for incoming logs.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "emitUnmatchedLines")]
    pub emit_unmatched_lines: Option<bool>,
    /// Enables the additional inotify-based watcher. Setting this parameter to false will disable the inotify events and use only timer watcher for file tailing.
    /// This option is mainly for avoiding the stuck issue with inotify.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "enableStatWatcher")]
    pub enable_stat_watcher: Option<bool>,
    /// Enables the additional watch timer. Setting this parameter to false will significantly reduce CPU and I/O consumption when tailing a large number of files on systems with inotify support.
    /// The default is true which results in an additional 1 second timer being used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "enableWatchTimer")]
    pub enable_watch_timer: Option<bool>,
    /// Specifies the encoding of reading lines. By default, in_tail emits string value as ASCII-8BIT encoding.
    /// If encoding is specified, in_tail changes string to encoding.
    /// If encoding and fromEncoding both are specified, in_tail tries to encode string from fromEncoding to encoding.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub encoding: Option<String>,
    /// The paths excluded from the watcher list.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "excludePath")]
    pub exclude_path: Option<Vec<String>>,
    /// Avoid to read rotated files duplicately. You should set true when you use * or strftime format in path.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "followInodes")]
    pub follow_inodes: Option<bool>,
    /// Specifies the encoding of reading lines. By default, in_tail emits string value as ASCII-8BIT encoding.
    /// If encoding is specified, in_tail changes string to encoding.
    /// If encoding and fromEncoding both are specified, in_tail tries to encode string from fromEncoding to encoding.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "fromEncoding")]
    pub from_encoding: Option<String>,
    /// The in_tail plugin can assign each log file to a group, based on user defined rules.
    /// The limit parameter controls the total number of lines collected for a group within a rate_period time interval.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub group: Option<ClusterInputInputsTailGroup>,
    /// If you have to exclude the non-permission files from the watch list, set this parameter to true. It suppresses the repeated permission error logs.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "ignoreRepeatedPermissionError")]
    pub ignore_repeated_permission_error: Option<bool>,
    /// Limits the watching files that the modification time is within the specified time range when using * in path.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "limitRecentlyModified")]
    pub limit_recently_modified: Option<i32>,
    /// The maximum length of a line. Longer lines than it will be just skipped.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "maxLineSize")]
    pub max_line_size: Option<i32>,
    /// The interval of flushing the buffer for multiline format.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "multilineFlushInterval")]
    pub multiline_flush_interval: Option<i32>,
    /// Opens and closes the file on every update instead of leaving it open until it gets rotated.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "openOnEveryUpdate")]
    pub open_on_every_update: Option<bool>,
    /// Parse defines various parameters for the parse plugin
    pub parse: ClusterInputInputsTailParse,
    /// The path(s) to read. Multiple paths can be specified, separated by comma ','.
    pub path: String,
    /// Adds the watching file path to the path_key field.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "pathKey")]
    pub path_key: Option<String>,
    /// This parameter is for strftime formatted path like /path/to/%Y/%m/%d/.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "pathTimezone")]
    pub path_timezone: Option<String>,
    /// (recommended) Fluentd will record the position it last read from this file.
    /// pos_file handles multiple positions in one file so no need to have multiple pos_file parameters per source.
    /// Don't share pos_file between in_tail configurations. It causes unexpected behavior e.g. corrupt pos_file content.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "posFile")]
    pub pos_file: Option<String>,
    /// The interval of doing compaction of pos file.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "posFileCompactionInterval")]
    pub pos_file_compaction_interval: Option<i32>,
    /// The number of reading bytes per second to read with I/O operation. This value should be equal or greater than 8192.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "readBytesLimitPerSecond")]
    pub read_bytes_limit_per_second: Option<i32>,
    /// Starts to read the logs from the head of the file or the last read position recorded in pos_file, not tail.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "readFromHead")]
    pub read_from_head: Option<bool>,
    /// The number of lines to read with each I/O operation.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "readLinesLimit")]
    pub read_lines_limit: Option<i32>,
    /// The interval to refresh the list of watch files. This is used when the path includes *.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "refreshInterval")]
    pub refresh_interval: Option<i32>,
    /// in_tail actually does a bit more than tail -F itself. When rotating a file, some data may still need to be written to the old file as opposed to the new one.
    /// in_tail takes care of this by keeping a reference to the old file (even after it has been rotated) for some time before transitioning completely to the new file.
    /// This helps prevent data designated for the old file from getting lost. By default, this time interval is 5 seconds.
    /// The rotate_wait parameter accepts a single integer representing the number of seconds you want this time interval to be.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "rotateWait")]
    pub rotate_wait: Option<i32>,
    /// Skips the refresh of the watch list on startup. This reduces the startup time when * is used in path.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "skipRefreshOnStartup")]
    pub skip_refresh_on_startup: Option<bool>,
    /// The tag of the event.
    pub tag: String,
}

/// The in_tail plugin can assign each log file to a group, based on user defined rules.
/// The limit parameter controls the total number of lines collected for a group within a rate_period time interval.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsTailGroup {
    /// Specifies the regular expression for extracting metadata (namespace, podname) from log file path.
    /// Default value of the pattern regexp extracts information about namespace, podname, docker_id, container of the log (K8s specific).
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub pattern: Option<String>,
    /// Time period in which the group line limit is applied. in_tail resets the counter after every rate_period interval.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "ratePeriod")]
    pub rate_period: Option<i32>,
    /// Grouping rules for log files.
    pub rule: ClusterInputInputsTailGroupRule,
}

/// Grouping rules for log files.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsTailGroupRule {
    /// Maximum number of lines allowed from a group in rate_period time interval. The default value of -1 doesn't throttle log files of that group.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub limit: Option<i32>,
    /// match parameter is used to check if a file belongs to a particular group based on hash keys (named captures from pattern) and hash values (regexp in string)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "match")]
    pub r#match: Option<BTreeMap<String, String>>,
}

/// Parse defines various parameters for the parse plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct ClusterInputInputsTailParse {
    /// Path to the file that includes custom grok patterns.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "customPatternPath")]
    pub custom_pattern_path: Option<String>,
    /// If true, use Fluent::Eventnow(current time) as a timestamp when time_key is specified.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "estimateCurrentEvent")]
    pub estimate_current_event: Option<bool>,
    /// Specifies the regular expression for matching logs. Regular expression also supports i and m suffix.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub expression: Option<String>,
    /// Grok Sections
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub grok: Option<Vec<ClusterInputInputsTailParseGrok>>,
    /// The key has grok failure reason.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokFailureKey")]
    pub grok_failure_key: Option<String>,
    /// The pattern of grok.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokPattern")]
    pub grok_pattern: Option<String>,
    /// Specify grok pattern series set.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "grokPatternSeries")]
    pub grok_pattern_series: Option<String>,
    /// The @id parameter specifies a unique name for the configuration.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    /// If true, keep time field in th record.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "keepTimeKey")]
    pub keep_time_key: Option<bool>,
    /// If true, uses local time.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub localtime: Option<bool>,
    /// The @log_level parameter specifies the plugin-specific logging level
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "logLevel")]
    pub log_level: Option<String>,
    /// The regexp to match beginning of multiline. This is only for "multiline_grok".
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "multiLineStartRegexp")]
    pub multi_line_start_regexp: Option<String>,
    /// Process value according to the specified format. This is available only when time_type is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormat")]
    pub time_format: Option<String>,
    /// Uses the specified time format as a fallback in the specified order. You can parse undetermined time format by using time_format_fallbacks. This options is enabled when time_type is mixed.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormatFallbacks")]
    pub time_format_fallbacks: Option<String>,
    /// Specify time field for event time. If the event doesn't have this field, current time is used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeKey")]
    pub time_key: Option<String>,
    /// parses/formats value according to this type, default is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeType")]
    pub time_type: Option<ClusterInputInputsTailParseTimeType>,
    /// Specify timeout for parse processing.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub timeout: Option<String>,
    /// Uses the specified timezone.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub timezone: Option<String>,
    /// The @type parameter specifies the type of the plugin.
    #[serde(rename = "type")]
    pub r#type: ClusterInputInputsTailParseType,
    /// Specify types for converting field into another, i.e: types user_id:integer,paid:bool,paid_usd_amount:float
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub types: Option<String>,
    /// If true, uses UTC.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub utc: Option<bool>,
}

#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputInputsTailParseGrok {
    /// If true, keep time field in the record.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "keepTimeKey")]
    pub keep_time_key: Option<bool>,
    /// The name of this grok section.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// The pattern of grok. Required parameter.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub pattern: Option<String>,
    /// Process value using specified format. This is available only when time_type is string
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeFormat")]
    pub time_format: Option<String>,
    /// Specify time field for event time. If the event doesn't have this field, current time is used.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeKey")]
    pub time_key: Option<String>,
    /// Use specified timezone. one can parse/format the time value in the specified timezone.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "timeZone")]
    pub time_zone: Option<String>,
}

/// Parse defines various parameters for the parse plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum ClusterInputInputsTailParseTimeType {
    #[serde(rename = "float")]
    Float,
    #[serde(rename = "unixtime")]
    Unixtime,
    #[serde(rename = "string")]
    String,
    #[serde(rename = "mixed")]
    Mixed,
}

/// Parse defines various parameters for the parse plugin
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum ClusterInputInputsTailParseType {
    #[serde(rename = "regexp")]
    Regexp,
    #[serde(rename = "apache2")]
    Apache2,
    #[serde(rename = "apache_error")]
    ApacheError,
    #[serde(rename = "nginx")]
    Nginx,
    #[serde(rename = "syslog")]
    Syslog,
    #[serde(rename = "csv")]
    Csv,
    #[serde(rename = "tsv")]
    Tsv,
    #[serde(rename = "ltsv")]
    Ltsv,
    #[serde(rename = "json")]
    Json,
    #[serde(rename = "multiline")]
    Multiline,
    #[serde(rename = "none")]
    None,
    #[serde(rename = "grok")]
    Grok,
    #[serde(rename = "multiline_grok")]
    MultilineGrok,
}

/// ClusterInputStatus defines the observed state of ClusterInput
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct ClusterInputStatus {
}