sedouard/azure-arm-validator

View on GitHub
modules/azure.js

Summary

Maintainability
D
1 day
Test Coverage
var scriptycli2 = require('azure-scripty-cli2'),
  conf = require('./config'),
  RSVP = require('rsvp'),
  fs = require('fs'),
  debug = require('debug')('arm-validator:azure'),
  mongoHelper = require('./mongo_helper');

var invoke = RSVP.denodeify(scriptycli2.invoke);

exports.login = function () {
  var cmd = {
      command: 'login --service-principal',
      username: conf.get('AZURE_CLIENT_ID'),
      password: conf.get('AZURE_CLIENT_SECRET'),
      tenant: conf.get('AZURE_TENANT_ID')
    };
  return invoke.call(scriptycli2, cmd)
};

exports.validateTemplate = function (templateFile, parametersFile, templateLink) {
  var cmd;
/*  if (templateFile) {
    cmd = {
      command: 'group deployment validate',
      'resource-group': conf.get('TEST_RESOURCE_GROUP_NAME'),
      'template-file': templateFile,
      'parameters': parametersFile
      };
    } else if (templateLink) {
        cmd = {
          command: 'group deployment validate',
          'resource-group': conf.get('TEST_RESOURCE_GROUP_NAME'),
          'template-uri': templateLink,
          'parameters': parametersFile
        };
    }
  debug('DEBUG: using template file:');
  debug(templateFile);
  debug('using paramters:');
  debug(parametersFile);
*/
  return; //invoke.call(scriptycli2, cmd);
};

exports.validateTemplateWithPreReq = function (templateFile, parametersFile, preReqTemplateFile, preReqParametersFile) {

  /*
  var cmd = {
    command: 'group deployment validate',
    'resource-group': conf.get('TEST_RESOURCE_GROUP_NAME'),
    'template-file': preReqTemplateFile
  };

  var preReqParamContent = JSON.parse(fs.readFileSync(preReqParametersFile));
  for (var key in preReqParamContent.parameters) {
    cmd['parameters'] = preReqParametersFile;
    break;
  }

  return invoke.call(scriptycli2, cmd)
    .then(() => {
      var cmd = {
        command: 'group deployment validate',
        'resource-group': conf.get('TEST_RESOURCE_GROUP_NAME'),
        'template-file': templateFile
      };

      var parametersFileContent = JSON.parse(fs.readFileSync(parametersFile));
      for (var key in parametersFileContent.parameters) {
        cmd['parameters'] = parametersFile;
        break;
      }

      // now deploy!
      return; // "Skipping Validation"; //invoke.call(scriptycli2, cmd);
    });
    */
   return;
}


function createGroup(groupName) {
  debug('creating resource group: ' + groupName + ' in region ' + conf.get('AZURE_REGION'));
  var cmd = {
    command: 'group create',
    'name': groupName,
    'location': conf.get('AZURE_REGION')

  };
  return invoke.call(scriptycli2, cmd);
}

exports.deleteExistingGroups = function () {
  return mongoHelper.connect()
    .then(db => {
      var resourceGroups = db.collection('resourceGroups');
      var find = RSVP.denodeify(resourceGroups.find);
      return find.call(resourceGroups, {});
    })
    .then(results => {
      var promises = [];
      results.forEach(result => {
        var promise = exports.deleteGroup(result.name);
        promises.push(promise);
      });

      return RSVP.all(promises);
    });
};

exports.deleteGroup = function (groupName) {
  var cmd = {
    command: 'group delete',
    'name': groupName,
    'yes': '-y',
  };
  // first, remove tracking entry in db
  return mongoHelper.connect()
    .then(db => {
      debug('deleting resource group: ' + groupName);
      var resourceGroups = db.collection('resourceGroups');
      var deleteOne = RSVP.denodeify(resourceGroups.deleteOne);
      return deleteOne.call(resourceGroups, {
        name: groupName
      });
    })
    .then(() => invoke.call(scriptycli2, cmd))
    .then(() => debug('sucessfully deleted resource group: ' + groupName));
};

exports.testTemplate = function (rgName, templateFile, parametersFile, templateLink) {
  debug('DEBUG: using template file:');
  debug(templateFile);
  debug('using paramters:');
  debug(parametersFile);
  debug('Deploying to RG: ' + rgName);

  return mongoHelper.connect()
    .then(db => {
      var resourceGroups = db.collection('resourceGroups');
      var insert = RSVP.denodeify(resourceGroups.insert);
      return insert.call(resourceGroups, {
        name: rgName,
        region: rgName
      });
    })
    .then(result => {
      debug('sucessfully inserted ' + result.ops.length + ' resource group to collection');
      return createGroup(rgName);
    })
    .then(() => {
      debug('sucessfully created resource group ' + rgName);
      var cmd;
      if (templateLink) {
        cmd = {
            command: 'group deployment create',
            'resource-group': rgName,
            'template-uri': templateLink
            };
        } else {
        cmd = {
            command: 'group deployment create',
            'resource-group': rgName,
            'template-file': templateFile
            };
        }

      var parametersFileContent = JSON.parse(fs.readFileSync(parametersFile));
      for (var key in parametersFileContent.parameters) {
        cmd['parameters'] = parametersFile;
        break;
      }
    
      // now deploy!
      return invoke.call(scriptycli2, cmd);
    });
};

exports.testTemplateWithPreReq = function (rgName, templateFile, parametersFile, preReqTemplateFile, preReqParametersFile) {
  debug('DEBUG: using prereq template file:');
  debug(preReqTemplateFile);
  debug('using prereq template parameters:');
  debug(preReqParametersFile);
  debug('DEBUG: using template file:');
  debug(templateFile);
  debug('using paramters:');
  debug(parametersFile);
  debug('Deploying to RG: ' + rgName);

  return mongoHelper.connect()
    .then(db => {
      var resourceGroups = db.collection('resourceGroups');
      var insert = RSVP.denodeify(resourceGroups.insert);
      return insert.call(resourceGroups, {
        name: rgName,
        region: rgName
      });
    })
    .then(result => {
      debug('sucessfully inserted ' + result.ops.length + ' resource group to collection');
      return createGroup(rgName);
    })
    .then(() => {
      debug('sucessfully created resource group ' + rgName);

      var cmd = {
        command: 'group deployment create',
        'resource-group': rgName,
        'template-file': preReqTemplateFile
      };

      var preReqParamContent = JSON.parse(fs.readFileSync(preReqParametersFile));
      for (var key in preReqParamContent.parameters) {
        cmd['parameters'] = preReqParametersFile;
        break;
      }

      // now deploy!
      return invoke.call(scriptycli2, cmd);
    })
    .then((response) => {
      debug('sucessfully deployed prereq resources');

      // Handle string replacement based pre-req mapping
      var parametersString = fs.readFileSync(parametersFile, 'utf8');
      for (var key in response.properties.outputs) {
        debug('key: ' + key);
        debug('Value: ' + response.properties.outputs[key].value);
        var keyValue = response.properties.outputs[key].value;
        parametersString = parametersString.replace(new RegExp('GET-PREREQ-' + key, 'g'), keyValue);
      }
      
      ////// Handle dynamic pre-req mapping based on name mapping
      ////var parametersObject = JSON.parse(parametersString);
      ////for (var key in response.properties.outputs) {
      ////  if (parametersObject.parameters[key]) {
      ////    parametersObject.parameters[key].value = response.properties.outputs[key].value;
      ////  }
      ////}
      ////parametersString = JSON.stringify(parametersObject);

      fs.writeFileSync(parametersFile, parametersString, 'utf8');

      var cmd = {
        command: 'group deployment create',
        'resource-group': rgName,
        'template-file': templateFile
      };

      var parametersFileContent = JSON.parse(fs.readFileSync(parametersFile));
      for (var key in parametersFileContent.parameters) {
        cmd['parameters'] = parametersFile;
        break;
      }

      // now deploy!
      return invoke.call(scriptycli2, cmd);
    });
};