From 1aae1146dc68cf9fc1477b567d685341728bd3cf Mon Sep 17 00:00:00 2001 From: somiljain2006 Date: Fri, 31 Jul 2026 10:25:02 +0530 Subject: [PATCH 1/2] Ad draft ItemConfigurator support for Folder --- pom.xml | 1 - .../folder/FolderItemConfigurator.java | 52 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java diff --git a/pom.xml b/pom.xml index f3df9427..a8e9d6df 100644 --- a/pom.xml +++ b/pom.xml @@ -68,7 +68,6 @@ io.jenkins configuration-as-code - test io.jenkins.configuration-as-code diff --git a/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java b/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java new file mode 100644 index 00000000..f719f305 --- /dev/null +++ b/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java @@ -0,0 +1,52 @@ +package com.cloudbees.hudson.plugins.folder; + +import hudson.Extension; +import io.jenkins.plugins.casc.ConfigurationContext; +import io.jenkins.plugins.casc.ConfiguratorException; +import io.jenkins.plugins.casc.ItemConfigurator; +import io.jenkins.plugins.casc.model.CNode; +import io.jenkins.plugins.casc.model.Mapping; +import jenkins.model.Jenkins; +import java.io.IOException; + +@Extension +public class FolderItemConfigurator implements ItemConfigurator { + + @Override + public String getName() { + return "folder"; + } + + @Override + public Class getTarget() { + return Folder.class; + } + + @Override + public Folder configure(String name, CNode config, ConfigurationContext context) throws ConfiguratorException { + try { + Jenkins jenkins = Jenkins.get(); + Folder folder = (Folder) jenkins.getItem(name); + + if (folder == null) { + folder = jenkins.createProject(Folder.class, name); + } + + Mapping mapping = config.asMapping(); + + if (mapping.containsKey("description")) { + folder.setDescription(mapping.getScalarValue("description")); + } + + if (mapping.containsKey("displayName")) { + folder.setDisplayName(mapping.getScalarValue("displayName")); + } + + folder.save(); + return folder; + + } catch (IOException e) { + throw new ConfiguratorException("Failed to configure folder: " + name, e); + } + } +} From f06619c6c90e7d5a358016fe58e79520e220e532 Mon Sep 17 00:00:00 2001 From: somiljain2006 Date: Sat, 1 Aug 2026 03:31:39 +0530 Subject: [PATCH 2/2] Added tests --- .../folder/FolderItemConfiguratorTest.java | 46 +++++++++++++++++++ .../hudson/plugins/folder/create-folder.yaml | 5 ++ .../hudson/plugins/folder/update-folder.yaml | 5 ++ 3 files changed, 56 insertions(+) create mode 100644 src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java create mode 100644 src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml create mode 100644 src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml diff --git a/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java b/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java new file mode 100644 index 00000000..65f37db0 --- /dev/null +++ b/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java @@ -0,0 +1,46 @@ +package com.cloudbees.hudson.plugins.folder; + +import io.jenkins.plugins.casc.ConfigurationAsCode; +import io.jenkins.plugins.casc.misc.ConfiguredWithCode; +import io.jenkins.plugins.casc.misc.JenkinsConfiguredWithCodeRule; +import jenkins.model.Jenkins; +import org.junit.Rule; +import org.junit.Test; + +import java.util.Objects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class FolderItemConfiguratorTest { + + @Rule + public JenkinsConfiguredWithCodeRule j = new JenkinsConfiguredWithCodeRule(); + + @Test + @ConfiguredWithCode("create-folder.yaml") + public void shouldCreateNewFolder() { + Folder folder = (Folder) Jenkins.get().getItem("team-alpha"); + + assertNotNull("Folder should have been created by JCasC", folder); + assertEquals("Team Alpha", folder.getDisplayName()); + assertEquals("Description for Team Alpha", folder.getDescription()); + } + + @Test + public void shouldUpdateExistingFolder() throws Exception { + Folder existingFolder = j.jenkins.createProject(Folder.class, "team-beta"); + existingFolder.setDescription("Old Description"); + existingFolder.setDisplayName("Old Display Name"); + + ConfigurationAsCode.get().configure( + Objects.requireNonNull(getClass().getResource("update-folder.yaml")).toExternalForm() + ); + + Folder updatedFolder = (Folder) Jenkins.get().getItem("team-beta"); + + assertNotNull(updatedFolder); + assertEquals("Team Beta Updated", updatedFolder.getDisplayName()); + assertEquals("New Description via JCasC", updatedFolder.getDescription()); + } +} diff --git a/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml b/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml new file mode 100644 index 00000000..ed6c1d94 --- /dev/null +++ b/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml @@ -0,0 +1,5 @@ +items: + - folder: + name: "team-alpha" + displayName: "Team Alpha" + description: "Description for Team Alpha" \ No newline at end of file diff --git a/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml b/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml new file mode 100644 index 00000000..71963ba5 --- /dev/null +++ b/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml @@ -0,0 +1,5 @@ +items: + - folder: + name: "team-beta" + displayName: "Team Beta Updated" + description: "New Description via JCasC" \ No newline at end of file