From 292f694d91df7dee75c956b04d1b7d940a91d106 Mon Sep 17 00:00:00 2001 From: Surya Guthikonda Date: Mon, 20 Jun 2022 13:40:51 +0530 Subject: [PATCH] feat(samples): add update-entity-type samples (#313) --- ...date-entity-type-monitoring-sample.test.js | 125 ++++++++++++++++++ .../test/update-entity-type-sample.test.js | 124 +++++++++++++++++ .../update-entity-type-monitoring-sample.js | 105 +++++++++++++++ samples/update-entity-type-sample.js | 97 ++++++++++++++ 4 files changed, 451 insertions(+) create mode 100644 samples/test/update-entity-type-monitoring-sample.test.js create mode 100644 samples/test/update-entity-type-sample.test.js create mode 100644 samples/update-entity-type-monitoring-sample.js create mode 100644 samples/update-entity-type-sample.js diff --git a/samples/test/update-entity-type-monitoring-sample.test.js b/samples/test/update-entity-type-monitoring-sample.test.js new file mode 100644 index 00000000..da20dea8 --- /dev/null +++ b/samples/test/update-entity-type-monitoring-sample.test.js @@ -0,0 +1,125 @@ +/* + * 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 entityTypeId = `entity_type_sample_${uuid() + .replace(/-/g, '_') + .slice(10, 20)}`; +const entityTypeDescription = + 'created during update entity type with monitoring sample testing'; +const duration = 172000; +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(); +}; + +const createEntityType = async () => { + // Configure the parent resource + const parent = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`; + + const entityType = { + description: entityTypeDescription, + }; + + const request = { + parent: parent, + entityTypeId: entityTypeId, + entityType: entityType, + }; + + // CreateEntityType request + const [operation] = await featurestoreServiceClient.createEntityType( + request, + {timeout: 300000} + ); + await operation.promise(); +}; + +describe('AI platform update entity type with monitoring', async function () { + this.retries(2); + before('should create the featurestore', async () => { + await createFeaturestore(); + }); + before('should create the entity type', async () => { + await createEntityType(); + }); + it('should update the entity type', async () => { + const stdout = execSync( + `node ./update-entity-type-monitoring-sample.js ${project} ${featurestoreId} ${entityTypeId} ${duration} ${location} ${apiEndpoint}` + ); + assert.match(stdout, /Update entity type monitoring response/); + }); + after('should delete the created featurestore', async () => { + await deleteFeaturestore(); + }); +}); diff --git a/samples/test/update-entity-type-sample.test.js b/samples/test/update-entity-type-sample.test.js new file mode 100644 index 00000000..8bc02d79 --- /dev/null +++ b/samples/test/update-entity-type-sample.test.js @@ -0,0 +1,124 @@ +/* + * 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 entityTypeId = `entity_type_sample_${uuid() + .replace(/-/g, '_') + .slice(10, 20)}`; +const entityTypeDescription = + 'created during update entity type sample testing'; +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(); +}; + +const createEntityType = async () => { + // Configure the parent resource + const parent = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`; + + const entityType = { + description: entityTypeDescription, + }; + + const request = { + parent: parent, + entityTypeId: entityTypeId, + entityType: entityType, + }; + + // CreateEntityType request + const [operation] = await featurestoreServiceClient.createEntityType( + request, + {timeout: 300000} + ); + await operation.promise(); +}; + +describe('AI platform update entity type', async function () { + this.retries(2); + before('should create the featurestore', async () => { + await createFeaturestore(); + }); + before('should create the entity type', async () => { + await createEntityType(); + }); + it('should update the entity type', async () => { + const stdout = execSync( + `node ./update-entity-type-sample.js ${project} ${featurestoreId} ${entityTypeId} ${location} ${apiEndpoint}` + ); + assert.match(stdout, /Update entity type response/); + }); + after('should delete the created featurestore', async () => { + await deleteFeaturestore(); + }); +}); diff --git a/samples/update-entity-type-monitoring-sample.js b/samples/update-entity-type-monitoring-sample.js new file mode 100644 index 00000000..24d797ea --- /dev/null +++ b/samples/update-entity-type-monitoring-sample.js @@ -0,0 +1,105 @@ +/* + * 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. + */ + +/* + * Updates the parameters of a single EntityType with monitoring configuration. + * See https://cloud.google.com/vertex-ai/docs/featurestore/setup before running + * the code snippet + */ + +'use strict'; + +async function main( + project, + featurestoreId, + entityTypeId, + duration, + location = 'us-central1', + apiEndpoint = 'us-central1-aiplatform.googleapis.com', + timeout = 300000 +) { + // [START aiplatform_update_entity_type_monitoring_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 entityTypeId = 'YOUR_ENTITY_TYPE_ID'; + // const duration = ; + // 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 updateEntityTypeMonitoring() { + // Configure the name resource + const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}/entityTypes/${entityTypeId}`; + + // Constructing the monitoring configuration + const monitoringConfig = { + snapshotAnalysis: { + monitoringInterval: { + seconds: Number(duration), + }, + }, + }; + + // Constructing the entityType + const entityType = { + name: name, + monitoringConfig: monitoringConfig, + }; + + const request = { + entityType: entityType, + }; + + // Update EntityType request + const [response] = await featurestoreServiceClient.updateEntityType( + request, + {timeout: Number(timeout)} + ); + + console.log('Update entity type monitoring response'); + console.log(`Name : ${response.name}`); + console.log('Raw response:'); + console.log(JSON.stringify(response, null, 2)); + } + updateEntityTypeMonitoring(); + // [END aiplatform_update_entity_type_monitoring_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/samples/update-entity-type-sample.js b/samples/update-entity-type-sample.js new file mode 100644 index 00000000..dfb3872c --- /dev/null +++ b/samples/update-entity-type-sample.js @@ -0,0 +1,97 @@ +/* + * 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. + */ + +/* + * Updates the parameters of a single EntityType. + * See https://cloud.google.com/vertex-ai/docs/featurestore/setup before running + * the code snippet + */ + +'use strict'; + +async function main( + project, + featurestoreId, + entityTypeId, + location = 'us-central1', + apiEndpoint = 'us-central1-aiplatform.googleapis.com', + timeout = 300000 +) { + // [START aiplatform_update_entity_type_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 entityTypeId = 'YOUR_ENTITY_TYPE_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 updateEntityType() { + // Configure the name resource + const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}/entityTypes/${entityTypeId}`; + + // Constructing the entityType + const entityType = { + name: name, + labels: { + language: 'nodejs', + project: 'vertex-ai-dev', + }, + description: 'updated description', + }; + + const request = { + entityType: entityType, + }; + + // Update EntityType request + const [response] = await featurestoreServiceClient.updateEntityType( + request, + {timeout: Number(timeout)} + ); + + console.log('Update entity type response'); + console.log(`Name : ${response.name}`); + console.log('Raw response:'); + console.log(JSON.stringify(response, null, 2)); + } + updateEntityType(); + // [END aiplatform_update_entity_type_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2));