From 30d44b2b93c67781c5959e0ce85c1042bcb5859b Mon Sep 17 00:00:00 2001 From: Surya Guthikonda Date: Fri, 17 Jun 2022 12:37:44 +0530 Subject: [PATCH] feat(samples): add get-featurestore sample (#313) --- samples/get-featurestore-sample.js | 85 ++++++++++++++++++ samples/test/get-featurestore-sample.test.js | 94 ++++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 samples/get-featurestore-sample.js create mode 100644 samples/test/get-featurestore-sample.test.js diff --git a/samples/get-featurestore-sample.js b/samples/get-featurestore-sample.js new file mode 100644 index 00000000..d157d7b1 --- /dev/null +++ b/samples/get-featurestore-sample.js @@ -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 + * + * 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. + */ + +/* + * Gets details of a single Featurestore. + * See https://cloud.google.com/vertex-ai/docs/featurestore/setup before running + * the code snippet + */ + +'use strict'; + +async function main( + project, + featurestoreId, + location = 'us-central1', + apiEndpoint = 'us-central1-aiplatform.googleapis.com', + timeout = 300000 +) { + // [START aiplatform_get_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 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 getFeaturestore() { + // Configure the parent resource + const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`; + + const request = { + name: name, + }; + + // Get Featurestore request + const [response] = await featurestoreServiceClient.getFeaturestore( + request, + {timeout: Number(timeout)} + ); + + console.log('Get featurestore response'); + console.log(`Name : ${response.name}`); + console.log('Raw response:'); + console.log(JSON.stringify(response, null, 2)); + } + getFeaturestore(); + // [END aiplatform_get_featurestore_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/samples/test/get-featurestore-sample.test.js b/samples/test/get-featurestore-sample.test.js new file mode 100644 index 00000000..1e9cef95 --- /dev/null +++ b/samples/test/get-featurestore-sample.test.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. + */ + +'use strict'; + +const {assert} = require('chai'); +const {FeaturestoreServiceClient} = require('@google-cloud/aiplatform').v1; +const {after, before, 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 createFeaturestore = async () => { + // Configure the parent resource + const parent = `projects/${project}/locations/${location}`; + + const featurestore = { + onlineServingConfig: { + fixedNodeCount: fixedNodeCount, + }, + }; + + const request = { + parent: parent, + featurestore: featurestore, + featurestoreId: featurestoreId, + }; + + // Create Featurestore request + const [operation] = await featurestoreServiceClient.createFeaturestore( + request, + {timeout: 900000} + ); + await operation.promise(); +}; + +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 get featurestore', async function () { + this.retries(2); + before('should create the featurestore', async () => { + await createFeaturestore(); + }); + it('should get the featurestore', async () => { + const stdout = execSync( + `node ./get-featurestore-sample.js ${project} ${featurestoreId} ${location} ${apiEndpoint}` + ); + assert.match(stdout, /Get featurestore response/); + }); + after('should delete the created featurestore', async () => { + await deleteFeaturestore(); + }); +});