diff --git a/src/main/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStep.java b/src/main/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStep.java index a5b3f2bce..8c2baddd5 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStep.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStep.java @@ -35,7 +35,6 @@ import hudson.model.Run; import hudson.model.TaskListener; import java.io.IOException; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -44,6 +43,7 @@ import org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryEndpoint; import org.jenkinsci.plugins.docker.commons.credentials.KeyMaterialFactory; import org.jenkinsci.plugins.docker.commons.tools.DockerTool; +import org.jenkinsci.plugins.structs.describable.CustomDescribableModel; import org.jenkinsci.plugins.structs.describable.UninstantiatedDescribable; import org.jenkinsci.plugins.workflow.steps.Step; import org.jenkinsci.plugins.workflow.steps.StepContext; @@ -107,7 +107,7 @@ public static class Execution extends AbstractEndpointStepExecution { } - @Extension public static class DescriptorImpl extends StepDescriptor { + @Extension public static class DescriptorImpl extends StepDescriptor implements CustomDescribableModel { @Override public String getFunctionName() { return "withDockerRegistry"; @@ -126,17 +126,7 @@ public static class Execution extends AbstractEndpointStepExecution { return true; } - @Override public UninstantiatedDescribable uninstantiate(Step step) throws UnsupportedOperationException { - RegistryEndpointStep s = (RegistryEndpointStep) step; - Map args = new TreeMap<>(); - args.put("url", s.registry.getUrl()); - args.put("credentialsId", s.registry.getCredentialsId()); - args.put("toolName", s.toolName); - args.values().removeAll(Collections.singleton(null)); - return new UninstantiatedDescribable(args); - } - - @Override public Step newInstance(Map arguments) throws Exception { + @Override public Map customInstantiate(Map arguments) { arguments = new HashMap<>(arguments); if (arguments.containsKey("url") || arguments.containsKey("credentialsId")) { if (arguments.containsKey("registry")) { @@ -146,7 +136,18 @@ public static class Execution extends AbstractEndpointStepExecution { } else if (!arguments.containsKey("registry")) { throw new IllegalArgumentException("must specify url/credentialsId (or registry)"); } - return super.newInstance(arguments); + return arguments; + } + + @Override public UninstantiatedDescribable customUninstantiate(UninstantiatedDescribable ud) { + Object registry = ud.getArguments().get("registry"); + if (registry instanceof UninstantiatedDescribable) { + Map arguments = new TreeMap<>(ud.getArguments()); + arguments.remove("registry"); + arguments.putAll(((UninstantiatedDescribable) registry).getArguments()); + return ud.withArguments(arguments); + } + return ud; } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStepTest.java b/src/test/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStepTest.java index 29a949c0d..60c7e0f9a 100644 --- a/src/test/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/docker/workflow/RegistryEndpointStepTest.java @@ -70,13 +70,18 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.logging.Level; +import org.jenkinsci.plugins.structs.describable.DescribableModel; +import org.jvnet.hudson.test.LoggerRule; public class RegistryEndpointStepTest { @Rule public JenkinsRule r = new JenkinsRule(); + @Rule public LoggerRule logging = new LoggerRule(); @Issue("JENKINS-51395") @Test public void configRoundTrip() throws Exception { + logging.record(DescribableModel.class, Level.FINE); { // Recommended syntax. SnippetizerTester st = new SnippetizerTester(r); RegistryEndpointStep step = new RegistryEndpointStep(new DockerRegistryEndpoint("https://myreg/", null));