googleapis / google-cloud-node

Google Cloud Client Library for Node.js

Home Page:https://cloud.google.com/nodejs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[resource-manager] Add `location` attribute to `tagBindingsClient` functions

LoicMoerman opened this issue · comments

Environment details

  • which product (packages/*): @google-cloud/resource-manager
  • google-cloud-node version: 5.0.1

Some tag bindings require the location to be specified, ex: compute instances

Steps to reproduce

The location option is missing from all tagBindingsClient functions so we cannot use tag bindings for regional or zonal resources

Related issue in terraform.

This not working :

const [bindings] = await this.tagBindingsClient.listTagBindings({
    parent: `//compute.googleapis.com/projects/${projectId}/zones/${zone}/instances/${instanceId}`,
});

Proposed solution is to add location like this :

const [bindings] = await this.tagBindingsClient.listTagBindings({
    parent: `//compute.googleapis.com/projects/${projectId}/zones/${zone}/instances/${instanceId}`,
    location: zone/region
});

The api endpoint needs to change for regional or zonal bindings like this :
northamerica-northeast1-a-cloudresourcemanager.googleapis.com

Hi @LoicMoerman, would you mind providing reproduction steps to better understand the issue? (We deal with a lot of APIs, it will help me better understand the context). Thank you!

Hi @sofisl

For example this code doesn't work :

import resourceManager from '@google-cloud/resource-manager';
const tagBindingsClient = new resourceManager.TagBindingsClient();
const [binding] = await tagBindingsClient.listTagBindings({
   parent: `//compute.googleapis.com/projects/${projectId}/zones/${zone}/instances/${instanceId}`,
});
console.log('binding :', binding);

Error is :
INVALID_ARGUMENT: field [binding.resource] has issue [Must be a valid One Platform resource name of a tag-compatible global resource. Did you forget to specify the correct location?]

Instead temporary fix is to use api with for example axios like this :

import axios from 'axios';
import { GoogleAuth } from 'google-auth-library';

const axiosGcpInstance = axios.create();
axiosGcpInstance.interceptors.request.use(
  async config => {
    config.headers.Authorization = `Bearer ${await getAccessToken()}`;
    return config;
  },
  error => {
    Promise.reject(error);
  },
);

async function getAccessToken(_forceRetry = false) {
  if (token && !_forceRetry) return token;
  console.log('getAccessToken');
  const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/cloud-platform'] });
  token = await auth.getAccessToken();
  return token;
}

const res = await axiosGcpInstance.get(`https://${zone}-cloudresourcemanager.googleapis.com/v3/tagBindings`, {
     params: {
       parent: `//compute.googleapis.com/projects/${projectId}/zones/${zone}/instances/${instanceId}`,
     },
});

console.log(res.data)

In the library @google-cloud/resource-manager there is no option to specify location (zone or region) like in the API one.

The URL for API is : ${zone}-cloudresourcemanager.googleapis.com/v3/tagBindings
But in the library it is only : cloudresourcemanager.googleapis.com

Maybe its related to this line