diff --git a/parametermanager/createParam.js b/parametermanager/createParam.js new file mode 100644 index 0000000000..d65ac75e03 --- /dev/null +++ b/parametermanager/createParam.js @@ -0,0 +1,64 @@ +// Copyright 2025 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'; + +/** + * Creates a global parameter using the Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is to be created. + * @param {string} parameterId - The ID of the parameter to create. This ID must be unique within the project. + */ +async function main(projectId, parameterId) { + // [START parametermanager_create_param] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function createParam() { + const parent = client.locationPath(projectId, 'global'); + const request = { + parent: parent, + parameterId: parameterId, + }; + + const [parameter] = await client.createParameter(request); + console.log(`Created parameter: ${parameter.name}`); + return parameter; + } + + return await createParam(); + // [END parametermanager_create_param] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/createParamVersion.js b/parametermanager/createParamVersion.js new file mode 100644 index 0000000000..9585745077 --- /dev/null +++ b/parametermanager/createParamVersion.js @@ -0,0 +1,80 @@ +// Copyright 2025 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'; + +/** + * Creates a parameter version globally for unstructured data. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is to be created + * @param {string} parameterId - The ID of the parameter for which the version is to be created. + * @param {string} parameterVersionId - The ID of the parameter version to be created. + * @param {string} payload - The unformatted string payload to be stored in the new parameter version. + */ +async function main(projectId, parameterId, parameterVersionId, payload) { + // [START parametermanager_create_param_version] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + // const parameterVersionId = 'YOUR_PARAMETER_VERSION_ID'; + // const payload = 'This is unstructured data'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function createParamVersion() { + // Construct the parent resource name + const parent = client.parameterPath(projectId, 'global', parameterId); + + // Construct the parameter version + const parameterVersion = { + payload: { + data: Buffer.from(payload, 'utf8'), + }, + }; + + // Construct the request + const request = { + parent: parent, + parameterVersionId: parameterVersionId, + parameterVersion: parameterVersion, + }; + + // Create the parameter version + const [paramVersion] = await client.createParameterVersion(request); + console.log(`Created parameter version: ${paramVersion.name}`); + return paramVersion; + } + + return await createParamVersion(); + // [END parametermanager_create_param_version] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/createParamVersionWithSecret.js b/parametermanager/createParamVersionWithSecret.js new file mode 100644 index 0000000000..2761adf353 --- /dev/null +++ b/parametermanager/createParamVersionWithSecret.js @@ -0,0 +1,90 @@ +// Copyright 2025 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'; + +/** + * Creates a new version of an existing parameter in the global location + * of the specified project using the Google Cloud Parameter Manager SDK. + * The payload is specified as a JSON string and includes a reference to a secret. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is located. + * @param {string} parameterId - The ID of the parameter for which the version is to be created. + * @param {string} parameterVersionId - The ID of the parameter version to be created. + * @param {string} secretId - The ID of the secret to be referenced. + */ +async function main(projectId, parameterId, parameterVersionId, secretId) { + // [START parametermanager_create_param_version_with_secret] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + // const parameterVersionId = 'YOUR_PARAMETER_VERSION_ID'; + // const secretId = 'YOUR_SECRET_ID'; // For example projects/my-project/secrets/application-secret/version/latest + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function createParamVersionWithSecret() { + // Construct the parent resource name + const parent = client.parameterPath(projectId, 'global', parameterId); + + // Construct the JSON data with secret references + const jsonData = { + db_user: 'test_user', + db_password: `__REF__(//secretmanager.googleapis.com/${secretId})`, + }; + + // Construct the parameter version + const parameterVersion = { + payload: { + data: Buffer.from(JSON.stringify(jsonData), 'utf8'), + }, + }; + + // Construct the request + const request = { + parent: parent, + parameterVersionId: parameterVersionId, + parameterVersion: parameterVersion, + }; + + // Create the parameter version + const [paramVersion] = await client.createParameterVersion(request); + console.log( + `Created parameter version with secret references: ${paramVersion.name}` + ); + return paramVersion; + } + + return await createParamVersionWithSecret(); + // [END parametermanager_create_param_version_with_secret] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/createStructuredParam.js b/parametermanager/createStructuredParam.js new file mode 100644 index 0000000000..cc349964f7 --- /dev/null +++ b/parametermanager/createStructuredParam.js @@ -0,0 +1,73 @@ +// Copyright 2025 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'; + +/** + * Creates a parameter in the global location of the specified + * project with specified format using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is to be created. + * @param {string} parameterId - The ID of the parameter to create. This ID must be unique within the project. + * @param {string} formatType - The format type of the parameter (UNFORMATTED, YAML, JSON). + */ +async function main(projectId, parameterId, formatType) { + // [START parametermanager_create_structured_param] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const {protos} = require('@google-cloud/parametermanager'); + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + // const formatType = protos.google.cloud.parametermanager.v1.ParameterFormat.JSON; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function createStructuredParam() { + const parent = client.locationPath(projectId, 'global'); + const request = { + parent: parent, + parameterId: parameterId, + parameter: { + format: formatType, + }, + }; + + const [parameter] = await client.createParameter(request); + console.log( + `Created parameter ${parameter.name} with format ${parameter.format}` + ); + return parameter; + } + + return await createStructuredParam(); + // [END parametermanager_create_structured_param] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/createStructuredParamVersion.js b/parametermanager/createStructuredParamVersion.js new file mode 100644 index 0000000000..79bc2809c4 --- /dev/null +++ b/parametermanager/createStructuredParamVersion.js @@ -0,0 +1,82 @@ +// Copyright 2025 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'; + +/** + * Creates a new version of an existing parameter in the global location + * of the specified project using the Google Cloud Parameter Manager SDK. + * The payload is specified as a JSON format. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is to be created. + * @param {string} parameterId - The ID of the parameter to create. This ID must be unique within the project. + * @param {string} parameterVersionId - The ID of the parameter version to be created. + * @param {Object} payload - The JSON payload data to be stored in the parameter version. + */ +async function main(projectId, parameterId, parameterVersionId, payload) { + // [START parametermanager_create_structured_param_version] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + // const parameterVersionId = 'YOUR_PARAMETER_VERSION_ID'; + // const jsonData = {username: "test-user", host: "localhost"}; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function createStructuredParamVersion() { + // Construct the parent resource name + const parent = client.parameterPath(projectId, 'global', parameterId); + + // Construct the parameter version + const parameterVersion = { + payload: { + data: Buffer.from(JSON.stringify(payload), 'utf8'), + }, + }; + + // Construct the request + const request = { + parent: parent, + parameterVersionId: parameterVersionId, + parameterVersion: parameterVersion, + }; + + // Create the parameter version + const [paramVersion] = await client.createParameterVersion(request); + console.log(`Created parameter version: ${paramVersion.name}`); + return paramVersion; + } + + return await createStructuredParamVersion(); + // [END parametermanager_create_structured_param_version] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/getParam.js b/parametermanager/getParam.js new file mode 100644 index 0000000000..b2ff816104 --- /dev/null +++ b/parametermanager/getParam.js @@ -0,0 +1,70 @@ +// Copyright 2025 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'; + +/** + * Retrieves a parameter from the global location of the specified + * project using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is located. + * @param {string} parameterId - The ID of the parameter to retrieve. + */ +async function main(projectId, parameterId) { + // [START parametermanager_get_param] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const parameterId = 'my-parameter'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function getParam() { + // Construct the fully qualified parameter name + const name = client.parameterPath(projectId, 'global', parameterId); + + // Get the parameter + const [parameter] = await client.getParameter({ + name: name, + }); + + // Find more details for the Parameter object here: + // https://cloud.google.com/secret-manager/parameter-manager/docs/reference/rest/v1/projects.locations.parameters#Parameter + console.log( + `Found parameter ${parameter.name} with format ${parameter.format}` + ); + return parameter; + } + + return await getParam(); + // [END parametermanager_get_param] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/getParamVersion.js b/parametermanager/getParamVersion.js new file mode 100644 index 0000000000..7771e6086f --- /dev/null +++ b/parametermanager/getParamVersion.js @@ -0,0 +1,81 @@ +// Copyright 2025 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'; + +/** + * Retrieves the details of a specific version of an existing parameter in the specified + * project using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is located. + * @param {string} parameterId - The ID of the parameter for which the version details are to be retrieved. + * @param {string} versionId - The version ID of the parameter to retrieve. + */ +async function main(projectId, parameterId, versionId) { + // [START parametermanager_get_param_version] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const parameterId = 'my-parameter'; + // const versionId = 'v1'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function getParamVersion() { + // Construct the fully qualified parameter version name + const name = client.parameterVersionPath( + projectId, + 'global', + parameterId, + versionId + ); + + // Get the parameter version + const [parameterVersion] = await client.getParameterVersion({ + name: name, + }); + // Find more details for the Parameter Version object here: + // https://cloud.google.com/secret-manager/parameter-manager/docs/reference/rest/v1/projects.locations.parameters.versions#ParameterVersion + console.log( + `Found parameter version ${parameterVersion.name} with state ${parameterVersion.disabled ? 'disabled' : 'enabled'}` + ); + if (!parameterVersion.disabled) { + console.log( + `Payload: ${parameterVersion.payload.data.toString('utf-8')}` + ); + } + return parameterVersion; + } + + return await getParamVersion(); + // [END parametermanager_get_param_version] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/listParamVersions.js b/parametermanager/listParamVersions.js new file mode 100644 index 0000000000..7e8cf5116e --- /dev/null +++ b/parametermanager/listParamVersions.js @@ -0,0 +1,73 @@ +// Copyright 2025 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'; + +/** + * + * Lists all versions of an existing parameter in the global location + * of the specified project using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where parameter is located. + * @param {string} parameterId - The parameter ID for which versions are to be listed. + */ +async function main(projectId, parameterId) { + // [START parametermanager_list_param_versions] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const parameterId = 'my-parameter'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function listParamVersions() { + // Construct the parent string for listing parameter versions globally + const parent = client.parameterPath(projectId, 'global', parameterId); + + const request = { + parent: parent, + }; + + // Use listParameterVersionsAsync to handle pagination automatically + const parameterVersions = await client.listParameterVersionsAsync(request); + + for await (const version of parameterVersions) { + console.log( + `Found parameter version ${version.name} with state ${version.disabled ? 'disabled' : 'enabled'}` + ); + } + return parameterVersions; + } + + return await listParamVersions(); + // [END parametermanager_list_param_versions] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/listParams.js b/parametermanager/listParams.js new file mode 100644 index 0000000000..1970f1078c --- /dev/null +++ b/parametermanager/listParams.js @@ -0,0 +1,70 @@ +// Copyright 2025 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'; + +/** + * Lists all parameters in the global location for the specified + * project using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameters are located. + */ +async function main(projectId) { + // [START parametermanager_list_params] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function listParams() { + // Construct the parent string for listing parameters globally + const parent = client.locationPath(projectId, 'global'); + + const request = { + parent: parent, + }; + + // Use listParametersAsync to handle pagination automatically + const parameters = await client.listParametersAsync(request); + + for await (const parameter of parameters) { + console.log( + `Found parameter ${parameter.name} with format ${parameter.format}` + ); + } + return parameters; + } + + return await listParams(); + // [END parametermanager_list_params] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/package.json b/parametermanager/package.json new file mode 100644 index 0000000000..62cca15a15 --- /dev/null +++ b/parametermanager/package.json @@ -0,0 +1,29 @@ +{ + "name": "nodejs-parameter-manager-samples", + "private": true, + "license": "Apache-2.0", + "files": [ + "*.js" + ], + "author": "Google LLC", + "repository": "googleapis/nodejs-parameter-manager", + "engines": { + "node": ">=20" + }, + "scripts": { + "test": "c8 mocha --recursive test/ --timeout=800000" + }, + "directories": { + "test": "test" + }, + "dependencies": { + "@google-cloud/parametermanager": "^0.1.0" + }, + "devDependencies": { + "@google-cloud/secret-manager": "^5.6.0", + "c8": "^10.1.3", + "chai": "^4.5.0", + "mocha": "^11.1.0", + "uuid": "^11.0.5" + } +} diff --git a/parametermanager/renderParamVersion.js b/parametermanager/renderParamVersion.js new file mode 100644 index 0000000000..6e0095ef77 --- /dev/null +++ b/parametermanager/renderParamVersion.js @@ -0,0 +1,86 @@ +// Copyright 2025 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'; + +/** + * Retrieves and renders the details of a specific version of an + * existing parameter in the global location of the specified project + * using the Google Cloud Parameter Manager SDK. + * + * @param {string} projectId - The Google Cloud project ID where the parameter is located. + * @param {string} parameterId - The ID of the parameter for which version details are to be rendered. + * @param {string} parameterVersionId - The ID of the parameter version to be rendered. + */ +async function main(projectId, parameterId, parameterVersionId) { + // [START parametermanager_render_param_version] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const parameterId = 'YOUR_PARAMETER_ID'; + // const parameterVersionId = 'YOUR_PARAMETER_VERSION_ID'; + + // Imports the Parameter Manager library + const {ParameterManagerClient} = require('@google-cloud/parametermanager'); + + // Instantiates a client + const client = new ParameterManagerClient(); + + async function renderParamVersion() { + // Construct the parameter version name + const name = client.parameterVersionPath( + projectId, + 'global', + parameterId, + parameterVersionId + ); + + // Construct the request + const request = { + name: name, + }; + + // Render the parameter version + const [parameterVersion] = await client.renderParameterVersion(request); + console.log( + `Rendered parameter version: ${parameterVersion.parameterVersion}` + ); + + // If the parameter contains secret references, they will be resolved + // and the actual secret values will be included in the rendered output. + // Be cautious with logging or displaying this information. + console.log( + 'Rendered payload: ', + parameterVersion.renderedPayload.toString('utf-8') + ); + return parameterVersion; + } + + return await renderParamVersion(); + // [END parametermanager_render_param_version] +} +module.exports.main = main; + +/* c8 ignore next 10 */ +if (require.main === module) { + main(...process.argv.slice(2)).catch(err => { + console.error(err.message); + process.exitCode = 1; + }); + process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; + }); +} diff --git a/parametermanager/test/.eslintrc.yml b/parametermanager/test/.eslintrc.yml new file mode 100644 index 0000000000..74add4846e --- /dev/null +++ b/parametermanager/test/.eslintrc.yml @@ -0,0 +1,17 @@ +# Copyright 2025 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. + +--- +env: + mocha: true diff --git a/parametermanager/test/parametermanager.test.js b/parametermanager/test/parametermanager.test.js new file mode 100644 index 0000000000..01d3661e98 --- /dev/null +++ b/parametermanager/test/parametermanager.test.js @@ -0,0 +1,256 @@ +// Copyright 2025 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 {v4: uuidv4} = require('uuid'); + +const {ParameterManagerClient} = require('@google-cloud/parametermanager'); +const client = new ParameterManagerClient(); + +const {SecretManagerServiceClient} = require('@google-cloud/secret-manager'); +const secretClient = new SecretManagerServiceClient(); + +let projectId; +const locationId = process.env.GCLOUD_LOCATION || 'us-central1'; +const options = {}; +options.apiEndpoint = `parametermanager.${locationId}.rep.googleapis.com`; + +const secretOptions = {}; +secretOptions.apiEndpoint = `secretmanager.${locationId}.rep.googleapis.com`; + +const secretId = `test-secret-${uuidv4()}`; +const parameterId = `test-parameter-${uuidv4()}`; +const parameterVersionId = `test-version-${uuidv4()}`; + +const jsonPayload = '{username: "test-user", host: "localhost"}'; +const payload = 'This is unstructured data'; + +let parameter; +let secret; +let secretVersion; + +describe('Parameter Manager samples', () => { + const parametersToDelete = []; + const parameterVersionsToDelete = []; + + before(async () => { + projectId = await client.getProjectId(); + + // Create a secret + [secret] = await secretClient.createSecret({ + parent: `projects/${projectId}`, + secretId: secretId, + secret: { + replication: { + automatic: {}, + }, + }, + }); + + // Create a secret version + [secretVersion] = await secretClient.addSecretVersion({ + parent: secret.name, + payload: { + data: Buffer.from('my super secret data', 'utf-8'), + }, + }); + + // Create a test global parameter + [parameter] = await client.createParameter({ + parent: `projects/${projectId}/locations/global`, + parameterId: parameterId, + parameter: { + format: 'JSON', + }, + }); + parametersToDelete.push(parameter.name); + }); + + after(async () => { + // Delete all parameter versions first + await Promise.all( + parameterVersionsToDelete.map(async parameterVersionName => { + try { + await client.deleteParameterVersion({ + name: parameterVersionName, + }); + } catch (err) { + if (!err.message.includes('NOT_FOUND')) { + throw err; + } + } + }) + ); + + // Delete all parameters + await Promise.all( + parametersToDelete.map(async parameterName => { + try { + await client.deleteParameter({ + name: parameterName, + }); + } catch (err) { + if (!err.message.includes('NOT_FOUND')) { + throw err; + } + } + }) + ); + + try { + await secretClient.deleteSecret({ + name: secret.name, + }); + } catch (err) { + if (!err.message.includes('NOT_FOUND')) { + throw err; + } + } + }); + + it('should create parameter version with secret references', async () => { + const sample = require('../createParamVersionWithSecret'); + const parameterVersion = await sample.main( + projectId, + parameterId, + parameterVersionId + '-1', + secretVersion.name + ); + parameterVersionsToDelete.push(parameterVersion.name); + assert.exists(parameterVersion); + assert.equal( + parameterVersion.name, + `projects/${projectId}/locations/global/parameters/${parameterId}/versions/${parameterVersionId}-1` + ); + }); + + it('should create a structured parameter', async () => { + const sample = require('../createStructuredParam'); + const parameter = await sample.main(projectId, parameterId + '-1'); + parametersToDelete.push(parameter.name); + assert.exists(parameter); + assert.equal( + parameter.name, + `projects/${projectId}/locations/global/parameters/${parameterId}-1` + ); + }); + + it('should create a unstructured parameter', async () => { + const sample = require('../createParam'); + const parameter = await sample.main(projectId, parameterId + '-2'); + parametersToDelete.push(parameter.name); + assert.exists(parameter); + assert.equal( + parameter.name, + `projects/${projectId}/locations/global/parameters/${parameterId}-2` + ); + }); + + it('should create a structured parameter version', async () => { + const sample = require('../createStructuredParamVersion'); + const parameterVersion = await sample.main( + projectId, + parameterId + '-1', + parameterVersionId + '-2', + jsonPayload + ); + parameterVersionsToDelete.push(parameterVersion.name); + assert.exists(parameterVersion); + assert.equal( + parameterVersion.name, + `projects/${projectId}/locations/global/parameters/${parameterId}-1/versions/${parameterVersionId}-2` + ); + }); + + it('should create a unstructured parameter version', async () => { + const sample = require('../createParamVersion'); + const parameterVersion = await sample.main( + projectId, + parameterId + '-2', + parameterVersionId + '-3', + payload + ); + parameterVersionsToDelete.push(parameterVersion.name); + assert.exists(parameterVersion); + assert.equal( + parameterVersion.name, + `projects/${projectId}/locations/global/parameters/${parameterId}-2/versions/${parameterVersionId}-3` + ); + }); + + it('should list parameters', async () => { + const sample = require('../listParams'); + const parameters = await sample.main(projectId); + assert.exists(parameters); + }); + + it('should get a parameter', async () => { + const sample = require('../getParam'); + const parameter = await sample.main(projectId, parameterId); + assert.exists(parameter); + assert.equal( + parameter.name, + `projects/${projectId}/locations/global/parameters/${parameterId}` + ); + }); + + it('should list parameter versions', async () => { + const sample = require('../listParamVersions'); + const parameterVersions = await sample.main(projectId, parameterId); + assert.exists(parameterVersions); + }); + + it('should get a parameter version', async () => { + const sample = require('../getParamVersion'); + const parameterVersion = await sample.main( + projectId, + parameterId, + parameterVersionId + '-1' + ); + assert.exists(parameterVersion); + assert.equal( + parameterVersion.name, + `projects/${projectId}/locations/global/parameters/${parameterId}/versions/${parameterVersionId}-1` + ); + }); + + it('should render parameter version', async () => { + // Get the current IAM policy. + const [policy] = await secretClient.getIamPolicy({ + resource: secret.name, + }); + + // Add the user with accessor permissions to the bindings list. + policy.bindings.push({ + role: 'roles/secretmanager.secretAccessor', + members: [parameter.policyMember.iamPolicyUidPrincipal], + }); + + // Save the updated IAM policy. + await secretClient.setIamPolicy({ + resource: secret.name, + policy: policy, + }); + + const sample = require('../renderParamVersion'); + const parameterVersion = await sample.main( + projectId, + parameterId, + parameterVersionId + '-1' + ); + assert.exists(parameterVersion); + }); +});