@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
144 lines (128 loc) • 4.02 kB
JavaScript
/*
* server.js: OpenStack Cloud server
*
* (C) 2013 Charlie Robbins, Ken Perkins, Ross Kukulinski & the Contributors.
*
*/
var util = require('util'),
compute = require('../../core/compute'),
base = require('../../core/compute/server'),
_ = require('underscore');
var Server = exports.Server = function Server(client, details) {
base.Server.call(this, client, details);
};
util.inherits(Server, base.Server);
Server.prototype._setProperties = function (details) {
var self = this;
// Set core properties
this.id = details.id;
this.name = details.name;
if (details.status) {
switch (details.status.toUpperCase()) {
case 'BUILD':
case 'REBUILD':
this.status = this.STATUS.provisioning;
break;
case 'ACTIVE':
this.status = this.STATUS.running;
break;
case 'SUSPENDED':
case 'SHUTOFF':
this.status = this.STATUS.stopped;
break;
case 'REBOOT':
case 'HARD_REBOOT':
this.status = this.STATUS.reboot;
break;
case 'QUEUE_RESIZE':
case 'PREP_RESIZE':
case 'RESIZE':
case 'VERIFY_RESIZE':
case 'SHARE_IP':
case 'SHARE_IP_NO_CONFIG':
case 'DELETE_IP':
case 'PASSWORD':
this.status = this.STATUS.updating;
break;
case 'RESCUE':
case 'ERROR':
this.status = this.STATUS.error;
break;
default:
this.status = this.STATUS.unknown;
break;
}
}
//
// Set extra properties
//
this.progress = details.progress;
this.imageId = details.imageId || this.imageId;
this.adminPass = details.adminPass || this.adminPass;
this.addresses = details.addresses || {};
this.metadata = details.metadata || {};
this.flavorId = details.flavorId || this.flavorId;
this.hostId = details.hostId || this.hostId;
this.created = details.created || this.created;
this.updated = details.updated || this.updated;
this.original = this.openstack = details;
if (Object.keys(this.addresses).length && !this.addresses.public
&& !this.addresses.private) {
this.addresses = Object.keys(this.addresses)
.map(function (network) {
return self.addresses[network];
})
.reduce(function (all, interfaces) {
Object.keys(interfaces).map(function (interface) {
return interfaces[interface].addr;
})
.forEach(function (addr) {
return compute.isPrivate(addr)
? all['private'].push(addr)
: all['public'].push(addr);
});
return all;
}, { public: [], private: [] });
}
// Try to set the flavorId using a flavor object
if (typeof this.flavorId === 'undefined' &&
details.flavor && details.flavor.id) {
this.flavorId = details.flavor.id;
}
// Try to set the imageId using an image object
if (typeof this.imageId === 'undefined' &&
details.image && details.image.id) {
this.imageId = details.image.id;
}
};
//
// Updates the addresses for this instance
// Parameters: type['public' || 'private]? callback
//
Server.prototype.getAddresses = function (type, callback) {
if (!callback && typeof type === 'function') {
callback = type;
type = '';
}
var self = this;
this.client.getServerAddresses(this, type, function (err, addresses) {
if (err) {
return callback(err);
}
if (type === '') {
self.addresses = addresses;
}
else {
self.addresses = addresses || {};
self.addresses[type] = addresses[type];
}
callback(null, addresses);
});
};
Server.prototype.toJSON = function() {
return _.pick(this, ['id', 'name', 'status', 'hostId', 'adminPass', 'addresses',
'links', 'key_name', 'imageId', 'flavorId', 'user_id', 'tenant_id', 'progress',
'OS-EXT-STS:task_state', 'OS-EXT-STS:vm_state', 'OS-EXT-STS:power_state',
'OS-DCF:diskConfig', 'accessIPv4', 'accessIPv6', 'config_drive', 'metadata',
'created', 'updated']);
};