11use std:: { fmt:: Display , str:: FromStr } ;
22
3+ use crate :: api:: comparable:: ResourceDiff ;
4+ use educe:: Educe ;
35use fleet_api_rs:: fleet_cluster:: { ClusterAgentEnvVars , ClusterAgentTolerations } ;
46use k8s_openapi:: {
57 api:: core:: v1:: { ConfigMap , ObjectReference } ,
68 apimachinery:: pkg:: apis:: meta:: v1:: { Condition , LabelSelector } ,
79} ;
810use kube:: {
11+ CustomResource , KubeSchema , Resource ,
912 api:: { ObjectMeta , TypeMeta } ,
1013 core:: { ParseExpressionError , Selector } ,
11- CustomResource , KubeSchema , Resource ,
1214} ;
1315use schemars:: JsonSchema ;
14- use serde:: { ser , Deserialize , Serialize } ;
15- use serde_with:: { serde_as , DisplayFromStr } ;
16+ use serde:: { Deserialize , Serialize , ser } ;
17+ use serde_with:: { DisplayFromStr , serde_as } ;
1618use serde_yaml:: Value ;
1719
1820pub const AGENT_NAMESPACE : & str = "fleet-addon-agent" ;
1921pub const EXPERIMENTAL_OCI_STORAGE : & str = "EXPERIMENTAL_OCI_STORAGE" ;
2022pub const EXPERIMENTAL_HELM_OPS : & str = "EXPERIMENTAL_HELM_OPS" ;
2123
2224/// This provides a config for fleet addon functionality
23- #[ derive( CustomResource , Deserialize , Serialize , Clone , Default , Debug , KubeSchema ) ]
25+ #[ derive( CustomResource , Deserialize , Serialize , Clone , Default , Debug , KubeSchema , PartialEq ) ]
2426#[ kube(
2527 kind = "FleetAddonConfig" ,
2628 group = "addons.cluster.x-k8s.io" ,
@@ -63,6 +65,11 @@ impl Default for FleetAddonConfig {
6365 }
6466 }
6567}
68+ impl ResourceDiff for FleetAddonConfig {
69+ fn diff ( & self , _: & Self ) -> bool {
70+ true
71+ }
72+ }
6673
6774#[ derive( Deserialize , Serialize , Clone , Default , Debug , JsonSchema ) ]
6875#[ serde( rename_all = "camelCase" ) ]
@@ -73,7 +80,7 @@ pub struct FleetAddonConfigStatus {
7380 pub conditions : Vec < Condition > ,
7481}
7582
76- #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema ) ]
83+ #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , PartialEq ) ]
7784#[ serde( rename_all = "camelCase" ) ]
7885pub struct ClusterClassConfig {
7986 /// Setting to disable setting owner references on the created resources
@@ -95,7 +102,7 @@ impl Default for ClusterClassConfig {
95102 }
96103}
97104
98- #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema ) ]
105+ #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , PartialEq ) ]
99106#[ serde( rename_all = "camelCase" ) ]
100107pub struct ClusterConfig {
101108 /// Apply a `ClusterGroup` for a `ClusterClass` referenced from a different namespace.
@@ -152,13 +159,21 @@ pub struct FleetSettings {
152159 pub data : Option < FleetSettingsSpec > ,
153160}
154161
162+ impl ResourceDiff for FleetSettings {
163+ fn diff ( & self , other : & Self ) -> bool {
164+ self . data != other. data
165+ }
166+ }
167+
155168#[ serde_as]
156- #[ derive( Serialize , Deserialize , Default , Clone , Debug ) ]
169+ #[ derive( Serialize , Deserialize , Default , Clone , Debug , Educe ) ]
170+ #[ educe( PartialEq ) ]
157171pub struct FleetSettingsSpec {
158172 #[ serde( default ) ]
159173 #[ serde_as( as = "DisplayFromStr" ) ]
160174 pub fleet : FleetChartValues ,
161175
176+ #[ educe( PartialEq ( ignore) ) ]
162177 #[ serde( flatten) ]
163178 pub other : Value ,
164179}
@@ -238,7 +253,7 @@ impl ClusterConfig {
238253}
239254
240255/// `NamingStrategy` is controlling Fleet cluster naming
241- #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , Default ) ]
256+ #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , Default , PartialEq ) ]
242257pub struct NamingStrategy {
243258 /// Specify a prefix for the Cluster name, applied to created Fleet cluster
244259 pub prefix : Option < String > ,
@@ -264,7 +279,7 @@ impl Default for ClusterConfig {
264279 }
265280}
266281
267- #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema ) ]
282+ #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
268283#[ serde( rename_all = "camelCase" ) ]
269284pub struct FleetConfig {
270285 /// fleet server url configuration options
@@ -290,7 +305,7 @@ impl Default for FleetConfig {
290305
291306/// Feature toggles for enabling or disabling experimental functionality.
292307/// This struct controls access to specific experimental features.
293- #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema ) ]
308+ #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
294309#[ serde( rename_all = "camelCase" ) ]
295310pub struct FeatureGates {
296311 /// Enables experimental OCI storage support.
@@ -360,7 +375,7 @@ impl Default for FeatureGates {
360375
361376/// `FeaturesConfigMap` references a `ConfigMap` where to apply feature flags.
362377/// If a `ConfigMap` is referenced, the controller will update it instead of upgrading the Fleet chart.
363- #[ derive( Clone , Default , Debug , Serialize , Deserialize , JsonSchema ) ]
378+ #[ derive( Clone , Default , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
364379#[ serde( rename_all = "camelCase" ) ]
365380pub struct FeaturesConfigMap {
366381 // The reference to a ConfigMap resource
@@ -369,7 +384,7 @@ pub struct FeaturesConfigMap {
369384}
370385
371386/// `FleetChartValues` represents Fleet chart values.
372- #[ derive( Clone , Default , Debug , Serialize , Deserialize ) ]
387+ #[ derive( Clone , Default , Debug , Serialize , Deserialize , PartialEq ) ]
373388#[ serde( rename_all = "camelCase" ) ]
374389pub struct FleetChartValues {
375390 pub extra_env : Option < Vec < EnvironmentVariable > > ,
@@ -378,14 +393,14 @@ pub struct FleetChartValues {
378393}
379394
380395/// `EnvironmentVariable` is a simple name/value pair.
381- #[ derive( Clone , Default , Debug , Serialize , Deserialize ) ]
396+ #[ derive( Clone , Default , Debug , Serialize , Deserialize , PartialEq ) ]
382397#[ serde( rename_all = "camelCase" ) ]
383398pub struct EnvironmentVariable {
384399 pub name : String ,
385400 pub value : String ,
386401}
387402
388- #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema ) ]
403+ #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
389404#[ serde( rename_all = "camelCase" ) ]
390405pub struct FleetInstall {
391406 /// Chart version to install
@@ -421,14 +436,14 @@ impl Default for Install {
421436 }
422437}
423438
424- #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema ) ]
439+ #[ derive( Clone , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
425440#[ serde( rename_all = "camelCase" ) ]
426441pub enum Server {
427442 InferLocal ( bool ) ,
428443 Custom ( InstallOptions ) ,
429444}
430445
431- #[ derive( Clone , Default , Debug , Serialize , Deserialize , JsonSchema ) ]
446+ #[ derive( Clone , Default , Debug , Serialize , Deserialize , JsonSchema , PartialEq ) ]
432447#[ serde( rename_all = "camelCase" ) ]
433448pub struct InstallOptions {
434449 pub api_server_ca_config_ref : Option < ObjectReference > ,
@@ -450,7 +465,7 @@ impl NamingStrategy {
450465}
451466
452467/// Selectors is controlling Fleet import strategy settings.
453- #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , Default ) ]
468+ #[ derive( Serialize , Deserialize , Clone , Debug , JsonSchema , Default , PartialEq ) ]
454469#[ serde( rename_all = "camelCase" ) ]
455470pub struct Selectors {
456471 /// Namespace label selector. If set, only clusters in the namespace matching label selector will be imported.
0 commit comments