Skip to content

Commit

Permalink
Merged changes from main
Browse files Browse the repository at this point in the history
  • Loading branch information
TetyanaYahodska committed Nov 20, 2024
2 parents 68aa1e0 + bcecf8f commit 2851016
Show file tree
Hide file tree
Showing 6 changed files with 263 additions and 20 deletions.
65 changes: 65 additions & 0 deletions dataplex/snippets/src/main/java/dataplex/SearchEntries.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright 2024 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 dataplex;

// [START dataplex_search_entries]
import com.google.cloud.dataplex.v1.CatalogServiceClient;
import com.google.cloud.dataplex.v1.Entry;
import com.google.cloud.dataplex.v1.SearchEntriesRequest;
import com.google.cloud.dataplex.v1.SearchEntriesResult;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

public class SearchEntries {

public static void main(String[] args) throws IOException {
// TODO(developer): Replace these variables before running the sample.
String projectId = "MY_PROJECT_ID";
// How to write query for search: https://cloud.google.com/dataplex/docs/search-syntax
String query = "MY_QUERY";

List<Entry> entries = searchEntries(projectId, query);
entries.forEach(entry -> System.out.println("Entry name found in search: " + entry.getName()));
}

// Method to search Entries located in projectId and matching query
public static List<Entry> searchEntries(String projectId, String query) throws IOException {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (CatalogServiceClient client = CatalogServiceClient.create()) {
SearchEntriesRequest searchEntriesRequest =
SearchEntriesRequest.newBuilder()
.setPageSize(100)
// Required field, will by default limit search scope to organization under which the
// project is located
.setName(String.format("projects/%s/locations/global", projectId))
// Optional field, will further limit search scope only to specified project
.setScope(String.format("projects/%s", projectId))
.setQuery(query)
.build();

CatalogServiceClient.SearchEntriesPagedResponse searchEntriesResponse =
client.searchEntries(searchEntriesRequest);
return searchEntriesResponse.getPage().getResponse().getResultsList().stream()
// Extract Entries nested inside search results
.map(SearchEntriesResult::getDataplexEntry)
.collect(Collectors.toList());
}
}
}
// [END dataplex_search_entries]
71 changes: 71 additions & 0 deletions dataplex/snippets/src/test/java/dataplex/SearchEntriesIT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright 2024 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 dataplex;

import static com.google.common.truth.Truth.assertThat;
import static junit.framework.TestCase.assertNotNull;

import com.google.cloud.dataplex.v1.Entry;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class SearchEntriesIT {
private static final String ID = UUID.randomUUID().toString().substring(0, 8);
private static final String LOCATION = "us-central1";
private static final String entryGroupId = "test-entry-group-" + ID;
private static final String entryId = "test-entry-" + ID;
private static final String expectedEntry =
String.format("locations/%s/entryGroups/%s/entries/%s", LOCATION, entryGroupId, entryId);

private static final String PROJECT_ID = requireProjectIdEnvVar();

private static String requireProjectIdEnvVar() {
String value = System.getenv("GOOGLE_CLOUD_PROJECT");
assertNotNull(
"Environment variable GOOGLE_CLOUD_PROJECT is required to perform these tests.", value);
return value;
}

@BeforeClass
public static void setUp() throws Exception {
requireProjectIdEnvVar();
CreateEntryGroup.createEntryGroup(PROJECT_ID, LOCATION, entryGroupId);
CreateEntry.createEntry(PROJECT_ID, LOCATION, entryGroupId, entryId);
Thread.sleep(30000);
}

@Test
public void testSearchEntries() throws IOException {
String query = "name:test-entry- AND description:description AND aspect:generic";
List<Entry> entries = SearchEntries.searchEntries(PROJECT_ID, query);
assertThat(
entries.stream()
.map(Entry::getName)
.map(entryName -> entryName.substring(entryName.indexOf("location"))))
.contains(expectedEntry);
}

@AfterClass
public static void tearDown() throws Exception {
// Entry inside this Entry Group will be deleted automatically
DeleteEntryGroup.deleteEntryGroup(PROJECT_ID, LOCATION, entryGroupId);
}
}
18 changes: 9 additions & 9 deletions functions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@

# Google Cloud Functions Java Samples

[Cloud Functions][functions_docs] is a lightweight, event-based, asynchronous
compute solution that allows you to create small, single-purpose functions that
respond to Cloud events without the need to manage a server or a runtime
environment.
[Cloud Run functions](https://cloud.google.com/functions/docs/concepts/overview) is a lightweight, event-based, asynchronous compute solution that allows you to create small, single-purpose functions that respond to Cloud events without the need to manage a server or a runtime environment.

[functions_docs]: https://cloud.google.com/functions/docs/
There are two versions of Cloud Run functions:

* **Cloud Run functions**, formerly known as Cloud Functions (2nd gen), which deploys your function as services on Cloud Run, allowing you to trigger them using Eventarc and Pub/Sub. Cloud Run functions are created using `gcloud functions` or `gcloud run`. Samples for Cloud Run functions can be found in the [`functions/v2`](v2/) folder.
* **Cloud Run functions (1st gen)**, formerly known as Cloud Functions (1st gen), the original version of functions with limited event triggers and configurability. Cloud Run functions (1st gen) are created using `gcloud functions --no-gen2`. Samples for Cloud Run functions (1st generation) can be found in the current `functions/` folder.

## Samples

* [Hello World](helloworld/)
* [Concepts](concepts/)
* [Concepts](v2/concepts/)
* [Datastore](v2/datastore/)
* [Firebase](firebase/)
* [Cloud Pub/Sub](pubsub/)
* [Cloud Pub/Sub](v2/pubsub/)
* [HTTP](http/)
* [Logging & Monitoring](logging/)
* [Slack](slack/)
* [OCR tutorial](ocr/)
* [ImageMagick](imagemagick/)
* [OCR tutorial](v2/ocr/)
* [ImageMagick](v2/imagemagick/)
* [CI/CD setup](ci_cd/)

## Running Functions Locally
Expand Down
85 changes: 85 additions & 0 deletions tpu/src/main/java/tpu/CreateTpuWithTopologyFlag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright 2024 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 tpu;

//[START tpu_vm_create_topology]
import com.google.cloud.tpu.v2.AcceleratorConfig;
import com.google.cloud.tpu.v2.AcceleratorConfig.Type;
import com.google.cloud.tpu.v2.CreateNodeRequest;
import com.google.cloud.tpu.v2.Node;
import com.google.cloud.tpu.v2.TpuClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateTpuWithTopologyFlag {

public static void main(String[] args)
throws IOException, ExecutionException, InterruptedException {
// TODO(developer): Replace these variables before running the sample.
// Project ID or project number of the Google Cloud project you want to create a node.
String projectId = "YOUR_PROJECT_ID";
// The zone in which to create the TPU.
// For more information about supported TPU types for specific zones,
// see https://cloud.google.com/tpu/docs/regions-zones
String zone = "europe-west4-a";
// The name for your TPU.
String nodeName = "YOUR_TPU_NAME";
// The version of the Cloud TPU you want to create.
// Available options: TYPE_UNSPECIFIED = 0, V2 = 2, V3 = 4, V4 = 7
Type tpuVersion = AcceleratorConfig.Type.V2;
// Software version that specifies the version of the TPU runtime to install.
// For more information, see https://cloud.google.com/tpu/docs/runtimes
String tpuSoftwareVersion = "tpu-vm-tf-2.17.0-pod-pjrt";
// The physical topology of your TPU slice.
// For more information about topology for each TPU version,
// see https://cloud.google.com/tpu/docs/system-architecture-tpu-vm#versions.
String topology = "2x2";

createTpuWithTopologyFlag(projectId, zone, nodeName, tpuVersion, tpuSoftwareVersion, topology);
}

// Creates a TPU VM with the specified name, zone, version and topology.
public static Node createTpuWithTopologyFlag(String projectId, String zone, String nodeName,
Type tpuVersion, String tpuSoftwareVersion, String topology)
throws IOException, ExecutionException, InterruptedException {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (TpuClient tpuClient = TpuClient.create()) {
String parent = String.format("projects/%s/locations/%s", projectId, zone);
Node tpuVm =
Node.newBuilder()
.setName(nodeName)
.setAcceleratorConfig(Node.newBuilder()
.getAcceleratorConfigBuilder()
.setType(tpuVersion)
.setTopology(topology)
.build())
.setRuntimeVersion(tpuSoftwareVersion)
.build();

CreateNodeRequest request =
CreateNodeRequest.newBuilder()
.setParent(parent)
.setNodeId(nodeName)
.setNode(tpuVm)
.build();

return tpuClient.createNodeAsync(request).get();
}
}
}
//[END tpu_vm_create_topology]
2 changes: 1 addition & 1 deletion tpu/src/test/java/tpu/QueuedResourceIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import org.mockito.MockedStatic;

@RunWith(JUnit4.class)
@Timeout(value = 30)
@Timeout(value = 10)
public class QueuedResourceIT {
private static final String PROJECT_ID = "project-id";
private static final String ZONE = "europe-west4-a";
Expand Down
42 changes: 32 additions & 10 deletions tpu/src/test/java/tpu/TpuVmIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import static org.mockito.Mockito.when;

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.tpu.v2.AcceleratorConfig;
import com.google.cloud.tpu.v2.CreateNodeRequest;
import com.google.cloud.tpu.v2.DeleteNodeRequest;
import com.google.cloud.tpu.v2.GetNodeRequest;
Expand All @@ -36,28 +37,22 @@
import java.io.IOException;
import java.io.PrintStream;
import java.util.concurrent.ExecutionException;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.MockedStatic;

@RunWith(JUnit4.class)
@Timeout(value = 30)
@Timeout(value = 10)
public class TpuVmIT {
private static final String PROJECT_ID = "project-id";
private static final String ZONE = "asia-east1-c";
private static final String NODE_NAME = "test-tpu";
private static final String TPU_TYPE = "v2-8";
private static final String TPU_SOFTWARE_VERSION = "tpu-vm-tf-2.12.1";
private static ByteArrayOutputStream bout;

@BeforeAll
public static void setUp() {
bout = new ByteArrayOutputStream();
System.setOut(new PrintStream(bout));
}
private static final AcceleratorConfig.Type ACCELERATOR_TYPE = AcceleratorConfig.Type.V2;
private static final String TPU_SOFTWARE_VERSION = "tpu-vm-tf-2.14.1";
private static final String TOPOLOGY = "2x2";

@Test
public void testCreateTpuVm() throws Exception {
Expand Down Expand Up @@ -102,6 +97,8 @@ public void testGetTpuVm() throws IOException {

@Test
public void testDeleteTpuVm() throws IOException, ExecutionException, InterruptedException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
System.setOut(new PrintStream(bout));
try (MockedStatic<TpuClient> mockedTpuClient = mockStatic(TpuClient.class)) {
TpuClient mockTpuClient = mock(TpuClient.class);
OperationFuture mockFuture = mock(OperationFuture.class);
Expand All @@ -116,6 +113,31 @@ public void testDeleteTpuVm() throws IOException, ExecutionException, Interrupte

assertThat(output).contains("TPU VM deleted");
verify(mockTpuClient, times(1)).deleteNodeAsync(any(DeleteNodeRequest.class));

bout.close();
}
}

@Test
public void testCreateTpuVmWithTopologyFlag()
throws IOException, ExecutionException, InterruptedException {
try (MockedStatic<TpuClient> mockedTpuClient = mockStatic(TpuClient.class)) {
Node mockNode = mock(Node.class);
TpuClient mockTpuClient = mock(TpuClient.class);
OperationFuture mockFuture = mock(OperationFuture.class);

mockedTpuClient.when(TpuClient::create).thenReturn(mockTpuClient);
when(mockTpuClient.createNodeAsync(any(CreateNodeRequest.class)))
.thenReturn(mockFuture);
when(mockFuture.get()).thenReturn(mockNode);
Node returnedNode = CreateTpuWithTopologyFlag.createTpuWithTopologyFlag(
PROJECT_ID, ZONE, NODE_NAME, ACCELERATOR_TYPE,
TPU_SOFTWARE_VERSION, TOPOLOGY);

verify(mockTpuClient, times(1))
.createNodeAsync(any(CreateNodeRequest.class));
verify(mockFuture, times(1)).get();
assertEquals(returnedNode, mockNode);
}
}
}

0 comments on commit 2851016

Please sign in to comment.