Skip to content

Instantly share code, notes, and snippets.

@yuki-takeichi
Created September 9, 2016 06:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuki-takeichi/ceac3a209d55c46d4b25ea64f076d6ae to your computer and use it in GitHub Desktop.
Save yuki-takeichi/ceac3a209d55c46d4b25ea64f076d6ae to your computer and use it in GitHub Desktop.
GCP metadata server long polling
// https://cloud.google.com/compute/docs/storing-retrieving-metadata#waitforchange
// curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/hoge?wait_for_change=true" -H "Metadata-Flavor: Google"
const http = require('http');
function longPollMetadataServer(path) {
return new Promise((resolve, reject) => {
http.get({
hostname: "metadata.google.internal",
path: path + "?wait_for_change=true",
headers: {
"Metadata-Flavor": "Google",
},
}, (res) => {
let body = '';
res.on('data', (data) => { body += data; });
res.on('end', () => {
try {
resolve(JSON.parse(body));
} catch(e) {
reject(e);
}
});
});
});
}
function longPollProjectMetadata(key) {
return longPollMetadataServer("/computeMetadata/v1/project/attributes/" + key);
}
function longPollAndProcessMetadata(key) {
return longPollProjectMetadata(key).then((data) => {
console.log(data); // XXX
}).catch((e) => {
console.error("err: ", e);
});
};
function forever(generator, args) {
return generator.apply(this, args).then(() => {
return forever(generator, args);
});
}
forever(() => { return longPollAndProcessMetadata('hoge'); });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment