diff --git a/application/src/main/resources/extensions/attachment-local-policy.yaml b/application/src/main/resources/extensions/attachment-local-policy.yaml index a0926ade60..0ed8d79ff0 100644 --- a/application/src/main/resources/extensions/attachment-local-policy.yaml +++ b/application/src/main/resources/extensions/attachment-local-policy.yaml @@ -10,6 +10,8 @@ apiVersion: storage.halo.run/v1alpha1 kind: Policy metadata: name: default-policy + labels: + halo.run/do-not-overwrite: "true" finalizers: - system-protection spec: diff --git a/application/src/test/java/run/halo/app/core/attachment/AttachmentLocalPolicyResourceTest.java b/application/src/test/java/run/halo/app/core/attachment/AttachmentLocalPolicyResourceTest.java new file mode 100644 index 0000000000..1c78018087 --- /dev/null +++ b/application/src/test/java/run/halo/app/core/attachment/AttachmentLocalPolicyResourceTest.java @@ -0,0 +1,54 @@ +package run.halo.app.core.attachment; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ClassPathResource; +import run.halo.app.extension.ExtensionUtil; +import run.halo.app.infra.utils.YamlUnstructuredLoader; + +/** + * Tests for the built-in local attachment policy resource. + * + *
The default policy (and its config map) are initialized from extensions/attachment-local-policy.yaml
+ * on every startup. The halo.run/do-not-overwrite label is required to prevent the initializer from
+ * reverting user modifications, such as the display priority label, on restart.
+ *
+ * @author bedhere
+ * @since 2.27.0
+ */
+class AttachmentLocalPolicyResourceTest {
+
+ @Test
+ void defaultPolicyShouldBeMarkedAsDoNotOverwrite() {
+ var resource = new ClassPathResource("extensions/attachment-local-policy.yaml");
+ var unstructuredList = new YamlUnstructuredLoader(resource).load();
+
+ var defaultPolicy = unstructuredList.stream()
+ .filter(unstructured -> "Policy".equals(unstructured.getKind()))
+ .filter(unstructured ->
+ "default-policy".equals(unstructured.getMetadata().getName()))
+ .findFirst()
+ .orElseThrow();
+
+ assertThat(defaultPolicy.getMetadata().getLabels())
+ .as("Default policy must not be overwritten on startup, otherwise user "
+ + "modifications (e.g. upload display priority) are reverted on restart.")
+ .containsEntry(ExtensionUtil.DO_NOT_OVERWRITE_LABEL, "true");
+ }
+
+ @Test
+ void defaultPolicyConfigMapShouldBeMarkedAsDoNotOverwrite() {
+ var resource = new ClassPathResource("extensions/attachment-local-policy.yaml");
+ var unstructuredList = new YamlUnstructuredLoader(resource).load();
+
+ var configMap = unstructuredList.stream()
+ .filter(unstructured -> "ConfigMap".equals(unstructured.getKind()))
+ .filter(unstructured -> "default-policy-config"
+ .equals(unstructured.getMetadata().getName()))
+ .findFirst()
+ .orElseThrow();
+
+ assertThat(configMap.getMetadata().getLabels()).containsEntry(ExtensionUtil.DO_NOT_OVERWRITE_LABEL, "true");
+ }
+}
diff --git a/application/src/test/java/run/halo/app/infra/ExtensionResourceInitializerTest.java b/application/src/test/java/run/halo/app/infra/ExtensionResourceInitializerTest.java
index cec6dfbe8f..a315145643 100644
--- a/application/src/test/java/run/halo/app/infra/ExtensionResourceInitializerTest.java
+++ b/application/src/test/java/run/halo/app/infra/ExtensionResourceInitializerTest.java
@@ -10,6 +10,7 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -24,6 +25,7 @@
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.FileSystemUtils;
import reactor.core.publisher.Mono;
+import run.halo.app.extension.ExtensionUtil;
import run.halo.app.extension.GroupVersionKind;
import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.Unstructured;
@@ -165,4 +167,25 @@ void shouldStartCorrectly() throws Exception {
]
""", JsonUtils.objectToJson(values), false);
}
+
+ @Test
+ void shouldNotUpdateExtensionWithDoNotOverwriteLabel() throws Exception {
+ when(haloProperties.isRequiredExtensionDisabled()).thenReturn(true);
+ var existing = new Unstructured(Map.of(
+ "apiVersion", "v1",
+ "kind", "FakeExtension",
+ "metadata",
+ Map.of(
+ "name",
+ "fake-extension",
+ "labels",
+ Map.of(ExtensionUtil.DO_NOT_OVERWRITE_LABEL, "true"))));
+
+ when(extensionClient.fetch(any(GroupVersionKind.class), any())).thenReturn(Mono.just(existing));
+
+ extensionResourceInitializer.start();
+
+ verify(extensionClient, never()).update(any());
+ verify(extensionClient, never()).create(any());
+ }
}