kcr_camel_apache_org 3.20260616.194955

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
// WARNING: generated by kopium - manual changes will be overwritten
// kopium command: kopium --docs --derive=Default --derive=PartialEq --smart-derive-elision --filename crd-catalog/apache/camel-k/camel.apache.org/v1/integrationkits.yaml
// kopium version: 0.23.0

#[allow(unused_imports)]
mod prelude {
    pub use kube::CustomResource;
    pub use serde::{Serialize, Deserialize};
    pub use std::collections::BTreeMap;
    pub use k8s_openapi::apimachinery::pkg::apis::meta::v1::Condition;
}

use self::prelude::*;

/// the desired configuration
#[derive(CustomResource, Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
#[kube(group = "camel.apache.org", version = "v1", kind = "IntegrationKit", plural = "integrationkits")]
#[kube(namespaced)]
#[kube(status = "IntegrationKitStatus")]
#[kube(schema = "disabled")]
#[kube(derive="Default")]
#[kube(derive="PartialEq")]
pub struct IntegrationKitSpec {
    /// features offered by the IntegrationKit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub capabilities: Option<Vec<String>>,
    /// Deprecated:
    /// 
    /// Use camel trait (camel.properties) to manage properties
    /// Use mount trait (mount.configs) to manage configs
    /// Use mount trait (mount.resources) to manage resources
    /// Use mount trait (mount.volumes) to manage volumes
    /// configuration used by the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub configuration: Option<Vec<IntegrationKitConfiguration>>,
    /// a list of Camel dependencies used by this kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub dependencies: Option<Vec<String>>,
    /// the container image as identified in the container registry
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub image: Option<String>,
    /// the profile which is expected by this kit
    /// 
    /// Deprecated: may be removed in future releases.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub profile: Option<String>,
    /// Maven repositories that can be used by the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub repositories: Option<Vec<String>>,
    /// the sources to add at build time
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sources: Option<Vec<IntegrationKitSources>>,
    /// traits that the kit will execute
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub traits: Option<IntegrationKitTraits>,
}

/// ConfigurationSpec represents a generic configuration specification.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitConfiguration {
    /// represents the type of configuration, ie: property, configmap, secret, ...
    #[serde(rename = "type")]
    pub r#type: String,
    /// the value to assign to the configuration (syntax may vary depending on the `Type`)
    pub value: String,
}

/// SourceSpec defines the configuration for one or more routes to be executed in a certain Camel DSL language.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitSources {
    /// if the content is compressed (base64 encrypted)
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub compression: Option<bool>,
    /// the source code (plain text)
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub content: Option<String>,
    /// the confimap key holding the source content
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "contentKey")]
    pub content_key: Option<String>,
    /// the confimap reference holding the source content
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "contentRef")]
    pub content_ref: Option<String>,
    /// the content type (tipically text or binary)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "contentType")]
    pub content_type: Option<String>,
    /// True if the spec is generated from a Kamelet
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "from-kamelet")]
    pub from_kamelet: Option<bool>,
    /// Interceptors are optional identifiers the org.apache.camel.k.RoutesLoader
    /// uses to pre/post process sources.
    /// 
    /// Deprecated: no longer in use.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub interceptors: Option<Vec<String>>,
    /// specify which is the language (Camel DSL) used to interpret this source code
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub language: Option<String>,
    /// Loader is an optional id of the org.apache.camel.k.RoutesLoader that will
    /// interpret this source at runtime
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub loader: Option<String>,
    /// the name of the specification
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// the path where the file is stored
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub path: Option<String>,
    /// List of property names defined in the source (e.g. if type is "template")
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "property-names")]
    pub property_names: Option<Vec<String>>,
    /// the source code (binary)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "rawContent")]
    pub raw_content: Option<String>,
    /// Type defines the kind of source described by this object
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
    pub r#type: Option<String>,
}

/// traits that the kit will execute
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitTraits {
    /// Deprecated: no longer in use.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub addons: Option<BTreeMap<String, BTreeMap<String, serde_json::Value>>>,
    /// The builder trait is internally used to determine the best strategy to build and configure IntegrationKits.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub builder: Option<IntegrationKitTraitsBuilder>,
    /// The Camel trait sets up Camel configuration.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub camel: Option<IntegrationKitTraitsCamel>,
    /// The Quarkus trait configures the Quarkus runtime.
    /// It's enabled by default.
    /// NOTE: Compiling to a native executable, requires at least 4GiB of memory, so the Pod running the native build must have enough memory available.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub quarkus: Option<IntegrationKitTraitsQuarkus>,
    /// The Registry trait sets up Maven to use the Image registry as a Maven repository (support removed since version 2.5.0).
    /// 
    /// Deprecated: use jvm trait or read documentation.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub registry: Option<IntegrationKitTraitsRegistry>,
}

/// The builder trait is internally used to determine the best strategy to build and configure IntegrationKits.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitTraitsBuilder {
    /// When using `pod` strategy, annotation to use for the builder pod.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub annotations: Option<BTreeMap<String, String>>,
    /// Specify a base image. In order to have the application working properly it must be a container image which has a Java JDK
    /// installed and ready to use on path (ie `/usr/bin/java`).
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "baseImage")]
    pub base_image: Option<String>,
    /// Legacy trait configuration parameters.
    /// 
    /// Deprecated: for backward compatibility.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub configuration: Option<BTreeMap<String, serde_json::Value>>,
    /// Deprecated: no longer in use.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub enabled: Option<bool>,
    /// Use the incremental image build option, to reuse existing containers (default `true`)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "incrementalImageBuild")]
    pub incremental_image_build: Option<bool>,
    /// When using `pod` strategy, the maximum amount of CPU required by the pod builder.
    /// 
    /// Deprecated: use TasksRequestCPU instead with task name `builder`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "limitCPU")]
    pub limit_cpu: Option<String>,
    /// When using `pod` strategy, the maximum amount of memory required by the pod builder.
    /// 
    /// Deprecated: use TasksRequestCPU instead with task name `builder`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "limitMemory")]
    pub limit_memory: Option<String>,
    /// A list of references pointing to configmaps/secrets that contains a maven profile.
    /// This configmap/secret is a resource of the IntegrationKit created, therefore it needs to be present in the namespace where the operator is going to create the IntegrationKit.
    /// The content of the maven profile is expected to be a text containing a valid maven profile starting with `<profile>` and ending with `</profile>` that will be integrated as an inline profile in the POM.
    /// Syntax: [configmap|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).
    /// 
    /// Deprecated: will be removed in future versions.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "mavenProfiles")]
    pub maven_profiles: Option<Vec<String>>,
    /// Defines a set of nodes the builder pod is eligible to be scheduled on, based on labels on the node.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "nodeSelector")]
    pub node_selector: Option<BTreeMap<String, String>>,
    /// The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default is the platform default)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "orderStrategy")]
    pub order_strategy: Option<IntegrationKitTraitsBuilderOrderStrategy>,
    /// The list of manifest platforms to use to build a container image (default `linux/amd64`).
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub platforms: Option<Vec<String>>,
    /// A list of properties to be provided to the build task
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub properties: Option<Vec<String>>,
    /// When using `pod` strategy, the minimum amount of CPU required by the pod builder.
    /// 
    /// Deprecated: use TasksRequestCPU instead with task name `builder`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requestCPU")]
    pub request_cpu: Option<String>,
    /// When using `pod` strategy, the minimum amount of memory required by the pod builder.
    /// 
    /// Deprecated: use TasksRequestCPU instead with task name `builder`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "requestMemory")]
    pub request_memory: Option<String>,
    /// The strategy to use, either `pod` or `routine` (default `routine`)
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub strategy: Option<IntegrationKitTraitsBuilderStrategy>,
    /// A list of tasks to be executed (available only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub tasks: Option<Vec<String>>,
    /// A list of tasks sorted by the order of execution in a csv format, ie, `<taskName1>,<taskName2>,...`.
    /// Mind that you must include also the operator tasks (`builder`, `quarkus-native`, `package`, `jib`, `s2i`)
    /// if you need to execute them. Useful only with `pod` strategy.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tasksFilter")]
    pub tasks_filter: Option<String>,
    /// A list of limit cpu configuration for the specific task with format `<task-name>:<limit-cpu-conf>`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tasksLimitCPU")]
    pub tasks_limit_cpu: Option<Vec<String>>,
    /// A list of limit memory configuration for the specific task with format `<task-name>:<limit-memory-conf>`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tasksLimitMemory")]
    pub tasks_limit_memory: Option<Vec<String>>,
    /// A list of request cpu configuration for the specific task with format `<task-name>:<request-cpu-conf>`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tasksRequestCPU")]
    pub tasks_request_cpu: Option<Vec<String>>,
    /// A list of request memory configuration for the specific task with format `<task-name>:<request-memory-conf>`.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "tasksRequestMemory")]
    pub tasks_request_memory: Option<Vec<String>>,
    /// Enable verbose logging on build components that support it (e.g. Kaniko build pod).
    /// 
    /// Deprecated: no longer in use
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub verbose: Option<bool>,
}

/// The builder trait is internally used to determine the best strategy to build and configure IntegrationKits.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum IntegrationKitTraitsBuilderOrderStrategy {
    #[serde(rename = "dependencies")]
    Dependencies,
    #[serde(rename = "fifo")]
    Fifo,
    #[serde(rename = "sequential")]
    Sequential,
}

/// The builder trait is internally used to determine the best strategy to build and configure IntegrationKits.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum IntegrationKitTraitsBuilderStrategy {
    #[serde(rename = "pod")]
    Pod,
    #[serde(rename = "routine")]
    Routine,
}

/// The Camel trait sets up Camel configuration.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitTraitsCamel {
    /// Legacy trait configuration parameters.
    /// 
    /// Deprecated: for backward compatibility.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub configuration: Option<BTreeMap<String, serde_json::Value>>,
    /// Deprecated: no longer in use.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub enabled: Option<bool>,
    /// A list of properties to be provided to the Integration runtime
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub properties: Option<Vec<String>>,
    /// The runtime provider to use for the integration. (Default, plain Quarkus).
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runtimeProvider")]
    pub runtime_provider: Option<IntegrationKitTraitsCamelRuntimeProvider>,
    /// The runtime version to use for the integration. It overrides the default version set in the Integration Platform.
    /// You can use a fixed version (for example "3.2.3") or a semantic version (for example "3.x") which will try to resolve
    /// to the best matching Catalog existing on the cluster (Default, the one provided by the operator version).
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runtimeVersion")]
    pub runtime_version: Option<String>,
}

/// The Camel trait sets up Camel configuration.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum IntegrationKitTraitsCamelRuntimeProvider {
    #[serde(rename = "quarkus")]
    Quarkus,
    #[serde(rename = "plain-quarkus")]
    PlainQuarkus,
}

/// The Quarkus trait configures the Quarkus runtime.
/// It's enabled by default.
/// NOTE: Compiling to a native executable, requires at least 4GiB of memory, so the Pod running the native build must have enough memory available.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitTraitsQuarkus {
    /// The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
    /// In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
    /// with the `native` kit having precedence over the `jvm` one once ready.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "buildMode")]
    pub build_mode: Option<Vec<String>>,
    /// Legacy trait configuration parameters.
    /// 
    /// Deprecated: for backward compatibility.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub configuration: Option<BTreeMap<String, serde_json::Value>>,
    /// Deprecated: no longer in use.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub enabled: Option<bool>,
    /// The base image to use when running a native build (default `quay.io/quarkus/quarkus-micro-image:2.0`)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "nativeBaseImage")]
    pub native_base_image: Option<String>,
    /// The image containing the tooling required for a native build (by default it will use the one provided in the runtime catalog)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "nativeBuilderImage")]
    pub native_builder_image: Option<String>,
    /// The Quarkus package types, `fast-jar` or `native` (default `fast-jar`).
    /// In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
    /// with the native kit having precedence over the `fast-jar` one once ready.
    /// The order influences the resolution of the current kit for the integration.
    /// The kit corresponding to the first package type will be assigned to the
    /// integration in case no existing kit that matches the integration exists.
    /// 
    /// Deprecated: use `build-mode` instead.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "packageTypes")]
    pub package_types: Option<Vec<String>>,
}

/// The Registry trait sets up Maven to use the Image registry as a Maven repository (support removed since version 2.5.0).
/// 
/// Deprecated: use jvm trait or read documentation.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitTraitsRegistry {
    /// Legacy trait configuration parameters.
    /// 
    /// Deprecated: for backward compatibility.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub configuration: Option<BTreeMap<String, serde_json::Value>>,
    /// Can be used to enable or disable a trait. All traits share this common property.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub enabled: Option<bool>,
}

/// the actual status
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitStatus {
    /// list of artifacts used by the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub artifacts: Option<Vec<IntegrationKitStatusArtifacts>>,
    /// base image used by the kit (could be another IntegrationKit)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "baseImage")]
    pub base_image: Option<String>,
    /// the catalog used to build/operate the IntegrationKit.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub catalog: Option<IntegrationKitStatusCatalog>,
    /// a list of conditions which happened for the events related the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub conditions: Option<Vec<Condition>>,
    /// actual image digest of the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub digest: Option<String>,
    /// failure reason (if any)
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub failure: Option<IntegrationKitStatusFailure>,
    /// actual image name of the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub image: Option<String>,
    /// ObservedGeneration is the most recent generation observed for this IntegrationKit.
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "observedGeneration")]
    pub observed_generation: Option<i64>,
    /// phase of the kit
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub phase: Option<String>,
    /// the platform for which this kit was configured
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub platform: Option<String>,
    /// root image used by the kit (the first image from which the incremental image has started, typically a JDK/JRE base image)
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "rootImage")]
    pub root_image: Option<String>,
    /// the runtime provider for which this kit was configured
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runtimeProvider")]
    pub runtime_provider: Option<String>,
    /// the runtime version for which this kit was configured
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "runtimeVersion")]
    pub runtime_version: Option<String>,
    /// the Camel K operator version for which this kit was configured
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub version: Option<String>,
}

/// Artifact represents a materialized artifact (a jar dependency or in general a file used by the build).
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitStatusArtifacts {
    /// a checksum (SHA1) of the content
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub checksum: Option<String>,
    /// the identification (GAV for maven dependencies or file name for other file types)
    pub id: String,
    /// where it is located in the builder `Pod`
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub location: Option<String>,
    /// the expected location in the runtime
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub target: Option<String>,
}

/// the catalog used to build/operate the IntegrationKit.
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitStatusCatalog {
    /// RuntimeProvider is the provider chosen for the runtime.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub provider: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub version: Option<String>,
}

/// failure reason (if any)
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitStatusFailure {
    /// a short text specifying the reason
    pub reason: String,
    /// the recovery attempted for this failure
    pub recovery: IntegrationKitStatusFailureRecovery,
    /// the time when the failure has happened
    pub time: String,
}

/// the recovery attempted for this failure
#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq)]
pub struct IntegrationKitStatusFailureRecovery {
    /// attempt number
    pub attempt: i64,
    /// maximum number of attempts
    #[serde(rename = "attemptMax")]
    pub attempt_max: i64,
    /// time of the attempt execution
    #[serde(default, skip_serializing_if = "Option::is_none", rename = "attemptTime")]
    pub attempt_time: Option<String>,
}