@@ -31,6 +31,7 @@ import (
3131 . "github.com/openstack-k8s-operators/lib-common/modules/common/test/helpers"
3232 "gopkg.in/yaml.v3"
3333 corev1 "k8s.io/api/core/v1"
34+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3435 "k8s.io/apimachinery/pkg/types"
3536 "k8s.io/utils/ptr"
3637)
@@ -1805,6 +1806,104 @@ var _ = Describe("Dataplane NodeSet Test", func() {
18051806 })
18061807 })
18071808
1809+ When ("Cert secret changes are detected after deployment" , func () {
1810+ var certSecretName types.NamespacedName
1811+ var certTestServiceName types.NamespacedName
1812+
1813+ BeforeEach (func () {
1814+ certSecretName = types.NamespacedName {
1815+ Name : "cert-cert-test-service-default-edpm-compute-node-1" ,
1816+ Namespace : namespace ,
1817+ }
1818+ certTestServiceName = types.NamespacedName {
1819+ Name : "cert-test-service" ,
1820+ Namespace : namespace ,
1821+ }
1822+
1823+ nodeSetSpec := DefaultDataPlaneNodeSetSpec ("edpm-compute" )
1824+ nodeSetSpec ["preProvisioned" ] = true
1825+ nodeSetSpec ["tlsEnabled" ] = false
1826+ nodeSetSpec ["services" ] = []string {"cert-test-service" }
1827+
1828+ DeferCleanup (th .DeleteInstance , CreateDataPlaneServiceFromSpec (certTestServiceName , map [string ]interface {}{
1829+ "playbook" : "test" ,
1830+ "tlsCerts" : map [string ]interface {}{
1831+ "default" : map [string ]interface {}{
1832+ "contents" : []string {"dnsnames" },
1833+ },
1834+ },
1835+ }))
1836+
1837+ // Create a cert secret with the labels that EnsureTLSCerts sets.
1838+ // Labels must match the service name and certKey so that
1839+ // GetDeploymentHashesForService picks them up.
1840+ certSecret := & corev1.Secret {
1841+ ObjectMeta : metav1.ObjectMeta {
1842+ Name : certSecretName .Name ,
1843+ Namespace : certSecretName .Namespace ,
1844+ Labels : map [string ]string {
1845+ "osdpns" : dataplaneNodeSetName .Name ,
1846+ "osdp-service" : certTestServiceName .Name ,
1847+ "osdp-service-cert-key" : "default" ,
1848+ "hostname" : "edpm-compute-node-1" ,
1849+ },
1850+ },
1851+ Data : map [string ][]byte {
1852+ "tls.crt" : []byte ("original-cert-data" ),
1853+ "tls.key" : []byte ("original-key-data" ),
1854+ "ca.crt" : []byte ("original-ca-data" ),
1855+ },
1856+ }
1857+ Expect (th .K8sClient .Create (th .Ctx , certSecret )).To (Succeed ())
1858+ DeferCleanup (th .K8sClient .Delete , th .Ctx , certSecret )
1859+
1860+ DeferCleanup (th .DeleteInstance , CreateNetConfig (dataplaneNetConfigName , DefaultNetConfigSpec ()))
1861+ DeferCleanup (th .DeleteInstance , CreateDNSMasq (dnsMasqName , DefaultDNSMasqSpec ()))
1862+ DeferCleanup (th .DeleteInstance , CreateDataplaneNodeSet (dataplaneNodeSetName , nodeSetSpec ))
1863+ DeferCleanup (th .DeleteInstance , CreateDataplaneDeployment (dataplaneDeploymentName , DefaultDataPlaneDeploymentSpec ()))
1864+ CreateSSHSecret (dataplaneSSHSecretName )
1865+ CreateCABundleSecret (caBundleSecretName )
1866+ SimulateDNSMasqComplete (dnsMasqName )
1867+ SimulateIPSetComplete (dataplaneNodeName )
1868+ SimulateDNSDataComplete (dataplaneNodeSetName )
1869+ })
1870+
1871+ It ("Should detect cert renewal and mark NodeSet as needing redeployment" , func () {
1872+ // Complete the deployment
1873+ Eventually (func (g Gomega ) {
1874+ ansibleeeName := types.NamespacedName {
1875+ Name : "cert-test-service-" + dataplaneDeploymentName .Name + "-" + dataplaneNodeSetName .Name ,
1876+ Namespace : namespace ,
1877+ }
1878+ ansibleEE := GetAnsibleee (ansibleeeName )
1879+ ansibleEE .Status .Succeeded = 1
1880+ g .Expect (th .K8sClient .Status ().Update (th .Ctx , ansibleEE )).To (Succeed ())
1881+ }, th .Timeout , th .Interval ).Should (Succeed ())
1882+
1883+ // Wait for deployment to be ready and cert secret hash to be tracked
1884+ Eventually (func (g Gomega ) {
1885+ instance := GetDataplaneNodeSet (dataplaneNodeSetName )
1886+ g .Expect (instance .Status .Conditions .IsTrue (condition .DeploymentReadyCondition )).To (BeTrue ())
1887+ g .Expect (instance .Status .SecretHashes ).Should (HaveKey (certSecretName .Name ))
1888+ }, th .Timeout , th .Interval ).Should (Succeed ())
1889+
1890+ // Simulate cert-manager renewal: update the cert secret data
1891+ Eventually (func (g Gomega ) {
1892+ secret := & corev1.Secret {}
1893+ g .Expect (th .K8sClient .Get (th .Ctx , certSecretName , secret )).To (Succeed ())
1894+ secret .Data ["tls.crt" ] = []byte ("renewed-cert-data" )
1895+ secret .Data ["tls.key" ] = []byte ("renewed-key-data" )
1896+ g .Expect (th .K8sClient .Update (th .Ctx , secret )).To (Succeed ())
1897+ }, th .Timeout , th .Interval ).Should (Succeed ())
1898+
1899+ // Verify DeploymentReadyCondition becomes False
1900+ Eventually (func (g Gomega ) {
1901+ instance := GetDataplaneNodeSet (dataplaneNodeSetName )
1902+ g .Expect (instance .Status .Conditions .IsFalse (condition .DeploymentReadyCondition )).To (BeTrue ())
1903+ }, th .Timeout , th .Interval ).Should (Succeed ())
1904+ })
1905+ })
1906+
18081907 When ("Running deployments exist with completed deployment" , func () {
18091908 BeforeEach (func () {
18101909 nodeSetSpec := DefaultDataPlaneNodeSetSpec ("edpm-compute" )
0 commit comments