From 6012c7ae99bda409b9780c0a2c17d803a19e0106 Mon Sep 17 00:00:00 2001 From: ndr_brt Date: Mon, 20 Nov 2023 15:15:33 +0100 Subject: [PATCH] fix: transform policy to contract offer (#3626) * fix: transform policy to contract offer * pr remarks --- .../from/JsonObjectFromPolicyTransformer.java | 6 +- .../JsonObjectFromPolicyTransformerTest.java | 12 ++- .../ContractNegotiationApiExtension.java | 4 +- .../JsonObjectToContractOfferTransformer.java | 44 ++++++++++ ...sonObjectToContractRequestTransformer.java | 39 ++++----- .../validation/ContractRequestValidator.java | 16 ++-- .../ContractNegotiationApiControllerTest.java | 35 +------- .../ContractNegotiationApiTest.java | 4 +- ...nObjectToContractOfferTransformerTest.java | 87 +++++++++++++++++++ ...bjectToContractRequestTransformerTest.java | 62 +++++++++---- .../ContractRequestValidatorTest.java | 62 ++++++++++--- .../edc/test/system/utils/Participant.java | 15 +--- .../README.md | 2 +- .../types/negotiation/ContractRequest.java | 18 +--- .../ContractNegotiationApiEndToEndTest.java | 40 +++++++-- .../TransferProcessApiEndToEndTest.java | 2 +- .../test/e2e/tracing/TracingEndToEndTest.java | 29 +++---- 17 files changed, 332 insertions(+), 145 deletions(-) create mode 100644 extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformer.java create mode 100644 extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformerTest.java diff --git a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformer.java b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformer.java index c06799d93d4..93433900e32 100644 --- a/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformer.java +++ b/core/common/transform-core/src/main/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformer.java @@ -157,7 +157,11 @@ public JsonObject visitPolicy(Policy policy) { .add(ODRL_PROHIBITION_ATTRIBUTE, prohibitionsBuilder) .add(ODRL_OBLIGATION_ATTRIBUTE, obligationsBuilder); - Optional.ofNullable(policy.getTarget()).ifPresent(it -> builder.add(ODRL_TARGET_ATTRIBUTE, it)); + Optional.ofNullable(policy.getTarget()) + .ifPresent(target -> builder.add( + ODRL_TARGET_ATTRIBUTE, + jsonFactory.createArrayBuilder().add(jsonFactory.createObjectBuilder().add(ID, target))) + ); return builder.build(); } diff --git a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformerTest.java b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformerTest.java index d99ddc10ecf..cfbed6e35d0 100644 --- a/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformerTest.java +++ b/core/common/transform-core/src/test/java/org/eclipse/edc/core/transform/transformer/from/JsonObjectFromPolicyTransformerTest.java @@ -17,6 +17,8 @@ import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonBuilderFactory; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; import org.eclipse.edc.policy.model.Action; import org.eclipse.edc.policy.model.AndConstraint; import org.eclipse.edc.policy.model.AtomicConstraint; @@ -36,6 +38,7 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.type; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VALUE; @@ -90,7 +93,14 @@ void transform_policyWithAllRuleTypes_returnJsonObject() { assertThat(result).isNotNull(); assertThat(result.getJsonString(TYPE).getString()).isEqualTo(OdrlNamespace.ODRL_SCHEMA + "Set"); - assertThat(result.getString(ODRL_TARGET_ATTRIBUTE)).isEqualTo("target"); + assertThat(result.get(ODRL_TARGET_ATTRIBUTE)) + .isNotNull() + .isInstanceOf(JsonArray.class) + .extracting(JsonValue::asJsonArray) + .matches(it -> !it.isEmpty()) + .asList().first() + .asInstanceOf(type(JsonObject.class)) + .matches(it -> it.getString(ID).equals("target")); assertThat(result.get(ODRL_PERMISSION_ATTRIBUTE)) .isNotNull() diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiExtension.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiExtension.java index 48a46e621e0..cad42503c3b 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiExtension.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiExtension.java @@ -21,6 +21,7 @@ import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectFromContractNegotiationTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectFromNegotiationStateTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractOfferDescriptionTransformer; +import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractOfferTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractRequestTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToTerminateNegotiationCommandTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.validation.ContractRequestValidator; @@ -68,7 +69,8 @@ public void initialize(ServiceExtensionContext context) { var factory = Json.createBuilderFactory(Map.of()); var monitor = context.getMonitor(); - transformerRegistry.register(new JsonObjectToContractRequestTransformer(monitor)); + transformerRegistry.register(new JsonObjectToContractRequestTransformer()); + transformerRegistry.register(new JsonObjectToContractOfferTransformer()); transformerRegistry.register(new JsonObjectToContractOfferDescriptionTransformer()); transformerRegistry.register(new JsonObjectToTerminateNegotiationCommandTransformer()); transformerRegistry.register(new JsonObjectFromContractNegotiationTransformer(factory)); diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformer.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformer.java new file mode 100644 index 00000000000..9a9f0a24903 --- /dev/null +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformer.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.edc.connector.api.management.contractnegotiation.transform; + +import jakarta.json.JsonObject; +import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.types.domain.offer.ContractOffer; +import org.eclipse.edc.transform.spi.TransformerContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JsonObjectToContractOfferTransformer extends AbstractJsonLdTransformer { + + public JsonObjectToContractOfferTransformer() { + super(JsonObject.class, ContractOffer.class); + } + + @Override + public @Nullable ContractOffer transform(@NotNull JsonObject jsonObject, @NotNull TransformerContext context) { + var policy = context.transform(jsonObject, Policy.class); + if (policy == null) { + return null; + } + var id = nodeId(jsonObject); + return ContractOffer.Builder.newInstance() + .id(id) + .assetId(policy.getTarget()) + .policy(policy) + .build(); + } +} diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformer.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformer.java index f287bcd3c0a..dccbc6134fb 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformer.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformer.java @@ -18,16 +18,12 @@ import org.eclipse.edc.connector.api.management.contractnegotiation.model.ContractOfferDescription; import org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest; import org.eclipse.edc.jsonld.spi.transformer.AbstractJsonLdTransformer; -import org.eclipse.edc.policy.model.Policy; -import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.offer.ContractOffer; import org.eclipse.edc.transform.spi.TransformerContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; - import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.CALLBACK_ADDRESSES; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.CONNECTOR_ADDRESS; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS; @@ -38,11 +34,8 @@ public class JsonObjectToContractRequestTransformer extends AbstractJsonLdTransformer { - private final Monitor monitor; - - public JsonObjectToContractRequestTransformer(Monitor monitor) { + public JsonObjectToContractRequestTransformer() { super(JsonObject.class, ContractRequest.class); - this.monitor = monitor; } @Override @@ -52,31 +45,33 @@ public JsonObjectToContractRequestTransformer(Monitor monitor) { .counterPartyAddress(counterPartyAddressOrConnectorAddress(jsonObject, context)) .protocol(transformString(jsonObject.get(PROTOCOL), context)); - var policyJson = jsonObject.get(POLICY); - if (policyJson != null) { - var policy = transformObject(jsonObject.get(POLICY), Policy.class, context); - contractRequestBuilder.policy(policy); + contractRequestBuilder.contractOffer(contractOffer(jsonObject, context)); + + var callbackAddress = jsonObject.get(CALLBACK_ADDRESSES); + if (callbackAddress != null) { + contractRequestBuilder.callbackAddresses(transformArray(callbackAddress, CallbackAddress.class, context)); + } + + return contractRequestBuilder.build(); + } + + private ContractOffer contractOffer(@NotNull JsonObject jsonObject, @NotNull TransformerContext context) { + var policy = jsonObject.get(POLICY); + if (policy != null) { + return transformObject(policy, ContractOffer.class, context); } var offerJson = jsonObject.get(OFFER); if (offerJson != null) { var contractOfferDescription = transformObject(jsonObject.get(OFFER), ContractOfferDescription.class, context); - var contractOffer = ContractOffer.Builder.newInstance() + return ContractOffer.Builder.newInstance() .id(contractOfferDescription.getOfferId()) .assetId(contractOfferDescription.getAssetId()) .policy(contractOfferDescription.getPolicy()) .build(); - contractRequestBuilder.contractOffer(contractOffer); } - var callbackAddress = jsonObject.get(CALLBACK_ADDRESSES); - if (callbackAddress != null) { - var addresses = new ArrayList(); - transformArrayOrObject(callbackAddress, CallbackAddress.class, addresses::add, context); - contractRequestBuilder.callbackAddresses(addresses); - } - - return contractRequestBuilder.build(); + return null; } private String getProviderId(@NotNull JsonObject jsonObject, @NotNull TransformerContext context) { diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidator.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidator.java index f6db13208c9..c8dca2b92e0 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidator.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/main/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidator.java @@ -19,11 +19,11 @@ import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.validator.jsonobject.JsonLdPath; import org.eclipse.edc.validator.jsonobject.JsonObjectValidator; +import org.eclipse.edc.validator.jsonobject.validators.MandatoryIdNotBlank; import org.eclipse.edc.validator.jsonobject.validators.MandatoryObject; import org.eclipse.edc.validator.jsonobject.validators.MandatoryValue; import org.eclipse.edc.validator.spi.ValidationResult; import org.eclipse.edc.validator.spi.Validator; -import org.eclipse.edc.validator.spi.Violation; import static java.lang.String.format; import static org.eclipse.edc.connector.api.management.contractnegotiation.model.ContractOfferDescription.ASSET_ID; @@ -34,6 +34,7 @@ import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.OFFER; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.POLICY; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.PROTOCOL; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; public class ContractRequestValidator { @@ -60,12 +61,15 @@ public ValidationResult validate(JsonObject input) { ).build().validate(input); } - var policyValidity = new MandatoryObject(path.append(POLICY)).validate(input); - if (policyValidity.succeeded()) { - return ValidationResult.success(); - } + var validator = JsonObjectValidator.newValidator() + .verify(POLICY, MandatoryObject::new) + .verifyObject(POLICY, builder -> builder + .verifyId(MandatoryIdNotBlank::new) + .verify(ODRL_TARGET_ATTRIBUTE, MandatoryObject::new) + .verifyObject(ODRL_TARGET_ATTRIBUTE, b -> b.verifyId(MandatoryIdNotBlank::new))) + .build(); - return ValidationResult.failure(Violation.violation(format("'%s' or '%s' must not be empty", OFFER, POLICY), path.toString())); + return validator.validate(input); } } diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiControllerTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiControllerTest.java index 39fab2eace2..02fe385fafb 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiControllerTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiControllerTest.java @@ -327,7 +327,7 @@ void getSingleContractNegotiationAgreement_whenNoneFound() { } @Test - void initiate_with_contractOffer() { + void initiate() { when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.success()); var contractNegotiation = createContractNegotiation("cn1"); var responseBody = createObjectBuilder().add(TYPE, ID_RESPONSE_TYPE).add(ID, contractNegotiation.getId()).build(); @@ -363,39 +363,6 @@ void initiate_with_contractOffer() { verifyNoMoreInteractions(transformerRegistry, service); } - @Test - void initiate_with_policy() { - when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.success()); - var contractNegotiation = createContractNegotiation("cn1"); - var responseBody = createObjectBuilder().add(TYPE, ID_RESPONSE_TYPE).add(ID, contractNegotiation.getId()).build(); - - when(transformerRegistry.transform(any(JsonObject.class), eq(ContractRequest.class))).thenReturn(Result.success( - ContractRequest.Builder.newInstance() - .protocol("test-protocol") - .providerId("test-provider-id") - .counterPartyAddress("test-cb") - .policy(Policy.Builder.newInstance().build()) - .build())); - - when(transformerRegistry.transform(any(), eq(JsonObject.class))).thenReturn(Result.success(responseBody)); - when(service.initiateNegotiation(any(ContractRequest.class))).thenReturn(contractNegotiation); - - when(transformerRegistry.transform(any(IdResponse.class), eq(JsonObject.class))).thenReturn(Result.success(responseBody)); - - baseRequest() - .contentType(JSON) - .body(createObjectBuilder().build()) - .post() - .then() - .statusCode(200) - .body(ID, is(contractNegotiation.getId())); - - verify(service).initiateNegotiation(any()); - verify(transformerRegistry).transform(any(JsonObject.class), eq(ContractRequest.class)); - verify(transformerRegistry).transform(any(IdResponse.class), eq(JsonObject.class)); - verifyNoMoreInteractions(transformerRegistry, service); - } - @Test void initiate_shouldReturnBadRequest_whenValidationFails() { when(validatorRegistry.validate(any(), any())).thenReturn(ValidationResult.failure(violation("error", "path"))); diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiTest.java index e6ecaee28e9..898503c1fda 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/ContractNegotiationApiTest.java @@ -19,6 +19,7 @@ import jakarta.json.JsonObject; import org.eclipse.edc.api.transformer.JsonObjectToCallbackAddressTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractOfferDescriptionTransformer; +import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractOfferTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToContractRequestTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.transform.JsonObjectToTerminateNegotiationCommandTransformer; import org.eclipse.edc.connector.api.management.contractnegotiation.validation.ContractRequestValidator; @@ -56,7 +57,8 @@ class ContractNegotiationApiTest { @BeforeEach void setUp() { - transformer.register(new JsonObjectToContractRequestTransformer(monitor)); + transformer.register(new JsonObjectToContractRequestTransformer()); + transformer.register(new JsonObjectToContractOfferTransformer()); transformer.register(new JsonObjectToContractOfferDescriptionTransformer()); transformer.register(new JsonObjectToCallbackAddressTransformer()); transformer.register(new JsonObjectToTerminateNegotiationCommandTransformer()); diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformerTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformerTest.java new file mode 100644 index 00000000000..dcadf150163 --- /dev/null +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractOfferTransformerTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + * + * Contributors: + * Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation + * + */ + +package org.eclipse.edc.connector.api.management.contractnegotiation.transform; + +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import org.eclipse.edc.jsonld.TitaniumJsonLd; +import org.eclipse.edc.jsonld.spi.JsonLd; +import org.eclipse.edc.policy.model.Policy; +import org.eclipse.edc.spi.monitor.Monitor; +import org.eclipse.edc.transform.spi.TransformerContext; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static jakarta.json.Json.createObjectBuilder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_OBLIGATION_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PERMISSION_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_SET; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PROHIBITION_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class JsonObjectToContractOfferTransformerTest { + + private final JsonLd jsonLd = new TitaniumJsonLd(mock(Monitor.class)); + private final TransformerContext context = mock(); + private JsonObjectToContractOfferTransformer transformer; + + @BeforeEach + void setUp() { + transformer = new JsonObjectToContractOfferTransformer(); + } + + @Test + void transform() { + var offerPolicy = createObjectBuilder() + .add(TYPE, ODRL_POLICY_TYPE_SET) + .add(ID, "test-offer-id") + .add(ODRL_TARGET_ATTRIBUTE, "test-asset") + .add(ODRL_PERMISSION_ATTRIBUTE, getJsonObject("permission")) + .add(ODRL_PROHIBITION_ATTRIBUTE, getJsonObject("prohibition")) + .add(ODRL_OBLIGATION_ATTRIBUTE, getJsonObject("duty")) + .build(); + + var policy = Policy.Builder.newInstance().target("test-asset").build(); + when(context.transform(any(JsonValue.class), eq(Policy.class))).thenReturn(policy); + + var result = transformer.transform(jsonLd.expand(offerPolicy).getContent(), context); + + assertThat(result).isNotNull(); + assertThat(result.getId()).isEqualTo("test-offer-id"); + assertThat(result.getAssetId()).isEqualTo("test-asset"); + } + + @Test + void shouldReturnNull_whenPolicyIsNull() { + when(context.transform(any(JsonValue.class), eq(Policy.class))).thenReturn(null); + + var result = transformer.transform(createObjectBuilder().build(), context); + + assertThat(result).isNull(); + } + + private JsonObject getJsonObject(String type) { + return createObjectBuilder() + .add(TYPE, type) + .build(); + } +} diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformerTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformerTest.java index 76480b399b4..9daaa66cb7d 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformerTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/transform/JsonObjectToContractRequestTransformerTest.java @@ -25,6 +25,8 @@ import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; +import org.eclipse.edc.spi.types.domain.offer.ContractOffer; +import org.eclipse.edc.transform.spi.ProblemBuilder; import org.eclipse.edc.transform.spi.TransformerContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -40,11 +42,13 @@ import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.OFFER; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.PROTOCOL; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.PROVIDER_ID; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_OBLIGATION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PERMISSION_ATTRIBUTE; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_POLICY_TYPE_SET; import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_PROHIBITION_ATTRIBUTE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.EVENTS; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.IS_TRANSACTIONAL; import static org.eclipse.edc.spi.types.domain.callback.CallbackAddress.URI; @@ -58,15 +62,43 @@ class JsonObjectToContractRequestTransformerTest { private final JsonLd jsonLd = new TitaniumJsonLd(mock(Monitor.class)); private final TransformerContext context = mock(); private JsonObjectToContractRequestTransformer transformer; - private final Monitor monitor = mock(); @BeforeEach void setUp() { - transformer = new JsonObjectToContractRequestTransformer(monitor); + transformer = new JsonObjectToContractRequestTransformer(); } @Test void transform() { + var jsonObject = Json.createObjectBuilder() + .add(TYPE, ContractRequest.CONTRACT_REQUEST_TYPE) + .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, "test-address") + .add(PROTOCOL, "test-protocol") + .add(PROVIDER_ID, "test-provider-id") + .add(CALLBACK_ADDRESSES, createCallbackAddress()) + .add(POLICY, createPolicy()) + .build(); + when(context.transform(any(JsonObject.class), eq(CallbackAddress.class))).thenReturn(CallbackAddress.Builder.newInstance() + .uri("http://test.local") + .events(Set.of("foo", "bar")) + .transactional(true) + .build()); + var offer = createContractOffer(); + when(context.transform(any(JsonValue.class), eq(ContractOffer.class))).thenReturn(offer); + + var request = transformer.transform(jsonLd.expand(jsonObject).getContent(), context); + + assertThat(request).isNotNull(); + assertThat(request.getProviderId()).isEqualTo("test-provider-id"); + assertThat(request.getCallbackAddresses()).isNotEmpty(); + assertThat(request.getProtocol()).isEqualTo("test-protocol"); + assertThat(request.getCounterPartyAddress()).isEqualTo("test-address"); + assertThat(request.getContractOffer()).isSameAs(offer); + } + + @Deprecated(since = "0.3.2") + @Test + void deprecated_transform_contractOfferFromOfferAttribute() { var jsonObject = Json.createObjectBuilder() .add(TYPE, ContractRequest.CONTRACT_REQUEST_TYPE) .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, "test-address") @@ -86,6 +118,8 @@ void transform() { .assetId("assetId") .policy(policy) .build(); + when(context.transform(any(JsonValue.class), eq(ContractOffer.class))).thenReturn(null); + when(context.problem()).thenReturn(new ProblemBuilder(context)); when(context.transform(any(JsonValue.class), eq(ContractOfferDescription.class))).thenReturn(contractOfferDescription); when(context.transform(any(JsonObject.class), eq(CallbackAddress.class))).thenReturn(CallbackAddress.Builder.newInstance() @@ -93,7 +127,7 @@ void transform() { .events(Set.of("foo", "bar")) .transactional(true) .build()); - + var request = transformer.transform(jsonLd.expand(jsonObject).getContent(), context); assertThat(request).isNotNull(); @@ -115,20 +149,9 @@ void transform_shouldSetProviderIdAsCounterPartyAddress_whenProviderIdNotDefined .add(TYPE, ContractRequest.CONTRACT_REQUEST_TYPE) .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, "test-address") .add(PROTOCOL, "test-protocol") - .add(OFFER, Json.createObjectBuilder() - .add(OFFER_ID, "test-offer-id") - .add(ASSET_ID, "test-asset") - .add(POLICY, createPolicy()) - .build()) + .add(POLICY, createPolicy()) .build(); - - var policy = Policy.Builder.newInstance().build(); - var contractOfferDescription = ContractOfferDescription.Builder.newInstance() - .offerId("offerId") - .assetId("assetId") - .policy(policy) - .build(); - when(context.transform(any(JsonValue.class), eq(ContractOfferDescription.class))).thenReturn(contractOfferDescription); + when(context.transform(any(JsonValue.class), eq(ContractOffer.class))).thenReturn(createContractOffer()); var request = transformer.transform(jsonLd.expand(jsonObject).getContent(), context); @@ -136,6 +159,11 @@ void transform_shouldSetProviderIdAsCounterPartyAddress_whenProviderIdNotDefined assertThat(request.getProviderId()).isEqualTo("test-address"); } + private ContractOffer createContractOffer() { + var policy = Policy.Builder.newInstance().target("test-asset").build(); + return ContractOffer.Builder.newInstance().id("offer-id").assetId("asset-id").policy(policy).build(); + } + private JsonArrayBuilder createCallbackAddress() { var builder = Json.createArrayBuilder(); return builder.add(Json.createObjectBuilder() @@ -150,6 +178,8 @@ private JsonObject createPolicy() { var dutyJson = getJsonObject("duty"); return Json.createObjectBuilder() .add(TYPE, ODRL_POLICY_TYPE_SET) + .add(ID, "test-offer-id") + .add(ODRL_TARGET_ATTRIBUTE, "test-asset") .add(ODRL_PERMISSION_ATTRIBUTE, permissionJson) .add(ODRL_PROHIBITION_ATTRIBUTE, prohibitionJson) .add(ODRL_OBLIGATION_ATTRIBUTE, dutyJson) diff --git a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java index b86c12c4142..d40be124581 100644 --- a/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java +++ b/extensions/control-plane/api/management-api/contract-negotiation-api/src/test/java/org/eclipse/edc/connector/api/management/contractnegotiation/validation/ContractRequestValidatorTest.java @@ -35,7 +35,9 @@ import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.OFFER; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.PROTOCOL; import static org.eclipse.edc.connector.contract.spi.types.negotiation.ContractRequest.PROVIDER_ID; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VALUE; +import static org.eclipse.edc.jsonld.spi.PropertyAndTypeNames.ODRL_TARGET_ATTRIBUTE; import static org.eclipse.edc.junit.assertions.AbstractResultAssert.assertThat; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -52,11 +54,9 @@ void shouldSuccess_whenObjectIsValid() { .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, value("http://connector-address")) .add(PROTOCOL, value("protocol")) .add(PROVIDER_ID, value("connector-id")) - .add(OFFER, createArrayBuilder().add(createObjectBuilder() - .add(OFFER_ID, value("offerId")) - .add(ASSET_ID, value("offerId")) - .add(POLICY, createArrayBuilder().add(createObjectBuilder())) - )) + .add(POLICY, createArrayBuilder().add(createObjectBuilder() + .add(ID, "offer-id") + .add(ODRL_TARGET_ATTRIBUTE, createArrayBuilder().add(createObjectBuilder().add(ID, "target"))))) .build(); var result = validator.validate(input); @@ -65,22 +65,35 @@ void shouldSuccess_whenObjectIsValid() { } @Test - void shouldFail_whenOfferMandatoryPropertiesAreMissing() { + void shouldFail_whenPolicyMissesId() { var input = Json.createObjectBuilder() .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, value("http://connector-address")) - .add(CONNECTOR_ADDRESS, value("http://connector-address")) .add(PROTOCOL, value("protocol")) .add(PROVIDER_ID, value("connector-id")) - .add(OFFER, createArrayBuilder().add(createObjectBuilder())) + .add(POLICY, createArrayBuilder().add(createObjectBuilder())) .build(); var result = validator.validate(input); assertThat(result).isFailed().extracting(ValidationFailure::getViolations).asInstanceOf(list(Violation.class)) .isNotEmpty() - .anySatisfy(violation -> assertThat(violation.path()).contains(OFFER_ID)) - .anySatisfy(violation -> assertThat(violation.path()).contains(ASSET_ID)) - .anySatisfy(violation -> assertThat(violation.path()).contains(POLICY)); + .anySatisfy(violation -> assertThat(violation.message()).contains(ID)); + } + + @Test + void shouldFail_whenPolicyMissesTarget() { + var input = Json.createObjectBuilder() + .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, value("http://connector-address")) + .add(PROTOCOL, value("protocol")) + .add(PROVIDER_ID, value("connector-id")) + .add(POLICY, createArrayBuilder().add(createObjectBuilder().add(ID, "offer-id"))) + .build(); + + var result = validator.validate(input); + + assertThat(result).isFailed().extracting(ValidationFailure::getViolations).asInstanceOf(list(Violation.class)) + .isNotEmpty() + .anySatisfy(violation -> assertThat(violation.message()).contains(ODRL_TARGET_ATTRIBUTE)); } @Test @@ -95,7 +108,6 @@ void shouldFail_whenOfferAndPolicyAreMissing() { assertThat(result).isFailed().extracting(ValidationFailure::getViolations).asInstanceOf(list(Violation.class)) .isNotEmpty() - .anySatisfy(violation -> assertThat(violation.message()).contains(OFFER)) .anySatisfy(violation -> assertThat(violation.message()).contains(POLICY)); } @@ -111,6 +123,27 @@ void shouldFail_whenMandatoryPropertiesAreMissing() { .anySatisfy(violation -> assertThat(violation.path()).isEqualTo(PROTOCOL)); } + @Deprecated(since = "0.3.2") + @Test + void shouldFail_whenOfferMandatoryPropertiesAreMissing() { + var input = Json.createObjectBuilder() + .add(CONTRACT_REQUEST_COUNTER_PARTY_ADDRESS, value("http://connector-address")) + .add(CONNECTOR_ADDRESS, value("http://connector-address")) + .add(PROTOCOL, value("protocol")) + .add(PROVIDER_ID, value("connector-id")) + .add(OFFER, createArrayBuilder().add(createObjectBuilder())) + .build(); + + var result = validator.validate(input); + + assertThat(result).isFailed().extracting(ValidationFailure::getViolations).asInstanceOf(list(Violation.class)) + .isNotEmpty() + .anySatisfy(violation -> assertThat(violation.path()).contains(OFFER_ID)) + .anySatisfy(violation -> assertThat(violation.path()).contains(ASSET_ID)) + .anySatisfy(violation -> assertThat(violation.path()).contains(POLICY)); + } + + @Deprecated(since = "0.3.2") @Test void shouldSucceed_whenDeprecatedOfferIsUsed() { var input = Json.createObjectBuilder() @@ -128,13 +161,16 @@ void shouldSucceed_whenDeprecatedOfferIsUsed() { verify(monitor).warning(anyString()); } + @Deprecated(since = "0.3.2") @Test void shouldSucceed_whenDeprecatedConnectorAddressIsUsed() { var input = Json.createObjectBuilder() .add(CONNECTOR_ADDRESS, value("http://connector-address")) .add(PROTOCOL, value("protocol")) .add(PROVIDER_ID, value("connector-id")) - .add(POLICY, createArrayBuilder().add(createObjectBuilder())) + .add(POLICY, createArrayBuilder().add(createObjectBuilder() + .add(ID, "offer-id") + .add(ODRL_TARGET_ATTRIBUTE, createArrayBuilder().add(createObjectBuilder().add(ID, "target"))))) .build(); var result = validator.validate(input); diff --git a/extensions/control-plane/api/management-api/management-api-test-fixtures/src/testFixtures/java/org/eclipse/edc/test/system/utils/Participant.java b/extensions/control-plane/api/management-api/management-api-test-fixtures/src/testFixtures/java/org/eclipse/edc/test/system/utils/Participant.java index 2d6d308bcc2..626b7b17f89 100644 --- a/extensions/control-plane/api/management-api/management-api-test-fixtures/src/testFixtures/java/org/eclipse/edc/test/system/utils/Participant.java +++ b/extensions/control-plane/api/management-api/management-api-test-fixtures/src/testFixtures/java/org/eclipse/edc/test/system/utils/Participant.java @@ -237,23 +237,17 @@ public JsonObject getDatasetForAsset(Participant provider, String assetId) { * Initiate negotiation with a provider. * * @param provider data provider - * @param offerId contract definition id - * @param assetId asset id * @param policy policy * @return id of the contract agreement. */ - public String negotiateContract(Participant provider, String offerId, String assetId, JsonObject policy) { + public String negotiateContract(Participant provider, JsonObject policy) { var requestBody = createObjectBuilder() .add(CONTEXT, createObjectBuilder().add(VOCAB, EDC_NAMESPACE)) .add(TYPE, "ContractRequestDto") .add("providerId", provider.id) .add("counterPartyAddress", provider.protocolEndpoint.url.toString()) .add("protocol", DSP_PROTOCOL) - .add("offer", createObjectBuilder() - .add("offerId", offerId) - .add("assetId", assetId) - .add("policy", jsonLd.compact(policy).getContent()) - ) + .add("policy", jsonLd.compact(policy).getContent()) .build(); var negotiationId = managementEndpoint.baseRequest() @@ -262,6 +256,7 @@ public String negotiateContract(Participant provider, String offerId, String ass .when() .post("/v2/contractnegotiations") .then() + .log().ifError() .statusCode(200) .extract().body().jsonPath().getString(ID); @@ -322,9 +317,7 @@ public String initiateTransfer(Participant provider, String contractAgreementId, public String requestAsset(Participant provider, String assetId, JsonObject privateProperties, JsonObject destination) { var dataset = getDatasetForAsset(provider, assetId); var policy = dataset.getJsonArray(ODRL_POLICY_ATTRIBUTE).get(0).asJsonObject(); - var contractDefinitionId = ContractOfferId.parseId(policy.getString(ID)) - .orElseThrow(failure -> new RuntimeException(failure.getFailureDetail())); - var contractAgreementId = negotiateContract(provider, contractDefinitionId.toString(), assetId, policy); + var contractAgreementId = negotiateContract(provider, policy); var transferProcessId = initiateTransfer(provider, contractAgreementId, assetId, privateProperties, destination); assertThat(transferProcessId).isNotNull(); return transferProcessId; diff --git a/extensions/control-plane/transfer/transfer-pull-http-dynamic-receiver/README.md b/extensions/control-plane/transfer/transfer-pull-http-dynamic-receiver/README.md index 4ff3d5b906a..ae5841c9789 100644 --- a/extensions/control-plane/transfer/transfer-pull-http-dynamic-receiver/README.md +++ b/extensions/control-plane/transfer/transfer-pull-http-dynamic-receiver/README.md @@ -18,7 +18,7 @@ and will be used by the consumer connector to dispatch the EDR "@type": "DataAddress", "type": "HttpProxy" }, - "connectorAddress": "http://localhost:8282/api/v1/ids/data", + "counterPartyAddress": "http://localhost:8282/api/v1/ids/data", "connectorId": "consumer", "privateProperties": { "receiverHttpEndpoint" : "http://localhost:9999" diff --git a/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/contract/spi/types/negotiation/ContractRequest.java b/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/contract/spi/types/negotiation/ContractRequest.java index a3da88a0119..65298bf9fb7 100644 --- a/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/contract/spi/types/negotiation/ContractRequest.java +++ b/spi/control-plane/contract-spi/src/main/java/org/eclipse/edc/connector/contract/spi/types/negotiation/ContractRequest.java @@ -14,7 +14,6 @@ package org.eclipse.edc.connector.contract.spi.types.negotiation; -import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.spi.types.domain.callback.CallbackAddress; import org.eclipse.edc.spi.types.domain.offer.ContractOffer; @@ -44,7 +43,6 @@ public class ContractRequest { private String protocol; private String counterPartyAddress; private ContractOffer contractOffer; - private Policy policy; private List callbackAddresses = new ArrayList<>(); public List getCallbackAddresses() { @@ -67,10 +65,6 @@ public ContractOffer getContractOffer() { return contractOffer; } - public Policy getPolicy() { - return policy; - } - public static class Builder { private final ContractRequest contractRequest; @@ -107,20 +101,10 @@ public Builder contractOffer(ContractOffer contractOffer) { return this; } - public Builder policy(Policy policy) { - contractRequest.policy = policy; - return this; - } - public ContractRequest build() { Objects.requireNonNull(contractRequest.protocol, "protocol"); Objects.requireNonNull(contractRequest.counterPartyAddress, "counterPartyAddress"); - if (contractRequest.contractOffer == null) { - Objects.requireNonNull(contractRequest.policy, "policy"); - } - if (contractRequest.policy == null) { - Objects.requireNonNull(contractRequest.contractOffer, "contractOffer"); - } + Objects.requireNonNull(contractRequest.contractOffer, "contractOffer"); return contractRequest; } } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java index fac45856a94..d2e3d220386 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/ContractNegotiationApiEndToEndTest.java @@ -130,15 +130,42 @@ void initiateNegotiation() { var requestJson = createObjectBuilder() .add(CONTEXT, createObjectBuilder().add(EDC_PREFIX, EDC_NAMESPACE)) .add(TYPE, "ContractRequest") - .add("connectorAddress", "test-address") + .add("counterPartyAddress", "test-address") + .add("protocol", "test-protocol") + .add("providerId", "test-provider-id") + .add("callbackAddresses", createCallbackAddress()) + .add("policy", createPolicy()) + .build(); + + var id = baseRequest() + .contentType(JSON) + .body(requestJson) + .post("/v2/contractnegotiations") + .then() + .statusCode(200) + .contentType(JSON) + .extract().jsonPath().getString(ID); + + var store = controlPlane.getContext().getService(ContractNegotiationStore.class); + + assertThat(store.findById(id)).isNotNull(); + } + + @Deprecated(since = "0.3.2") + @Test + void deprecated_initiateNegotiation() { + + var requestJson = createObjectBuilder() + .add(CONTEXT, createObjectBuilder().add(EDC_PREFIX, EDC_NAMESPACE)) + .add(TYPE, "ContractRequest") + .add("counterPartyAddress", "test-address") .add("protocol", "test-protocol") .add("providerId", "test-provider-id") .add("callbackAddresses", createCallbackAddress()) .add("offer", createObjectBuilder() - .add("offerId", "test-offer-id") - .add("assetId", "test-asset") - .add("policy", createPolicy()) - .build()) + .add("offerId", "offer-id") + .add("assetId", "assetId") + .add("policy", createPolicy())) .build(); var id = baseRequest() @@ -146,6 +173,7 @@ void initiateNegotiation() { .body(requestJson) .post("/v2/contractnegotiations") .then() + .log().ifError() .statusCode(200) .contentType(JSON) .extract().jsonPath().getString(ID); @@ -226,9 +254,11 @@ private JsonObject createPolicy() { return createObjectBuilder() .add(CONTEXT, "http://www.w3.org/ns/odrl.jsonld") .add(TYPE, "Offer") + .add(ID, "offer-id") .add("permission", permissionJson) .add("prohibition", prohibitionJson) .add("obligation", dutyJson) + .add("target", "asset-id") .build(); } diff --git a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java index febc6e97601..c7cedd290f6 100644 --- a/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java +++ b/system-tests/management-api/management-api-test-runner/src/test/java/org/eclipse/edc/test/e2e/managementapi/TransferProcessApiEndToEndTest.java @@ -109,7 +109,7 @@ void create() { ) .add("callbackAddresses", createCallbackAddress()) .add("protocol", "dataspace-protocol-http") - .add("connectorAddress", "http://connector-address") + .add("counterPartyAddress", "http://connector-address") .add("connectorId", "connectorId") .add("contractId", "contractId") .add("assetId", "assetId") diff --git a/system-tests/telemetry/telemetry-test-runner/src/test/java/org/eclipse/edc/test/e2e/tracing/TracingEndToEndTest.java b/system-tests/telemetry/telemetry-test-runner/src/test/java/org/eclipse/edc/test/e2e/tracing/TracingEndToEndTest.java index a3984c0d5c9..24565572693 100644 --- a/system-tests/telemetry/telemetry-test-runner/src/test/java/org/eclipse/edc/test/e2e/tracing/TracingEndToEndTest.java +++ b/system-tests/telemetry/telemetry-test-runner/src/test/java/org/eclipse/edc/test/e2e/tracing/TracingEndToEndTest.java @@ -18,7 +18,6 @@ import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; import io.opentelemetry.proto.trace.v1.Span; import jakarta.json.Json; -import jakarta.json.JsonObject; import org.eclipse.edc.junit.annotations.EndToEndTest; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -38,8 +37,10 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.CONTEXT; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.ID; import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.TYPE; +import static org.eclipse.edc.jsonld.spi.JsonLdKeywords.VOCAB; import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; /** @@ -72,15 +73,17 @@ void transferFile_testTraces() { traceCollectorServer.when(HttpRequest.request()).respond(HttpResponse.response().withStatusCode(200)); var requestJson = Json.createObjectBuilder() - .add(TYPE, EDC_NAMESPACE + "ContractRequest") - .add(EDC_NAMESPACE + "connectorAddress", "test-address") - .add(EDC_NAMESPACE + "protocol", "test-protocol") - .add(EDC_NAMESPACE + "providerId", "test-provider-id") - .add(EDC_NAMESPACE + "consumerId", "test-consumer-id") - .add(EDC_NAMESPACE + "offer", Json.createObjectBuilder() - .add(EDC_NAMESPACE + "offerId", "test-offer-id") - .add(EDC_NAMESPACE + "assetId", "test-asset") - .add(EDC_NAMESPACE + "policy", noConstraintPolicy()) + .add(CONTEXT, Json.createObjectBuilder().add(VOCAB, EDC_NAMESPACE)) + .add(TYPE, "ContractRequest") + .add("counterPartyAddress", "test-address") + .add("protocol", "test-protocol") + .add("providerId", "test-provider-id") + .add("consumerId", "test-consumer-id") + .add("policy", Json.createObjectBuilder() + .add(CONTEXT, "http://www.w3.org/ns/odrl.jsonld") + .add(TYPE, "use") + .add(ID, "offer-id") + .add("target", "test-asset") .build()) .build(); @@ -91,6 +94,7 @@ void transferFile_testTraces() { .body(requestJson) .post("/management/v2/contractnegotiations") .then() + .log().ifError() .statusCode(200) .contentType(JSON) .extract().jsonPath().getString(ID); @@ -128,9 +132,4 @@ private List extractSpansFromRequests(HttpRequest[] requests) { .collect(Collectors.toList()); } - private JsonObject noConstraintPolicy() { - return Json.createObjectBuilder() - .add(TYPE, "use") - .build(); - } }