From 15a5cef6ad1ee4bf7f58932432535c26ee22ff96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20R=C3=B6gner?= Date: Fri, 2 Aug 2024 13:00:29 +0200 Subject: [PATCH 1/3] Enable to pass Job inputs from foreign S3 buckets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduce new input type "InputsFromS3" that a user can specify to pass input files using a reference to an S3 Bucket & Key-prefix (given the service' account got access rights granted) - Change Input classes & metadata models accordingly to contain a reference to the target S3 bucket - Enhance S3Client to work with arbitrary buckets rather than only with the service' default bucket Signed-off-by: Benjamin Rögner --- .../com/here/xyz/jobs/service/JobApi.java | 13 ++++ .../com/here/xyz/jobs/util/AsyncS3Client.java | 12 +++- .../steps/impl/imp/ImportFilesToSpace.java | 26 ++++--- .../com/here/xyz/jobs/steps/inputs/Input.java | 70 +++++++++++++++---- .../xyz/jobs/steps/inputs/InputsFromS3.java | 61 ++++++++++++++++ .../here/xyz/jobs/steps/inputs/UploadUrl.java | 4 +- .../java/com/here/xyz/jobs/util/S3Client.java | 14 ++-- .../com/here/xyz/util/web/HubWebClient.java | 3 +- 8 files changed, 166 insertions(+), 37 deletions(-) create mode 100644 xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/InputsFromS3.java diff --git a/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/service/JobApi.java b/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/service/JobApi.java index 603d384076..05133c03d9 100644 --- a/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/service/JobApi.java +++ b/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/service/JobApi.java @@ -40,6 +40,7 @@ import com.here.xyz.jobs.datasets.DatasetDescription; import com.here.xyz.jobs.steps.inputs.Input; import com.here.xyz.jobs.steps.inputs.InputsFromJob; +import com.here.xyz.jobs.steps.inputs.InputsFromS3; import com.here.xyz.jobs.steps.inputs.ModelBasedInput; import com.here.xyz.jobs.steps.inputs.UploadUrl; import com.here.xyz.jobs.steps.outputs.Output; @@ -112,6 +113,18 @@ protected void postJobInput(final RoutingContext context) throws HttpException { .onSuccess(res -> sendResponse(context, CREATED.code(), res)) .onFailure(err -> sendErrorResponse(context, err)); } + else if (input instanceof InputsFromS3 s3Inputs) { + loadJob(context, jobId) + .compose(job -> job.getStatus().getState() == NOT_READY + ? Future.succeededFuture(job) + : Future.failedFuture(new HttpException(BAD_REQUEST, "No inputs can be created after a job was submitted."))) + .compose(job -> { + s3Inputs.dereference(job.getId()); + return Future.succeededFuture(); + }) + .onSuccess(v -> sendResponse(context, OK.code(), (XyzSerializable) null)) + .onFailure(err -> sendErrorResponse(context, err)); + } else if (input instanceof ModelBasedInput modelBasedInput) { loadJob(context, jobId) .compose(job -> { diff --git a/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/util/AsyncS3Client.java b/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/util/AsyncS3Client.java index 891b494d27..d4105ccbe1 100644 --- a/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/util/AsyncS3Client.java +++ b/xyz-jobs/xyz-job-service/src/main/java/com/here/xyz/jobs/util/AsyncS3Client.java @@ -24,9 +24,11 @@ import com.here.xyz.util.Async; import io.vertx.core.Future; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class AsyncS3Client extends S3Client { - private static final AsyncS3Client instance = new AsyncS3Client(Config.instance.JOBS_S3_BUCKET); + private static final Map instances = new ConcurrentHashMap<>(); private static final Async ASYNC = new Async(20, AsyncS3Client.class); protected AsyncS3Client(String bucketName) { @@ -34,7 +36,13 @@ protected AsyncS3Client(String bucketName) { } public static AsyncS3Client getInstance() { - return instance; + return getInstance(Config.instance.JOBS_S3_BUCKET); + } + + public static AsyncS3Client getInstance(String bucketName) { + if (!instances.containsKey(bucketName)) + instances.put(bucketName, new AsyncS3Client(bucketName)); + return instances.get(bucketName); } //NOTE: Only the long-blocking methods are added as async variants diff --git a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/impl/imp/ImportFilesToSpace.java b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/impl/imp/ImportFilesToSpace.java index 89c962e94c..6b51335d9c 100644 --- a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/impl/imp/ImportFilesToSpace.java +++ b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/impl/imp/ImportFilesToSpace.java @@ -199,12 +199,10 @@ public void execute() throws WebClientException, SQLException, TooManyResourcesC } public void _execute(boolean isResume) throws WebClientException, SQLException, TooManyResourcesClaimed { - logAndSetPhase(null, "Importing input files from s3://" + bucketName() + "/" + inputS3Prefix() + " in region " + bucketRegion() - + " into space " + getSpaceId() + " ..."); - - logAndSetPhase(null, "Loading space config for space "+getSpaceId()); + logAndSetPhase(null, "Importing input files for job " + getJobId() + " into space " + getSpaceId() + " ..."); + logAndSetPhase(null, "Loading space config for space " + getSpaceId() + " ..."); Space space = loadSpace(getSpaceId()); - logAndSetPhase(null, "Getting storage database for space "+getSpaceId()); + logAndSetPhase(null, "Getting storage database for space " + getSpaceId() + " ..."); Database db = loadDatabase(space.getStorage().getId(), WRITER); //TODO: Move resume logic into #resume() @@ -251,9 +249,9 @@ private void createAndFillTemporaryTable(Database db) throws SQLException, TooMa }catch (SQLException e){ //We expect that - if(e.getSQLState() != null && !e.getSQLState().equals("42P01")) { + if (e.getSQLState() != null && !e.getSQLState().equals("42P01")) throw e; - } + //TODO: Should we really ignore all other SQLExceptions? } if(!tmpTableNotExistsAndHasNoData) { @@ -264,7 +262,7 @@ private void createAndFillTemporaryTable(Database db) throws SQLException, TooMa runWriteQuerySync(buildTemporaryTableForImportQuery(getSchema(db)), db, 0); logAndSetPhase(Phase.FILL_TMP_TABLE); - fillTemporaryTableWithInputs(db, loadInputs(), bucketName(), bucketRegion()); + fillTemporaryTableWithInputs(db, loadInputs(), bucketRegion()); } } @@ -397,10 +395,10 @@ private SQLQuery buildTemporaryTableForImportQuery(String schema) { .withVariable("primaryKey", getTemporaryTableName() + "_primKey"); } - private void fillTemporaryTableWithInputs(Database db, List inputs, String bucketName, String bucketRegion) throws SQLException, TooManyResourcesClaimed { + private void fillTemporaryTableWithInputs(Database db, List inputs, String bucketRegion) throws SQLException, TooManyResourcesClaimed { List queryList = new ArrayList<>(); - for (Input input : inputs){ - if(input instanceof UploadUrl uploadUrl) { + for (Input input : inputs) { + if (input instanceof UploadUrl uploadUrl) { JsonObject data = new JsonObject() .put("compressed", uploadUrl.isCompressed()) .put("filesize", uploadUrl.getByteSize()); @@ -414,7 +412,7 @@ private void fillTemporaryTableWithInputs(Database db, List inputs, Strin .withVariable("schema", getSchema(db)) .withVariable("table", getTemporaryTableName()) .withNamedParameter("s3Key", input.getS3Key()) - .withNamedParameter("bucketName", bucketName) + .withNamedParameter("bucketName", input.getS3Bucket()) .withNamedParameter("bucketRegion", bucketRegion) .withNamedParameter("state", "SUBMITTED") .withNamedParameter("data", data.toString()) @@ -431,9 +429,9 @@ private void fillTemporaryTableWithInputs(Database db, List inputs, Strin .withVariable("schema", getSchema(db)) .withVariable("table", getTemporaryTableName()) .withNamedParameter("s3Key", "SUCCESS_MARKER") - .withNamedParameter("bucketName", bucketName) + .withNamedParameter("bucketName", "SUCCESS_MARKER") .withNamedParameter("state", "SUCCESS_MARKER") - .withNamedParameter("bucketRegion", bucketRegion) + .withNamedParameter("bucketRegion", "SUCCESS_MARKER") .withNamedParameter("data", "{}")); runBatchWriteQuerySync(SQLQuery.batchOf(queryList), db, 0); } diff --git a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/Input.java b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/Input.java index 62999d357c..d7b52e27d3 100644 --- a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/Input.java +++ b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/Input.java @@ -19,6 +19,7 @@ package com.here.xyz.jobs.steps.inputs; +import com.amazonaws.services.s3.AmazonS3URI; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.ObjectMetadata; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -26,6 +27,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.here.xyz.Typed; import com.here.xyz.XyzSerializable; +import com.here.xyz.jobs.steps.Config; import com.here.xyz.jobs.util.S3Client; import java.io.IOException; import java.util.HashSet; @@ -49,6 +51,8 @@ public abstract class Input implements Typed { protected long byteSize; protected boolean compressed; @JsonIgnore + private String s3Bucket; + @JsonIgnore private String s3Key; private static Map> inputsCache = new WeakHashMap<>(); private static Set submittedJobs = new HashSet<>(); @@ -61,6 +65,25 @@ private static String inputMetaS3Key(String jobId) { return jobId + "/meta/inputs.json"; } + private static String defaultBucket() { + return Config.instance.JOBS_S3_BUCKET; + } + + public String getS3Bucket() { + if (s3Bucket == null) + return defaultBucket(); + return s3Bucket; + } + + public void setS3Bucket(String s3Bucket) { + this.s3Bucket = s3Bucket; + } + + public T withS3Bucket(String s3Bucket) { + setS3Bucket(s3Bucket); + return (T) this; + } + public String getS3Key() { return s3Key; } @@ -87,16 +110,32 @@ public static List loadInputs(String jobId) { return loadInputsAndWriteMetadata(jobId); } + private static AmazonS3URI toS3Uri(String s3Uri) { + return new AmazonS3URI(s3Uri); + } + private static List loadInputsAndWriteMetadata(String jobId) { try { InputsMetadata metadata = loadMetadata(jobId); return metadata.inputs.entrySet().stream() - .map(metaEntry -> createInput(metaEntry.getKey(), metaEntry.getValue().byteSize, metaEntry.getValue().compressed)) + .map(metaEntry -> { + final String metaKey = metaEntry.getKey(); + String s3Bucket = null; + String s3Key; + if (metaKey.startsWith("s3://")) { + AmazonS3URI s3Uri = toS3Uri(metaKey); + s3Bucket = s3Uri.getBucket(); + s3Key = "/" + s3Uri.getKey(); + } + else + s3Key = metaKey; + return createInput(s3Bucket, s3Key, metaEntry.getValue().byteSize, metaEntry.getValue().compressed); + }) .toList(); } catch (IOException | AmazonS3Exception ignore) {} - final List inputs = loadInputsInParallel(jobId); + final List inputs = loadInputsInParallel(defaultBucket(), Input.inputS3Prefix(jobId)); //Only write metadata of jobs which are submitted already if (inputs != null && submittedJobs.contains(jobId)) storeMetadata(jobId, inputs); @@ -104,13 +143,13 @@ private static List loadInputsAndWriteMetadata(String jobId) { return inputs; } - static InputsMetadata loadMetadata(String jobId) throws IOException { + static final InputsMetadata loadMetadata(String jobId) throws IOException { InputsMetadata metadata = XyzSerializable.deserialize(S3Client.getInstance().loadObjectContent(inputMetaS3Key(jobId)), InputsMetadata.class); return metadata; } - static void storeMetadata(String jobId, InputsMetadata metadata) { + static final void storeMetadata(String jobId, InputsMetadata metadata) { try { S3Client.getInstance().putObject(inputMetaS3Key(jobId), "application/json", metadata.serialize()); } @@ -124,19 +163,20 @@ private static void storeMetadata(String jobId, List inputs) { storeMetadata(jobId, inputs, null); } - static void storeMetadata(String jobId, List inputs, String referencedJobId) { + static final void storeMetadata(String jobId, List inputs, String referencedJobId) { logger.info("Storing inputs metadata for job {} ...", jobId); Map metadata = inputs.stream() - .collect(Collectors.toMap(input -> input.s3Key, input -> new InputMetadata(input.byteSize, input.compressed))); + .collect(Collectors.toMap(input -> (input.s3Bucket == null ? "" : "s3://" + input.s3Bucket) + input.s3Key, + input -> new InputMetadata(input.byteSize, input.compressed))); storeMetadata(jobId, new InputsMetadata(metadata, Set.of(jobId), referencedJobId)); } - private static List loadInputsInParallel(String jobId) { - logger.info("Scanning inputs for job {} ...", jobId); + static final List loadInputsInParallel(String bucketName, String inputS3Prefix) { + logger.info("Scanning inputs from bucket {} and prefix {} ...", bucketName, inputS3Prefix); ForkJoinPool tmpPool = new ForkJoinPool(10); List inputs = null; try { - inputs = tmpPool.submit(() -> loadAndTransformInputs(jobId, -1, Input.class)).get(); + inputs = tmpPool.submit(() -> loadAndTransformInputs(bucketName, inputS3Prefix, -1, Input.class)).get(); } catch (InterruptedException | ExecutionException ignore) {} finally { @@ -150,13 +190,14 @@ public static int currentInputsCount(String jobId, Class inputT } public static List loadInputsSample(String jobId, int maxSampleSize, Class inputType) { - return loadAndTransformInputs(jobId, maxSampleSize, inputType); + return loadAndTransformInputs(defaultBucket(), Input.inputS3Prefix(jobId), maxSampleSize, inputType); } - private static List loadAndTransformInputs(String jobId, int maxReturnSize, Class inputType) { - Stream inputsStream = S3Client.getInstance().scanFolder(Input.inputS3Prefix(jobId)) + private static List loadAndTransformInputs(String bucketName, String inputS3Prefix, int maxReturnSize, Class inputType) { + Stream inputsStream = S3Client.getInstance(bucketName).scanFolder(inputS3Prefix) .parallelStream() - .map(s3ObjectSummary -> createInput(s3ObjectSummary.getKey(), s3ObjectSummary.getSize(), inputIsCompressed(s3ObjectSummary.getKey()))) + .map(s3ObjectSummary -> createInput(defaultBucket().equals(bucketName) ? null : bucketName, s3ObjectSummary.getKey(), + s3ObjectSummary.getSize(), inputIsCompressed(s3ObjectSummary.getKey()))) .filter(input -> inputType.isAssignableFrom(input.getClass())); if (maxReturnSize > 0) @@ -199,9 +240,10 @@ else if (metadata != null) storeMetadata(owningJobId, metadata); } - private static Input createInput(String s3Key, long byteSize, boolean compressed) { + private static Input createInput(String s3Bucket, String s3Key, long byteSize, boolean compressed) { //TODO: Support ModelBasedInputs return new UploadUrl() + .withS3Bucket(s3Bucket) .withS3Key(s3Key) .withByteSize(byteSize) .withCompressed(compressed); diff --git a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/InputsFromS3.java b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/InputsFromS3.java new file mode 100644 index 0000000000..674f1c8bfb --- /dev/null +++ b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/InputsFromS3.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017-2024 HERE Europe B.V. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * License-Filename: LICENSE + */ + +package com.here.xyz.jobs.steps.inputs; + +import java.util.List; + +public class InputsFromS3 extends Input { + private String bucketArn; + private String prefix; + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public InputsFromS3 withBucketArn(String bucketArn) { + setBucketArn(bucketArn); + return this; + } + + public String getBucketArn() { + return bucketArn; + } + + public void setBucketArn(String bucketArn) { + this.bucketArn = bucketArn; + } + + public InputsFromS3 withPrefix(String prefix) { + setPrefix(prefix); + return this; + } + + public void dereference(String forJob) { + //First load the inputs from the (foreign bucket) + List inputs = loadInputsInParallel(getBucketArn(), getPrefix()); + inputs.forEach(input -> input.setS3Bucket(getBucketArn())); + //Store the metadata for the job that accesses the bucket + storeMetadata(forJob, inputs, null); + } +} diff --git a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/UploadUrl.java b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/UploadUrl.java index e0a6eaafb9..4b631c8004 100644 --- a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/UploadUrl.java +++ b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/steps/inputs/UploadUrl.java @@ -28,12 +28,12 @@ public class UploadUrl extends Input { @JsonView(Public.class) public URL getUrl() { - return S3Client.getInstance().generateUploadURL(getS3Key()); + return S3Client.getInstance(getS3Bucket()).generateUploadURL(getS3Key()); } @JsonView(Public.class) public URL getDownloadUrl() { - return S3Client.getInstance().generateDownloadURL(getS3Key()); + return S3Client.getInstance(getS3Bucket()).generateDownloadURL(getS3Key()); } @JsonIgnore diff --git a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/util/S3Client.java b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/util/S3Client.java index 89e594777d..de2aeec091 100644 --- a/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/util/S3Client.java +++ b/xyz-jobs/xyz-job-steps/src/main/java/com/here/xyz/jobs/util/S3Client.java @@ -45,10 +45,12 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.zip.GZIPOutputStream; public class S3Client { - private static S3Client instance; + private static Map instances = new ConcurrentHashMap<>(); private final String bucketName; protected static final int PRESIGNED_URL_EXPIRATION_SECONDS = 7 * 24 * 60 * 60; @@ -81,9 +83,13 @@ protected S3Client(String bucketName) { } public static S3Client getInstance() { - if (instance == null) - instance = new S3Client(Config.instance.JOBS_S3_BUCKET); - return instance; + return getInstance(Config.instance.JOBS_S3_BUCKET); + } + + public static S3Client getInstance(String bucketName) { + if (!instances.containsKey(bucketName)) + instances.put(bucketName, new S3Client(bucketName)); + return instances.get(bucketName); } private URL generatePresignedUrl(String key, HttpMethod method) { diff --git a/xyz-util/src/main/java/com/here/xyz/util/web/HubWebClient.java b/xyz-util/src/main/java/com/here/xyz/util/web/HubWebClient.java index 343e9d8d23..5cbada446e 100644 --- a/xyz-util/src/main/java/com/here/xyz/util/web/HubWebClient.java +++ b/xyz-util/src/main/java/com/here/xyz/util/web/HubWebClient.java @@ -38,12 +38,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import net.jodah.expiringmap.ExpirationPolicy; import net.jodah.expiringmap.ExpiringMap; public class HubWebClient extends XyzWebClient { - private static Map instances = new HashMap<>(); + private static Map instances = new ConcurrentHashMap<>(); private ExpiringMap connectorCache = ExpiringMap.builder() .expirationPolicy(ExpirationPolicy.CREATED) .expiration(3, TimeUnit.MINUTES) From ebf0e5e951c4e7ee1290f74d4c9c2205da2990c1 Mon Sep 17 00:00:00 2001 From: xyz-hub-dev Date: Fri, 2 Aug 2024 12:10:08 +0000 Subject: [PATCH 2/3] [maven-release-plugin] prepare release 3.9.35 --- pom.xml | 4 ++-- xyz-connectors/pom.xml | 2 +- xyz-hub-service/pom.xml | 2 +- xyz-hub-test/pom.xml | 2 +- xyz-jobs/pom.xml | 2 +- xyz-jobs/xyz-job-service/pom.xml | 2 +- xyz-jobs/xyz-job-steps/pom.xml | 2 +- xyz-models/pom.xml | 2 +- xyz-psql-connector/pom.xml | 2 +- xyz-util/pom.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 4e1dc70977..dc9b94f865 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ com.here.xyz xyz-hub - 3.9.35-SNAPSHOT + 3.9.35 pom @@ -58,7 +58,7 @@ https://github.com/heremaps/xyz-hub scm:git:git://github.com/heremaps/xyz-hub.git scm:git:ssh://git@github.com/heremaps/xyz-hub.git - HEAD + 3.9.35 diff --git a/xyz-connectors/pom.xml b/xyz-connectors/pom.xml index 48dd3d1c3f..3bdf7da386 100644 --- a/xyz-connectors/pom.xml +++ b/xyz-connectors/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 diff --git a/xyz-hub-service/pom.xml b/xyz-hub-service/pom.xml index 913bc8c5ac..663ef566cc 100644 --- a/xyz-hub-service/pom.xml +++ b/xyz-hub-service/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 diff --git a/xyz-hub-test/pom.xml b/xyz-hub-test/pom.xml index cfcdb07976..5a6ebaee55 100644 --- a/xyz-hub-test/pom.xml +++ b/xyz-hub-test/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 diff --git a/xyz-jobs/pom.xml b/xyz-jobs/pom.xml index 19f8ea5fb8..efef6727b6 100644 --- a/xyz-jobs/pom.xml +++ b/xyz-jobs/pom.xml @@ -4,7 +4,7 @@ com.here.xyz xyz-hub - 3.9.35-SNAPSHOT + 3.9.35 XYZ Job Framework diff --git a/xyz-jobs/xyz-job-service/pom.xml b/xyz-jobs/xyz-job-service/pom.xml index 6302893207..ddac4084c7 100644 --- a/xyz-jobs/xyz-job-service/pom.xml +++ b/xyz-jobs/xyz-job-service/pom.xml @@ -22,7 +22,7 @@ com.here.xyz xyz-jobs - 3.9.35-SNAPSHOT + 3.9.35 XYZ Job Service diff --git a/xyz-jobs/xyz-job-steps/pom.xml b/xyz-jobs/xyz-job-steps/pom.xml index ec72ac34a5..9f8c4f7baf 100644 --- a/xyz-jobs/xyz-job-steps/pom.xml +++ b/xyz-jobs/xyz-job-steps/pom.xml @@ -22,7 +22,7 @@ com.here.xyz xyz-jobs - 3.9.35-SNAPSHOT + 3.9.35 XYZ Job Steps diff --git a/xyz-models/pom.xml b/xyz-models/pom.xml index 08fe3132fa..7171b112ad 100644 --- a/xyz-models/pom.xml +++ b/xyz-models/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 diff --git a/xyz-psql-connector/pom.xml b/xyz-psql-connector/pom.xml index b611b6ba63..d71b2762ee 100644 --- a/xyz-psql-connector/pom.xml +++ b/xyz-psql-connector/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 diff --git a/xyz-util/pom.xml b/xyz-util/pom.xml index 7f74441449..a3156bbc88 100644 --- a/xyz-util/pom.xml +++ b/xyz-util/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35-SNAPSHOT + 3.9.35 From 103b1655c446560a96f9fe7ce270ce3701289756 Mon Sep 17 00:00:00 2001 From: xyz-hub-dev Date: Fri, 2 Aug 2024 12:10:09 +0000 Subject: [PATCH 3/3] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- xyz-connectors/pom.xml | 2 +- xyz-hub-service/pom.xml | 2 +- xyz-hub-test/pom.xml | 2 +- xyz-jobs/pom.xml | 2 +- xyz-jobs/xyz-job-service/pom.xml | 2 +- xyz-jobs/xyz-job-steps/pom.xml | 2 +- xyz-models/pom.xml | 2 +- xyz-psql-connector/pom.xml | 2 +- xyz-util/pom.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index dc9b94f865..777f8718d3 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ com.here.xyz xyz-hub - 3.9.35 + 3.9.36-SNAPSHOT pom @@ -58,7 +58,7 @@ https://github.com/heremaps/xyz-hub scm:git:git://github.com/heremaps/xyz-hub.git scm:git:ssh://git@github.com/heremaps/xyz-hub.git - 3.9.35 + HEAD diff --git a/xyz-connectors/pom.xml b/xyz-connectors/pom.xml index 3bdf7da386..7da7c7ba08 100644 --- a/xyz-connectors/pom.xml +++ b/xyz-connectors/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT diff --git a/xyz-hub-service/pom.xml b/xyz-hub-service/pom.xml index 663ef566cc..e78d52a7b2 100644 --- a/xyz-hub-service/pom.xml +++ b/xyz-hub-service/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT diff --git a/xyz-hub-test/pom.xml b/xyz-hub-test/pom.xml index 5a6ebaee55..544ef354e3 100644 --- a/xyz-hub-test/pom.xml +++ b/xyz-hub-test/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT diff --git a/xyz-jobs/pom.xml b/xyz-jobs/pom.xml index efef6727b6..bfe34a025b 100644 --- a/xyz-jobs/pom.xml +++ b/xyz-jobs/pom.xml @@ -4,7 +4,7 @@ com.here.xyz xyz-hub - 3.9.35 + 3.9.36-SNAPSHOT XYZ Job Framework diff --git a/xyz-jobs/xyz-job-service/pom.xml b/xyz-jobs/xyz-job-service/pom.xml index ddac4084c7..14275355a6 100644 --- a/xyz-jobs/xyz-job-service/pom.xml +++ b/xyz-jobs/xyz-job-service/pom.xml @@ -22,7 +22,7 @@ com.here.xyz xyz-jobs - 3.9.35 + 3.9.36-SNAPSHOT XYZ Job Service diff --git a/xyz-jobs/xyz-job-steps/pom.xml b/xyz-jobs/xyz-job-steps/pom.xml index 9f8c4f7baf..a682b5da31 100644 --- a/xyz-jobs/xyz-job-steps/pom.xml +++ b/xyz-jobs/xyz-job-steps/pom.xml @@ -22,7 +22,7 @@ com.here.xyz xyz-jobs - 3.9.35 + 3.9.36-SNAPSHOT XYZ Job Steps diff --git a/xyz-models/pom.xml b/xyz-models/pom.xml index 7171b112ad..bd1c321549 100644 --- a/xyz-models/pom.xml +++ b/xyz-models/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT diff --git a/xyz-psql-connector/pom.xml b/xyz-psql-connector/pom.xml index d71b2762ee..ee73b628e2 100644 --- a/xyz-psql-connector/pom.xml +++ b/xyz-psql-connector/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT diff --git a/xyz-util/pom.xml b/xyz-util/pom.xml index a3156bbc88..760dd4bc73 100644 --- a/xyz-util/pom.xml +++ b/xyz-util/pom.xml @@ -25,7 +25,7 @@ com.here.xyz xyz-hub ../pom.xml - 3.9.35 + 3.9.36-SNAPSHOT