Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / plugins / launchpad / src / recordViewer / recordViewStore.js
diff --git a/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js b/skyquake/plugins/launchpad/src/recordViewer/recordViewStore.js
new file mode 100644 (file)
index 0000000..fbdae39
--- /dev/null
@@ -0,0 +1,455 @@
+/*
+ * 
+ *   Copyright 2016 RIFT.IO Inc
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ *
+ */
+import RecordViewActions from './recordViewActions.js';
+import RecordViewSource from './recordViewSource.js';
+// import source
+// import AppHeaderActions from 'widgets/header/headerActions.js';
+import Alt from '../alt';
+import _ from 'underscore';
+
+class RecordViewStore {
+    constructor() {
+        this.isLoading = true;
+        this.cardLoading = true;
+        this.detailLoading = true;
+        //Reference to current socket
+        this.socket = null;
+        //Reference to current record type
+        //"vnfr", "nsr", "default"
+        this.recordType = "default";
+        //Reference to current record ID
+        //uuid or null
+        this.recordID = null;
+        //Record data
+        //object or null
+        this.recordData = null;
+        this.nav = [];
+        this.vnfrs = {};
+        this.configPrimitives = [];
+        this.jobData = [];
+        this.bindActions(RecordViewActions);
+        this.exportPublicMethods({
+            constructAndTriggerVnfConfigPrimitive: this.constructAndTriggerVnfConfigPrimitive,
+            constructAndTriggerNsConfigPrimitive: this.constructAndTriggerNsConfigPrimitive,
+            triggerCreateScalingGroupInstance: this.triggerCreateScalingGroupInstance,
+            triggerDeleteScalingGroupInstance: this.triggerDeleteScalingGroupInstance,
+            validateInputs: this.validateInputs,
+            handleCloseSocket: this.handleCloseSocket,
+            handleCloseJobSocket: this.handleCloseJobSocket,
+            triggerCreateVirtualLink: this.triggerCreateVirtualLink,
+            triggerEditVirtualLink: this.triggerEditVirtualLink,
+            triggerDeleteVirtualLink: this.triggerDeleteVirtualLink
+        })
+        this.exportAsync(RecordViewSource);
+    }
+    handleLogout = () => {
+
+    }
+    handleCloseSocket = () => {
+        if (this.socket) {
+            window.multiplexer.channel(this.channelId).close();
+        }
+    }
+    handleCloseJobSocket = () => {
+        if (this.jobSocket) {
+            window.multiplexer.channel(this.jobSocketChannelId).close();
+        }
+    }
+    loadRecord(record) {
+        this.setState({
+            cardLoading: true,
+            recordID: record.id
+        });
+    }
+    getNSRSocketLoading() {
+        this.setState({
+            cardLoading: true
+        })
+    }
+    getVNFRSocketLoading() {
+        this.setState({
+            cardLoading: true
+        })
+    }
+    getConfigSocketJobSuccess(connection) {
+        let self = this;
+        let ws = window.multiplexer.channel(connection);
+        if (!connection) {
+            console.warn('There was an issue connecting to the Config Job socket');
+            return;
+        }
+        if (self.socket) {
+            self.handleCloseJobSocket();
+        }
+
+        self.setState({
+            jobSocket: ws.ws,
+            jobSocketChannelId: connection
+        });
+        ws.onmessage = function(data) {
+            let jobData = JSON.parse(data.data);
+            jobData = jobData.nsrs[0]["config-agent-job"] || [];
+            self.setState({jobData:jobData});
+        };
+        ws.onerror = function(data) {
+            console.log('err', data)
+        }
+    }
+    getVNFRSocketSuccess(connection) {
+        // debugger;
+        connectionManager.call(this, 'vnfr', connection);
+    }
+    getNSRSocketSuccess(connection) {
+        connectionManager.call(this, 'nsr', connection);
+    }
+    getRawLoading() {
+        this.setState({
+            detailLoading: true
+        })
+    }
+    getRawSuccess(data) {
+        this.setState({
+            rawData: data,
+            detailLoading: false
+        })
+    }
+    getNSRSuccess(data) {
+
+    }
+    constructAndTriggerVnfConfigPrimitive(data) {
+        let vnfrs = data.vnfrs;
+        let vnfrIndex = data.vnfrIndex;
+        let configPrimitiveIndex = data.configPrimitiveIndex;
+        let payload = {};
+        let isValid = false;
+        let configPrimitive = vnfrs[vnfrIndex]['vnf-configuration']['service-primitive'][configPrimitiveIndex];
+
+        payload['name'] = '';
+        payload['nsr_id_ref'] = vnfrs[vnfrIndex]['nsr-id-ref'];
+        payload['vnf-list'] = [];
+        payload['triggered-by'] = 'vnf-primitive';
+        let parameters = [];
+        configPrimitive['parameter'].map((parameter) => {
+            if(!isValid) {
+                isValid = validateParameter(parameter);
+            }
+            parameters.push({
+                name: parameter['name'],
+                value: parameter['value'] || parameter['default-value']
+            });
+        });
+
+        let vnfPrimitive = [];
+        vnfPrimitive[0] = {
+            name: configPrimitive['name'],
+            index: configPrimitiveIndex,
+            parameter: parameters
+        }
+
+        payload['vnf-list'].push({
+            'member_vnf_index_ref': vnfrs[vnfrIndex]['member-vnf-index-ref'],
+            'vnfr-id-ref': vnfrs[vnfrIndex]['id'],
+            'vnf-primitive': vnfPrimitive
+        })
+        if (isValid) {
+            this.execNsConfigPrimitive(payload);
+        }
+        return isValid;
+    }
+    constructAndTriggerNsConfigPrimitive(data) {
+        let nsConfigPrimitiveIndexToExecute = data.nsConfigPrimitiveIndex;
+        let nsConfigPrimitives = data.nsConfigPrimitives;
+        let nsConfigPrimitive = data.nsConfigPrimitives[nsConfigPrimitiveIndexToExecute];
+
+        let payload = {
+            name: nsConfigPrimitive['name'],
+            nsr_id_ref: nsConfigPrimitive['nsr_id_ref'],
+            'vnf-list': [],
+            'parameter': [],
+            'parameter-group': [],
+        };
+        let vnfList = [];
+        nsConfigPrimitive['vnf-primitive-group'].map((vnf) => {
+
+            let vnfPrimitiveList = []
+            vnf['inputs'].map((vnfPrimitive) => {
+
+                let parameterList = [];
+
+                const filterAndAddByValue = (paramObj) => {
+                    if (paramObj['value'] != undefined) {
+                        parameterList.push({
+                            name: paramObj.name,
+                            value: paramObj.value
+                        });
+                    }
+                    return paramObj['value'] != undefined;
+                }
+
+                vnfPrimitive['parameter'].filter(filterAndAddByValue);
+
+                if (parameterList.length > 0) {
+                    vnfPrimitiveList.push({
+                        name: vnfPrimitive['name'],
+                        index: vnfPrimitive['index'],
+                        parameter: parameterList
+                    });
+                }
+            });
+
+            vnfList.push({
+                'member_vnf_index_ref': vnf['member-vnf-index-ref'],
+                'vnfr-id-ref': vnf['vnfr-id-ref'],
+                'vnf-primitive': vnfPrimitiveList
+            });
+        });
+
+        payload['vnf-list'] = vnfList;
+
+        let nsConfigPrimitiveParameterGroupParameters = [];
+        nsConfigPrimitive['parameter-group'] && nsConfigPrimitive['parameter-group'].map((nsConfigPrimitiveParameterGroup) => {
+            let nsConfigPrimitiveParameters = [];
+            nsConfigPrimitiveParameterGroup['parameter'] && nsConfigPrimitiveParameterGroup['parameter'].map((nsConfigPrimitiveParameterGroupParameter) => {
+                if (nsConfigPrimitiveParameterGroupParameter['value'] != undefined) {
+                    nsConfigPrimitiveParameters.push({
+                        'name': nsConfigPrimitiveParameterGroupParameter.name,
+                        'value': nsConfigPrimitiveParameterGroupParameter.value
+                    });
+                }
+            });
+            nsConfigPrimitiveParameterGroupParameters.push({
+                'name': nsConfigPrimitiveParameterGroup.name,
+                'parameter': nsConfigPrimitiveParameters
+            });
+        });
+
+        payload['parameter-group'] = nsConfigPrimitiveParameterGroupParameters;
+
+        let nsConfigPrimitiveParameters = [];
+        nsConfigPrimitive['parameter'] && nsConfigPrimitive['parameter'].map((nsConfigPrimitiveParameter) => {
+            if (nsConfigPrimitiveParameter['value'] != undefined && nsConfigPrimitiveParameter['value'] != ""
+                )
+            {
+                nsConfigPrimitiveParameters.push({
+                    'name': nsConfigPrimitiveParameter.name,
+                    'value': nsConfigPrimitiveParameter.value
+                });
+            } else {
+                if ( (nsConfigPrimitiveParameter['value'] == undefined)
+                   && nsConfigPrimitiveParameter['default-value']) {
+                    nsConfigPrimitiveParameters.push({
+                        'name': nsConfigPrimitiveParameter.name,
+                        'value': nsConfigPrimitiveParameter['default-value']
+                    });
+                }
+            }
+        });
+
+        payload['parameter'] = nsConfigPrimitiveParameters;
+
+        this.execNsConfigPrimitive(payload);
+    }
+    execNsConfigPrimitiveSuccess(data) {}
+    createScalingGroupInstanceSuccess(data) {}
+    deleteScalingGroupInstanceSuccess(data) {}
+    triggerCreateScalingGroupInstance(params) {
+        this.createScalingGroupInstance(params);
+    }
+    triggerDeleteScalingGroupInstance(params) {
+        this.deleteScalingGroupInstance(params);
+    }
+    validateInputs(data) {
+        let nsConfigPrimitiveIndexToExecute = data.nsConfigPrimitiveIndex;
+        let nsConfigPrimitives = data.nsConfigPrimitives;
+        let nsConfigPrimitive = data.nsConfigPrimitives[nsConfigPrimitiveIndexToExecute];
+        let isValid = true;
+        //Check parameter groups for required fields
+        nsConfigPrimitive['parameter-group'] && nsConfigPrimitive['parameter-group'].map((parameterGroup, parameterGroupIndex) => {
+            let isMandatory = parameterGroup.mandatory != 'false';
+            let optionalChecked = parameterGroup.optionalChecked;
+            let isActiveOptional = (optionalChecked && !isMandatory);
+            if (isActiveOptional || isMandatory) {
+                parameterGroup['parameter'] && parameterGroup['parameter'].map((parameter, parameterIndex) => {
+                    let msg = 'Parameter Group: ' + parameterGroup.name + ' is not valid';
+                    if (isValid) {
+                        isValid = validateParameter(parameter);
+                    }
+                });
+            }
+        });
+
+        //Check top level parameters for required fields
+        nsConfigPrimitive['parameter'] && nsConfigPrimitive['parameter'].map((parameter, parameterIndex) => {
+                if (isValid) {
+                    isValid = validateParameter(parameter);
+                }
+        });
+
+        nsConfigPrimitive['vnf-primitive-group'] && nsConfigPrimitive['vnf-primitive-group'].map((vnfPrimitiveGroup, vnfPrimitiveGroupIndex) => {
+            vnfPrimitiveGroup['inputs'] && vnfPrimitiveGroup['inputs'].map((input, inputIndex) => {
+                input['parameter'] && input['parameter'].map((param) => {
+                    if (isValid) {
+                        isValid = validateParameter(param);
+                    }
+                })
+            })
+        });
+
+        return isValid;
+    }
+
+    createVirtualLinkSuccess(data) {}
+    editVirtualLinkSuccess(data) {}
+    deleteVirtualLinkSuccess(data) {}
+
+    triggerCreateVirtualLink(params) {
+        this.createVirtualLink(params);
+    }
+
+    triggerDeleteVirtualLink(params) {
+        this.deleteVirtualLink(params);
+    }
+
+    triggerEditVirtualLink(params) {
+        this.editVirtualLink(params);
+    }
+
+}
+
+
+
+function validateParameter(parameter, msg) {
+    if ((parameter['hidden'] == 'true') || (parameter['read-only'] == 'true')) {
+        if (!parameter['default-value']) {
+            var errorMsg = 'Your descriptor has hidden or read-only parameters with no default-values. Please rectify this.';
+            console.log(errorMsg);
+            return false;
+        } else {
+            parameter.value = parameter['default-value'];
+        }
+    }
+
+    if (parameter.mandatory == "true") {
+        if(parameter.hasOwnProperty('value')){
+            if (!parameter.value) {
+                return false;
+            }
+        } else {
+            if (!parameter['default-value']) {
+                return false;
+            } else {
+                parameter.value = parameter['default-value'];
+            }
+        }
+    };
+
+    // if (parameter.value == '' || !parameter.value) {
+    //     if (parameter['default-value']) {
+    //         parameter.value = parameter['default-value'];
+    //     }
+    // };
+
+    return true;
+};
+
+function connectionManager(type, connection) {
+    let self = this;
+    let ws = window.multiplexer.channel(connection);
+    if (!connection) {
+        console.warn('There was an issue connecting to the ' + type + ' socket');
+        return;
+    }
+    if (self.socket) {
+        self.handleCloseSocket();
+    }
+
+    self.setState({
+        socket: ws.ws,
+        channelId: connection
+    });
+    ws.onmessage = function(data) {
+
+        let recordData = JSON.parse(data.data);
+
+        let nsrsData = recordData['nsrs'] || null;
+
+        let navigatorState = {};
+
+        if (nsrsData) {
+            let nav = [];
+            let nsrs = nsrsData[0];
+            nav.push({
+                name: nsrs.name,
+                id: nsrs.id,
+                nsd_name: nsrs.nsd_name,
+                type: 'nsr'
+            });
+
+            // Scaled VNFRs
+            let scaledVnfrs = [];
+
+            nsrs['scaling-group-record'] && nsrs['scaling-group-record'].map((sgr, sgrIndex) => {
+                sgr['instance'] && sgr['instance'].map((sgInstance, sgInstanceIndex) => {
+                    let scaledVnfNav = {
+                        type: 'sgr',
+                        scalingGroupName: sgr['scaling-group-name-ref'],
+                        scalingGroupInstanceId: sgInstance['instance-id'],
+                        vnfr: []
+                    }
+
+                    sgInstance['vnfrs'] && sgInstance['vnfrs'].map((vnfr, vnfrIndex) => {
+                        scaledVnfrs.push(vnfr);
+                        scaledVnfNav.vnfr.push({
+                            name: _.findWhere(nsrs.vnfrs, {id: vnfr})['short-name'],
+                            id: vnfr,
+                            type: 'vnfr'
+                        });
+                    });
+                    nav.push(scaledVnfNav);
+                });
+            });
+
+            // Non-scaled VNFRs
+            nsrs.vnfrs.map(function(vnfr, vnfrIndex) {
+                if (_.indexOf(scaledVnfrs, vnfr.id) == -1) {
+                    nav.push({
+                        name: vnfr["short-name"],
+                        id: vnfr.id,
+                        type: 'vnfr'
+                    });
+                }
+            });
+            navigatorState = {
+                nav: nav,
+                recordID: nsrs.id,
+                isLoading: false,
+            };
+        }
+
+        navigatorState = _.extend(navigatorState, {
+            recordData: recordData,
+            recordType: type,
+            cardLoading: false,
+            // ,isLoading: false
+        });
+
+        self.setState(navigatorState);
+    };
+}
+
+export default Alt.createStore(RecordViewStore);