1 day 
Constructor.
@class
@classdesc
Abstract cloud provider implementation.

This class should be inherited from to implement cloud-provider
specific implementations. Any method in this class that throws
must be overridded. Methods that do not throw may be optionally
overridden.

@param {Ojbect} [options]               - Options for the instance.
@param {Object} [options.clOptions]     - Command line options if called from a script.
@param {Object} [options.logger]        - Logger to use. Or, pass loggerOptions to get your own logger.
@param {Object} [options.loggerOptions] - Options for the logger.
See {@link module:logger.getLogger} for details.
function CloudProvider(options) {
    const logger = options ? options.logger : undefined;
    let loggerOptions = options ? options.loggerOptions : undefined;

    this.options = {};
    if (options) {
        Object.keys(options).forEach((option) => {
            this.options[option] = options[option];
        });
    }

    this.clOptions = {};
    if (options && options.clOptions) {
        Object.keys(options.clOptions).forEach((option) => {
            this.clOptions[option] = options.clOptions[option];
        });
    }

    // Holder for supported features. If an implementation supports an features,
    // set them to true in this map
    this.features = {};

    if (logger) {
        this.logger = logger;
    } else {
        loggerOptions = loggerOptions || { logLevel: 'none' };
        loggerOptions.module = module;
        this.logger = Logger.getLogger(loggerOptions);
        this.loggerOptions = loggerOptions;
    }
}