From 5876d81482b7bd247ef02a6b9f7f062bfae9d4b0 Mon Sep 17 00:00:00 2001 From: Surya Krishna Guthikonda <86280547+suryaguthikonda@users.noreply.github.com> Date: Thu, 23 Jun 2022 18:15:48 +0530 Subject: [PATCH] feat(samples): add create-featurestore samples (#317) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added create-featurestore-sample.js and create-featurestore-sample.test.js * feat(samples): added createFeaturestore sample (#313) * feat(samples): added remaining featurestore samples (#313) * removed the extraneous files * feat(samples): added create-featurestore sample (#313) * feat(samples): added variation of create-featurestore sample (#313) * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot --- README.md | 2 + samples/README.md | 36 +++++++ .../create-featurestore-fixed-nodes-sample.js | 94 ++++++++++++++++ samples/create-featurestore-sample.js | 102 ++++++++++++++++++ ...te-featurestore-fixed-nodes-sample.test.js | 67 ++++++++++++ .../test/create-featurestore-sample.test.js | 68 ++++++++++++ 6 files changed, 369 insertions(+) create mode 100644 samples/create-featurestore-fixed-nodes-sample.js create mode 100644 samples/create-featurestore-sample.js create mode 100644 samples/test/create-featurestore-fixed-nodes-sample.test.js create mode 100644 samples/test/create-featurestore-sample.test.js diff --git a/README.md b/README.md index 0ad659c8..64d5fd36 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,8 @@ Samples are in the [`samples/`](https://github.com/googleapis/nodejs-ai-platform | Create-dataset-video | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-dataset-video.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-dataset-video.js,samples/README.md) | | Create-dataset | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-dataset.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-dataset.js,samples/README.md) | | Create-endpoint | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-endpoint.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-endpoint.js,samples/README.md) | +| Create-featurestore-fixed-nodes-sample | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-featurestore-fixed-nodes-sample.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-featurestore-fixed-nodes-sample.js,samples/README.md) | +| Create-featurestore-sample | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-featurestore-sample.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-featurestore-sample.js,samples/README.md) | | Create-hyperparameter-tuning-job | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-hyperparameter-tuning-job.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-hyperparameter-tuning-job.js,samples/README.md) | | Create-training-pipeline-image-classification | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-training-pipeline-image-classification.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-training-pipeline-image-classification.js,samples/README.md) | | Create-training-pipeline-image-object-detection | [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-training-pipeline-image-object-detection.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-training-pipeline-image-object-detection.js,samples/README.md) | diff --git a/samples/README.md b/samples/README.md index bd0594eb..2e59e2c3 100644 --- a/samples/README.md +++ b/samples/README.md @@ -31,6 +31,8 @@ machine learning development lifecycle. * [Create-dataset-video](#create-dataset-video) * [Create-dataset](#create-dataset) * [Create-endpoint](#create-endpoint) + * [Create-featurestore-fixed-nodes-sample](#create-featurestore-fixed-nodes-sample) + * [Create-featurestore-sample](#create-featurestore-sample) * [Create-hyperparameter-tuning-job](#create-hyperparameter-tuning-job) * [Create-training-pipeline-image-classification](#create-training-pipeline-image-classification) * [Create-training-pipeline-image-object-detection](#create-training-pipeline-image-object-detection) @@ -379,6 +381,40 @@ __Usage:__ +### Create-featurestore-fixed-nodes-sample + +View the [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-featurestore-fixed-nodes-sample.js). + +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-featurestore-fixed-nodes-sample.js,samples/README.md) + +__Usage:__ + + +`node samples/create-featurestore-fixed-nodes-sample.js` + + +----- + + + + +### Create-featurestore-sample + +View the [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-featurestore-sample.js). + +[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-ai-platform&page=editor&open_in_editor=samples/create-featurestore-sample.js,samples/README.md) + +__Usage:__ + + +`node samples/create-featurestore-sample.js` + + +----- + + + + ### Create-hyperparameter-tuning-job View the [source code](https://github.com/googleapis/nodejs-ai-platform/blob/main/samples/create-hyperparameter-tuning-job.js). diff --git a/samples/create-featurestore-fixed-nodes-sample.js b/samples/create-featurestore-fixed-nodes-sample.js new file mode 100644 index 00000000..6fcd87be --- /dev/null +++ b/samples/create-featurestore-fixed-nodes-sample.js @@ -0,0 +1,94 @@ +/* + * 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 + * + * https://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. + */ + +/* + * Creates a new Featurestore with fixed nodes configuration in a given project and location. + * See https://cloud.google.com/vertex-ai/docs/featurestore/setup before running + * the code snippet + */ + +'use strict'; + +async function main( + project, + featurestoreId, + fixedNodeCount = 1, + location = 'us-central1', + apiEndpoint = 'us-central1-aiplatform.googleapis.com', + timeout = 900000 +) { + // [START aiplatform_create_featurestore_fixed_nodes_sample] + /** + * TODO(developer): Uncomment these variables before running the sample.\ + * (Not necessary if passing values as arguments) + */ + + // const project = 'YOUR_PROJECT_ID'; + // const featurestoreId = 'YOUR_FEATURESTORE_ID'; + // const fixedNodeCount = ; + // const location = 'YOUR_PROJECT_LOCATION'; + // const apiEndpoint = 'YOUR_API_ENDPOINT'; + // const timeout = ; + + // Imports the Google Cloud Featurestore Service Client library + const {FeaturestoreServiceClient} = require('@google-cloud/aiplatform').v1; + + // Specifies the location of the api endpoint + const clientOptions = { + apiEndpoint: apiEndpoint, + }; + + // Instantiates a client + const featurestoreServiceClient = new FeaturestoreServiceClient( + clientOptions + ); + + async function createFeaturestoreFixedNodes() { + // Configure the parent resource + const parent = `projects/${project}/locations/${location}`; + + const featurestore = { + onlineServingConfig: {fixedNodeCount: Number(fixedNodeCount)}, + }; + + const request = { + parent: parent, + featurestore: featurestore, + featurestoreId: featurestoreId, + }; + + // Create Featurestore request + const [operation] = await featurestoreServiceClient.createFeaturestore( + request, + {timeout: Number(timeout)} + ); + const [response] = await operation.promise(); + + console.log('Create featurestore fixed nodes response'); + console.log(`Name : ${response.name}`); + console.log('Raw response:'); + console.log(JSON.stringify(response, null, 2)); + } + createFeaturestoreFixedNodes(); + // [END aiplatform_create_featurestore_fixed_nodes_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/samples/create-featurestore-sample.js b/samples/create-featurestore-sample.js new file mode 100644 index 00000000..a4933a54 --- /dev/null +++ b/samples/create-featurestore-sample.js @@ -0,0 +1,102 @@ +/* + * 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 + * + * https://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. + */ + +/* + * Creates a new Featurestore in a given project and location. + * See https://cloud.google.com/vertex-ai/docs/featurestore/setup before running + * the code snippet + */ + +'use strict'; + +async function main( + project, + featurestoreId, + minNodeCount = 1, + maxNodeCount = 5, + location = 'us-central1', + apiEndpoint = 'us-central1-aiplatform.googleapis.com', + timeout = 900000 +) { + // [START aiplatform_create_featurestore_sample] + /** + * TODO(developer): Uncomment these variables before running the sample.\ + * (Not necessary if passing values as arguments) + */ + + // const project = 'YOUR_PROJECT_ID'; + // const featurestoreId = 'YOUR_FEATURESTORE_ID'; + // const minNodeCount = ; + // const maxNodeCount = ; + // const location = 'YOUR_PROJECT_LOCATION'; + // const apiEndpoint = 'YOUR_API_ENDPOINT'; + // const timeout = ; + + // Imports the Google Cloud Featurestore Service Client library + const {FeaturestoreServiceClient} = + require('@google-cloud/aiplatform').v1beta1; + + // Specifies the location of the api endpoint + const clientOptions = { + apiEndpoint: apiEndpoint, + }; + + // Instantiates a client + const featurestoreServiceClient = new FeaturestoreServiceClient( + clientOptions + ); + + async function createFeaturestore() { + // Configure the parent resource + const parent = `projects/${project}/locations/${location}`; + + const featurestore = { + onlineServingConfig: { + scaling: { + minNodeCount: minNodeCount, + maxNodeCount: maxNodeCount, + }, + }, + }; + + const request = { + parent: parent, + featurestore: featurestore, + featurestoreId: featurestoreId, + }; + + // Create Featurestore request + const [operation] = await featurestoreServiceClient.createFeaturestore( + request, + {timeout: Number(timeout)} + ); + const [response] = await operation.promise(); + + console.log('Create featurestore response'); + console.log(`Name : ${response.name}`); + console.log('Raw response:'); + console.log(JSON.stringify(response, null, 2)); + } + createFeaturestore(); + // [END aiplatform_create_featurestore_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/samples/test/create-featurestore-fixed-nodes-sample.test.js b/samples/test/create-featurestore-fixed-nodes-sample.test.js new file mode 100644 index 00000000..566a62fd --- /dev/null +++ b/samples/test/create-featurestore-fixed-nodes-sample.test.js @@ -0,0 +1,67 @@ +/* + * 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 + * + * https://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. + */ + +'use strict'; + +const {assert} = require('chai'); +const {FeaturestoreServiceClient} = require('@google-cloud/aiplatform').v1; +const {after, describe, it} = require('mocha'); +const uuid = require('uuid').v4; +const cp = require('child_process'); +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const project = process.env.CAIP_PROJECT_ID; +const featurestoreId = `featurestore_sample_${uuid() + .replace(/-/g, '_') + .slice(10, 20)}`; +const fixedNodeCount = 1; +const location = 'us-central1'; +const apiEndpoint = 'us-central1-aiplatform.googleapis.com'; + +// Instantiates a featurestore clients +const featurestoreServiceClient = new FeaturestoreServiceClient({ + apiEndpoint: apiEndpoint, +}); + +const deleteFeaturestore = async () => { + // Configure the name resource + const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`; + + const request = { + name: name, + force: true, + }; + + // Delete Featurestore request + const [operation] = await featurestoreServiceClient.deleteFeaturestore( + request, + {timeout: 60000} + ); + await operation.promise(); +}; + +describe('AI platform create featurestore with fixed nodes', async function () { + this.retries(2); + it('should create a featurestore', async () => { + const stdout = execSync( + `node ./create-featurestore-fixed-nodes-sample.js ${project} ${featurestoreId} ${fixedNodeCount} ${location} ${apiEndpoint}` + ); + assert.match(stdout, /Create featurestore fixed nodes response/); + }); + after('should delete the created featurestore', async () => { + await deleteFeaturestore(); + }); +}); diff --git a/samples/test/create-featurestore-sample.test.js b/samples/test/create-featurestore-sample.test.js new file mode 100644 index 00000000..cb66466c --- /dev/null +++ b/samples/test/create-featurestore-sample.test.js @@ -0,0 +1,68 @@ +/* + * 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 + * + * https://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. + */ + +'use strict'; + +const {assert} = require('chai'); +const {FeaturestoreServiceClient} = require('@google-cloud/aiplatform').v1; +const {after, describe, it} = require('mocha'); +const uuid = require('uuid').v4; +const cp = require('child_process'); +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const project = process.env.CAIP_PROJECT_ID; +const featurestoreId = `featurestore_sample_${uuid() + .replace(/-/g, '_') + .slice(10, 20)}`; +const minNodeCount = 1; +const maxNodeCount = 5; +const location = 'us-central1'; +const apiEndpoint = 'us-central1-aiplatform.googleapis.com'; + +// Instantiates a featurestore clients +const featurestoreServiceClient = new FeaturestoreServiceClient({ + apiEndpoint: apiEndpoint, +}); + +const deleteFeaturestore = async () => { + // Configure the name resource + const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`; + + const request = { + name: name, + force: true, + }; + + // Delete Featurestore request + const [operation] = await featurestoreServiceClient.deleteFeaturestore( + request, + {timeout: 60000} + ); + await operation.promise(); +}; + +describe('AI platform create featurestore', async function () { + this.retries(2); + it('should create a featurestore', async () => { + const stdout = execSync( + `node ./create-featurestore-sample.js ${project} ${featurestoreId} ${minNodeCount} ${maxNodeCount} ${location} ${apiEndpoint}` + ); + assert.match(stdout, /Create featurestore response/); + }); + after('should delete the created featurestore', async () => { + await deleteFeaturestore(); + }); +});