RackHD/on-tasks

View on GitHub
lib/jobs/dell-wsman-delete-volume-updateXml.js

Summary

Maintainability
D
2 days
Test Coverage
// Copyright © 2017 Dell Inc. or its subsidiaries. All Rights Reserved.

'use strict';

var di = require('di'),
    xmldom = require('xmldom').DOMParser;
module.exports = WsmanDeleteVolumeXmlFactory;
di.annotate(WsmanDeleteVolumeXmlFactory, new di.Provide('Job.Dell.Wsman.Delete.Volume.UpdateXml'));
di.annotate(WsmanDeleteVolumeXmlFactory, new di.Inject(
    'Job.Base',
    'Logger',
    'Assert',
    'Util',
    'Services.Configuration',
    'Errors',
    'JobUtils.Smb2Client',
    'JobUtils.NfsClient'
));

function WsmanDeleteVolumeXmlFactory(
    BaseJob,
    Logger,
    assert,
    util,
    configuration,
    errors,
    Smb2Client,
    NfsClient
) {
    var logger = Logger.initialize(WsmanDeleteVolumeXmlFactory);

    function WsmanDeleteVolumeXmlJob(options, context, taskId) {
        WsmanDeleteVolumeXmlJob.super_.call(this, logger, options, context, taskId);
        assert.object(this.options);
        this.nodeId = this.context.target;
    }

    util.inherits(WsmanDeleteVolumeXmlJob, BaseJob);

    WsmanDeleteVolumeXmlJob.prototype._run = function () {
        var self = this;
        self.dell = configuration.get('dell');
        if (!self.dell.shareFolder) {
            throw new errors.NotFoundError('The shareFolder is not defined in smiConfig.json.');
        }
        if(self.options.volumeId === ""){
            throw new errors.NotFoundError('The volumeId can not be empty string.');
        }
        self.parseXmlFileForRAID();
    };

    WsmanDeleteVolumeXmlJob.prototype.parseXmlFileForRAID = function(){
        logger.info("Parse xml file for delete volume operation.");
        var self = this;
        var fileName = self.context.graphId +".xml";
        var volumeId = self.options.volumeId;
        var client;
        if(self.dell.shareFolder.shareType === 0){
            client = new NfsClient(
                self.dell.shareFolder.address,
                self.dell.shareFolder.shareName,
                self.context.mountDir
            );
        }else if(self.dell.shareFolder.shareType === 2){
            client = new Smb2Client(
                self.dell.shareFolder.address,
                self.dell.shareFolder.shareName,
                self.dell.shareFolder.username,
                self.dell.shareFolder.password
            );
        }else{
            throw new Error('The shareType must be 0 or 2.');
        }
        return client.readFile(fileName).then(function(data){
            return self.updateXml(data, volumeId);
        }).then(function(doc){
            return client.writeFile(fileName, doc);
        }).then(function(){
            self._done();
        }).catch(function(error){
            logger.error('Error occurs', error);
            self._done(error);
        });
    };

    WsmanDeleteVolumeXmlJob.prototype.updateXml = function(fileData, volumeId){
        var xmlFile = String.fromCharCode.apply(null, new Uint16Array(fileData));
        var doc = new xmldom().parseFromString(xmlFile, 'application/xml');
        var components = doc.getElementsByTagName('Component');
        var deleteIndex = [];
        for(var i = 0; i < components.length; i++){       //jshint ignore:line
            var fqdd = components[i].getAttribute('FQDD');
            if(fqdd.split('.')[0] === 'Disk' && fqdd.indexOf('Enclosure') === -1){
                if(fqdd === volumeId){
                    components[i].getElementsByTagName('Attribute')[0].childNodes[0].textContent = "Delete";
                }else{
                    deleteIndex.push(i);
                }
            }
        }
        for(var i = 0; i < deleteIndex.length; i++){       // jshint ignore:line
            doc.documentElement.removeChild(components[deleteIndex[i]]);
        }
        return doc;
    };

    return WsmanDeleteVolumeXmlJob;
}