@fdot/azure-container-instances-utils
Version:
Utilities for managing Azure Container Instances
141 lines (128 loc) • 5.75 kB
JavaScript
const axios = require('axios');
const azureContainerInstanceUtils = (optionsConfiguration) => {
let options = {
tenantName: process.env.TENANT_NAME,
clientId: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
subscriptionId: process.env.SUBSCRIPTION_ID,
resourceGroupName: process.env.RESOURCE_GROUP_NAME,
}
if (optionsConfiguration) {
options = {
...options,
...optionsConfiguration
};
}
const authUrl = `https://login.microsoftonline.com/${options.tenantName}/oauth2/token`;
const authBody = `grant_type=client_credentials&client_id=${options.clientId}&client_secret=${options.clientSecret}&resource=https%3A%2F%2Fmanagement.azure.com%2F`;
const getStopUrl = (containerGroupName) => `https://management.azure.com/subscriptions/${options.subscriptionId}/resourceGroups/${options.resourceGroupName}/providers/Microsoft.ContainerInstance/containerGroups/${containerGroupName}/stop?api-version=2018-10-01`;
const getStartUrl = (containerGroupName) => `https://management.azure.com/subscriptions/${options.subscriptionId}/resourceGroups/${options.resourceGroupName}/providers/Microsoft.ContainerInstance/containerGroups/${containerGroupName}/start?api-version=2018-10-01`;
const getAccessToken = () => {
return new Promise((resolve, reject) => {
axios.post(authUrl, authBody)
.then((authResponse) => {
resolve(authResponse.data.access_token);
})
.catch((error) => {
console.log('Error', error.message);
reject(error);
})
});
}
const getAxiosConfig = (accessToken) => {
return {
headers: {
'Content-Type': 'application/json',
'Authorization': 'bearer ' + accessToken
}
};
}
const startOrStop = (url) => {
return new Promise((resolve, reject) => {
getAccessToken()
.then((accessToken) => {
const config = getAxiosConfig(accessToken);
axios.post(url, null, config)
.then((response) => {
if (response.status === 204) {
resolve();
}
else {
reject(`Received Status Code: ${response.status} while trying to start or stop container`);
}
})
.catch((error) => {
console.log('Error', error.message);
reject(error);
})
})
.catch((error) => {
console.log('Error', error.message);
reject(error);
});
});
}
const stop = (containerGroupName) => {
const url = getStopUrl(containerGroupName);
return startOrStop(url);
}
const start = (containerGroupName) => {
const url = getStartUrl(containerGroupName);
return startOrStop(url);
}
const getProperties = (containerGroupName) => {
const url = `https://management.azure.com/subscriptions/${options.subscriptionId}/resourceGroups/${options.resourceGroupName}/providers/Microsoft.ContainerInstance/containerGroups/${containerGroupName}?api-version=2018-10-01`;
return new Promise((resolve, reject) => {
getAccessToken()
.then((accessToken) => {
const config = getAxiosConfig(accessToken);
axios.get(url, config)
.then((response) => {
if (response.status === 200) {
resolve(response.data);
}
else {
reject(`Received Status Code: ${response.status} while trying to get container group information for: ${containerGroupName}`);
}
})
.catch((error) => {
console.log('Error', error.message);
reject(error);
})
})
.catch((error) => {
console.log('Error', error.message);
reject(error);
});
});
}
const stopAndStart = async (containerGroupName, secondsAfterRestartToCollectProperties) => {
return new Promise(async (resolve, reject) => {
try {
const originalProperties = await getProperties(containerGroupName);
await stop(containerGroupName);
await start(containerGroupName);
setTimeout(async () => {
try {
const postRestartProperties = await getProperties(containerGroupName);
resolve({ originalProperties, postRestartProperties });
}
catch (error) {
reject(error);
}
}, secondsAfterRestartToCollectProperties * 1000);
}
catch (error) {
reject(error);
return;
}
});
}
return {
stop,
start,
getProperties,
stopAndStart
}
}
module.exports = azureContainerInstanceUtils;