ui/lib/nodes/addon/components/driver-vmwarevsphere/component.js

204 lines
5.5 KiB
JavaScript

import { alias } from '@ember/object/computed';
import { get, set, computed } from '@ember/object';
import Component from '@ember/component';
import NodeDriver from 'shared/mixins/node-driver';
import layout from './template';
import { inject as service } from '@ember/service';
import C from 'shared/utils/constants';
const DRIVER = 'vmwarevsphere';
const CONFIG = 'vmwarevsphereConfig';
const VAPP_MODE_DISABLED = 'disabled';
const VAPP_MODE_AUTO = 'auto';
const VAPP_MODE_MANUAL = 'manual';
const stringsToParams = (params, str) => {
const index = str.indexOf('=');
if ( index > -1 ) {
params.push({
key: str.slice(0, index),
value: str.slice(index + 1),
});
}
return params;
};
const paramsToStrings = (strs, param) => {
if (param.value && param.key) {
strs.push(`${ param.key }=${ param.value }`);
}
return strs;
};
const initialVAppOptions = {
vappIpprotocol: '',
vappIpallocationpolicy: '',
vappTransport: '',
vappProperty: []
};
const getDefaultVappOptions = (networks) => {
return {
vappIpprotocol: 'IPv4',
vappIpallocationpolicy: 'fixedAllocated',
vappTransport: 'com.vmware.guestInfo',
vappProperty: networksToVappProperties(networks)
};
};
const networksToVappProperties = (networks) => {
return networks.length === 0
? []
: networks.reduce(networkToVappProperties, [
`guestinfo.dns.servers=\${ dns:${ networks[0] } }`,
`guestinfo.dns.domains=\${ searchPath:${ networks[0] } }`
]);
}
const networkToVappProperties = (props, network, i) => {
const n = i.toString();
props.push(
`guestinfo.interface.${ n }.ip.0.address=ip:${ network }`,
`guestinfo.interface.${ n }.ip.0.netmask=\${netmask:${ network }}`,
`guestinfo.interface.${ n }.route.0.gateway=\${gateway:${ network }}`
);
return props;
};
const getInitialVappMode = (c) => {
const vappProperty = c.vappProperty || []
if (
!c.vappIpprotocol &&
!c.vappIpallocationpolicy &&
!c.vappTransport &&
vappProperty.length === 0
) {
return VAPP_MODE_DISABLED;
}
const d = getDefaultVappOptions(c.network);
if (
c.vappIpprotocol === d.vappIpprotocol &&
c.vappIpallocationpolicy === d.vappIpallocationpolicy &&
c.vappTransport === d.vappTransport &&
vappProperty.length === d.vappProperty.length &&
vappProperty.join() === d.vappProperty.join()
) {
return VAPP_MODE_AUTO;
}
return VAPP_MODE_MANUAL;
};
export default Component.extend(NodeDriver, {
settings: service(),
layout,
driverName: DRIVER,
model: null,
showEngineUrl: false,
initParamArray: null,
initVappArray: null,
vappMode: VAPP_MODE_DISABLED,
config: alias(`model.${ CONFIG }`),
init() {
this._super(...arguments);
this.initKeyValueParams('config.cfgparam', 'initParamArray');
this.initKeyValueParams('config.vappProperty', 'initVappArray');
this.initVappMode();
},
actions: {
paramChanged(array) {
this.updateKeyValueParams('config.cfgparam', array);
},
vappPropertyChanged(array) {
this.updateKeyValueParams('config.vappProperty', array);
},
finishAndSelectCloudCredential(credential) {
set(this, 'model.cloudCredentialId', get(credential, 'id'))
}
},
network: computed('config.network', {
get() {
return (get(this, 'config.network') || []).join(', ');
},
set(k, value) {
set(this, 'config.network', value.split(',').filter((x) => {
return x.trim().length !== 0
}));
return value;
}
}),
bootstrap() {
let iso = get(this, `settings.${ C.SETTING.ENGINE_ISO_URL }`) || 'https://releases.rancher.com/os/latest/rancheros-vmware.iso';
let config = get(this, 'globalStore').createRecord({
type: CONFIG,
password: '',
cpuCount: 2,
memorySize: 2048,
diskSize: 20000,
vcenterPort: 443,
network: [],
cfgparam: ['disk.enableUUID=TRUE'],
boot2dockerUrl: iso,
vappIpprotocol: initialVAppOptions.vappIpprotocol,
vappIpallocationpolicy: initialVAppOptions.vappIpallocationpolicy,
vappTransport: initialVAppOptions.vappTransport,
vappProperty: initialVAppOptions.vappProperty
});
set(this, `model.${ CONFIG }`, config);
},
initKeyValueParams(pairsKey, paramsKey) {
set(this, paramsKey, (get(this, pairsKey) || []).reduce(stringsToParams, []));
},
updateKeyValueParams(pairsKey, params) {
set(this, pairsKey, params.reduce(paramsToStrings, []));
},
initVappMode() {
set(this, 'vappMode', getInitialVappMode(get(this, 'config')));
},
updateVappOptions(opts) {
set(this, 'config.vappIpprotocol', opts.vappIpprotocol);
set(this, 'config.vappIpallocationpolicy', opts.vappIpallocationpolicy);
set(this, 'config.vappTransport', opts.vappTransport);
set(this, 'config.vappProperty', opts.vappProperty);
this.initKeyValueParams('config.vappProperty', 'initVappArray');
},
willSave() {
const vappMode = get(this, 'vappMode')
if (vappMode === VAPP_MODE_DISABLED) {
this.updateVappOptions(initialVAppOptions);
} else if (vappMode === VAPP_MODE_AUTO) {
const network = get(this, 'config.network')
const defaultVappOptions = getDefaultVappOptions(network)
this.updateVappOptions(defaultVappOptions);
}
return this._super(...arguments);
}
});