Simplify references in Attachment (#2800)

#### What type of PR is this?

/kind improvement
/kind api-change
/area core
/milestone 2.0.x

#### What this PR does / why we need it:

This PR replace refs in Attachment extension with simple name.

> **Warning** Please @halo-dev/sig-halo-console be aware of that this PR contains break changes, so that we can not use Attachment feature in the console directly. The console has to adapt the break changes.

#### Does this PR introduce a user-facing change?

```release-note
None
```
pull/2799/head
John Niang 2022-11-30 10:23:46 +08:00 committed by GitHub
parent 5be038834e
commit eefdd27c44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 55 deletions

View File

@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import run.halo.app.extension.AbstractExtension; import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK; import run.halo.app.extension.GVK;
import run.halo.app.extension.Ref;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@ -32,14 +31,14 @@ public class Attachment extends AbstractExtension {
@Schema(description = "Display name of attachment") @Schema(description = "Display name of attachment")
private String displayName; private String displayName;
@Schema(description = "Reference of Group") @Schema(description = "Group name")
private Ref groupRef; private String groupName;
@Schema(description = "Reference of Policy") @Schema(description = "Policy name")
private Ref policyRef; private String policyName;
@Schema(description = "Reference of User who uploads the attachment") @Schema(description = "Name of User who uploads the attachment")
private Ref uploadedBy; private String ownerName;
@Schema(description = "Media type of attachment") @Schema(description = "Media type of attachment")
private String mediaType; private String mediaType;

View File

@ -1,5 +1,6 @@
package run.halo.app.core.extension.attachment; package run.halo.app.core.extension.attachment;
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
import static run.halo.app.core.extension.attachment.Policy.KIND; import static run.halo.app.core.extension.attachment.Policy.KIND;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ -8,31 +9,30 @@ import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import run.halo.app.extension.AbstractExtension; import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK; import run.halo.app.extension.GVK;
import run.halo.app.extension.Ref;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@GVK(group = Constant.GROUP, version = Constant.VERSION, kind = KIND, plural = "policies", @GVK(group = Constant.GROUP, version = Constant.VERSION, kind = KIND,
singular = "policy") plural = "policies", singular = "policy")
public class Policy extends AbstractExtension { public class Policy extends AbstractExtension {
public static final String KIND = "Policy"; public static final String KIND = "Policy";
@Schema(required = true) @Schema(requiredMode = REQUIRED)
private PolicySpec spec; private PolicySpec spec;
@Data @Data
public static class PolicySpec { public static class PolicySpec {
@Schema(required = true, description = "Display name of policy") @Schema(requiredMode = REQUIRED, description = "Display name of policy")
private String displayName; private String displayName;
@Schema(description = "Reference name of Setting extension") @Schema(requiredMode = REQUIRED, description = "Reference name of PolicyTemplate")
private Ref templateRef; private String templateName;
@Schema(description = "Reference name of ConfigMap extension") @Schema(description = "Reference name of ConfigMap extension")
private Ref configMapRef; private String configMapName;
} }

View File

@ -1,13 +1,14 @@
package run.halo.app.core.extension.attachment; package run.halo.app.core.extension.attachment;
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
import static run.halo.app.core.extension.attachment.PolicyTemplate.KIND; import static run.halo.app.core.extension.attachment.PolicyTemplate.KIND;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import run.halo.app.extension.AbstractExtension; import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK; import run.halo.app.extension.GVK;
import run.halo.app.extension.Ref;
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@ -25,7 +26,8 @@ public class PolicyTemplate extends AbstractExtension {
private String displayName; private String displayName;
private Ref settingRef; @Schema(requiredMode = REQUIRED)
private String settingName;
} }

View File

@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -49,7 +50,6 @@ import run.halo.app.core.extension.endpoint.SortResolver;
import run.halo.app.extension.Comparators; import run.halo.app.extension.Comparators;
import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ConfigMap;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.Ref;
import run.halo.app.extension.router.IListRequest; import run.halo.app.extension.router.IListRequest;
import run.halo.app.extension.router.IListRequest.QueryListRequest; import run.halo.app.extension.router.IListRequest.QueryListRequest;
import run.halo.app.plugin.ExtensionComponentsFinder; import run.halo.app.plugin.ExtensionComponentsFinder;
@ -108,11 +108,11 @@ public class AttachmentEndpoint implements CustomEndpoint {
.map(UploadRequest::new) .map(UploadRequest::new)
// prepare the upload option // prepare the upload option
.flatMap(uploadRequest -> client.get(Policy.class, uploadRequest.getPolicyName()) .flatMap(uploadRequest -> client.get(Policy.class, uploadRequest.getPolicyName())
.filter(policy -> policy.getSpec().getConfigMapRef() != null) .filter(policy -> StringUtils.hasText(policy.getSpec().getConfigMapName()))
.switchIfEmpty(Mono.error(() -> new ServerWebInputException( .switchIfEmpty(Mono.error(() -> new ServerWebInputException(
"Please configure the attachment policy before uploading"))) "Please configure the attachment policy before uploading")))
.flatMap(policy -> { .flatMap(policy -> {
var configMapName = policy.getSpec().getConfigMapRef().getName(); var configMapName = policy.getSpec().getConfigMapName();
return client.get(ConfigMap.class, configMapName) return client.get(ConfigMap.class, configMapName)
.map(configMap -> new UploadOption(uploadRequest.getFile(), policy, .map(configMap -> new UploadOption(uploadRequest.getFile(), policy,
configMap)); configMap));
@ -127,12 +127,12 @@ public class AttachmentEndpoint implements CustomEndpoint {
spec = new Attachment.AttachmentSpec(); spec = new Attachment.AttachmentSpec();
attachment.setSpec(spec); attachment.setSpec(spec);
} }
spec.setUploadedBy(Ref.of(username)); spec.setOwnerName(username);
spec.setPolicyRef(Ref.of(uploadOption.policy())); spec.setPolicyName(uploadOption.policy().getMetadata().getName());
var groupName = uploadRequest.getGroupName(); var groupName = uploadRequest.getGroupName();
if (groupName != null) { if (groupName != null) {
// validate the group name // validate the group name
spec.setGroupRef(Ref.of(groupName)); spec.setGroupName(groupName);
} }
})) }))
.next() .next()
@ -239,31 +239,20 @@ public class AttachmentEndpoint implements CustomEndpoint {
}).orElse(true); }).orElse(true);
Predicate<Attachment> policyPred = attachment -> getPolicy() Predicate<Attachment> policyPred = attachment -> getPolicy()
.map(policy -> { .map(policy -> Objects.equals(policy, attachment.getSpec().getPolicyName()))
var policyRef = attachment.getSpec().getPolicyRef(); .orElse(true);
return policyRef != null && policy.equals(policyRef.getName());
}).orElse(true);
Predicate<Attachment> groupPred = attachment -> getGroup() Predicate<Attachment> groupPred = attachment -> getGroup()
.map(group -> { .map(group -> Objects.equals(group, attachment.getSpec().getGroupName()))
var groupRef = attachment.getSpec().getGroupRef();
return groupRef != null && group.equals(groupRef.getName());
})
.orElse(true); .orElse(true);
Predicate<Attachment> ungroupedPred = attachment -> getUngrouped() Predicate<Attachment> ungroupedPred = attachment -> getUngrouped()
.filter(Boolean::booleanValue) .filter(Boolean::booleanValue)
.map(ungrouped -> { .map(ungrouped -> !StringUtils.hasText(attachment.getSpec().getGroupName()))
var groupRef = attachment.getSpec().getGroupRef();
return groupRef == null || !StringUtils.hasText(groupRef.getName());
})
.orElseGet(() -> groupPred.test(attachment)); .orElseGet(() -> groupPred.test(attachment));
Predicate<Attachment> uploadedByPred = attachment -> getUploadedBy() Predicate<Attachment> uploadedByPred = attachment -> getUploadedBy()
.map(uploadedBy -> { .map(uploadedBy -> Objects.equals(uploadedBy, attachment.getSpec().getOwnerName()))
var uploadedByRef = attachment.getSpec().getUploadedBy();
return uploadedByRef != null && uploadedBy.equals(uploadedByRef.getName());
})
.orElse(true); .orElse(true);

View File

@ -130,10 +130,10 @@ class LocalAttachmentUploadHandler implements AttachmentHandler {
private boolean shouldHandle(Policy policy) { private boolean shouldHandle(Policy policy) {
if (policy == null if (policy == null
|| policy.getSpec() == null || policy.getSpec() == null
|| policy.getSpec().getTemplateRef() == null) { || !StringUtils.hasText(policy.getSpec().getTemplateName())) {
return false; return false;
} }
return "local".equals(policy.getSpec().getTemplateRef().getName()); return "local".equals(policy.getSpec().getTemplateName());
} }
@Data @Data

View File

@ -49,11 +49,9 @@ public class AttachmentReconciler implements Reconciler<Request> {
client.fetch(Attachment.class, request.name()).ifPresent(attachment -> { client.fetch(Attachment.class, request.name()).ifPresent(attachment -> {
// TODO Handle the finalizer // TODO Handle the finalizer
if (attachment.getMetadata().getDeletionTimestamp() != null) { if (attachment.getMetadata().getDeletionTimestamp() != null) {
Policy policy = Policy policy = client.fetch(Policy.class, attachment.getSpec().getPolicyName())
client.fetch(Policy.class, attachment.getSpec().getPolicyRef().getName())
.orElseThrow(); .orElseThrow();
var configMap = var configMap = client.fetch(ConfigMap.class, policy.getSpec().getConfigMapName())
client.fetch(ConfigMap.class, policy.getSpec().getConfigMapRef().getName())
.orElseThrow(); .orElseThrow();
var deleteOption = new DeleteOption(attachment, policy, configMap); var deleteOption = new DeleteOption(attachment, policy, configMap);
Flux.fromIterable(extensionComponentsFinder.getExtensions(AttachmentHandler.class)) Flux.fromIterable(extensionComponentsFinder.getExtensions(AttachmentHandler.class))

View File

@ -4,8 +4,7 @@ metadata:
name: local name: local
spec: spec:
displayName: Local Storage displayName: Local Storage
settingRef: settingName: local-policy-template-setting
name: local-policy-template-setting
--- ---
apiVersion: v1alpha1 apiVersion: v1alpha1
kind: Setting kind: Setting

View File

@ -37,7 +37,6 @@ import run.halo.app.extension.ConfigMap;
import run.halo.app.extension.ListResult; import run.halo.app.extension.ListResult;
import run.halo.app.extension.Metadata; import run.halo.app.extension.Metadata;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.Ref;
import run.halo.app.plugin.ExtensionComponentsFinder; import run.halo.app.plugin.ExtensionComponentsFinder;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
@ -104,7 +103,7 @@ class AttachmentEndpointTest {
@Test @Test
void shouldUploadSuccessfully() { void shouldUploadSuccessfully() {
var policySpec = new PolicySpec(); var policySpec = new PolicySpec();
policySpec.setConfigMapRef(Ref.of("fake-configmap")); policySpec.setConfigMapName("fake-configmap");
var policyMetadata = new Metadata(); var policyMetadata = new Metadata();
policyMetadata.setName("fake-policy"); policyMetadata.setName("fake-policy");
var policy = new Policy(); var policy = new Policy();
@ -146,9 +145,9 @@ class AttachmentEndpointTest {
.expectStatus().isOk() .expectStatus().isOk()
.expectBody() .expectBody()
.jsonPath("$.metadata.name").isEqualTo("fake-attachment") .jsonPath("$.metadata.name").isEqualTo("fake-attachment")
.jsonPath("$.spec.uploadedBy.name").isEqualTo("fake-user") .jsonPath("$.spec.ownerName").isEqualTo("fake-user")
.jsonPath("$.spec.policyRef.name").isEqualTo("fake-policy") .jsonPath("$.spec.policyName").isEqualTo("fake-policy")
.jsonPath("$.spec.groupRef.name").isEqualTo("fake-group") .jsonPath("$.spec.groupName").isEqualTo("fake-group")
; ;
verify(client).get(Policy.class, "fake-policy"); verify(client).get(Policy.class, "fake-policy");
@ -195,7 +194,7 @@ class AttachmentEndpointTest {
assertTrue(pred.test(attachment)); assertTrue(pred.test(attachment));
spec.setGroupRef(Ref.of("halo")); spec.setGroupName("halo");
assertFalse(pred.test(attachment)); assertFalse(pred.test(attachment));
} }
} }