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(); + }); +});