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