Home Reference Source

src/CloudlinkApi.js

import CloudlinkApiError from './CloudlinkApiError';
import CloudlinkHttp from './CloudlinkHttp';

/**
 * CloudlinkApi class
 * @property {{
 *  auth: object,
 *  cloud: string,
 *  server: {host:string,port:number,secure:boolean}
 * }} config
 */
export class CloudlinkApi {

    /**
     * A list of supported cloud (Cloud providers) codes
     * @returns {string[]}
     */
    static get supportedClouds() {
        return [
            'aws',
            'digitalocean',
            'gce'
        ];
    }

    /**
     * CloudlinkApi constructor
     * @param {{}} config Configurations object (must include "auth" and "server" properties)
     * @throws {CloudlinkApiError}
     */
    constructor(config) {

        /* eslint max-statements: ["error", 20] */
        // noinspection JSValidateTypes

        this.config = config || {};
        if (!this.config.cloud) {
            throw new CloudlinkApiError(
                'Missing "cloud" definition in config'
            );
        }
        if (CloudlinkApi.supportedClouds.indexOf(this.config.cloud) === -1) {
            throw new CloudlinkApiError(
                `"${this.config.cloud}" is not a supported cloud provider`
            );
        }
        if (!this.config.server) {
            throw new CloudlinkApiError(
                'Missing "server" object in config'
            );
        }
        if (!this.config.server.host) {
            throw new CloudlinkApiError(
                'Messing "server.host" in config'
            );
        }
        if (!this.config.server.port) {
            this.config.server.port = 80;
        }
        if (!this.config.server.secure) {
            this.config.server.secure = false;
        }
        if (!this.config.auth) {
            throw new CloudlinkApiError(
                'Missing "auth" object in config'
            );
        }
    }

    /**
     * Returns a list of instances (Virtual machines)
     * @param {Array} [ids]
     * @returns {Promise}
     */
    listInstances(ids = []) {
        return CloudlinkHttp.request(this.config, 'listInstances', {ids});
    }

    /**
     * Adds a new instance (Virtual machine)
     * @returns {Promise}
     * @param {Array} names New instance/s names
     * @param {string} region Region to create the instance/s at
     * @param {string} image Image/ami to create the instance/s from
     * @param {number} disk Disk size in GB
     * @param {string} size Diskspace size
     * @param {string} sshKeys SSH key to deploy to the new instance/s
     * @param {number|string} [subnet] Subnet id
     * @param {Array} [securityGroups] List of security groups ids
     * @param {number|string} [vpc] Vpc id/address to provision to
     * @param {Array} [tags] Tags list
     * @param {string} [sshUser] SSH user
     */
    addInstance(names, region, image, disk, size, sshKeys, subnet, securityGroups, vpc, tags, sshUser) {
        return CloudlinkHttp.request(this.config, 'addInstance', {
            names,
            region,
            image,
            disk,
            size,
            subnet,
            sshKeys,
            sshUser,
            securityGroups,
            vpc,
            tags
        });
    }

    /**
     * Deletes an instance/list of instances
     * @param instanceIds
     * @returns {Promise}
     */
    deleteInstance(instanceIds) {
        return CloudlinkHttp.request(this.config, 'deleteInstance', {
            ids: instanceIds
        });
    }

    /**
     * Returns the status of an instance (Virtual machine)
     * @param {string|number} instanceId The id of an instance
     * @returns {Promise}
     */
    getInstanceStatus(instanceId) {
        return CloudlinkHttp.request(this.config, 'getInstanceStatus', {
            instanceId
        });
    }

    /**
     * Returns a list of regions available on cloud provider
     * @returns {Promise}
     */
    listRegions() {
        return CloudlinkHttp.request(this.config, 'listRegions', {});
    }

    /**
     * Returns a list of sizes available on cloud provider
     * @returns {Promise}
     */
    listSizes() {
        return CloudlinkHttp.request(this.config, 'listSizes', {});
    }

    /**
     * Returns a list of distributions available on cloud provider
     * @param {{}} filters Filters object
     * @returns {Promise}
     */
    listDistributions(filters = {}) {
        return CloudlinkHttp.request(this.config, 'listDistributions', {
            filters
        });
    }

    /**
     * Returns a list of volumes (Virtual/disks)
     * @returns {Promise}
     */
    listVolumes() {
        return CloudlinkHttp.request(this.config, 'listVolumes', {});
    }

    /**
     * Returns a list of SSH keys registered on cloud provider
     * @returns {Promise}
     */
    listKeys() {
        return CloudlinkHttp.request(this.config, 'listKeys', {});
    }

    /**
     * Registers a new public key on cloud provider
     * @param {string} name Name of the new key
     * @param {string} publicKey Public key contents
     * @returns {Promise}
     */
    addKey(name, publicKey) {
        return CloudlinkHttp.request(this.config, 'addKey', {
            name,
            publicKey
        });
    }

    /**
     * Deletes a key from cloud provider
     * @param {string|number} id Key name/id
     * @returns {Promise}
     */
    deleteKey(id) {
        return CloudlinkHttp.request(this.config, 'deleteKey', {
            id
        });
    }

    /**
     * Returns a list of VPCs (Virtual private network)
     * @param {{}} filters Filters object
     * @param {Array} ids Ids list
     * @returns {Promise}
     */
    listVpcs(filters = {}, ids = []) {
        return CloudlinkHttp.request(this.config, 'listVpcs', {
            filters,
            ids
        });
    }

    /**
     * Creates a new VPC (Virtual private network)
     * @param name Vpc name
     * @param cidr CIDR block, network range
     * @param tenancy Tenancy default/dedicated/host
     * @returns {Promise}
     */
    addVpc(name, cidr, tenancy) {
        return CloudlinkHttp.request(this.config, 'addVpc', {
            name,
            cidr,
            tenancy
        });
    }

    /**
     * Sets/adds vpc attribute
     * @param vpcId
     * @param attributes
     * @returns {Promise}
     */
    addVpcAttribute(vpcId, attributes) {
        return CloudlinkHttp.request(this.config, 'addVpcAttribute', {
            vpcId,
            attributes
        });
    }

    /**
     * Returns vpc attribute value
     * @param vpcId
     * @param attribute
     * @returns {Promise}
     */
    getVpcAttribute(vpcId, attribute) {
        return CloudlinkHttp.request(this.config, 'getVpcAttribute', {
            vpcId,
            attribute
        });
    }

    /**
     * Returns a list of subnets
     * @param ids
     * @param filters
     * @returns {Promise}
     */
    listSubNets(ids = [], filters = []) {
        return CloudlinkHttp.request(this.config, 'listSubNets', {
            ids,
            filters
        });
    }

    /**
     * Creates a new subnet within a VPC
     * @param cidr CIDR block, network range
     * @param vpcId VPC id
     * @returns {Promise}
     */
    addSubNet(cidr, vpcId) {
        return CloudlinkHttp.request(this.config, 'addSubNet', {
            cidr,
            vpcId
        });
    }

    /**
     * Sets "assignPublicIp" property for a subNet
     * @param subNetId
     * @param assignPublicIp
     * @returns {Promise}
     */
    setSubNetAttribute(subNetId, assignPublicIp) {
        return CloudlinkHttp.request(this.config, 'setSubNetAttribute', {
            subNetId,
            assignPublicIp
        });
    }

    /**
     * Creates a new security group under a vpcId
     * @param vpcId
     * @param name
     * @param description
     * @returns {Promise}
     */
    addSecurityGroup(vpcId, name, description) {
        return CloudlinkHttp.request(this.config, 'addSecurityGroup', {
            vpcId,
            name,
            description
        });
    }

    /**
     * Creates a set of inbound security group rules
     * @param groupId
     * @param rules
     * @returns {Promise}
     */
    addSecurityGroupInboundRules(groupId, rules) {
        return CloudlinkHttp.request(this.config, 'addSecurityGroupInboundRules', {
            groupId,
            rules
        });
    }

    /**
     * Creates a set of outbound security group rules
     * @param groupId
     * @param rules
     * @returns {Promise}
     */
    addSecurityGroupOutboundRules(groupId, rules) {
        return CloudlinkHttp.request(this.config, 'addSecurityGroupOutboundRules', {
            groupId,
            rules
        });
    }

    /**
     * Creates a new internet gateway
     * @returns {Promise}
     */
    addInternetGateway() {
        return CloudlinkHttp.request(this.config, 'addInternetGateway', {});
    }

    /**
     * Attaches internet gateway to VPC
     * @param vpcId
     * @param gatewayId
     * @returns {Promise}
     */
    attachInternetGateway(vpcId, gatewayId) {
        return CloudlinkHttp.request(this.config, 'attachInternetGateway', {
            vpcId,
            gatewayId
        });
    }

    /**
     * Lists all routes tables, may apply filters
     * @param filters
     * @returns {Promise}
     */
    listRouteTables(filters) {
        return CloudlinkHttp.request(this.config, 'listRouteTables', {
            filters: filters || {}
        });
    }

    /**
     * Adds a new route to a routes table and links it to an Internet gateway
     * @param routesTableId
     * @param cidr
     * @param gatewayId
     * @returns {Promise}
     */
    addRoute(routesTableId, cidr, gatewayId) {
        return CloudlinkHttp.request(this.config, 'addRoute', {
            routesTableId,
            cidr,
            gatewayId
        });
    }

}