diff --git a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApi.java b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApi.java index 1443f480..311aae85 100644 --- a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApi.java +++ b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApi.java @@ -14,36 +14,22 @@ package com.ionos.edc.extension.s3.api; -import io.minio.Result; -import io.minio.messages.Item; import org.eclipse.edc.runtime.metamodel.annotation.ExtensionPoint; import com.ionos.edc.extension.s3.connector.ionosapi.TemporaryKey; import java.io.ByteArrayInputStream; - - @ExtensionPoint public interface S3ConnectorApi { - void s3ConnectorApi(String endpoint, String accessKey, String secretKey, String token); - void createBucket(String bucketName); - void deleteBucket(String bucketName); - boolean bucketExists(String bucketName); - - void uploadFile(String bucketName, String fileName, String path); void uploadParts(String bucketName, String fileName, ByteArrayInputStream part); byte[] getFile(String bucketName, String fileName); - - Result listItems(String bucketName); - - void deleteFile(String bucketName, String fileName); TemporaryKey createTemporaryKey(); diff --git a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApiImpl.java b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApiImpl.java index db973edf..ef469164 100644 --- a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApiImpl.java +++ b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/api/S3ConnectorApiImpl.java @@ -20,21 +20,15 @@ import io.minio.BucketExistsArgs; import io.minio.GetObjectArgs; -import io.minio.ListObjectsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.PutObjectArgs; -import io.minio.RemoveBucketArgs; -import io.minio.RemoveObjectArgs; -import io.minio.Result; -import io.minio.UploadObjectArgs; import io.minio.errors.ErrorResponseException; import io.minio.errors.InsufficientDataException; import io.minio.errors.InternalException; import io.minio.errors.InvalidResponseException; import io.minio.errors.ServerException; import io.minio.errors.XmlParserException; -import io.minio.messages.Item; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -47,169 +41,85 @@ public class S3ConnectorApiImpl implements S3ConnectorApi { MinioConnector minConnector = new MinioConnector(); HttpConnector ionosApi = new HttpConnector(); - + private MinioClient minioClient; - private String region; - private String token; + private final String region; + private final String token; - - public S3ConnectorApiImpl(String endpoint, String accessKey, String secretKey, String token) { - if(accessKey != null && secretKey != null && endpoint !=null) - this.minioClient = minConnector.connect(endpoint, accessKey, secretKey); - this.region = getRegion(endpoint); - this.token = token; - } - @Override - public void s3ConnectorApi(String endpoint, String accessKey, String secretKey, String token) { - if(accessKey != null && secretKey != null && endpoint !=null) - this.minioClient = minConnector.connect(endpoint, accessKey, secretKey); + public S3ConnectorApiImpl(String endpoint, String accessKey, String secretKey, String token) { + if (accessKey != null && secretKey != null && endpoint != null) + this.minioClient = minConnector.connect(endpoint, accessKey, secretKey); this.region = getRegion(endpoint); - this.token = token; + this.token = token; } @Override public void createBucket(String bucketName) { if (!bucketExists(bucketName.toLowerCase())) { - // Make a new bucket'. - try { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName.toLowerCase()).build()); - } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | - InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | - IllegalArgumentException | IOException e) { - e.printStackTrace(); - } - } - - } - - @Override - public void deleteBucket(String bucketName) { - - if (bucketExists(bucketName.toLowerCase())) { - // Remove a bucket. try { - minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName.toLowerCase()).build()); + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName.toLowerCase()).region(region).build()); } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | - InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | - IllegalArgumentException | IOException e) { - + InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | + IllegalArgumentException | IOException e) { e.printStackTrace(); } } } - - @Override - public void uploadFile(String bucketName, String fileName, String path) { - - if (!bucketExists(bucketName.toLowerCase())){ - - createBucket(bucketName.toLowerCase()); - } - - try { - - minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName.toLowerCase()).object(fileName) - .filename(path).build()); - } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | - InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | - IllegalArgumentException | IOException e) { - - e.printStackTrace(); - - } - } - @Override public void uploadParts(String bucketName, String fileName, ByteArrayInputStream part) { - - if (!bucketExists(bucketName.toLowerCase())){ - + if (!bucketExists(bucketName.toLowerCase())) { createBucket(bucketName.toLowerCase()); } try { - - minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(part, part.available(), -1).build()); - } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | - InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | - IllegalArgumentException | IOException e) { - - e.printStackTrace(); - } - + minioClient.putObject(PutObjectArgs.builder().bucket(bucketName.toLowerCase()).region(region).object(fileName).stream(part, part.available(), -1).build()); + } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | + InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | + IllegalArgumentException | IOException e) { + e.printStackTrace(); + } } @Override public byte[] getFile(String bucketName, String fileName) { - if (!bucketExists(bucketName.toLowerCase())) { return null; } + InputStream stream; try { - stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); + stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName.toLowerCase()).region(region).object(fileName).build()); return stream.readAllBytes(); } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | IllegalArgumentException | IOException e) { - e.printStackTrace(); return null; } - - } - - @Override - public Result listItems(String bucketName) { - - Iterable> results = minioClient - .listObjects(ListObjectsArgs.builder().bucket(bucketName.toLowerCase()).build()); - - return results.iterator().next(); - } - - @Override - public void deleteFile(String bucketName, String fileName) { - - try { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName.toLowerCase()).object(fileName).build()); - } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | - InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | - IllegalArgumentException | IOException e) { - - e.printStackTrace(); - } } @Override public boolean bucketExists(String bucketName) { - boolean found = false; try { - - found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName.toLowerCase()).region(this.region).build()); + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName.toLowerCase()).region(this.region).build()); } catch (InvalidKeyException | ErrorResponseException | InsufficientDataException | InternalException | InvalidResponseException | NoSuchAlgorithmException | ServerException | XmlParserException | IllegalArgumentException | IOException e) { - e.printStackTrace(); + return false; } - return found; } @Override public TemporaryKey createTemporaryKey() { - return ionosApi.createTemporaryKey(token); - } @Override public void deleteTemporaryKey(String accessKey) { - ionosApi.deleteTemporaryAccount(token,accessKey); - } private String getRegion(String endpoint) { diff --git a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/configuration/S3CoreExtension.java b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/configuration/S3CoreExtension.java index e88ae3ae..8d7c2d2f 100644 --- a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/configuration/S3CoreExtension.java +++ b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/configuration/S3CoreExtension.java @@ -19,30 +19,20 @@ import org.eclipse.edc.runtime.metamodel.annotation.Extension; import org.eclipse.edc.runtime.metamodel.annotation.Inject; import org.eclipse.edc.runtime.metamodel.annotation.Provides; -import org.eclipse.edc.runtime.metamodel.annotation.Setting; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.security.Vault; import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; -import org.eclipse.edc.spi.security.CertificateResolver; -import org.eclipse.edc.spi.security.PrivateKeyResolver; -//import org.eclipse.edc.spi.system.vault.NoopCertificateResolver; -//import org.eclipse.edc.spi.system.vault.NoopPrivateKeyResolver; @Provides(S3ConnectorApi.class) @Extension(value = S3CoreExtension.NAME) public class S3CoreExtension implements ServiceExtension { + public static final String NAME = "IonosS3"; - @Setting private static final String IONOS_ACCESS_KEY = "edc.ionos.access.key"; - @Setting private static final String IONOS_SECRET_KEY = "edc.ionos.secret.key"; - @Setting private static final String IONOS_ENDPOINT = "edc.ionos.endpoint"; - @Setting private static final String IONOS_TOKEN = "edc.ionos.token"; - @Setting - private static final String IONOS_WITH_VAULT = "edc.ionos.vault"; @Inject private Vault vault; @@ -57,10 +47,12 @@ public String name() { @Override public void initialize(ServiceExtensionContext context) { + var accessKey = vault.resolveSecret(IONOS_ACCESS_KEY); var secretKey = vault.resolveSecret(IONOS_SECRET_KEY); var endPoint = vault.resolveSecret(IONOS_ENDPOINT); var token = vault.resolveSecret(IONOS_TOKEN); + if(accessKey == null || secretKey == null || endPoint ==null) { monitor.warning("Couldn't connect or the vault didn't return values, falling back to ConfigMap Configuration"); accessKey = context.getSetting(IONOS_ACCESS_KEY, IONOS_ACCESS_KEY); @@ -71,12 +63,5 @@ public void initialize(ServiceExtensionContext context) { var s3Api = new S3ConnectorApiImpl(endPoint, accessKey, secretKey, token); context.registerService(S3ConnectorApi.class, s3Api); - - // var privateKeyResolver = new NoopPrivateKeyResolver(); - // context.registerService(PrivateKeyResolver.class, privateKeyResolver); - - // var certificateResolver = new NoopCertificateResolver(); - // context.registerService(CertificateResolver.class, certificateResolver); } - } diff --git a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/schema/IonosBucketSchema.java b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/schema/IonosBucketSchema.java index 0fc15af4..47ce29a0 100644 --- a/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/schema/IonosBucketSchema.java +++ b/edc-ionos-extension/core-ionos-s3/src/main/java/com/ionos/edc/extension/s3/schema/IonosBucketSchema.java @@ -14,11 +14,13 @@ package com.ionos.edc.extension.s3.schema; +import static org.eclipse.edc.spi.CoreConstants.EDC_NAMESPACE; + public interface IonosBucketSchema { String TYPE = "IonosS3"; - String STORAGE_NAME = "storage"; - String BUCKET_NAME = "bucketName"; - String BLOB_NAME = "blobName"; - String ACCESS_KEY_ID = "accessKey"; - String SECRET_ACCESS_KEY = "secretKey"; + String STORAGE_NAME = EDC_NAMESPACE + "storage"; + String BUCKET_NAME = EDC_NAMESPACE + "bucketName"; + String BLOB_NAME = EDC_NAMESPACE + "blobName"; + String ACCESS_KEY_ID = EDC_NAMESPACE + "accessKey"; + String SECRET_ACCESS_KEY = EDC_NAMESPACE + "secretKey"; } diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSink.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSink.java index 7683f6d3..42178022 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSink.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSink.java @@ -18,27 +18,33 @@ import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; import org.eclipse.edc.connector.dataplane.spi.pipeline.StreamResult; import org.eclipse.edc.connector.dataplane.util.sink.ParallelSink; -import org.eclipse.edc.spi.response.ResponseStatus; import org.jetbrains.annotations.NotNull; import java.io.ByteArrayInputStream; import java.util.List; +import java.util.Objects; import static java.lang.String.format; public class IonosDataSink extends ParallelSink { + private S3ConnectorApi s3Api; private String bucketName; private String blobName; - private String accessKey; - private String secretkey; private IonosDataSink() {} @Override protected StreamResult transferParts(List parts) { - for (var part : parts) { + for (DataSource.Part part : parts) { + String blobName; + if (this.blobName != null) { + blobName = this.blobName; + } else { + blobName = part.name(); + } + try (var input = part.openStream()) { s3Api.uploadParts(bucketName, blobName, new ByteArrayInputStream(input.readAllBytes())); } catch (Exception e) { @@ -57,6 +63,7 @@ private StreamResult uploadFailure(Exception e, String blobName) { } public static class Builder extends ParallelSink.Builder { + private Builder() { super(new IonosDataSink()); } @@ -79,18 +86,10 @@ public Builder blobName(String blobName) { sink.blobName = blobName; return this; } - - public Builder accessKey(String accessKey) { - sink.accessKey = accessKey; - return this; - } - - public Builder secretkey(String secretkey) { - sink.secretkey = secretkey; - return this; - } @Override - protected void validate() {} + protected void validate() { + Objects.requireNonNull(sink.bucketName, "Bucket Name is required"); + } } } diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSinkFactory.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSinkFactory.java index 7c95d28d..2c3d1890 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSinkFactory.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSinkFactory.java @@ -35,15 +35,13 @@ import java.util.concurrent.ExecutorService; public class IonosDataSinkFactory implements DataSinkFactory { - private static final int CHUNK_SIZE_IN_BYTES = 1024 * 1024 * 500; // 500MB chunk size private static final String DEFAULT_STORAGE = "s3-eu-central-1.ionoscloud.com"; private final ExecutorService executorService; private final Monitor monitor; - private S3ConnectorApi s3Api; - - private Vault vault; - private TypeManager typeManager; + private final S3ConnectorApi s3Api; + private final Vault vault; + private final TypeManager typeManager; private final ValidationRule validation = new IonosSinkDataAddressValidationRule(); @@ -63,48 +61,57 @@ public boolean canHandle(DataFlowRequest request) { @Override public @NotNull Result validateRequest(DataFlowRequest request) { - var destination = request.getDestinationDataAddress(); - - + var destination = request.getDestinationDataAddress(); return validation.apply(destination).map(it -> null); } @Override public @NotNull Result validate(DataFlowRequest request) { - var destination = request.getDestinationDataAddress(); - return validation.apply(destination).map(it -> true); } @Override public DataSink createSink(DataFlowRequest request) { + var validationResult = validateRequest(request); if (validationResult.failed()) { - throw new EdcException(String.join(", ", validationResult.getFailureMessages())); - } - var destination = request.getDestinationDataAddress();; - var secret = vault.resolveSecret(destination.getProperty(IonosBucketSchema.BUCKET_NAME)); - S3ConnectorApi s3ApiTemp; + throw new EdcException(String.join(", ", validationResult.getFailureMessages())); + } + + var destination = request.getDestinationDataAddress(); + + var secret = vault.resolveSecret(destination.getKeyName()); if (secret != null) { - var Token = typeManager.readValue(secret, IonosToken.class); - - if (destination.getProperty(IonosBucketSchema.STORAGE_NAME)!=null) { - - s3ApiTemp = new S3ConnectorApiImpl(destination.getProperty(IonosBucketSchema.STORAGE_NAME), Token.getAccessKey(), Token.getSecretKey(), ""); - return IonosDataSink.Builder.newInstance().bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) - .blobName(destination.getKeyName()).requestId(request.getId()).executorService(executorService) - .monitor(monitor).s3Api(s3ApiTemp).build(); - } else { - s3ApiTemp = new S3ConnectorApiImpl(DEFAULT_STORAGE, Token.getAccessKey(), Token.getSecretKey(), ""); - return IonosDataSink.Builder.newInstance().bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) - .blobName(destination.getKeyName()).requestId(request.getId()).executorService(executorService) - .monitor(monitor).s3Api(s3ApiTemp).build(); + var token = typeManager.readValue(secret, IonosToken.class); + + if (destination.getProperty(IonosBucketSchema.STORAGE_NAME) != null) { + var s3ApiTemp = new S3ConnectorApiImpl(destination.getProperty(IonosBucketSchema.STORAGE_NAME), token.getAccessKey(), token.getSecretKey(), ""); + return IonosDataSink.Builder.newInstance() + .bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) + .blobName(destination.getProperty(IonosBucketSchema.BLOB_NAME)) + .requestId(request.getId()) + .executorService(executorService) + .monitor(monitor).s3Api(s3ApiTemp) + .build(); + } else { + var s3ApiTemp = new S3ConnectorApiImpl(DEFAULT_STORAGE, token.getAccessKey(), token.getSecretKey(), ""); + return IonosDataSink.Builder.newInstance() + .bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) + .blobName(destination.getProperty(IonosBucketSchema.BLOB_NAME)) + .requestId(request.getId()) + .executorService(executorService) + .monitor(monitor) + .s3Api(s3ApiTemp) + .build(); } - } - - return IonosDataSink.Builder.newInstance().bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) - .blobName(destination.getKeyName()).requestId(request.getId()).executorService(executorService) - .monitor(monitor).s3Api(s3Api).build(); - } + } + return IonosDataSink.Builder.newInstance() + .bucketName(destination.getProperty(IonosBucketSchema.BUCKET_NAME)) + .blobName(destination.getProperty(IonosBucketSchema.BLOB_NAME)) + .requestId(request.getId()).executorService(executorService) + .monitor(monitor).s3Api(s3Api) + .build(); + } } + diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSource.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSource.java index 999257f7..c00f45df 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSource.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSource.java @@ -25,46 +25,39 @@ class IonosDataSource implements DataSource { + private S3ConnectorApi s3Api; private String bucketName; - private String keyName; private String blobName; - private S3ConnectorApi s3Api; - private IonosDataSource() { - } @Override public StreamResult> openPartStream() { - return success(Stream.of(new S3Part(s3Api, keyName, bucketName, keyName))); + return success(Stream.of(new S3Part(s3Api, bucketName, blobName))); } private static class S3Part implements Part { private final S3ConnectorApi s3Api; - private final String keyName; private final String bucketName; - private String blobName; + private final String blobName; - S3Part(S3ConnectorApi s3Api, String keyName, String bucketName, String blobName) { + S3Part(S3ConnectorApi s3Api, String bucketName, String blobName) { super(); this.s3Api = s3Api; - this.keyName = keyName; this.bucketName = bucketName; this.blobName = blobName; } @Override public String name() { - return keyName; + return blobName; } @Override public InputStream openStream() { - InputStream targetStream = new ByteArrayInputStream(s3Api.getFile(bucketName, blobName)); - return targetStream; + return new ByteArrayInputStream(s3Api.getFile(bucketName, blobName)); } - } public static class Builder { @@ -78,25 +71,18 @@ public static Builder newInstance() { return new Builder(); } - public Builder bucketName(String bucketName) { - source.bucketName = bucketName; - return this; - } - - public Builder keyName(String keyName) { - source.keyName = keyName; - return this; + public IonosDataSource build() { + return source; } - - public Builder blobName; public Builder client(S3ConnectorApi s3Api) { source.s3Api = s3Api; return this; } - public IonosDataSource build() { - return source; + public Builder bucketName(String bucketName) { + source.bucketName = bucketName; + return this; } public Builder blobName(String blobName) { diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSourceFactory.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSourceFactory.java index 6edee858..e7747387 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSourceFactory.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/IonosDataSourceFactory.java @@ -17,24 +17,18 @@ import com.ionos.edc.dataplane.ionos.s3.validation.IonosSourceDataAddressValidationRule; import com.ionos.edc.extension.s3.api.S3ConnectorApi; import com.ionos.edc.extension.s3.schema.IonosBucketSchema; -import org.eclipse.edc.connector.dataplane.spi.client.DataPlaneClient; import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSource; import org.eclipse.edc.connector.dataplane.spi.pipeline.DataSourceFactory; -import org.eclipse.edc.connector.transfer.spi.callback.ControlPlaneApiUrl; -import org.eclipse.edc.connector.transfer.spi.flow.DataFlowController; -import org.eclipse.edc.connector.transfer.spi.types.DataFlowResponse; -import org.eclipse.edc.connector.transfer.spi.types.DataRequest; import org.eclipse.edc.connector.dataplane.util.validation.ValidationRule; import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.result.Result; -import org.eclipse.edc.spi.security.Vault; import org.eclipse.edc.spi.types.TypeManager; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.transfer.DataFlowRequest; import org.jetbrains.annotations.NotNull; public class IonosDataSourceFactory implements DataSourceFactory { - private S3ConnectorApi s3Api; + private final S3ConnectorApi s3Api; private final TypeManager typeManager; @@ -63,15 +57,18 @@ public boolean canHandle(DataFlowRequest request) { @Override public DataSource createSource(DataFlowRequest request) { + var validationResult = validateRequest(request); if (validationResult.failed()) { throw new EdcException(String.join(", ", validationResult.getFailureMessages())); } var source = request.getSourceDataAddress(); - - return IonosDataSource.Builder.newInstance().client(s3Api).bucketName(source.getProperty(IonosBucketSchema.BUCKET_NAME)).blobName(source.getProperty(IonosBucketSchema.BLOB_NAME)) - .keyName(source.getKeyName()).build(); + + return IonosDataSource.Builder.newInstance().client(s3Api) + .bucketName(source.getProperty(IonosBucketSchema.BUCKET_NAME)) + .blobName(source.getProperty(IonosBucketSchema.BLOB_NAME)) + .build(); } } diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSinkDataAddressValidationRule.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSinkDataAddressValidationRule.java index e5a2310a..6d007e17 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSinkDataAddressValidationRule.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSinkDataAddressValidationRule.java @@ -24,13 +24,13 @@ import java.util.Map; import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.BUCKET_NAME; -import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.STORAGE_NAME; +import static org.eclipse.edc.spi.types.domain.DataAddress.SIMPLE_KEY_NAME; public class IonosSinkDataAddressValidationRule implements ValidationRule { private final CompositeValidationRule> mandatoryPropertyValidationRule = new CompositeValidationRule<>( List.of( - new EmptyValueValidationRule(BUCKET_NAME), - new EmptyValueValidationRule(STORAGE_NAME) + new EmptyValueValidationRule(SIMPLE_KEY_NAME), + new EmptyValueValidationRule(BUCKET_NAME) ) ); diff --git a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSourceDataAddressValidationRule.java b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSourceDataAddressValidationRule.java index f6eb3ef0..bf6018af 100644 --- a/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSourceDataAddressValidationRule.java +++ b/edc-ionos-extension/data-plane-ionos-s3/src/main/java/com/ionos/edc/dataplane/ionos/s3/validation/IonosSourceDataAddressValidationRule.java @@ -25,13 +25,18 @@ import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.BLOB_NAME; import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.BUCKET_NAME; +import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.STORAGE_NAME; +import static org.eclipse.edc.spi.types.domain.DataAddress.SIMPLE_KEY_NAME; + public class IonosSourceDataAddressValidationRule implements ValidationRule { private final CompositeValidationRule> mandatoryPropertyValidationRule = new CompositeValidationRule<>( List.of( - - new EmptyValueValidationRule(BUCKET_NAME) + new EmptyValueValidationRule(SIMPLE_KEY_NAME), + new EmptyValueValidationRule(STORAGE_NAME), + new EmptyValueValidationRule(BUCKET_NAME), + new EmptyValueValidationRule(BLOB_NAME) ) ); diff --git a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ConsumerResourceDefinitionGenerator.java b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ConsumerResourceDefinitionGenerator.java index 0a784f72..e1da5358 100644 --- a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ConsumerResourceDefinitionGenerator.java +++ b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ConsumerResourceDefinitionGenerator.java @@ -23,8 +23,6 @@ import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; import org.eclipse.edc.policy.model.Policy; - - import com.ionos.edc.extension.s3.schema.IonosBucketSchema; public class IonosS3ConsumerResourceDefinitionGenerator implements ConsumerResourceDefinitionGenerator { @@ -36,13 +34,22 @@ public ResourceDefinition generate(DataRequest dataRequest, Policy policy) { var destination = dataRequest.getDataDestination(); var id = randomUUID().toString(); - var bucket = destination.getProperty(IonosBucketSchema.BUCKET_NAME); - var acc = destination.getProperty(IonosBucketSchema.STORAGE_NAME); + var keyName = destination.getKeyName(); + var storage = destination.getProperty(IonosBucketSchema.STORAGE_NAME); + var bucketName = destination.getProperty(IonosBucketSchema.BUCKET_NAME); + var blobName = destination.getProperty(IonosBucketSchema.BLOB_NAME); var accessKey = destination.getProperty(IonosBucketSchema.ACCESS_KEY_ID); var secretKey = destination.getProperty(IonosBucketSchema.SECRET_ACCESS_KEY); - return IonosS3ResourceDefinition.Builder.newInstance().id(id).accessKey(accessKey).secretKey(secretKey).storage(acc).bucketName(bucket).build(); - + return IonosS3ResourceDefinition.Builder.newInstance() + .id(id) + .keyName(keyName) + .storage(storage) + .bucketName(bucketName) + .blobName(blobName) + .accessKey(accessKey) + .secretKey(secretKey) + .build(); } @Override diff --git a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ProvisionedResource.java b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ProvisionedResource.java index 99f7d8b0..ab167e0f 100644 --- a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ProvisionedResource.java +++ b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ProvisionedResource.java @@ -21,34 +21,26 @@ import com.ionos.edc.extension.s3.schema.IonosBucketSchema; import org.eclipse.edc.connector.transfer.spi.types.ProvisionedDataDestinationResource; -import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.BUCKET_NAME; -import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.STORAGE_NAME; +import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.*; @JsonDeserialize(builder = IonosS3ProvisionedResource.Builder.class) @JsonTypeName("dataspaceconnector:ionosprovisionedresource") public class IonosS3ProvisionedResource extends ProvisionedDataDestinationResource { - private String keyId; - + + private String accessKey; + public String getStorage() { return getDataAddress().getProperty(STORAGE_NAME); } public String getBucketName() { return getDataAddress().getProperty(BUCKET_NAME); } - - - - public String getKeyId() { - return keyId; - } - public void setKeyId(String keyId) { - this.keyId = keyId; - } - @Override - public String getResourceName() { - return dataAddress.getProperty(BUCKET_NAME); + public String getBlobName() { + return getDataAddress().getProperty(BLOB_NAME); + } + public String getAccessKey() { + return accessKey; } - private IonosS3ProvisionedResource() { } @@ -71,14 +63,19 @@ public Builder storage(String storage) { dataAddressBuilder.property(STORAGE_NAME, storage); return this; } + public Builder bucketName(String bucketName) { dataAddressBuilder.property(BUCKET_NAME, bucketName); - dataAddressBuilder.keyName(bucketName + "-key"); return this; } - public Builder keyId(String arn) { - provisionedResource.keyId = arn; + public Builder blobName(String blobName) { + dataAddressBuilder.property(BLOB_NAME, blobName); + return this; + } + + public Builder accessKey(String accessKey) { + provisionedResource.accessKey = accessKey; return this; } } diff --git a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3Provisioner.java b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3Provisioner.java index 9d1a0ab5..561a4831 100644 --- a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3Provisioner.java +++ b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3Provisioner.java @@ -23,14 +23,12 @@ import org.eclipse.edc.connector.transfer.spi.types.ProvisionResponse; import org.eclipse.edc.connector.transfer.spi.types.ProvisionedResource; import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; -import org.eclipse.edc.spi.response.ResponseStatus; import org.eclipse.edc.spi.monitor.Monitor; import org.eclipse.edc.spi.response.StatusResult; import org.jetbrains.annotations.NotNull; import java.time.OffsetDateTime; import java.util.concurrent.CompletableFuture; -import static java.util.concurrent.CompletableFuture.completedFuture; import static dev.failsafe.Failsafe.with; public class IonosS3Provisioner implements Provisioner { @@ -58,68 +56,53 @@ public boolean canDeprovision(ProvisionedResource resourceDefinition) { @Override public CompletableFuture> provision(IonosS3ResourceDefinition resourceDefinition, org.eclipse.edc.policy.model.Policy policy) { - - String storage = resourceDefinition.getStorage(); - String bucketName = resourceDefinition.getbucketName(); - OffsetDateTime expiryTime = OffsetDateTime.now().plusHours(1); + String bucketName = resourceDefinition.getBucketName(); + if (!s3Api.bucketExists(bucketName)) { + createBucket(bucketName); + } + + var serviceAccount = s3Api.createTemporaryKey(); + + String resourceName = resourceDefinition.getKeyName(); - if (storage == null) { - storage = "storage"; + var resourceBuilder = IonosS3ProvisionedResource.Builder.newInstance() + .id(resourceDefinition.getId()) + .resourceName(resourceName) + .bucketName(resourceDefinition.getBucketName()) + .resourceDefinitionId(resourceDefinition.getId()) + .accessKey(serviceAccount.getAccessKey()) + .transferProcessId(resourceDefinition.getTransferProcessId()) + .hasToken(true); + if (resourceDefinition.getStorage() != null) { + resourceBuilder = resourceBuilder.storage(resourceDefinition.getStorage()); } + if (resourceDefinition.getBlobName() != null) { + resourceBuilder = resourceBuilder.blobName(resourceDefinition.getBlobName()); + } + var resource = resourceBuilder.build(); + var expiryTime = OffsetDateTime.now().plusHours(1); + var secretToken = new IonosToken(serviceAccount.getAccessKey(), serviceAccount.getSecretKey(), expiryTime.toInstant().toEpochMilli() ); + var response = ProvisionResponse.Builder.newInstance().resource(resource).secretToken(secretToken).build(); - if (!s3Api.bucketExists(bucketName)) { - - createBucket(bucketName); - } - - - // Ensure resource name is unique to avoid key collisions in local and remote vaults - String resourceName = resourceDefinition.getId() + "-container"; - var serviceAccount =s3Api.createTemporaryKey(); - - - var resource = IonosS3ProvisionedResource.Builder.newInstance().id( resourceDefinition.getbucketName()) - .storage(resourceDefinition.getStorage()) - .bucketName(resourceDefinition.getbucketName()) - .resourceDefinitionId(resourceDefinition.getId()) - .keyId(serviceAccount.getAccessKey()) - .transferProcessId(resourceDefinition.getTransferProcessId()) - .resourceName(resourceName).hasToken(true) - .build(); - var secretToken = new IonosToken(serviceAccount.getAccessKey(), serviceAccount.getSecretKey(), expiryTime.toInstant().toEpochMilli() ); - var response = ProvisionResponse.Builder.newInstance().resource(resource).secretToken(secretToken).build(); - - return CompletableFuture.completedFuture(StatusResult.success(response)); - - + return CompletableFuture.completedFuture(StatusResult.success(response)); } @Override public CompletableFuture> deprovision( IonosS3ProvisionedResource provisionedResource, org.eclipse.edc.policy.model.Policy policy) { - return with(retryPolicy).runAsync(() -> s3Api.deleteTemporaryKey(provisionedResource.getKeyId())) - .thenApply(empty -> StatusResult.success(DeprovisionedResource.Builder.newInstance().provisionedResourceId(provisionedResource.getId()).build())); - - - } - - @NotNull - private CompletableFuture getExistBucket(String bucketName) { - return with(retryPolicy) - .runAsync(() -> { - s3Api.bucketExists(bucketName); - }); + return with(retryPolicy).runAsync(() -> s3Api.deleteTemporaryKey(provisionedResource.getAccessKey())) + .thenApply(empty -> + StatusResult.success(DeprovisionedResource.Builder.newInstance().provisionedResourceId(provisionedResource.getId()).build()) + ); } @NotNull private CompletableFuture createBucket(String bucketName) { - return with(retryPolicy) - .runAsync(() -> { - s3Api.createBucket(bucketName); - }); + return with(retryPolicy).runAsync(() -> { + s3Api.createBucket(bucketName); + }); } - } diff --git a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ResourceDefinition.java b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ResourceDefinition.java index 83d7e2e6..acfc9da4 100644 --- a/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ResourceDefinition.java +++ b/edc-ionos-extension/provision-ionos-s3/src/main/java/com/ionos/edc/provision/s3/bucket/IonosS3ResourceDefinition.java @@ -14,62 +14,43 @@ package com.ionos.edc.provision.s3.bucket; +import java.util.Objects; import org.eclipse.edc.connector.transfer.spi.types.ResourceDefinition; - public class IonosS3ResourceDefinition extends ResourceDefinition { + private String keyName; private String storage; private String accessKey; private String secretKey; private String bucketName; - + private String blobName; public IonosS3ResourceDefinition() { super(); } + public String getKeyName() { + return keyName; + } public String getStorage() { return storage; } - - public void setStorage(String storage) { - this.storage = storage; - } - public String getAccessKey() { return accessKey; } - - - - public void setAccessKey(String accessKey) { - this.accessKey = accessKey; - } - - - public String getSecretKey() { return secretKey; } - - - - public void setSecretKey(String secretKey) { - this.secretKey = secretKey; - } - - - public String getbucketName() { + public String getBucketName() { return bucketName; } - - public void setbucketName(String bucketName) { - this.bucketName = bucketName; + public String getBlobName() { + return blobName; } @Override public Builder toBuilder() { - return initializeBuilder(new Builder()).storage(storage).accessKey(accessKey).secretKey(secretKey).bucketName(bucketName); + return initializeBuilder(new Builder()).keyName(keyName).storage(storage).accessKey(accessKey).secretKey(secretKey).bucketName(bucketName).blobName(blobName); } public static class Builder extends ResourceDefinition.Builder { @@ -81,7 +62,12 @@ private Builder() { public static Builder newInstance() { return new Builder(); } - + + public Builder keyName(String keyName) { + resourceDefinition.keyName = keyName; + return this; + } + public Builder storage(String storage) { resourceDefinition.storage = storage; return this; @@ -101,14 +87,17 @@ public Builder bucketName(String bucketName) { resourceDefinition.bucketName = bucketName; return this; } - - + + public Builder blobName(String blobName) { + resourceDefinition.blobName = blobName; + return this; + } @Override protected void verify() { super.verify(); - + Objects.requireNonNull(resourceDefinition.keyName, "Key Name is required"); + Objects.requireNonNull(resourceDefinition.bucketName, "Bucket Name is required"); } } - } diff --git a/example/file-transfer-persistence/transfer-file/build.gradle.kts b/example/file-transfer-persistence/transfer-file/build.gradle.kts index 96d3655a..938b7b11 100644 --- a/example/file-transfer-persistence/transfer-file/build.gradle.kts +++ b/example/file-transfer-persistence/transfer-file/build.gradle.kts @@ -39,10 +39,8 @@ dependencies { implementation("${postgresqlGroup}:postgresql:$postgresqlVersion") implementation("${edcGroup}:control-plane-sql:$edcVersion") - implementation("${edcGroup}:control-plane-core:${edcVersion}") implementation("${edcGroup}:data-plane-core:${edcVersion}") - implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) implementation("${edcGroup}:data-plane-client:${edcVersion}") implementation("${edcGroup}:data-plane-selector-client:${edcVersion}") implementation("${edcGroup}:data-plane-selector-core:${edcVersion}") @@ -51,4 +49,7 @@ dependencies { implementation("${edcGroup}:policy-model:${edcVersion}") implementation("${edcGroup}:policy-spi:${edcVersion}") implementation("${edcGroup}:core-spi:${edcVersion}") + + implementation(project(":edc-ionos-extension:core-ionos-s3")) + implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) } \ No newline at end of file diff --git a/example/file-transfer-persistence/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java b/example/file-transfer-persistence/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java index 7f20ada6..52c1c9a3 100644 --- a/example/file-transfer-persistence/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java +++ b/example/file-transfer-persistence/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java @@ -22,11 +22,13 @@ import org.eclipse.edc.policy.model.Permission; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.runtime.metamodel.annotation.Inject; + import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.asset.Asset; - + + import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.*; import static org.eclipse.edc.spi.query.Criterion.criterion; public class CloudTransferExtension implements ServiceExtension { @Inject @@ -54,17 +56,14 @@ public void registerDataEntries() { try { var asset = Asset.Builder.newInstance().id("1").build(); var dataAddress = DataAddress.Builder.newInstance().type("IonosS3") - .property("storage", "s3-eu-central-1.ionoscloud.com") - .property("bucketName", "company1") - .property("container", "company1") - .property("blobName", "device1-data.csv") - .keyName("device1-data.csv").build(); - - + .property(STORAGE_NAME, "s3-eu-central-1.ionoscloud.com") + .property(BUCKET_NAME, "company1") + .property(BLOB_NAME, "device1-data.csv") + .keyName("device1").build(); + assetIndex.create(asset, dataAddress); } catch (Exception e) { - // TODO: handle exception - System.out.println(e); + throw new EdcException("Error creating Data Entries", e); } } diff --git a/example/file-transfer-push-daps/transfer-file/build.gradle.kts b/example/file-transfer-push-daps/transfer-file/build.gradle.kts index 4c3c53eb..958c8eb6 100644 --- a/example/file-transfer-push-daps/transfer-file/build.gradle.kts +++ b/example/file-transfer-push-daps/transfer-file/build.gradle.kts @@ -30,15 +30,16 @@ dependencies { implementation("${edcGroup}:control-plane-core:${edcVersion}") implementation("${edcGroup}:data-plane-core:${edcVersion}") - implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) implementation("${edcGroup}:data-plane-client:${edcVersion}") implementation("${edcGroup}:data-plane-selector-client:${edcVersion}") implementation("${edcGroup}:data-plane-selector-core:${edcVersion}") implementation("${edcGroup}:transfer-data-plane:${edcVersion}") - - + implementation("${edcGroup}:contract-spi:${edcVersion}") implementation("${edcGroup}:policy-model:${edcVersion}") implementation("${edcGroup}:policy-spi:${edcVersion}") - implementation("${edcGroup}:core-spi:${edcVersion}") + implementation("${edcGroup}:core-spi:${edcVersion}") + + implementation(project(":edc-ionos-extension:core-ionos-s3")) + implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) } \ No newline at end of file diff --git a/example/file-transfer-push-daps/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java b/example/file-transfer-push-daps/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java index 4528e0ef..9f700b37 100644 --- a/example/file-transfer-push-daps/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java +++ b/example/file-transfer-push-daps/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java @@ -22,12 +22,14 @@ import org.eclipse.edc.policy.model.Permission; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.runtime.metamodel.annotation.Inject; + import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.asset.Asset; - + + import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.*; import static org.eclipse.edc.spi.query.Criterion.criterion; public class CloudTransferExtension implements ServiceExtension { @Inject @@ -55,17 +57,14 @@ public void registerDataEntries() { try { var asset = Asset.Builder.newInstance().id("1").build(); var dataAddress = DataAddress.Builder.newInstance().type("IonosS3") - .property("storage", "s3-eu-central-1.ionoscloud.com") - .property("bucketName", "company1") - .property("container", "company1") - .property("blobName", "device1-data.csv") - .keyName("device1-data.csv").build(); - - + .property(STORAGE_NAME, "s3-eu-central-1.ionoscloud.com") + .property(BUCKET_NAME, "company1") + .property(BLOB_NAME, "device1-data.csv") + .keyName("device1").build(); + assetIndex.create(asset, dataAddress); } catch (Exception e) { - // TODO: handle exception - System.out.println(e); + throw new EdcException("Error creating Data Entries", e); } } diff --git a/example/file-transfer-push/transfer-file/build.gradle.kts b/example/file-transfer-push/transfer-file/build.gradle.kts index 4c3c53eb..326cc468 100644 --- a/example/file-transfer-push/transfer-file/build.gradle.kts +++ b/example/file-transfer-push/transfer-file/build.gradle.kts @@ -30,15 +30,16 @@ dependencies { implementation("${edcGroup}:control-plane-core:${edcVersion}") implementation("${edcGroup}:data-plane-core:${edcVersion}") - implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) - implementation("${edcGroup}:data-plane-client:${edcVersion}") - implementation("${edcGroup}:data-plane-selector-client:${edcVersion}") - implementation("${edcGroup}:data-plane-selector-core:${edcVersion}") - implementation("${edcGroup}:transfer-data-plane:${edcVersion}") - - + implementation("${edcGroup}:data-plane-client:${edcVersion}") + implementation("${edcGroup}:data-plane-selector-client:${edcVersion}") + implementation("${edcGroup}:data-plane-selector-core:${edcVersion}") + implementation("${edcGroup}:transfer-data-plane:${edcVersion}") + implementation("${edcGroup}:contract-spi:${edcVersion}") implementation("${edcGroup}:policy-model:${edcVersion}") implementation("${edcGroup}:policy-spi:${edcVersion}") - implementation("${edcGroup}:core-spi:${edcVersion}") + implementation("${edcGroup}:core-spi:${edcVersion}") + + implementation(project(":edc-ionos-extension:core-ionos-s3")) + implementation(project(":edc-ionos-extension:data-plane-ionos-s3")) } \ No newline at end of file diff --git a/example/file-transfer-push/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java b/example/file-transfer-push/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java index 49f7233c..32ad7855 100644 --- a/example/file-transfer-push/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java +++ b/example/file-transfer-push/transfer-file/src/main/java/org/eclipse/edc/sample/extension/transfer/CloudTransferExtension.java @@ -22,12 +22,14 @@ import org.eclipse.edc.policy.model.Permission; import org.eclipse.edc.policy.model.Policy; import org.eclipse.edc.runtime.metamodel.annotation.Inject; + import org.eclipse.edc.spi.EdcException; import org.eclipse.edc.spi.asset.AssetIndex; import org.eclipse.edc.spi.system.ServiceExtension; import org.eclipse.edc.spi.system.ServiceExtensionContext; import org.eclipse.edc.spi.types.domain.DataAddress; import org.eclipse.edc.spi.types.domain.asset.Asset; - + + import static com.ionos.edc.extension.s3.schema.IonosBucketSchema.*; import static org.eclipse.edc.spi.query.Criterion.criterion; public class CloudTransferExtension implements ServiceExtension { @Inject @@ -55,17 +57,14 @@ public void registerDataEntries() { try { var asset = Asset.Builder.newInstance().id("1").build(); var dataAddress = DataAddress.Builder.newInstance().type("IonosS3") - .property("storage", "s3-eu-central-1.ionoscloud.com") - .property("bucketName", "company1") - .property("container", "company1") - .property("blobName", "device1-data.csv") - .keyName("device1-data.csv").build(); - - + .property(STORAGE_NAME, "s3-eu-central-1.ionoscloud.com") + .property(BUCKET_NAME, "company1") + .property(BLOB_NAME, "device1-data.csv") + .keyName("device1").build(); + assetIndex.create(asset, dataAddress); } catch (Exception e) { - // TODO: handle exception - System.out.println(e); + throw new EdcException("Error creating Data Entries", e); } }