RackHD/on-tasks

View on GitHub
lib/services/ucs-obm-service.js

Summary

Maintainability
B
6 hrs
Test Coverage
// Copyright 2017, EMC, Inc.

'use strict';

var di = require('di'),
    util = require('util');

module.exports = UcsObmServiceFactory;

di.annotate(UcsObmServiceFactory, 
    new di.Provide('ucs-obm-service')
);
di.annotate(UcsObmServiceFactory, 
    new di.Inject(
        'OBM.base',
        'Promise',
        'Services.Waterline', 
        'Assert', 
        '_',
        'JobUtils.UcsTool',
        'HttpTool'
    )
);
function UcsObmServiceFactory(
    BaseObmService, 
    Promise, 
    waterline,
    assert,
    _,
    UcsTool
) {
    function UcsObmService(options) {
        BaseObmService.call(this, options);
        this.requiredKeys = ['uri'];
        this.params = options.params;
        this.config = options.config;
        this.ucs = this.initClient(this.config);

    }
    util.inherits(UcsObmService, BaseObmService);
    
    UcsObmService.prototype.initClient = function(settings) {
        var ucs = new UcsTool();
        ucs.settings = settings;
        return ucs;
    };

    UcsObmService.prototype.powerOn = function() {
        return this._runInternal('on');
    };
    
    UcsObmService.prototype.powerOff = function() {
        return this._runInternal('off');
    };

    UcsObmService.prototype.reboot = function() {
        return this._runInternal('cycle-immediate');
    };
    
    UcsObmService.prototype.reset = function() {
        return this.reboot();
    };

    UcsObmService.prototype.powerButton = function() {
        return this._runInternal('ipmi-reset');
    };
    
    UcsObmService.prototype.powerStatus = function() {
        var self = this;
        var dn = self.ucs.settings.dn;
        var url=  "/power?identifier=" + dn;
        return self.ucs.clientRequest(url)
        .then(function(res) {
            assert.object(res, 'Response');
            if (res.body.serverState === "down"){
                return false;
            }
            else if(res.body.serverState === "up"){
                return true;
            }
            else {
                throw new Error(
                    'Unknown Power State: ' + self.config.root
                );
            }
        });
    };
    
    UcsObmService.prototype._runInternal = function (action) {
        return this.run({
            action:action
        });
    };
    
    UcsObmService.prototype.run = function (options) {       
        var self = this;
        return Promise.try(function(){
            assert.object(options);
            assert.string(options.action);
            var action = options.action;
            var nodeId = self.options.nodeId;
            return waterline.nodes.findOne(nodeId)
                .then(function(data){
                    var url=  "/power?" + "identifier=" + data.name + "&action=" + action;
                    return self.ucs.clientRequest(url, "POST");
                });
        });
    };   

    
    UcsObmService.create = function(options) {
        return BaseObmService.create(UcsObmService, options);
    };

    return UcsObmService;
}