@@ -685,6 +685,84 @@ func TestApplyPGBackRestClientCertificate(t *testing.T) {
685685 })
686686}
687687
688+ func TestApplyReplicationCertificate (t * testing.T ) {
689+ t .Run ("create replication certificate successfully" , func (t * testing.T ) {
690+ cluster := testCluster ()
691+ cluster .Name = "replication-cert-test"
692+ client := setupFakeClient (t , cluster )
693+ ctrl := NewController (client , client .Scheme (), false )
694+
695+ err := ctrl .ApplyReplicationCertificate (t .Context (), cluster )
696+ require .NoError (t , err )
697+
698+ cert := & v1.Certificate {}
699+ certName := cluster .Name + "-replication-cert"
700+ err = client .Get (t .Context (), sigs.ObjectKey {
701+ Namespace : cluster .Namespace ,
702+ Name : certName ,
703+ }, cert )
704+ require .NoError (t , err )
705+
706+ assert .Equal (t , certName , cert .Name )
707+ assert .Equal (t , cluster .Namespace , cert .Namespace )
708+ assert .Equal (t , naming .ReplicationClientCertSecret (cluster ).Name , cert .Spec .SecretName )
709+ assert .Equal (t , "_crunchyrepl" , cert .Spec .CommonName )
710+ assert .Equal (t , []string {"_crunchyrepl" }, cert .Spec .DNSNames )
711+ assert .Equal (t , naming .TLSIssuer (cluster ).Name , cert .Spec .IssuerRef .Name )
712+ assert .Equal (t , v1 .IssuerKind , cert .Spec .IssuerRef .Kind )
713+ assert .NotNil (t , cert .Spec .Duration )
714+ assert .Equal (t , DefaultCertDuration , cert .Spec .Duration .Duration )
715+ assert .NotNil (t , cert .Spec .RenewBefore )
716+ assert .Equal (t , DefaultRenewBefore , cert .Spec .RenewBefore .Duration )
717+ assert .NotNil (t , cert .Spec .PrivateKey )
718+ assert .Equal (t , v1 .ECDSAKeyAlgorithm , cert .Spec .PrivateKey .Algorithm )
719+ assert .Equal (t , 256 , cert .Spec .PrivateKey .Size )
720+ assert .Equal (t , v1 .RotationPolicyNever , cert .Spec .PrivateKey .RotationPolicy )
721+
722+ assert .Contains (t , cert .Spec .Usages , v1 .UsageClientAuth )
723+ assert .Contains (t , cert .Spec .Usages , v1 .UsageDigitalSignature )
724+ assert .Contains (t , cert .Spec .Usages , v1 .UsageKeyEncipherment )
725+ assert .NotContains (t , cert .Spec .Usages , v1 .UsageServerAuth )
726+
727+ assert .NotNil (t , cert .Spec .SecretTemplate )
728+ assert .Equal (t , cluster .Name , cert .Spec .SecretTemplate .Labels [naming .LabelCluster ])
729+ assert .Equal (t , "replication-client-tls" , cert .Spec .SecretTemplate .Labels [naming .LabelClusterCertificate ])
730+
731+ assert .Equal (t , cluster .Name , cert .Labels [naming .LabelCluster ])
732+ assert .Equal (t , "replication-client-tls" , cert .Labels [naming .LabelClusterCertificate ])
733+ assert .NotEmpty (t , cert .Labels [naming .LabelPerconaManagedBy ])
734+
735+ require .Len (t , cert .OwnerReferences , 1 )
736+ assert .Equal (t , cluster .Name , cert .OwnerReferences [0 ].Name )
737+
738+ // return nil when certificate already exists
739+ err = ctrl .ApplyReplicationCertificate (t .Context (), cluster )
740+ require .NoError (t , err )
741+ })
742+
743+ t .Run ("uses CertValidityDuration when set" , func (t * testing.T ) {
744+ customDuration := 4320 * time .Hour // 180 days
745+ cluster := testCluster ()
746+ cluster .Name = "replication-cert-dur"
747+ cluster .Spec .TLS = & v1beta1.TLSSpec {
748+ CertValidityDuration : & metav1.Duration {Duration : customDuration },
749+ }
750+ client := setupFakeClient (t , cluster )
751+ ctrl := NewController (client , client .Scheme (), false )
752+
753+ err := ctrl .ApplyReplicationCertificate (t .Context (), cluster )
754+ require .NoError (t , err )
755+
756+ cert := & v1.Certificate {}
757+ err = client .Get (t .Context (), sigs.ObjectKey {
758+ Namespace : cluster .Namespace ,
759+ Name : cluster .Name + "-replication-cert" ,
760+ }, cert )
761+ require .NoError (t , err )
762+ assert .Equal (t , customDuration , cert .Spec .Duration .Duration )
763+ })
764+ }
765+
688766func TestUpdateCertificateDuration (t * testing.T ) {
689767 initialDuration := 2160 * time .Hour // 90 days
690768 updatedDuration := 4320 * time .Hour // 180 days
@@ -798,6 +876,31 @@ func TestUpdateCertificateDuration(t *testing.T) {
798876 assert .Equal (t , updatedDuration , cert .Spec .Duration .Duration )
799877 })
800878
879+ t .Run ("replication certificate duration updated when spec changes" , func (t * testing.T ) {
880+ cluster := testCluster ()
881+ cluster .Name = "update-repl-dur"
882+ cluster .Spec .TLS = & v1beta1.TLSSpec {
883+ CertValidityDuration : & metav1.Duration {Duration : initialDuration },
884+ }
885+ client := setupFakeClient (t , cluster )
886+ ctrl := NewController (client , client .Scheme (), false )
887+
888+ err := ctrl .ApplyReplicationCertificate (t .Context (), cluster )
889+ require .NoError (t , err )
890+
891+ cluster .Spec .TLS .CertValidityDuration = & metav1.Duration {Duration : updatedDuration }
892+ err = ctrl .ApplyReplicationCertificate (t .Context (), cluster )
893+ require .NoError (t , err )
894+
895+ cert := & v1.Certificate {}
896+ err = client .Get (t .Context (), sigs.ObjectKey {
897+ Namespace : cluster .Namespace ,
898+ Name : cluster .Name + "-replication-cert" ,
899+ }, cert )
900+ require .NoError (t , err )
901+ assert .Equal (t , updatedDuration , cert .Spec .Duration .Duration )
902+ })
903+
801904 t .Run ("pgbackrest client certificate duration updated when pgBackRestCertValidityDuration changes" , func (t * testing.T ) {
802905 cluster := testCluster ()
803906 cluster .Name = "update-pgbr-client-dur"
0 commit comments