This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 9c8bdf35843 config: persist config subgroups with their name and group 
id (#14050)
9c8bdf35843 is described below

commit 9c8bdf358432753be10346853c2ef183c5a9ad86
Author: Ramgopal Nagaboina <[email protected]>
AuthorDate: Wed Sep 9 08:09:47 2026 -0400

    config: persist config subgroups with their name and group id (#14050)
    
    createOrupdateConfigObject created a missing configuration subgroup with the
    no-arg ConfigurationSubGroupVO constructor, so the row was written with a 
null
    name and null group_id. Because the name stayed null, the next
    findByNameAndGroup lookup missed again and inserted another null row on 
every
    management-server restart. Build the subgroup with its name and precedence 
and
    set its group id, matching the sibling configuration-group branch.
---
 .../framework/config/impl/ConfigDepotImpl.java     |  3 ++-
 .../framework/config/impl/ConfigDepotImplTest.java | 30 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git 
a/framework/config/src/main/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java
 
b/framework/config/src/main/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java
index db9cb172ccd..32bac8ac826 100644
--- 
a/framework/config/src/main/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java
+++ 
b/framework/config/src/main/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java
@@ -172,7 +172,8 @@ public class ConfigDepotImpl implements ConfigDepot, 
ConfigDepotAdmin {
             Pair<String, Long> subGroup = key.subGroup();
             ConfigurationSubGroupVO subGroupVO = 
_configSubGroupDao.findByNameAndGroup(subGroup.first(), groupId);
             if (subGroupVO == null) {
-                subGroupVO = new ConfigurationSubGroupVO();
+                subGroupVO = new ConfigurationSubGroupVO(subGroup.first(), 
null, subGroup.second());
+                subGroupVO.setGroupId(groupId);
                 subGroupVO = _configSubGroupDao.persist(subGroupVO);
             }
             subGroupId = subGroupVO.getId();
diff --git 
a/framework/config/src/test/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImplTest.java
 
b/framework/config/src/test/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImplTest.java
index ca2f54f1442..a0b9287acdc 100644
--- 
a/framework/config/src/test/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImplTest.java
+++ 
b/framework/config/src/test/java/org/apache/cloudstack/framework/config/impl/ConfigDepotImplTest.java
@@ -24,24 +24,54 @@ import java.util.Set;
 
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.config.dao.ConfigurationSubGroupDao;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.springframework.test.util.ReflectionTestUtils;
 
+import com.cloud.utils.Pair;
+
+import java.util.Date;
+
 @RunWith(MockitoJUnitRunner.class)
 public class ConfigDepotImplTest {
 
     @Mock
     ConfigurationDao _configDao;
 
+    @Mock
+    ConfigurationSubGroupDao _configSubGroupDao;
+
     @InjectMocks
     private ConfigDepotImpl configDepotImpl = new ConfigDepotImpl();
 
+    @Test
+    public void createConfigObjectPersistsSubGroupWithNameAndGroupId() {
+        ConfigKey<?> key = Mockito.mock(ConfigKey.class);
+        Mockito.when(key.group()).thenReturn(null);
+        Mockito.when(key.subGroup()).thenReturn(new Pair<>("ConsoleProxy VM", 
5L));
+        Mockito.when(key.key()).thenReturn("consoleproxy.capacity.standby");
+        Mockito.when(key.scope()).thenReturn(ConfigKey.Scope.Global);
+        Mockito.when(_configSubGroupDao.findByNameAndGroup("ConsoleProxy VM", 
1L)).thenReturn(null);
+        
Mockito.when(_configSubGroupDao.persist(Mockito.any(ConfigurationSubGroupVO.class)))
+                .thenAnswer(invocation -> invocation.getArgument(0));
+        
Mockito.when(_configDao.findById("consoleproxy.capacity.standby")).thenReturn(Mockito.mock(ConfigurationVO.class));
+
+        ArgumentCaptor<ConfigurationSubGroupVO> captor = 
ArgumentCaptor.forClass(ConfigurationSubGroupVO.class);
+        ReflectionTestUtils.invokeMethod(configDepotImpl, 
"createOrupdateConfigObject",
+                new Date(), "components", key, "someValue");
+
+        Mockito.verify(_configSubGroupDao).persist(captor.capture());
+        Assert.assertEquals("ConsoleProxy VM", captor.getValue().getName());
+        Assert.assertEquals(Long.valueOf(1L), captor.getValue().getGroupId());
+    }
+
     @Test
     public void createEmptyScopeLevelMappingsTest() {
         configDepotImpl.createEmptyScopeLevelMappings();

Reply via email to