55use compute_pcrs_lib:: { Part , Pcr } ;
66use k8s_openapi:: api:: apps:: v1:: Deployment ;
77use k8s_openapi:: api:: core:: v1:: { ConfigMap , Secret } ;
8- use kube:: { Api , api:: DeleteParams } ;
8+ use kube:: {
9+ Api ,
10+ api:: { DeleteParams , PostParams } ,
11+ } ;
912use std:: time:: Duration ;
1013use trusted_cluster_operator_lib:: conditions:: NOT_COMMITTED_REASON_PENDING ;
1114use trusted_cluster_operator_lib:: reference_values:: ImagePcrs ;
1215use trusted_cluster_operator_lib:: {
13- ApprovedImage , AttestationKey , Machine , TrustedExecutionCluster , generate_owner_reference,
16+ ApprovedImage , AttestationKey , FIELD_MANAGER , Machine , TrustedExecutionCluster ,
17+ generate_owner_controller_reference,
1418} ;
1519use trusted_cluster_operator_test_utils:: * ;
1620
@@ -28,10 +32,9 @@ named_test!(
2832 let tec_api: Api <TrustedExecutionCluster > = Api :: namespaced( client. clone( ) , namespace) ;
2933 let tec = tec_api. get( name) . await ?;
3034
31- let owner_reference = generate_owner_reference ( & tec) ?;
35+ let owner_controller_reference = generate_owner_controller_reference ( & tec) ?;
3236
33- // Create a test Machine with TEC as owner reference. We need to set the owner reference
34- // manually since the machine is not created directly by the operator.
37+ // Create a test Machine with TEC as owner-controller reference. We need to set the owner reference manually since the machine is not created directly by the operator, but by register-server.
3538 let machine_uuid = uuid:: Uuid :: new_v4( ) . to_string( ) ;
3639 let machine_name = format!( "test-machine-{}" , & machine_uuid[ ..8 ] ) ;
3740
@@ -40,7 +43,7 @@ named_test!(
4043 metadata: k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: ObjectMeta {
4144 name: Some ( machine_name. clone( ) ) ,
4245 namespace: Some ( namespace. to_string( ) ) ,
43- owner_references: Some ( vec![ owner_reference . clone( ) ] ) ,
46+ owner_references: Some ( vec![ owner_controller_reference . clone( ) ] ) ,
4447 ..Default :: default ( )
4548 } ,
4649 spec: trusted_cluster_operator_lib:: MachineSpec {
@@ -49,7 +52,11 @@ named_test!(
4952 status: None ,
5053 } ;
5154
52- machines. create( & Default :: default ( ) , & machine) . await ?;
55+ let pp = PostParams {
56+ field_manager: Some ( FIELD_MANAGER . to_string( ) ) ,
57+ ..Default :: default ( )
58+ } ;
59+ machines. create( & pp, & machine) . await ?;
5360 test_ctx. info( format!( "Created test Machine: {machine_name}" ) ) ;
5461
5562 // Create an AttestationKey with the same uuid as the Machine
@@ -70,9 +77,11 @@ named_test!(
7077 status: None ,
7178 } ;
7279
73- attestation_keys
74- . create( & Default :: default ( ) , & attestation_key)
75- . await ?;
80+ let pp = PostParams {
81+ field_manager: Some ( FIELD_MANAGER . to_string( ) ) ,
82+ ..Default :: default ( )
83+ } ;
84+ attestation_keys. create( & pp, & attestation_key) . await ?;
7685 test_ctx. info( format!(
7786 "Created test AttestationKey: {ak_name} with uuid: {machine_uuid}" ,
7887 ) ) ;
@@ -87,6 +96,8 @@ named_test!(
8796 . poll_async( || {
8897 let ak_api = attestation_keys. clone( ) ;
8998 let ak_name_clone = ak_name. clone( ) ;
99+ let machine_name_clone = machine_name. clone( ) ;
100+
90101 async move {
91102 let ak = ak_api. get( & ak_name_clone) . await ?;
92103
@@ -108,6 +119,26 @@ named_test!(
108119 ) ) ;
109120 }
110121
122+ // On approval of attestation key, the operator transfers ownership and control of the AttestationKey to the Machine. Validating that it happens below.
123+ let has_machine_controller = ak
124+ . metadata
125+ . owner_references
126+ . as_ref( )
127+ . map( |refs| {
128+ refs. iter( ) . any( |r| {
129+ r. kind == "Machine"
130+ && r. name == machine_name_clone
131+ && r. controller == Some ( true )
132+ } )
133+ } )
134+ . unwrap_or( false ) ;
135+
136+ if !has_machine_controller {
137+ return Err ( anyhow:: anyhow!(
138+ "AttestationKey does not have Machine as controller yet"
139+ ) ) ;
140+ }
141+
111142 Ok ( ( ) )
112143 }
113144 } )
@@ -290,7 +321,7 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
290321
291322 let tec_api: Api <TrustedExecutionCluster > = Api :: namespaced( client. clone( ) , namespace) ;
292323 let tec = tec_api. get( tec_name) . await ?;
293- let owner_reference = generate_owner_reference ( & tec) ?;
324+ let owner_controller_reference = generate_owner_controller_reference ( & tec) ?;
294325
295326 let machine_uuid = uuid:: Uuid :: new_v4( ) . to_string( ) ;
296327
@@ -302,7 +333,7 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
302333 metadata: k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: ObjectMeta {
303334 name: Some ( ak_name. clone( ) ) ,
304335 namespace: Some ( namespace. to_string( ) ) ,
305- owner_references: Some ( vec![ owner_reference . clone( ) ] ) ,
336+ owner_references: Some ( vec![ owner_controller_reference . clone( ) ] ) ,
306337 ..Default :: default ( )
307338 } ,
308339 spec: trusted_cluster_operator_lib:: AttestationKeySpec {
@@ -312,9 +343,8 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
312343 status: None ,
313344 } ;
314345
315- attestation_keys
316- . create( & Default :: default ( ) , & attestation_key)
317- . await ?;
346+ let pp = PostParams { field_manager: Some ( FIELD_MANAGER . to_string( ) ) , ..Default :: default ( ) } ;
347+ attestation_keys. create( & pp, & attestation_key) . await ?;
318348 test_ctx. info( format!(
319349 "Created test AttestationKey: {ak_name} with uuid: {machine_uuid}" ,
320350 ) ) ;
@@ -325,7 +355,7 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
325355 metadata: k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: ObjectMeta {
326356 name: Some ( machine_name. clone( ) ) ,
327357 namespace: Some ( namespace. to_string( ) ) ,
328- owner_references: Some ( vec![ owner_reference . clone( ) ] ) ,
358+ owner_references: Some ( vec![ owner_controller_reference . clone( ) ] ) ,
329359 ..Default :: default ( )
330360 } ,
331361 spec: trusted_cluster_operator_lib:: MachineSpec {
@@ -334,7 +364,8 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
334364 status: None ,
335365 } ;
336366
337- machines. create( & Default :: default ( ) , & machine) . await ?;
367+ let pp = PostParams { field_manager: Some ( FIELD_MANAGER . to_string( ) ) , ..Default :: default ( ) } ;
368+ machines. create( & pp, & machine) . await ?;
338369 test_ctx. info( format!(
339370 "Created test Machine: {machine_name} with uuid: {machine_uuid}" ,
340371 ) ) ;
@@ -373,40 +404,44 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
373404 ) ) ;
374405 }
375406
376- // Check for owner reference to the Machine
377- let has_machine_owner_ref = ak
407+ // Check for owner-controller reference to the Machine
408+ let has_machine_owner_controller_ref = ak
378409 . metadata
379410 . owner_references
380411 . as_ref( )
381- . map( |owner_refs| {
382- owner_refs. iter( ) . any( |owner_ref| {
383- owner_ref. kind == "Machine" && owner_ref. name == machine_name_clone
412+ . map( |owner_controller_refs| {
413+ owner_controller_refs. iter( ) . any( |owner_ref| {
414+ owner_ref. kind == "Machine"
415+ && owner_ref. name == machine_name_clone
416+ && owner_ref. controller == Some ( true )
384417 } )
385418 } )
386419 . unwrap_or( false ) ;
387420
388- if !has_machine_owner_ref {
421+ if !has_machine_owner_controller_ref {
389422 return Err ( anyhow:: anyhow!(
390- "AttestationKey does not have owner reference to Machine yet"
423+ "AttestationKey does not have Machine as owner-controller yet"
391424 ) ) ;
392425 }
393426
394- // Check that a Secret with the same name exists and has the AttestationKey as owner
427+ // Check that a Secret with the same name exists and has the AttestationKey as owner-controller
395428 let secret = secrets. get( & ak_name_clone) . await ?;
396- let has_ak_owner_ref = secret
429+ let has_ak_owner_controller_ref = secret
397430 . metadata
398431 . owner_references
399432 . as_ref( )
400- . map( |owner_refs| {
401- owner_refs. iter( ) . any( |owner_ref| {
402- owner_ref. kind == "AttestationKey" && owner_ref. name == ak_name_clone
433+ . map( |owner_controller_refs| {
434+ owner_controller_refs. iter( ) . any( |owner_ref| {
435+ owner_ref. kind == "AttestationKey"
436+ && owner_ref. name == ak_name_clone
437+ && owner_ref. controller == Some ( true )
403438 } )
404439 } )
405440 . unwrap_or( false ) ;
406441
407- if !has_ak_owner_ref {
442+ if !has_ak_owner_controller_ref {
408443 return Err ( anyhow:: anyhow!(
409- "Secret does not have owner reference to AttestationKey yet"
444+ "Secret does not have AttestationKey as owner-controller yet"
410445 ) ) ;
411446 }
412447
@@ -415,9 +450,9 @@ async fn test_attestation_key_lifecycle() -> anyhow::Result<()> {
415450 } )
416451 . await ?;
417452
418- test_ctx. info( format! (
419- "AttestationKey successfully approved with owner reference to Machine: {machine_name} and Secret created"
420- ) ) ;
453+ test_ctx. info(
454+ "AttestationKey successfully approved with Machine as owner-controller and Secret created" ,
455+ ) ;
421456
422457 // Delete the Machine
423458 let dp = DeleteParams :: default ( ) ;
@@ -444,7 +479,7 @@ async fn test_nonexistent_approved_image() -> anyhow::Result<()> {
444479 let namespace = test_ctx. namespace( ) ;
445480
446481 let images: Api <ApprovedImage > = Api :: namespaced( client. clone( ) , namespace) ;
447- images. create( & Default :: default ( ) , & ApprovedImage {
482+ images. create( & PostParams { field_manager : Some ( FIELD_MANAGER . to_string ( ) ) , .. Default :: default ( ) } , & ApprovedImage {
448483 metadata: k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: ObjectMeta {
449484 name: Some ( "coreos1" . to_string( ) ) ,
450485 namespace: Some ( namespace. to_string( ) ) ,
0 commit comments