Creating an environment in Node.js

This article presents an example of using the Cloud Services Management REST API to create an environment in Node.js.

This example works only with the On-Premises version.

# Dependencies

This example uses request-promise-native and core dependencies from Node.js: crypto, url.

# Example

The following simple example presents how to create an environment using the Cloud Services Management REST API.
The ENVIRONMENTS_MANAGEMENT_SECRET_KEY and APPLICATION_ENDPOINT variables should be set to proper values from the configuration.

const url = require( 'url' );
const crypto = require( 'crypto' );
const requestPromise = require( 'request-promise-native' );

const ENVIRONMENTS_MANAGEMENT_SECRET_KEY = 'secret';
const APPLICATION_ENDPOINT = 'http://localhost:8000';

( async () => {
    try {
        const newEnvironment = {
            id: _randomString( 20 ), // required length 20
            name: 'Production',
            organizationId: _randomString( 60 ), // required length 10-60
            accessKeys: [
                {
                    value: _randomString( 100 ) // required length 10-120
                }
            ],
            services: [
                {
                    id: _randomString( 24 ), // required length 24
                    type: 'easy-image'
                },
                {
                    id: _randomString( 24 ), // required length 24
                    type: 'collaboration'
                }
            ] // all these services types recommended
        };

        const timestamp = Date.now();

        const uri = `${ APPLICATION_ENDPOINT }/environments`;
        const method = 'POST';

        const signature = _generateSignature(
            ENVIRONMENTS_MANAGEMENT_SECRET_KEY,
            method,
            uri,
            timestamp,
            newEnvironment
        );

        const options = {
            uri,
            method,
            headers: {
                'X-CS-Signature': signature,
                'X-CS-Timestamp': timestamp
            },
            body: newEnvironment,
            json: true,
            rejectUnauthorized: false // required for domains with self signed certificate
        };

        await requestPromise( options );

        console.log( 'New Environment created.' );
        console.log( `EnvironmentId: ${ newEnvironment.id } AccessKey: ${ newEnvironment.accessKeys[ 0 ].value }` );
    } catch ( error ) {
        console.log( 'error:', error.message );
    }
} )();

function _generateSignature( apiSecret, method, uri, timestamp, body ) {
    const path = url.parse( uri ).path;

    const hmac = crypto.createHmac( 'SHA256', apiSecret );

    hmac.update( `${ method.toUpperCase() }${ path }${ timestamp }` );

    if ( body ) {
        hmac.update( Buffer.from( JSON.stringify( body ) ) );
    }

    return hmac.digest( 'hex' );
}

function _randomString( length ) {
    return crypto.randomBytes( length / 2 ).toString( 'hex' );
}

# Usage

Run:

node index.js