@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
122 lines (106 loc) • 3.65 kB
JavaScript
/*
* server.js: Azure Server
*
* (C) Microsoft Open Technologies, Inc.
*
*/
var util = require('util'),
base = require('../../core/compute/server');
var Server = exports.Server = function Server(client, details) {
base.Server.call(this, client, details);
this.requestPending = false;
};
util.inherits(Server, base.Server);
Server.prototype._setProperties = function (details) {
var roleInstance = null;
details = details || {};
this.id = details.Name || '';
this.name = details.Name || '';
if (details.RoleInstanceList && details.RoleInstanceList.RoleInstance) {
roleInstance = details.RoleInstanceList.RoleInstance;
}
//console.log('Status: ' + details.Status + ' RoleInstanceList: ' + roleInstance ? roleInstance.InstanceStatus : 'UNKNOWN');
// azure can return an inconsistent RoleInstance status (not in azure rest api docs) so we check everything.
// an azure vm has a complicated state machine. We need to check the status of both the deployment and the role.
// azure first starts a deployment and then starts a role. The role seems to go through STOPPEDVM, PROVISIONING and then
// READYROLE.
// Note: since azureAPI has to wait until azure responds to our createServer request, we most likely will miss all of the
// deployment states unless something goes wrong
// TODO: there doesn't seem to be an ERROR or FAIL status in pkgcloud
if (roleInstance) {
switch (roleInstance.InstanceStatus.toUpperCase()) {
case 'PROVISIONING':
case 'CREATINGVM':
case 'STARTINGVM':
case 'CREATINGROLE':
case 'STARTINGROLE':
case 'RESTARTINGROLE':
case 'BUSYROLE':
case 'INITIALIZING':
case 'BUSY':
this.status = this.STATUS.provisioning;
break;
case 'READYROLE':
case 'READY':
this.status = this.STATUS.running;
break;
case 'STOPPING':
case 'STOPPED':
case 'STOPPINGROLE':
case 'STOPPINGVM':
case 'STOPPEDVM':
this.status = this.STATUS.stopped;
break;
case 'DELETINGVM':
this.status = this.STATUS.terminated;
break;
case 'ROLESTATEUNKNOWN':
case 'UNKNOWN':
default:
this.status = this.STATUS.unknown;
break;
}
} else if (details.Status) {
switch (details.Status.toUpperCase()) {
case 'STARTING':
case 'DEPLOYING':
case 'PROVISIONING':
case 'RUNNINGTRANSITIONING':
this.status = this.STATUS.provisioning;
break;
case 'RUNNING':
this.status = this.STATUS.running;
break;
case 'SUSPENDING':
case 'SUSPENDED':
case 'SUSPENDEDTRANSITIONING':
this.status = this.STATUS.stopped;
break;
case 'DELETING':
this.status = this.STATUS.terminated;
break;
default:
this.status = this.STATUS.unknown;
break;
}
} else {
this.status = this.STATUS.unknown;
}
var addresses = { private: [], public: [] };
// TODO: Need to clean up once I understand what is private ip?
if (roleInstance) {
addresses.public.push(roleInstance.InstanceEndpoints.InstanceEndpoint.Vip);
addresses.private.push(roleInstance.IpAddress);
} else {
addresses.public.push('');
addresses.private.push('');
}
this.addresses = details.addresses = addresses;
if (details.RoleList && details.RoleList.Role) {
if (details.RoleList.Role.OSVirtualHardDisk) {
this.imageId = details.RoleList.Role.OSVirtualHardDisk.SourceImageName;
}
}
this.serviceName = details.serviceName || details.Name;
this.original = this.azure = details;
};