diff --git a/README.md b/README.md index c284101..555c43d 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,15 @@ use this Cloud Fleet Routing Client Library. +## Samples + +Samples are in the [`samples/`](https://github.com/googleapis/java-optimization/tree/main/samples) directory. + +| Sample | Source Code | Try it | +| --------------------------- | --------------------------------- | ------ | +| Async Api | [source code](https://github.com/googleapis/java-optimization/blob/main/samples/snippets/src/main/java/com/example/optimizationai/AsyncApi.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-optimization&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/optimizationai/AsyncApi.java) | + + ## Troubleshooting diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 1ba7f30..9119592 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -32,7 +32,11 @@ 0.1.1 - + + com.google.cloud + google-cloud-storage + 2.6.0 + junit junit @@ -81,4 +85,4 @@ - + \ No newline at end of file diff --git a/samples/pom.xml b/samples/pom.xml index 1ac0e01..bfb97b8 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud--samples - 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT pom Google Cloud Fleet Routing Samples Parent https://github.com/googleapis/java-optimization @@ -53,4 +53,4 @@ - + \ No newline at end of file diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 1f67e12..8a7fac1 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -32,6 +32,11 @@ + + com.google.cloud + google-cloud-storage + 2.6.0 + junit junit @@ -80,4 +85,4 @@ - + \ No newline at end of file diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index dae97ee..b843131 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -2,10 +2,13 @@ 4.0.0 com.google.cloud - -snippets - jar - Google Cloud Fleet Routing Snippets + optimization-ai-snippets + pom + Google Cloud Fleet Routing Samples Parent https://github.com/googleapis/java-optimization + + Java idiomatic client for Google Cloud Platform services. + + + + + com.google.cloud + libraries-bom + 25.1.0 + pom + import + + + + - com.google.cloud google-cloud-optimization 0.1.1 - + + + com.google.cloud + google-cloud-storage + junit junit @@ -44,4 +63,4 @@ test - + \ No newline at end of file diff --git a/samples/snippets/src/main/java/com/example/optimizationai/AsyncApi.java b/samples/snippets/src/main/java/com/example/optimizationai/AsyncApi.java new file mode 100644 index 0000000..97430d3 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/optimizationai/AsyncApi.java @@ -0,0 +1,85 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + +package com.optimizationai; + +// [START cloudoptimization_async_api] +import com.google.api.gax.longrunning.OperationFuture; +import com.google.cloud.optimization.v1.AsyncModelMetadata; +import com.google.cloud.optimization.v1.BatchOptimizeToursRequest; +import com.google.cloud.optimization.v1.BatchOptimizeToursRequest.AsyncModelConfig; +import com.google.cloud.optimization.v1.BatchOptimizeToursResponse; +import com.google.cloud.optimization.v1.DataFormat; +import com.google.cloud.optimization.v1.FleetRoutingClient; +import com.google.cloud.optimization.v1.GcsDestination; +import com.google.cloud.optimization.v1.GcsSource; +import com.google.cloud.optimization.v1.InputConfig; +import com.google.cloud.optimization.v1.OutputConfig; + +/** + * This is an example to send a request to Cloud Fleet Routing asynchronous API via Java API Client. + * A sample async_request_java.textproto file and a sample request_model_java.json file can be found + * in the resources folder. + */ +public class AsyncApi { + public static void callAsyncApi() throws Exception { + // TODO(developer): Replace these variables before running the sample. + String projectParent = "projects/{YOUR_GCP_PROJECT_ID}"; + String inputUri = "gs://YOUR_GCS_PATH"; + String outputUri = "gs://YOUR_SOLUTION_PATH"; + callAsyncApi(projectParent, inputUri, outputUri); + } + + public static void callAsyncApi(String projectParent, String inputUri, String outputUri) + throws Exception { + GcsSource gcsSource = GcsSource.newBuilder().setUri(inputUri).build(); + InputConfig inputConfig = + InputConfig.newBuilder().setGcsSource(gcsSource).setDataFormat(DataFormat.JSON).build(); + GcsDestination gcsDestination = GcsDestination.newBuilder().setUri(outputUri).build(); + OutputConfig outputConfig = + OutputConfig.newBuilder() + .setGcsDestination(gcsDestination) + .setDataFormat(DataFormat.JSON) + .build(); + + AsyncModelConfig asyncModelConfig = + AsyncModelConfig.newBuilder() + .setInputConfig(inputConfig) + .setOutputConfig(outputConfig) + .build(); + BatchOptimizeToursRequest request = + BatchOptimizeToursRequest.newBuilder() + .setParent(projectParent) + .addModelConfigs(asyncModelConfig) + .build(); + + FleetRoutingClient fleetRoutingClient = FleetRoutingClient.create(); + OperationFuture response = + fleetRoutingClient.batchOptimizeToursAsync(request); + System.out.format("the response name: %s\n", response.getInitialFuture().get().getName()); + + // Block to wait for the job to finish. + response.getPollingFuture().get(); + if (response.getMetadata().get().getState() == AsyncModelMetadata.State.SUCCEEDED) { + // Code to do your stuff + System.out.println("Job finished successfully."); + } else { + System.out.println( + "Job failed with message:" + response.getPollingFuture().get().getErrorMessage()); + } + } +} +// [END cloudoptimization_async_api] diff --git a/samples/snippets/src/test/java/com/example/optimizationai/AsyncApiTest.java b/samples/snippets/src/test/java/com/example/optimizationai/AsyncApiTest.java new file mode 100644 index 0000000..058b46a --- /dev/null +++ b/samples/snippets/src/test/java/com/example/optimizationai/AsyncApiTest.java @@ -0,0 +1,93 @@ +/* + * Copyright 2022 Google LLC + * + * 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. + */ + +package com.optimizationai; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.api.gax.paging.Page; +import com.google.cloud.storage.Blob; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.UUID; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** Tests for AsyncApi sample. */ +public class AsyncApiTest { + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_PARENT = String.format("projects/%s", PROJECT_ID); + private static final String BUCKET_NAME = + String.format("optimizationai-test-%s", UUID.randomUUID()); + private static final String INPUT_URI = + "gs://cloud-samples-data/optimization-ai/async_request_model.json"; + private static final String BATCH_OUTPUT_URI = + String.format("gs://%s/code_snippets_test_output.json", BUCKET_NAME); + + private ByteArrayOutputStream bout; + private PrintStream out; + private PrintStream originalPrintStream; + + private static void cleanUpBucket() { + Storage storage = StorageOptions.getDefaultInstance().getService(); + Page blobs = storage.list(BUCKET_NAME, Storage.BlobListOption.currentDirectory()); + + deleteDirectory(storage, blobs); + } + + private static void deleteDirectory(Storage storage, Page blobs) { + for (Blob blob : blobs.iterateAll()) { + if (!blob.delete()) { + Page subBlobs = + storage.list( + BUCKET_NAME, + Storage.BlobListOption.currentDirectory(), + Storage.BlobListOption.prefix(blob.getName())); + + deleteDirectory(storage, subBlobs); + } + } + } + + @Before + public void setUp() { + bout = new ByteArrayOutputStream(); + out = new PrintStream(bout); + originalPrintStream = System.out; + System.setOut(out); + + Storage storage = StorageOptions.getDefaultInstance().getService(); + storage.create(BucketInfo.of(BUCKET_NAME)); + } + + @After + public void tearDown() { + cleanUpBucket(); + System.out.flush(); + System.setOut(originalPrintStream); + } + + @Test + public void testAsyncApi() throws Exception { + AsyncApi.callAsyncApi(PROJECT_PARENT, INPUT_URI, BATCH_OUTPUT_URI); + String got = bout.toString(); + assertThat(got).contains("Job"); + } +}